如何在使用 sklearn one-hot 编码后给出列名?
How to give column names after one-hot encoding with sklearn?
这是我的问题,希望有人能帮我弄清楚..
解释一下,我的数据集中有10多个分类列,每个列都有200-300个类别。我想将它们转换成二进制值。为此,我使用第一个标签编码器将字符串类别转换为数字。标签编码器代码和输出如下所示。
在 Label Encoder 之后,我再次使用了来自 scikit-learn 的 One Hot Encoder,它成功了。但问题是,我需要一个热编码器后的列名称。例如,A 列在编码之前具有分类值。 A = [1,2,3,4,..]
编码后应该是这样的,
A-1, A-2, A-3
任何人都知道如何在一次热编码后将列名分配给(旧列名-值名或数字)。这是我的一个热编码及其输出;
我需要带有名称的列,因为我训练了一个人工神经网络,但每次出现数据时,我都无法一次又一次地转换所有过去的数据。所以,我想每次都添加新的。还是谢谢..
您可以使用 .get_feature_names()
属性获取列名。
>>> ohenc.get_feature_names()
>>> x_cat_df.columns = ohenc.get_feature_names()
详细示例为here。
更新
从版本 1.0 开始,使用 get_feature_names_out
此示例可能对未来的读者有所帮助:
import pandas as pd
from sklearn.preprocessing import OneHotEncoder
train_X = pd.DataFrame({'Sex':['male', 'female']*3, 'AgeGroup':[0,15,30,45,60,75]})
>>>
Sex AgeGroup
0 male 0
1 female 15
2 male 30
3 female 45
4 male 60
5 female 75
encoder=OneHotEncoder(sparse=False)
train_X_encoded = pd.DataFrame (encoder.fit_transform(train_X[['Sex']]))
train_X_encoded.columns = encoder.get_feature_names(['Sex'])
train_X.drop(['Sex'] ,axis=1, inplace=True)
OH_X_train= pd.concat([train_X, train_X_encoded ], axis=1)
>>>
AgeGroup Sex_female Sex_male
0 0 0.0 1.0
1 15 1.0 0.0
2 30 0.0 1.0
3 45 1.0 0.0
4 60 0.0 1.0
5 75 1.0 0.0`
嘿,我遇到了同样的问题,我有一个自定义 Estimator,它从 Sklearn.base
扩展了 BaseEstimator Class
我在名为 self.feature_names 的 init 中添加了一个 class 属性,然后作为刚刚更新 self.feature_names 的转换方法的最后一步结果中的列。
from sklearn.base import BaseEstimator, TransformerMixin
import pandas as pd
class CustomOneHotEncoder(BaseEstimator, TransformerMixin):
def __init__(self, **kwargs):
self.feature_names = []
def fit(self, X, y=None):
return self
def transform(self, X):
result = pd.get_dummies(X)
self.feature_names = result.columns
return result
我知道的有点基础,但它可以完成我需要的工作。
如果您想从 sklearn 管道中检索特征重要性的列名,您可以从 classifier 步骤中获取特征,并从一个热编码步骤中获取列名。
a = model.best_estimator_.named_steps["clf"].feature_importances_
b = model.best_estimator_.named_steps["ohc"].feature_names
df = pd.DataFrame(a,b)
df.sort_values(by=[0], ascending=False).head(20)
包 category_encoders
还有另一种简单的方法,此方法使用管道,这也是数据科学最佳实践之一。
import pandas as pd
from category_encoders.one_hot import OneHotEncoder
X = pd.DataFrame({'Sex':['male', 'female']*3, 'AgeGroup':[0,15,30,45,60,75]})
ohe = OneHotEncoder(use_cat_names=True)
ohe.fit_transform(X)
更新:根据@Venkatachalam 的回答,方法get_feature_names()
已在scikit-learn 1.0
中弃用。尝试 运行 时会收到警告。相反,使用 get_feature_names_out()
:
import pandas as pd
from category_encoders.one_hot import OneHotEncoder
ohenc = OneHotEncoder(sparse=False)
x_cat_df = pd.DataFrame(ohenc.fit_transform(xtrain_lbl))
x_cat_df.columns = ohenc.get_feature_names_out(input_features=xtrain_lbl.columns)
在OneHotEncoder()
中设置参数sparse=False
将return一个数组而不是稀疏矩阵,所以你以后不需要转换它。 fit_transform()
将在一行中计算参数并转换训练集。
这是我的问题,希望有人能帮我弄清楚..
解释一下,我的数据集中有10多个分类列,每个列都有200-300个类别。我想将它们转换成二进制值。为此,我使用第一个标签编码器将字符串类别转换为数字。标签编码器代码和输出如下所示。
在 Label Encoder 之后,我再次使用了来自 scikit-learn 的 One Hot Encoder,它成功了。但问题是,我需要一个热编码器后的列名称。例如,A 列在编码之前具有分类值。 A = [1,2,3,4,..]
编码后应该是这样的,
A-1, A-2, A-3
任何人都知道如何在一次热编码后将列名分配给(旧列名-值名或数字)。这是我的一个热编码及其输出;
我需要带有名称的列,因为我训练了一个人工神经网络,但每次出现数据时,我都无法一次又一次地转换所有过去的数据。所以,我想每次都添加新的。还是谢谢..
您可以使用 .get_feature_names()
属性获取列名。
>>> ohenc.get_feature_names()
>>> x_cat_df.columns = ohenc.get_feature_names()
详细示例为here。
更新
从版本 1.0 开始,使用 get_feature_names_out
此示例可能对未来的读者有所帮助:
import pandas as pd
from sklearn.preprocessing import OneHotEncoder
train_X = pd.DataFrame({'Sex':['male', 'female']*3, 'AgeGroup':[0,15,30,45,60,75]})
>>>
Sex AgeGroup
0 male 0
1 female 15
2 male 30
3 female 45
4 male 60
5 female 75
encoder=OneHotEncoder(sparse=False)
train_X_encoded = pd.DataFrame (encoder.fit_transform(train_X[['Sex']]))
train_X_encoded.columns = encoder.get_feature_names(['Sex'])
train_X.drop(['Sex'] ,axis=1, inplace=True)
OH_X_train= pd.concat([train_X, train_X_encoded ], axis=1)
>>>
AgeGroup Sex_female Sex_male
0 0 0.0 1.0
1 15 1.0 0.0
2 30 0.0 1.0
3 45 1.0 0.0
4 60 0.0 1.0
5 75 1.0 0.0`
嘿,我遇到了同样的问题,我有一个自定义 Estimator,它从 Sklearn.base
扩展了 BaseEstimator Class我在名为 self.feature_names 的 init 中添加了一个 class 属性,然后作为刚刚更新 self.feature_names 的转换方法的最后一步结果中的列。
from sklearn.base import BaseEstimator, TransformerMixin
import pandas as pd
class CustomOneHotEncoder(BaseEstimator, TransformerMixin):
def __init__(self, **kwargs):
self.feature_names = []
def fit(self, X, y=None):
return self
def transform(self, X):
result = pd.get_dummies(X)
self.feature_names = result.columns
return result
我知道的有点基础,但它可以完成我需要的工作。
如果您想从 sklearn 管道中检索特征重要性的列名,您可以从 classifier 步骤中获取特征,并从一个热编码步骤中获取列名。
a = model.best_estimator_.named_steps["clf"].feature_importances_
b = model.best_estimator_.named_steps["ohc"].feature_names
df = pd.DataFrame(a,b)
df.sort_values(by=[0], ascending=False).head(20)
包 category_encoders
还有另一种简单的方法,此方法使用管道,这也是数据科学最佳实践之一。
import pandas as pd
from category_encoders.one_hot import OneHotEncoder
X = pd.DataFrame({'Sex':['male', 'female']*3, 'AgeGroup':[0,15,30,45,60,75]})
ohe = OneHotEncoder(use_cat_names=True)
ohe.fit_transform(X)
更新:根据@Venkatachalam 的回答,方法get_feature_names()
已在scikit-learn 1.0
中弃用。尝试 运行 时会收到警告。相反,使用 get_feature_names_out()
:
import pandas as pd
from category_encoders.one_hot import OneHotEncoder
ohenc = OneHotEncoder(sparse=False)
x_cat_df = pd.DataFrame(ohenc.fit_transform(xtrain_lbl))
x_cat_df.columns = ohenc.get_feature_names_out(input_features=xtrain_lbl.columns)
在OneHotEncoder()
中设置参数sparse=False
将return一个数组而不是稀疏矩阵,所以你以后不需要转换它。 fit_transform()
将在一行中计算参数并转换训练集。