我正在尝试在Python中使用Scikit-learn来完成一些分类器问题(如RF、GBM等)。除了构建模型和进行预测外,我想查看变量的重要性。我知道有一种方法可以获取重要性。
importances = clf.feature_importances_
print(importances)
但是如何获得更精细的内容,使其与变量名称相关联(例如R中的summary(gbm)
或varImp(randomForest)
),特别是对于具有多个级别的分类变量而言?
我正在尝试在Python中使用Scikit-learn来完成一些分类器问题(如RF、GBM等)。除了构建模型和进行预测外,我想查看变量的重要性。我知道有一种方法可以获取重要性。
importances = clf.feature_importances_
print(importances)
但是如何获得更精细的内容,使其与变量名称相关联(例如R中的summary(gbm)
或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
获取数据中的列名/特征名/变量名(然后将此列表与变量重要性列表映射在一起或以其他方式操作)。