日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

特征选择 GBDT 特征重要度

發布時間:2023/12/20 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 特征选择 GBDT 特征重要度 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Tree ensemble算法的特征重要度計算

集成學習因具有預測精度高的優勢而受到廣泛關注,尤其是使用決策樹作為基學習器的集成學習算法。樹的集成算法的著名代碼有隨機森林和GBDT。隨機森林具有很好的抵抗過擬合的特性,并且參數(決策樹的個數)對預測性能的影響較小,調參比較容易,一般設置一個比較大的數。GBDT具有很優美的理論基礎,一般而言性能更有優勢。

基于樹的集成算法還有一個很好的特性,就是模型訓練結束后可以輸出模型所使用的特征的相對重要度,便于我們選擇特征,理解哪些因素是對預測有關鍵影響,這在某些領域(如生物信息學、神經系統科學等)特別重要。本文主要介紹基于樹的集成算法如何計算各特征的相對重要度。

使用boosted tree作為學習算法的優勢:

  • 使用不同類型的數據時,不需要做特征標準化/歸一化
  • 可以很容易平衡運行時效率和精度;比如,使用boosted tree作為在線預測的模型可以在機器資源緊張的時候截斷參與預測的樹的數量從而提高預測效率
  • 學習模型可以輸出特征的相對重要程度,可以作為一種特征選擇的方法
  • 模型可解釋性好
  • 對數據字段缺失不敏感
  • 能夠自動做多組特征間的interaction,具有很好的非性線性

特征重要度的計算

Friedman在GBM的論文中提出的方法:

特征j[Math Processing Error]的全局重要度通過特征j[Math Processing Error]在單顆樹中的重要度的平均值來衡量:?

J2j^=1Mm=1MJ2j^(Tm) [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 特征重要度的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。