gpt4 book ai didi

python - 为什么 sklearn 预处理 LabelEncoder inverse_transform 仅适用于一列?

转载 作者:行者123 更新时间:2023-11-30 22:39:32 25 4
gpt4 key购买 nike

我有一个用 sklearn 构建的随机森林模型。该模型构建在一个文件中,我有第二个文件,在其中使用 joblib 加载模型并将其应用于新数据。数据具有通过 sklearn 的预处理 LabelEncoder.fit_transform 转换的分类字段。做出预测后,我尝试使用 LabelEncoder.inverse_transform 反转此转换。

这是代码:

 #transform the categorical rf inputs
df["method"] = le.fit_transform(df["method"])
df["vendor"] = le.fit_transform(df["vendor"])
df["type"] = le.fit_transform(df["type"])
df["name"] = le.fit_transform(df["name"])
dups["address"] = le.fit_transform(df["address"])

#designate inputs for rf model
inputs = ["amt","vendor","type","name","address","method"]

#load rf model and run it on new data
from sklearn.externals import joblib
rf = joblib.load('rf.pkl')
predict = rf.predict(df[inputs])

#reverse LabelEncoder fit_transform
df["method"] = le.inverse_transform(df["method"])
df["vendor"] = le.inverse_transform(df["vendor"])
df["type"] = le.inverse_transform(df["type"])
df["name"] = le.inverse_transform(df["name"])
df["address"] = le.inverse_transform(df["address"])

#convert target to numeric to make it play nice with SQL Server
predict = pd.to_numeric(predict)

#add target field to df
df["prediction"] = predict

#write results to SQL Server table
import sqlalchemy
engine = sqlalchemy.create_engine("mssql+pyodbc://<username>:<password>@UserDSN")
df.to_sql('TABLE_NAME', engine, schema='SCHEMANAME', if_exists='replace', index=False)

如果没有 inverse_transform 部分,结果将如预期:用数字代码代替分类值。使用inverse_transform 片段,结果很奇怪:为所有 分类字段返回与“地址”字段对应的分类值。

因此,如果 1600宾夕法尼亚大道 编码为数字 1,所有 编码为数字 1 的分类值(无论字段如何)现在都会返回 1600 宾夕法尼亚大道。为什么 inverse_transform 选择一列来反转所有 fit_transform 代码?

最佳答案

这是预期的行为。

当您调用le.fit_transform()时,LabelEncoder的内部参数(学习的类)将被重新初始化。 le 对象适合您提供的列的值。

在上面的代码中,您使用同一对象来转换所有列,并且您提供的最后一列是地址。因此,le 会忘记之前调用 fit()(或本例中的 fit_transform())的所有信息,并再次学习新数据。因此,当您对其调用 inverse_transform() 时,它仅返回与 address 相关的值。希望我说得清楚。

要对所有列进行编码,您需要初始化不同的对象,每一列都有一个对象。如下所示:

 df["method"] = le_method.fit_transform(df["method"])
df["vendor"] = le_vendor.fit_transform(df["vendor"])
df["type"] = le_type.fit_transform(df["type"])
df["name"] = le_name.fit_transform(df["name"])
df["address"] = le_address.fit_transform(df["address"])

然后在适当的编码器上调用inverse_transform()

关于python - 为什么 sklearn 预处理 LabelEncoder inverse_transform 仅适用于一列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43128020/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com