我正在使用sklearn.ensemble.GradientBoostingRegressor来训练模型。
我的数据集包括异构变量,包括数值变量和类别变量由于sklearn不支持分类变量,在输入到Regressor之前,我使用DictVectorizer转换这些分类特征。这是我的一段代码:
# process numeric and categorical variables separately
lsNumericColumns = []
lsCategoricalColumns = []
for col in dfTrainingSet.columns:
if (dfTrainingSet[col].dtype == np.object):
lsCategoricalColumns.append(col)
else:
lsNumericColumns.append(col)
# numeric columns
dfNumVariables = dfTrainingSet.loc[:, lsNumericColumns]
dfNumVariables.fillna(0, inplace=True)
arrNumVariables = dfNumVariables.as_matrix()
# categorical columns
dfCateVariables = dfTrainingSet.loc[:,lsCategoricalColumns]
dfCateVariables.fillna('NA', inplace=True)
vectorizer = DictVectorizer(sparse=False)
arrCateFeatures = vectorizer.fit_transform(dfCateVariables.T.to_dict().values())
# setup training set
arrX = np.concatenate((arrNumVariables,arrCateFeatures), axis=1)
arrY = dfData['Y'].values
然后,训练模型并输出特征重要性:
# setup regressor
params = {'n_estimators':500, 'max_depth':10, 'min_samples_split':50,
'min_samples_leaf':50, 'learning_rate':0.05, 'loss':'lad',
'subsample':1.0, 'max_features':"auto"}
gbr = GradientBoostingRegressor(**params)
# fit
print('start to train model ...')
gbr.fit(arrX, arrY)
print('finish training model.')
print(gbr.feature_importances_)
这将给我一个(feature_index,feature_importance)元组列表然而,我发现这个特征索引不是原始的特征索引,因为一个分类列可以转换为多个列
我知道我可以从DictVectorizer获得矢量化的特征名称,但我如何才能发现原始特征的重要性
我可以把同一原始特征对应的矢量化特征的所有重要性相加,得到原始特征的重要性吗?
您可以通过获得一个热门功能的功能重要性
zip(vectorizer.get_feature_names(), gbr.feature_importances_)
这给出了(特征,重要性)对的列表,其中特征的形式为类别的'name=value'
,而原始数字特征的形式仅为name
。get_feature_names
输出中的出现顺序保证与transform
或fit_transform
输出中的顺序匹配。
老实说,我不确定原始类别的功能重要性;我试着取平均值而不是总和。