我试图从数据帧中获得每个特征的重要性权重。我使用scikit文档中的代码:
names=['Class label', 'Alcohol',
'Malic acid', 'Ash',
'Alcalinity of ash', 'Magnesium',
'Total phenols', 'Flavanoids',
'Nonflavanoid phenols',
'Proanthocyanins',
'Color intensity', 'Hue',
'OD280/OD315 of diluted wines',
'Proline']
df_wine = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data', header=None,names=names)
from sklearn.ensemble import RandomForestClassifier
forest = RandomForestClassifier(n_estimators=10000,
random_state=0,
n_jobs=-1)
forest.fit(X_train, y_train)
feat_labels = df_wine.columns[1:]
importances = forest.feature_importances_
indices = np.argsort(importances)[::-1]
for f in range(X_train.shape[1]):
print("%2d) %-*s %f" % (f + 1, 30,feat_labels[f], importances[indices[f]]))
但是,尽管我理解np.argsort方法,我仍然不理解这个FOR循环。为什么我们使用"索引"来索引"重要性"数组?为什么我们不能简单地使用这样的代码:
for f in range(X_train.shape[1]):
print("%2d) %-*s %f" % (f + 1, 30,feat_labels[f], importances[f]))
使用"importances[index[f]]"(前5行)时的输出:
1) Alcohol 0.182483
2) Malic acid 0.158610
3) Ash 0.150948
4) Alcalinity of ash 0.131987
5) Magnesium 0.106589
"重要性[f]"情况下的输出(前5行):
1) Alcohol 0.106589
2) Malic acid 0.025400
3) Ash 0.013916
4) Alcalinity of ash 0.032033
5) Magnesium 0.022078
这不是放在文档中的内容,仔细看,它说
# FROM DOCS
for f in range(X.shape[1]):
print("%d. feature %d (%f)" % (f + 1, indices[f], importances[indices[f]]))
哪个是正确的,而不是
# FROM YOUR QUESTION
for f in range(X_train.shape[1]):
print("%2d) %-*s %f" % (f + 1, 30,feat_labels[f], importances[indices[f]]))
这是错误的。如果你想使用feat_labels,你应该做
# CORRECT SOLUTION
for f in range(X_train.shape[1]):
print("%2d) %-*s %f" % (f + 1, 30,feat_labels[indices[f]], importances[indices[f]]))
之所以使用他们的方法,是因为他们希望按照特征重要性的递减顺序进行迭代,而不使用"索引"则会使用特征的排序。两者都很好,唯一不正确的是你提出的第一种方法——这是两种方法的混合,错误地赋予了特征的重要性。