首页 > 解决方案 > 为 ML 保存和加载一种热编码

问题描述

我已经搜索了两天,似乎我无法掌握解决方案。对于机器学习回归模型,我需要对某些列进行热编码。训练数据和模型拟合正在我的本地 PC 上进行。在此之后,模型将被上传到服务器进行预测。

问题是新数据不是初始编码的一部分,因此我需要以与在我的 PC 上学习数据相同的方式对其进行热编码。我发现我可以保存编码器(sklearn.preprocessing -> OneHotEncoder)。但我无法将数据转换为正确的格式。

为了在这里更容易理解,我刚刚创建了一个带有一些非常简单的虚拟数据的笔记本。

# Import pandas library 
import pandas as pd 
# initialize list of lists 
data = [['tom', 10], ['nick', 15], ['juli', 14]] 
# Create the pandas DataFrame 
df = pd.DataFrame(data, columns = ['Name', 'Age']) 
# print dataframe.
df 

输出:

姓名年龄

汤姆 10

尼克 15

七月十四


# hot encoding
hot_Name = pd.get_dummies(df.Name)
X = pd.concat((df[['Age']], hot_Name), axis=1)
X

输出:

年龄 朱莉 尼克 汤姆

10 0 0 1

15 0 1 0

14 1 0 0


# outside data
# initialize list of lists 
data_new = [['michael', 20], ['juli', 45]] 
# Create the pandas DataFrame 
df_new = pd.DataFrame(data_new, columns = ['Name', 'Age']) 
# print dataframe. 
df_new

输出:

姓名年龄

迈克尔 20

七月 45

是否可以像“data”一样对“data_new”进行编码并保存编码器以供以后用于实时传入数据?

在 df_new 的模型中使用的预期热编码:

年龄 朱莉 尼克 汤姆

20 0 0 0

45 1 0 0

标签: pythonmachine-learningone-hot-encoding

解决方案


据我所知,pandas没有公开使用get_dummies. 我会OneHotEncoder直接使用对变量进行编码,然后joblib对其进行序列化。

import joblib
import pandas as pd 
from sklearn.preprocessing import OneHotEncoder

col_names = ['name', 'age']
data = [['tom', 10], ['nick', 15], ['juli', 14]] 

enc = OneHotEncoder(handle_unknown='error')
enc.fit(data)
joblib.dump(enc, 'encoder.joblib')

然后在服务器上:

enc = joblib.load('encoder.joblib')
data_df = pd.DataFrame(data=data, columns=col_names)
enc_df = pd.DataFrame(data=enc.transform(data).toarray(), columns=enc.get_feature_names(col_names), dtype=bool)
df = pd.concat([data_df, enc_df], axis=1)

输出df

|   | name | age | name_juli | name_nick | name_tom | age_10 | age_14 | age_15 |
|---|------|-----|-----------|-----------|----------|--------|--------|--------|
| 0 | tom  | 10  | False     | False     | True     | True   | False  | False  |
| 1 | nick | 15  | False     | True      | False    | False  | False  | True   |
| 2 | juli | 14  | True      | False     | False    | False  | True   | False  |

推荐阅读