“特征重要性”的“单热编码”变量的显示名称
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_importance
s。
设置:
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 我用我正在做的一切更新了我的答案,所以你知道我是如何得到我的输出的。以上是关于“特征重要性”的“单热编码”变量的显示名称的主要内容,如果未能解决你的问题,请参考以下文章