【发布时间】:2017-08-24 23:28:30
【问题描述】:
我有一个用 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 代码?
【问题讨论】:
标签: python python-3.x pandas scikit-learn random-forest