首页 文章

如何sklearn随机森林索引feature_importances_

提问于
浏览
6

我在sklearn中使用了RandomForestClassifier来确定数据集中的重要功能 . 我如何能够返回实际的特征名称(我的变量标记为x1,x2,x3等)而不是它们的相对名称(它告诉我重要的特征是'12','22'等) . 下面是我目前用于返回重要功能的代码 .

important_features = []
for x,i in enumerate(rf.feature_importances_):
    if i>np.average(rf.feature_importances_):
        important_features.append(str(x))
print important_features

另外,为了理解索引,我能够找出重要的特征'12'实际上是什么(它是变量x14) . 当我将变量x14移动到训练数据集的0索引位置并再次运行代码时,它应该告诉我特征'0'很重要,但它没有,它就像它看不到那个特征已经列出的第一个功能实际上是我第一次运行代码时列出的第二个功能(功能'22') .

我想也许feature_importances_实际上是使用第一列(我放置了x14)作为训练数据集其余部分的一种ID,因此在选择重要特征时忽略它 . 任何人都可以对这两个问题有所了解吗?提前感谢您的任何帮助 .

EDIT
以下是我存储功能名称的方法:

tgmc_reader = csv.reader(csvfile)
row = tgmc_reader.next()    #Header contains feature names
feature_names = np.array(row)

然后我加载了数据集和目标类

tgmc_x, tgmc_y = [], []
for row in tgmc_reader:
    tgmc_x.append(row[3:])    #This says predictors start at the 4th column, columns 2 and 3 are just considered ID variables.
    tgmc_y.append(row[0])     #Target column is the first in the dataset

然后继续将数据集拆分为测试和训练部分 .

from sklearn.cross_validation import train_test_split

x_train, x_test, y_train, y_test = train_test_split(tgmc_x, tgmc_y, test_size=.10, random_state=33)

然后适合模型

from sklearn.ensemble import RandomForestClassifier

rf = RandomForestClassifier(n_estimators=1, criterion='entropy', max_features=2, max_depth=5, bootstrap=True, oob_score=True, n_jobs=2, random_state=33)
rf = rf.fit(x_train, y_train)

然后返回了重要的功能

important_features = []
for x,i in enumerate(rf.feature_importances_):
    if i>np.average(rf.feature_importances_):
        important_features.append((x))

然后我把你的建议结合起来(非常感谢!)

important_names = feature_names[important_features > np.mean(important_features)]
print important_names

它确实返回了变量名称 .

['x9' 'x10' 'x11' 'x12' 'x13' 'x15' 'x16']

所以你肯定已经解决了我问题的一部分,这太棒了 . 但是当我回到打印我的重要功能的结果

print important_features

它返回以下输出:

[12, 22, 51, 67, 73, 75, 87, 91, 92, 106, 125, 150, 199, 206, 255, 256, 275, 309, 314, 317]

我解释这意味着它认为第12,22,51等变量是重要的变量 . 所以这将是我告诉它在我的代码开头索引观察结果的第12个变量:

tgmc_x.append(row[3:])

这种解释是否正确?如果这是正确的,当我将第12个变量移动到原始数据集中的第4列时(我告诉它开始使用我刚刚引用的代码读取预测值)并再次运行代码,我得到以下输出:

[22, 51, 66, 73, 75, 76, 106, 112, 125, 142, 150, 187, 191, 199, 250, 259, 309, 317]

这似乎不再能识别变量 . 另外,当我将同一个变量移动到原始数据集中的第5列时,输出如下所示:

[1,22, 51, 66, 73, 75, 76, 106, 112, 125, 142, 150, 187, 191, 199, 250, 259, 309, 317]

这看起来像是再次认识到它 . 最后一件事,在我通过你的建议让它返回变量名后,它给了我一个包含7个变量的列表 . 当我使用我最初使用的代码返回重要变量时,它会给我一个更长的重要变量列表 . 为什么是这样?再次感谢您的帮助 . 对此,我真的非常感激!

3 回答

  • 10

    Feature Importances返回一个数组,其中每个索引对应于训练集中该特征的估计特征重要性 . 内部没有排序,它与训练期间给出的功能一一对应 .

    如果将要素名称存储为numpy数组并确保它与传递给模型的要素一致,则可以利用numpy索引来执行此操作 .

    importances = rf.feature_importances_
    important_names = feature_names[importances > np.mean(importances)]
    print important_names
    
  • 3

    这是我用来打印和绘制特征重要性的内容,包括名称,而不仅仅是值

    importances = pd.DataFrame({'feature':X_train.columns,'importance':np.round(clf.feature_importances_,3)})
    importances = importances.sort_values('importance',ascending=False).set_index('feature')
    print importances
    importances.plot.bar()
    

    完整的例子

    from sklearn.ensemble import RandomForestClassifier
    from sklearn.cross_validation import train_test_split
    import numpy as np
    import pandas as pd
    
    # set vars
    predictors = ['x1','x2']
    response = 'y'
    
    X = df[predictors]
    y = df[response]
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20)
    
    # run model
    clf = RandomForestClassifier(max_features=5)
    clf.fit(X_train.values, y_train.values)
    
    #show to plot importances
    importances = pd.DataFrame({'feature':X_train.columns,'importance':np.round(clf.feature_importances_,3)})
    importances = importances.sort_values('importance',ascending=False).set_index('feature')
    print importances
    importances.plot.bar()
    
  • 4

    得到变量解释:

    regressor.score(X, y)
    

    获得变量的重要性:

    importances = regressor.feature_importances_
    print(importances)
    

相关问题