我希望在数据集被SKLearn OneHotEncoder转换后获得它的特性名。
在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-3
或
a-0,a-1,a-2,b-0,b-1,b-2,b-3,b-4,b-5,b-6,b-7,b-8
或任何有助于查看编码列分配给原始列的内容)。
背景:我希望看到一些算法的特征重要性,以获得对所使用的算法影响最大的特征。
发布于 2018-03-22 16:32:34
您可以使用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')发布于 2018-03-22 16:37:43
如果我正确理解,您可以使用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.]]注意,在对功能进行编码之前,首先对它们进行排序。
发布于 2019-07-10 13:07:55
您可以使用开放源码包特性-引擎来实现这一点:
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://stackoverflow.com/questions/49433462
复制相似问题