GBDTアルゴリズムの特徴的重要度計算


Tree ensembleアルゴリズムの特徴重要度計算
タグ:特徴選択GBDT特徴重要度
集積学習は予測精度の高い利点があるために広く注目されており、特に決定樹を基学習器としての集積学習アルゴリズムを用いている.ツリーの集積アルゴリズムの有名なコードはランダム森林とGBDTがあります.ランダム森林は過当フィットに対して優れた特性を持ち,パラメータ(決定ツリーの個数)は予測性能に影響が小さく,調整が容易で,一般的に比較的大きな数を設定した.GBDTは優れた理論的基礎を持ち、一般的に性能が優れています.GBDTアルゴリズムの原理については、前のブログ「GBDTアルゴリズム原理深化解析」を参照してください.
ツリーベースの集積アルゴリズムにはもう一つの優れた特性があります.モデルの訓練が終わったら、モデルが使用する特徴の相対的重要度を出力できます.特徴を選択しやすく、どのような要因が予測に重要な影響を与えるかを理解することができます.本論文では主に、ツリーベースの集積アルゴリズムが、各特徴の相対的重要度をどのように計算するかを紹介する.
booted treeを学習アルゴリズムとして使うメリット:
  • 異なるタイプのデータを使用する場合、特徴標準化/正規化をする必要はない.
  • は、運転時の効率と精度を容易にバランスさせることができる.例えば、booted treeをオンライン予測のモデルとして使用すると、マシンリソースが緊張しているときに予測に参加するツリーの数を遮断して予測効率を上げることができます.
  • 学習モデルは、特徴の比較的重要度を出力することができ、特徴選択の方法
  • として機能することができる.
  • モデルは、良い解釈
  • データフィールドに対して感度がない
  • は、複数の特徴のセット間のインターレースを自動的に行うことができ、非線形性
  • を備えている.
    特徴重要度の計算
    FriendmanがGBMの論文で提出した方法:
    特徴jのグローバル重要度は、特徴jの単一ツリーにおける重要度の平均値によって測定される.
    J 2 j^=1 MΣm=1 MJ 2 j^(Tm)
    そのうち、Mは木の数です.特徴
    jのシングルツリーにおける重要度は以下の通りである.
    J 2 j^(T)=Σt=1 L−1 i 2 t^1(vt=j)
    そのうち
    Lは木の葉っぱの数であり、
    L−1は木の非葉っぱノード数であり(樹は子供を左右する二叉の木である)、
    vtは和ノードです
    tに関連する特徴、
    i 2 t^はノードです
    t分裂後の二乗損失の減少値.
    コードセグメントを実現
    特徴重要度の計算方法をより良く理解するために、以下にscikit-learnのツール・バッグに実装され、コードはいくつかの関連しない部分を除去する.
    下のコードはGraadient Boosting Class ifeierオブジェクトから来ています.importence属性の計算方法:
    def feature_importances_(self):
        total_sum = np.zeros((self.n_features, ), dtype=np.float64)
        for tree in self.estimators_:
            total_sum += tree.feature_importances_ 
        importances = total_sum / len(self.estimators_)
        return importances
    その中で、self.estimartors_アルゴリズムで構築された意思決定ツリーの配列であり、tree.feature_importence_シングルツリーの特徴的な重要度ベクトルです.その計算方法は以下の通りです.
    cpdef compute_feature_importances(self, normalize=True):
        """Computes the importance of each feature (aka variable)."""
    
        while node != end_node:
            if node.left_child != _TREE_LEAF:
                # ... and node.right_child != _TREE_LEAF:
                left = &nodes[node.left_child]
                right = &nodes[node.right_child]
    
                importance_data[node.feature] += (
                    node.weighted_n_node_samples * node.impurity -
                    left.weighted_n_node_samples * left.impurity -
                    right.weighted_n_node_samples * right.impurity)
            node += 1
    
        importances /= nodes[0].weighted_n_node_samples
    
        return importances
    上のコードは簡略化され、核心思想が残されています.すべての非リーフノードの分割時の加重不純度の減少を計算し、より多くの特徴を示すほど重要である.
    不純度の減少は、実際にはノードの今回の分裂による収益であるので、ノード分裂時の収益が大きいほど、ノードに対応する特徴の重要度が高いことも理解できる.収益の定義については、前のブログ「GBDTアルゴリズム原理深化解析」の式(9)の定義を参照してください.
    参考資料
    [1]Feature Selection for Ranking using Boosted Trees[2]Graadient Boosted Feature Selection[3]Feature Select with Esembers,Artficial Varables,and Redundency Elimination[4]GBDTアルゴリズムの原理が深く出ている.