Python SKLearn:如何在 OneHotEncoder 之后获取特征名称?
Posted
技术标签:
【中文标题】Python SKLearn:如何在 OneHotEncoder 之后获取特征名称?【英文标题】:Python SKLearn: How to Get Feature Names After OneHotEncoder? 【发布时间】:2018-09-01 04:11:04 【问题描述】:我想获取经过 SKLearn OneHotEncoder 转换后的数据集的特征名称。
在active_features_ attribute in OneHotEncoder 中可以很好地解释n_values_
、feature_indices_
和active_features_
属性是如何在transform()
执行后填充的。
我的问题是:
例如基于 DataFrame 的输入数据:
data = pd.DataFrame("a": [0, 1, 2,0], "b": [0,1,4, 5], "c":[0,1,4, 5]).as_matrix()
代码如何从原始特征名称a
、b
和c
到转换后的特征名称列表
(例如:
a-0
,a-1
,a-2
,b-0
,b-1
,b-2
,b-3
,c-0
,c-1
,c-2
,c-2
,@987
或
a-0
,a-1
,a-2
,b-0
,b-1
,b-2
,b-3
,b-4
,b-5
,b-7
,@98654351@,@9867654351@
或任何有助于查看编码列与原始列的分配情况)。
背景:我想看看一些算法的特征重要性,以了解哪个特征对所用算法的影响最大。
【问题讨论】:
我不确定您需要知道什么。您想知道“从……到……”的代码。您只想列出新列的名称吗?看到编码器用来生成新列名的代码了吗? “查看分配”会混淆问题,因为这些列未“分配给”原始列;它们派生自原始列,不再具有数据流连接.. 【参考方案1】:你可以使用pd.get_dummies()
:
pd.get_dummies(data["a"],prefix="a")
会给你:
a_0 a_1 a_2
0 1 0 0
1 0 1 0
2 0 0 1
3 1 0 0
可以自动生成列名。您可以将此应用于所有列,然后获取列名称。无需将它们转换为 numpy 矩阵。
所以:
df = pd.DataFrame("a": [0, 1, 2,0], "b": [0,1,4, 5], "c":[0,1,4, 5])
data = df.as_matrix()
解决方案如下:
columns = df.columns
my_result = pd.DataFrame()
temp = pd.DataFrame()
for runner in columns:
temp = pd.get_dummies(df[runner], prefix=runner)
my_result[temp.columns] = temp
print(my_result.columns)
>>Index(['a_0', 'a_1', 'a_2', 'b_0', 'b_1', 'b_4', 'b_5', 'c_0', 'c_1', 'c_4',
'c_5'],
dtype='object')
【讨论】:
【参考方案2】:如果我理解正确,您可以使用feature_indices_
来识别哪些列对应于哪个功能。
例如
import pandas as pd
from sklearn.preprocessing import OneHotEncoder
data = pd.DataFrame("a": [0, 1, 2,0], "b": [0,1,4, 5], "c":[0,1,4, 5]).as_matrix()
ohe = OneHotEncoder(sparse=False)
ohe_fitted = ohe.fit_transform(data)
print(ohe_fitted)
print(ohe.feature_indices_) # [ 0 3 9 15]
从上面的feature_indices_
我们知道如果我们拼接来自0:3
的OneHotEncoded数据,我们将得到与data
中第一列对应的特征,如下所示:
print(ohe_fitted[:,0:3])
拼接数据中的每一列代表第一个特征中的一个值。第一列是 0,第二列是 1,第三列是 2。为了在拼接数据上说明这一点,列标签如下所示:
a_0 a_1 a_2
[[ 1. 0. 0.]
[ 0. 1. 0.]
[ 0. 0. 1.]
[ 1. 0. 0.]]
请注意,特征在编码之前先排序。
【讨论】:
【参考方案3】:有一个 OneHotEncoder 可以为您完成所有工作。
包 sksurv 有一个 OneHotEncoder,它将返回一个熊猫数据框,其中包含为您设置的所有列名。看看这个。确保您设置了一个环境来使用编码器,以确保它不会破坏您当前的环境。这个编码器为我节省了很多时间和精力。
scikit-suvival GitHub
OneHotEncoder Documentation
【讨论】:
【参考方案4】:您可以使用开源包功能引擎来做到这一点:
import pandas as pd
from sklearn.model_selection import train_test_split
from feature_engine.encoding import OneHotEncoder
# load titanic data from openML
pd.read_csv('https://www.openml.org/data/get_csv/16826755/phpMYEkMl')
# divide into train and test
X_train, X_test, y_train, y_test = train_test_split(
data[['sex', 'embarked']], # predictors for this example
data['survived'], # target
test_size=0.3, # percentage of obs in test set
random_state=0) # seed to ensure reproducibility
ohe_enc = OneHotEncoder(
top_categories=None,
variables=['sex', 'embarked'],
drop_last=True)
ohe_enc.fit(X_train)
X_train = ohe_enc.transform(X_train)
X_test = ohe_enc.transform(X_test)
X_train.head()
您应该会看到返回的输出:
sex_female embarked_S embarked_C embarked_Q
501 1 1 0 0
588 1 1 0 0
402 1 0 1 0
1193 0 0 0 1
686 1 0 0 1
这里有更多关于功能引擎的细节:
https://www.trainindata.com/feature-engine
https://github.com/feature-engine/feature_engine
https://feature-engine.readthedocs.io/en/latest/
【讨论】:
您的 tmp 变量未声明!【参考方案5】:OneHotEncoder
现在有一个方法get_feature_names
。您可以使用input_features=data.columns
来匹配训练数据。
【讨论】:
以上是关于Python SKLearn:如何在 OneHotEncoder 之后获取特征名称?的主要内容,如果未能解决你的问题,请参考以下文章
尝试使用 OneHot Encoder Python 的预处理错误