了解 onehotencoder 的工作原理 - 为啥我在 ohe 列中有多行?

Posted

技术标签:

【中文标题】了解 onehotencoder 的工作原理 - 为啥我在 ohe 列中有多行?【英文标题】:understanding how onehotencoder works - why do i get mutliple ones in ohe column?了解 onehotencoder 的工作原理 - 为什么我在 ohe 列中有多行? 【发布时间】:2021-02-23 08:50:03 【问题描述】:

我正在使用 sklearn 管道执行 one-hot 编码:

preprocess = make_column_transformer(
    (MinMaxScaler(),numeric_cols),
    (OneHotEncoder(),['country'])
    )

param_grid =     
                  'xgbclassifier__learning_rate': [0.01,0.005,0.001],
                 
                  

model = make_pipeline(preprocess,XGBClassifier())

# Initialize Grid Search Modelg
model = GridSearchCV(model,param_grid = param_grid,scoring = 'roc_auc',
                                 verbose= 1,iid= True,
                                     refit = True,cv  = 3)
model.fit(X_train,y_train)

要查看这些国家/地区是如何被热编码的,我得到以下信息(我知道有两个)

pd.DataFrame(preprocess.fit_transform(X_test))

这样的结果是:

几个问题:

如果有错误,现在纠正我,但在一个热编码中,我认为它是一系列全 0,只有一个数字 1。为什么我在一列中有多个 1 当我执行 model.predict(x_test) 时,它会应用在 piepline 训练中定义的转换? 调用 fit_transform 时如何检索特征名称?

【问题讨论】:

(1) 每行一个1 (2) 是 (3) 您需要访问OHE 转换器并检查vocabulary_ 属性 这是在文档中的哪里我找不到它(词汇属性?) 它是categories_ 适合的OHE 属性。很抱歉误导了你。文档是here 好的,这是在我调用 fit_transform 后获取功能。对不起,我不明白你在 (1) 中的意思,是否真的每个向量只需要一个 1 来作为一个类别,因为在你刚刚分享的文档中,如果你滚动到底部,ohe 向量不止一个1 添加我的意思是当我调用 fit_transform(X_test) 我如何获得所有的特征名称?? 【参考方案1】:

为了帮助您更好地理解 (1),即 OHE 的工作原理。

假设您有 1 列包含分类数据:

df = pd.DataFrame("categorical": ["a","b","a"])
print(df)
  categorical
0           a
1           b
2           a

然后您将获得每行一个 1(对于一列分类数据总是如此),但不一定在每列基础上:

from sklearn.preprocessing import OneHotEncoder
ohe = OneHotEncoder()
ohe.fit(df)
ohe_out = ohe.transform(df).todense()
# ohe_df = pd.DataFrame(ohe_out, columns=ohe.get_feature_names(df.columns))
ohe_df = pd.DataFrame(ohe_out, columns=ohe.get_feature_names(["categorical"]))
print(ohe_df)
   categorical_a  categorical_b
0            1.0            0.0
1            0.0            1.0
2            1.0            0.0

您是否应该添加更多数据列,例如一个数字列,这将适用于每列,但不再适用于整行:

df = pd.DataFrame("categorical":["a","b","a"],"nums":[0,1,0])
print(df)
  categorical  nums
0           a     0
1           b     1
2           a     0

ohe.fit(df)
ohe_out = ohe.transform(df).todense()
# ohe_df = pd.DataFrame(ohe_out, columns=ohe.get_feature_names(df.columns))
ohe_df = pd.DataFrame(ohe_out, columns=ohe.get_feature_names(["categorical","nums"]))
print(ohe_df)
   categorical_a  categorical_b  nums_0  nums_1
0            1.0            0.0     1.0     0.0
1            0.0            1.0     0.0     1.0
2            1.0            0.0     1.0     0.0

【讨论】:

我明白了,谢谢,所以你可以每列获得不止一个 1

以上是关于了解 onehotencoder 的工作原理 - 为啥我在 ohe 列中有多行?的主要内容,如果未能解决你的问题,请参考以下文章

如何把纯化标签加上去

了解 UIPickerView 的工作原理

运维-了解ansible架构与工作原理

深入了解webdriver工作原理

深入了解RabbitMQ工作原理及简单使用

来深入了解一下 Eureka 的工作机制及相关原理