python:如何从 feature_importances 获取真实的特征名称

Posted

技术标签:

【中文标题】python:如何从 feature_importances 获取真实的特征名称【英文标题】:python: How to get real feature name from feature_importances 【发布时间】:2015-08-02 00:35:19 【问题描述】:

我正在使用 Python 的 sklearn 随机森林 (ensemble.RandomForestClassifier) 进行分类,并使用 feature_importances_ 为分类器找到重要特征。现在我的代码是:

for trip in database:
    venue_feature_start.append(Counter(trip['POI']))
# Counter(trip['POI']) is like Counter('school':1, 'hospital':1, 'bus station':2),actually key is the feature

feat_loc_vectorizer = DictVectorizer()
feat_loc_vectorizer.fit(venue_feature_start)
feat_loc_orig_mat = feat_loc_vectorizer.transform(venue_feature_start)

orig_tfidf = TfidfTransformer()
orig_ven_feat = orig_tfidf.fit_transform(feat_loc_orig_mat.tocsr())

# so DictVectorizer() and TfidfTransformer() help me to phrase the features and for each instance, the feature dimension is 580, which means that there are 580 venue types 

data = orig_ven_feat.tocsr()

le = LabelEncoder() 
labels = le.fit_transform(labels_raw)
if "Unlabelled" in labels_raw:
    unlabelled_int = int(le.transform(["Unlabelled"]))
else:
    unlabelled_int = -1

valid_rows_idx = np.where(labels!=unlabelled_int)[0]  
labels = labels[valid_rows_idx]
user_ids = np.asarray(user_ids_raw)
# user_ids is for cross validation, labels is for classification 

clf = ensemble.RandomForestClassifier(n_estimators = 50)
cv_indices = LeavePUsersOut(user_ids[valid_rows_idx], n_folds = 10)                      
data = data[valid_rows_idx,:].toarray()
for train_ind, test_ind in cv_indices:
    train_data = data[train_ind,:]
    test_data = data[test_ind,:]
    labels_train = labels[train_ind]
    labels_test = labels[test_ind]

    print ("Training classifier...")
    clf.fit(train_data,labels_train)
    importances = clf.feature_importances_

现在的问题是,当我使用feature_importances时,我得到一个维度为580(与特征维度相同)的数组,我想知道前20个重要特征(前20个重要场所)

我认为至少我应该知道的是 importances 中最大的 20 个数字的索引, 但我不知道:

    如何从 importances

    获取前 20 名的索引

    由于我使用了 Dictvectorizer 和 TfidfTransformer,所以我不知道如何将索引与真实场地名称('school'、'home'、....)进行匹配

有什么想法可以帮助我吗?非常感谢!

【问题讨论】:

【参考方案1】:

要获得每个特征名称的重要性,只需将列名称和 feature_importances 一起迭代(它们相互映射):

for feat, importance in zip(df.columns, clf.feature_importances_):
    print 'feature: f, importance: i'.format(f=feat, i=importance)

【讨论】:

【参考方案2】:

feature_importances_ 方法按照特征输入算法的顺序返回相对重要性数字。因此,为了获得前 20 个功能,您需要将功能从最重要到最不重要进行排序,例如:

importances = forest.feature_importances_
indices = numpy.argsort(importances)[-20:]

[-20:] 因为你需要取出数组的最后 20 个元素,因为argsort 按升序排序)

【讨论】:

非常感谢,但是您知道如何将索引与真实的特征名称匹配吗?

以上是关于python:如何从 feature_importances 获取真实的特征名称的主要内容,如果未能解决你的问题,请参考以下文章

python 通过随机森林模型计算feature_importances

如何使用决策树中的 feature_importances_ 删除所有非零重要特征?

从 RandomForestRegressor() 或 RandomForestClassifier() 获取 feature_importances_ 以解决回归和分类问题

scikit learn中的feature_importances,如何选择正确的参数?

如何参考管道步骤,在管道上使用 feature_importance_?

RandomForestRegressor 和 feature_importances_ 错误