【发布时间】:2020-04-28 12:03:16
【问题描述】:
假设我有这样的火车:
Name | day
------------
First | 0
Second | 1
Third | 1
Forth | 2
还有一个不包含所有这些名称或日期的测试集。像这样:
Name | day
------------
First | 2
Second | 1
Forth | 0
我有以下代码来转换编码特征中的这些列:
features_to_encode = ['Name', 'day']
label_final = pd.DataFrame()
for feature in features_to_encode:
label_campaign = LabelBinarizer()
label_results = label_campaign.fit_transform(df[feature])
label_results = pd.DataFrame(label_results, columns=label_campaign.classes_)
label_final = pd.concat([label_final, label_results], axis=1)
df_encoded = label_final.join(df)
在火车上产生以下输出(效果很好):
First | Second | Third | Forth | 0 | 1 | 2 |
-----------------------------------------------
1 | 0 | 0 | 0 | 1 | 0 | 0 |
0 | 1 | 0 | 0 | 0 | 1 | 0 |
0 | 0 | 1 | 0 | 0 | 1 | 0 |
0 | 0 | 0 | 1 | 0 | 0 | 1 |
但是,当我在测试数据(新数据)上运行此程序时,如果测试数据不包含与训练数据完全相同的名称和日期,我会得到不匹配的特征。所以如果我在这个测试样本上运行类似的代码,我会得到:
First | Second | Forth | 0 | 1 | 2 |
--------------------------------------
1 | 0 | 0 | 0 | 0 | 1 |
0 | 1 | 0 | 0 | 1 | 0 |
0 | 0 | 1 | 1 | 0 | 0 |
我可以做些什么来保留来自训练数据的相同转换并将其正确应用于测试数据,从而产生这个所需的输出:
First | Second | Third | Forth | 0 | 1 | 2 |
-----------------------------------------------
1 | 0 | 0 | 0 | 0 | 0 | 1 |
0 | 1 | 0 | 0 | 0 | 1 | 0 |
0 | 0 | 0 | 1 | 1 | 0 | 0 |
我已经尝试添加一个 dict 来捕获 fit_transform 结果,但我不确定这是否有效或之后如何处理:
features_to_encode = ['Name', 'day']
label_final = pd.DataFrame()
labels = {}--------------------------------------------------------------------> TRIED THIS
for feature in features_to_encode:
label_campaign = LabelBinarizer()
label_results = label_campaign.fit_transform(df[feature])
labels[feature] = label_results--------------------------------------------> WITH THIS
label_results = pd.DataFrame(label_results, columns=label_campaign.classes_)
label_final = pd.concat([label_final, label_results], axis=1)
df_encoded = label_final.join(df)
感谢任何帮助。谢谢=)
【问题讨论】:
-
训练和测试数据是在不同时间产生的吗?在这种情况下,您可以在拆分之前创建这些列。无论如何,在更真实的场景中,我通常会创建一个名为
normalize_X的函数,在其中检查测试集中缺失的列并将它们添加为 0,并删除训练集中不存在的列。 -
是的,这应该在生产环境中运行,其中测试数据从不同的来源收集并以完全相同的原始格式出现。预处理应该是相同的,因为我训练了 XGBoost,并且必须在类似的数据集上进行预测。
标签: python pandas encoding scikit-learn one-hot-encoding