我正试图在python中使用scikit learn来解决几个不同的分类器问题(RF、GBM等)。除了建立模型和做出预测,我还希望看到变量的重要性。我知道有一种方法可以得到的重要性
importances = clf.feature_importances_
print(importances)
但是,我如何获得与变量名称(即R中的summary(gbm)
或R中的varImp(randomForest)
)具有重要性的更精细的东西,特别是如果它是一个具有多个级别的分类变量?
变量重要性(或特性重要性)是为您的模型所适合的所有特性计算的。这个伪代码让您了解变量名称和重要性之间的关系:
import pandas as pd
train = pd.read_csv("train.csv")
cols = ['hour', 'season', 'holiday', 'workingday', 'weather', 'temp', 'windspeed']
clf = YourClassifiers()
clf.fit(train[cols], train.targets) # targets/labels
print len(clf.feature_importances_)
print len(cols)
您将看到打印的两个列表的长度是相同的——您基本上可以将列表映射在一起,或者按照自己的意愿对其进行操作。如果你想在一个图中很好地显示变量的重要性,你可以使用这个:
import numpy as np
import matplotlib.pyplot as plt
plt.figure(figsize=(6 * 1.618, 6))
index = np.arange(len(cols))
bar_width = 0.35
plt.bar(index, clf.feature_importances_, color='black', alpha=0.5)
plt.xlabel('features')
plt.ylabel('importance')
plt.title('Feature importance')
plt.xticks(index + bar_width, cols)
plt.tight_layout()
plt.show()
如果你不想使用这种方法(这意味着你正在拟合所有列,而不仅仅是cols
变量中设置的少数列),那么你可以用train.columns.values
获取数据的列/特征/变量名称(然后将该列表与变量重要性列表映射在一起,或者以其他方式进行操作)。