了解 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 列中有多行?的主要内容,如果未能解决你的问题,请参考以下文章