树模型中特征重要性是如何计算的
2019-08-20 本文已影响0人
yangy_fly
使用sklearn里决策树的包,以及iris的数据集,使用基尼系数作为切割点划分依据
-
数据集如下
image.png
- 构建决策树,使用gini系数作为切割参数,决策数为cart树。生成的树结构如下
- 计算个特征的重要性
f1 = 0.49*7 - 0.375*4 + 0.5*2 + 0.444*3 = 4.262
f2 = 0
f3 = 0.459*14 - 0.49*7 - 0.245*7 = 1.281
f4 = 0.245*7 - 0.444*3 + 0.375*4 - 0.5*2 = 0.883
-
这棵树总的不纯减少量为4.262+1.281+0.883=6.426
-
经过归一化后,各特征的重要性分别如下:
f1_importance = 4.262/6.426=0.663
f2_importance = 0
f3_importance = 1.281/6.426=0.2
f4_importance = 0.883/6.426=0.137
- 使用代码跑出来的特征重要性如下
from sklearn.tree import DecisionTreeClassifier
train_df = pd.DataFrame(
[[1, 1, 1, 1, 0],
[1, 1, 1, 2, 0],
[2, 1, 1, 1, 1],
[3, 2, 1, 1, 1],
[3, 3, 2, 1, 1],
[3, 3, 2, 2, 0],
[2, 3, 2, 2, 1],
[1, 2, 1, 1, 0],
[1, 3, 2, 1, 1],
[3, 2, 2, 1, 1],
[1, 2, 2, 2, 1],
[2, 2, 1, 2, 1],
[2, 1, 2, 1, 1],
[3, 2, 1, 2, 0],
], columns=['f1', 'f2', 'f3', 'f4', 'label'])
X, y = train_df[['f1', 'f2', 'f3', 'f4']].values, train_df['label']
clf = DecisionTreeClassifier(criterion='gini')
clf.fit(X,y)
print(clf.feature_importances_)
# 特征重要性
[0.66296296 0. 0.2 0.13703704]