如何使用 OneHotEncoder 和 Pipeline 进行新的预测?

Posted

技术标签:

【中文标题】如何使用 OneHotEncoder 和 Pipeline 进行新的预测?【英文标题】:How to use OneHotEncoder and Pipeline to make new predictions? 【发布时间】:2020-10-06 14:47:32 【问题描述】:

我正在完成一个专注于 OneHotEncoder 的教程。我得到了编码特征背后的想法,但是我在使用带有管道的编码器进行新预测时遇到了一点问题。其中两个特征——“Sex”和“Embarked”——是分类的而不是数字的。当创建一个新的 numpy 数组来进行预测时,你是否使用初始值,比如“male”和“C”,或者说,“1”和“2”来进行新的预测?我收到以下错误:“ValueError:仅熊猫数据帧支持使用字符串指定列”,鉴于我使用的值是数字,这很奇怪。无论如何,我是否必须将管道安装到 X_new 才能做出新的预测?如果是这样,我该怎么做?

X_new = [[3, 1, 0]] OR X_new = [['3','male', 'C']]

pipe.predict(X_new)

完整代码:

import pandas as pd

import numpy as np


df = pd.read_csv("https://raw.githubusercontent.com/---/pandas-videos/master/data/titanic_train.csv")


from sklearn.linear_model import LogisticRegression

logreg = LogisticRegression(solver='lbfgs')



from sklearn.model_selection import cross_val_score

cross_val_score(logreg, X, y, cv=5, scoring='accuracy').mean()


from sklearn.preprocessing import OneHotEncoder

ohe = OneHotEncoder(sparse=False)


X = df.drop('Survived', axis='columns')


from sklearn.compose import make_column_transformer

column_trans = make_column_transformer(

  (OneHotEncoder(), ['Sex', 'Embarked']),

remainder='passthrough')


column_trans.fit_transform(X)


from sklearn.pipeline import make_pipeline

pipe = make_pipeline(column_trans, logreg)



cross_val_score(pipe, X, y, cv=5, scoring='accuracy').mean()



X_new = [[3, 1, 0]]

pipe.predict(X_new)

【问题讨论】:

【参考方案1】:

当您应用 OneHotEncoder 时,您指定的分类列将根据分类列中唯一值的数量转换为多个整数列。

例如,性别列包含“男”和“女”,那么它将原来的列转换为“男”和“女”2列。它与 LabelEncoder 不同。

如果要应用管道、逻辑回归和 OneHotEncoder,可以使用管道来拟合训练数据。

pipe.fit(X,y)

然后您可以应用预测。这是一个示例,当我应用性别、年龄和上船这 3 个特征并将 OHE 应用于 Sex 和上船时。

X_new = [['female', 20, 'C']]
X_new_df = pd.DataFrame (X_new,columns=['Sex','Age','Embarked'])
pipe.predict(X_new_df)

但是,您在代码中使用的特征是除标注分类(“Survived”)之外的所有特征,即 11 个特征。输入的数量必须等于或大于拟合模型,而您只应用可能提示和错误的3列。

【讨论】:

以上是关于如何使用 OneHotEncoder 和 Pipeline 进行新的预测?的主要内容,如果未能解决你的问题,请参考以下文章

scikit-learn:如何使用管道组合 LabelEncoder 和 OneHotEncoder?

如何改进此代码以使用 OneHotEncoder? [复制]

如何在 pandas 系列列表中使用 OneHotEncoder?

如何在普通最小二乘回归图中使用 OneHotEncoder 输出

使用 sklearn OneHotEncoder 时如何去掉数字列?

将 OneHotEncoder 用于决策树分类器中的分类特征