如何在sklearn中使用DictVectorizer后获取分类特征的重要性

4 投票
1 回答
1817 浏览
提问于 2025-04-19 18:29

我正在使用sklearn.ensemble.GradientBoostingRegressor来训练一个模型。

我的数据集包含不同类型的变量,有数字型的,也有分类的。因为sklearn不支持分类变量,所以我使用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_)

这样我就能得到一个包含(特征索引,特征重要性)元组的列表。不过,我发现这个特征索引并不是原始特征的索引,因为一个分类列可能会被转换成多个列。

我知道可以从DictVectorizer中获取向量化特征的名称,但我该如何找到原始特征的重要性呢?

我是否可以把所有对应于同一个原始特征的向量化特征的重要性加起来,从而得到原始特征的重要性?

1 个回答

6

你可以通过以下方式获取一热编码特征的重要性:

zip(vectorizer.get_feature_names(), gbr.feature_importances_)

这个方法会返回一个包含(特征,重要性)对的列表,其中特征的格式是 'name=value',适用于分类特征,而原本是数字的特征则只显示 name。在 get_feature_names 输出中的顺序会和 transformfit_transform 输出中的顺序一致。

老实说,我不太确定原始分类特征的重要性;我建议可以试试取平均值,而不是求和。

撰写回答