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

Posted

技术标签:

【中文标题】在 sklearn 中使用 DictVectorizer 后如何获得分类特征的重要性【英文标题】:How to get importance of categorical feature after using DictVectorizer in sklearn 【发布时间】:2014-10-28 20:54:54 【问题描述】:

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

我的数据集包括异构变量,包括数字变量和分类变量。 由于 sklearn 不支持分类变量,我使用 DictVectorizer 在输入到 Regressor 之前对这些分类特征进行转换。这是我的一段代码:

# 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 获取矢量化特征名称,但是我如何才能找出原始特征的重要性?

我可以把与相同原始特征对应的向量化特征的所有重要性相加得到原始特征的重要性吗?

【问题讨论】:

【参考方案1】:

您可以通过

获取 one-hot 特征的特征重要性
zip(vectorizer.get_feature_names(), gbr.feature_importances_)

这给出了(特征,重要性)对的列表,其中特征的形式为 'name=value' 用于分类,而 name 用于原始数字特征。 get_feature_names 输出中的出现顺序保证与transformfit_transform 输出中的顺序一致。

说实话,我不确定原始分类的特征重要性;我会尝试取平均值而不是总和。

【讨论】:

以上是关于在 sklearn 中使用 DictVectorizer 后如何获得分类特征的重要性的主要内容,如果未能解决你的问题,请参考以下文章

在安卓设备中使用 sklearn

在 Python 中使用 sklearn 使用 MAE 训练线性模型

sklearn中SVM的实现

使用 sklearn 在嵌套交叉验证中使用 GroupKFold

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

使用 sklearn 在数据中保持零