“特征重要性”的“单热编码”变量的显示名称

Posted

技术标签:

【中文标题】“特征重要性”的“单热编码”变量的显示名称【英文标题】:Display name of 'one-hot-encoded' variables for 'feature Importance' 【发布时间】:2018-02-11 23:44:18 【问题描述】:

在完成算法的训练和验证后,如何正确显示“one-hot-encoded”特征的名称?我想整齐地显示每个功能的名称及其重要性。以下是我尝试过的:

显示特征重要性:

grid_search.best_estimator_.feature_importances_
array([  7.67359589e-02,   7.20731884e-02,   4.38667330e-02,
         1.69222269e-02,   1.51816327e-02,   1.66947835e-02,
         1.56858183e-02,   3.43347923e-01,   5.95555727e-02,
         7.65422356e-02,   1.11224727e-01,   1.02677088e-02,
         1.32720377e-01,   1.06447326e-04,   4.45207929e-03,
         4.62258699e-03])

获取热门类别名称:

cat_one_hot_attribs = list(encoder.classes_)
print(cat_one_hot_attribs)
['<1H OCEAN', 'INLAND', 'ISLAND', 'NEAR BAY', 'NEAR OCEAN']

获取其余名称(其他类别):

num_attribs = list(X_train)

['longitude',
 'latitude',
 'housing_median_age',
 'total_rooms',
 'total_bedrooms',
 'population',
 'households',
 'median_income',
 'rooms_per_household',
 'bedrooms_per_household',
 'population_per_household',
 0,
 1,
 2,
 3,
 4]

现在我执行以下操作:

attributes = num_attribs + cat_one_hot_attribs

print(pd.DataFrame(sorted(zip(feature_importance, attributes), reverse=True)))

但我得到以下信息:

         0                         1
0   0.343348             median_income
1   0.132720                         1
2   0.111225  population_per_household
3   0.076736                 longitude
4   0.076542    bedrooms_per_household
5   0.072073                  latitude
6   0.059556       rooms_per_household
7   0.043867        housing_median_age
8   0.016922               total_rooms
9   0.016695                population
10  0.015686                households
11  0.015182            total_bedrooms
12  0.010268                         0
13  0.004623                         4
14  0.004452                         3
15  0.000106                         2

我也尝试了其他方法,但都失败了。

有人可以建议一种正确显示此内容的方法吗?谢谢。

编辑:

根据@cᴏʟᴅsᴘᴇᴇᴅ 的回答,我尝试了以下方法:

feature_importance = grid_search.best_estimator_.feature_importances_

cat_one_hot_attribs = list(encoder.classes_)

num_attribs = list(X_train)
attributes = num_attribs + cat_one_hot_attribs

vals = sorted(zip(feature_importance, attributes), key=lambda x: x[0], reverse=True)
df = pd.DataFrame(vals)
print(df)

仍然得到如上的输出。

【问题讨论】:

你希望它如何排序? 从高到低最好。 【参考方案1】:

打破它。首先排序,按键。确保只考虑 feature_importances。

设置:

import pandas as pd
import numpy as np

feature_importance = np.array([  7.67359589e-02,   7.20731884e-02,   4.38667330e-02,
     1.69222269e-02,   1.51816327e-02,   1.66947835e-02,
     1.56858183e-02,   3.43347923e-01,   5.95555727e-02,
     7.65422356e-02,   1.11224727e-01,   1.02677088e-02,
     1.32720377e-01,   1.06447326e-04,   4.45207929e-03,
     4.62258699e-03])

cat_one_hot_attribs = ['<1H OCEAN', 'INLAND', 'ISLAND', 'NEAR BAY', 'NEAR OCEAN']

num_attribs = ['longitude',
 'latitude',
 'housing_median_age',
 'total_rooms',
 'total_bedrooms',
 'population',
 'households',
 'median_income',
 'rooms_per_household',
 'bedrooms_per_household',
 'population_per_household',
 0,
 1,
 2,
 3,
 4]

attributes = num_attribs

通过feature_importance 获取vals 的排序列表。

vals = sorted(zip(feature_importance, attributes), key=lambda x: x[0], reverse=True)
df = pd.DataFrame(vals)

然后,使用.replace 将编码替换为cat_one_hot_attribs 中的值。

df.iloc[:, -1] = df.iloc[:, -1].replace(i : k for i, k in enumerate(cat_one_hot_attribs))
df

           0                         1
0   0.343348             median_income
1   0.132720                    INLAND
2   0.111225  population_per_household
3   0.076736                 longitude
4   0.076542    bedrooms_per_household
5   0.072073                  latitude
6   0.059556       rooms_per_household
7   0.043867        housing_median_age
8   0.016922               total_rooms
9   0.016695                population
10  0.015686                households
11  0.015182            total_bedrooms
12  0.010268                 <1H OCEAN
13  0.004623                NEAR OCEAN
14  0.004452                  NEAR BAY
15  0.000106                    ISLAND

【讨论】:

@JohnWayne360 我认为您在执行此操作之前还应该执行attributes = cat_one_hot_attribs + num_attribs。您能否还包括您的预期输出?如果这不能解决问题,那会有所帮助。 我是,但它仍然在窃听。会不会是我的环境? @JohnWayne360 我不这么认为。更新您的代码,以便我可以看到您在做什么。还有一些预期的输出! 至于输出,它应该看起来像你的。它看起来仍然像我的代码中的那个。我希望我可以发布整个代码,但它是一个长文件。我会更新你的解决方案。 @JohnWayne360 我用我正在做的一切更新了我的答案,所以你知道我是如何得到我的输出的。

以上是关于“特征重要性”的“单热编码”变量的显示名称的主要内容,如果未能解决你的问题,请参考以下文章

用特征名称绘制特征重要性

将特征重要性从随机森林导出到 csv

Rapidminer 变量重要性

每种模式的特征重要性

使用单热编码处理sklearn中的分类变量

增加特征重要性