使用 RandomClassifier Scikit 获取重要特征

Getting features importance with RandomClassifier Scikit

我尝试从我的数据框中获取每个特征的重要性权重。 我使用 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 循环。 为什么我们使用 "indices" 来索引 "importances" 数组?为什么我们不能简单地使用这样的代码:

for f in range(X_train.shape[1]):
print("%2d) %-*s %f" % (f + 1, 30,feat_labels[f], importances[f]))

使用 "importances[indices[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

"importances[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]]))

使用他们的方法是因为他们想按特征重要性的降序进行迭代,而不是使用 "indices" 而是使用特征的排序。两者都很好,唯一不正确的是您提出的第一个 - 这是两种方法的混合,并且错误地分配了特征的重要性。