2014-09-04 37 views
4

我正在使用sklearn.ensemble.GradientBoostingRegressor來訓練模型。如何在sklearn中使用DictVectorizer後獲得分類特徵的重要性

我的數據集包括異構變量,數字和分類變量。 由於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_importance)元組的列表。 但是,我發現此功能索引不是原始功能索引,因爲一個分類列可以轉換爲多個列。

我知道我可以從DictVectorizer獲得矢量化的功能名稱,但是我怎麼才能找出原始功能的重要性?

我能總結一下對應於相同原始特徵的矢量化特徵的所有重要性,以獲得原始特徵的重要性嗎?

回答

5

你可以爲一個熱特徵的特徵重要度與

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

這給(特徵,重要性)對,其中的特點是categoricals形式'name=value'的和原來只是name列表數字特徵。 get_feature_names輸出中的出現順序保證與transformfit_transform輸出中的順序相匹配。

說實話,我不確定原始分類的重要性,我會嘗試採取意思,而不是總和。

相關問題