特征选择 GBDT 特征重要度
Tree ensemble算法的特征重要度計算
集成學習因具有預測精度高的優勢而受到廣泛關注,尤其是使用決策樹作為基學習器的集成學習算法。樹的集成算法的著名代碼有隨機森林和GBDT。隨機森林具有很好的抵抗過擬合的特性,并且參數(決策樹的個數)對預測性能的影響較小,調參比較容易,一般設置一個比較大的數。GBDT具有很優美的理論基礎,一般而言性能更有優勢。
基于樹的集成算法還有一個很好的特性,就是模型訓練結束后可以輸出模型所使用的特征的相對重要度,便于我們選擇特征,理解哪些因素是對預測有關鍵影響,這在某些領域(如生物信息學、神經系統科學等)特別重要。本文主要介紹基于樹的集成算法如何計算各特征的相對重要度。
使用boosted tree作為學習算法的優勢:
- 使用不同類型的數據時,不需要做特征標準化/歸一化
- 可以很容易平衡運行時效率和精度;比如,使用boosted tree作為在線預測的模型可以在機器資源緊張的時候截斷參與預測的樹的數量從而提高預測效率
- 學習模型可以輸出特征的相對重要程度,可以作為一種特征選擇的方法
- 模型可解釋性好
- 對數據字段缺失不敏感
- 能夠自動做多組特征間的interaction,具有很好的非性線性
特征重要度的計算
Friedman在GBM的論文中提出的方法:
特征j[Math Processing Error]的全局重要度通過特征j[Math Processing Error]在單顆樹中的重要度的平均值來衡量:?
其中,M是樹的數量。特征 j [Math Processing Error] 在單顆樹中的重要度的如下:?
J2j^(T)=∑t=1L?1i2t^1(vt=j) [Math Processing Error] ?
其中, L [Math Processing Error] 為樹的葉子節點數量, L?1 [Math Processing Error] 即為樹的非葉子節點數量(構建的樹都是具有左右孩子的二叉樹), vt [Math Processing Error] 是和節點 t [Math Processing Error] 相關聯的特征, i2t^ [Math Processing Error] 是節點 t [Math Processing Error] 分裂之后平方損失的減少值。
實現代碼片段
為了更好的理解特征重要度的計算方法,下面給出scikit-learn工具包中的實現,代碼移除了一些不相關的部分。
下面的代碼來自于GradientBoostingClassifier對象的feature_importances屬性的計算方法:
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- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
其中,self.estimators_是算法構建出的決策樹的數組,tree.feature_importances_ 是單棵樹的特征重要度向量,其計算方法如下:
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 += 1importances /= nodes[0].weighted_n_node_samplesreturn importances- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
上面的代碼經過了簡化,保留了核心思想。計算所有的非葉子節點在分裂時加權不純度的減少,減少得越多說明特征越重要。
總結
以上是生活随笔為你收集整理的特征选择 GBDT 特征重要度的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 通过Python实现NC文件转GeoTi
- 下一篇: 使用medusa进行ssh爆破