如何在Scikit-Learn中重新使用LabelBinarizer进行输入预测

4
我使用Scikit-Learn训练了一个分类器。我正在从CSV文件中加载输入以训练我的分类器。一些列的值(例如'Town')是规范化的(例如可以是'New York','Paris','Stockholm'等)。为了使用这些规范化的列,我使用Scikit-Learn中的LabelBinarizer进行独热编码。以下是在训练之前我如何转换数据的方式:
import pandas as pd
from sklearn.preprocessing import LabelBinarizer

headers = [ 
    'Ref.', 'Town' #,...
]

df = pd.read_csv("/path/to/some.csv", header=None, names=headers, na_values="?")

lb = LabelBinarizer()
lb_results = lb.fit_transform(df['Town'])

然而,我不清楚如何使用LabelBinarizer来创建特征向量并对新输入数据进行预测。特别是,如果新数据包含已知城镇(例如纽约),则需要将其编码到与训练数据中相同的位置。 如何在新输入数据上重新应用标签二值化? (我对Scikit-Learn没有强烈的感觉,如果有人知道如何使用Pandas的get_dummies方法做到这一点,也可以。)
1个回答

4

只需使用lb.transform()即可使用已经训练好的lb模型。

演示:

假设我们有以下训练数据框:

In [250]: df
Out[250]:
           Town
0      New York
1        Munich
2          Kiev
3         Paris
4        Berlin
5      New York
6  Zaporizhzhia

一步完成模型拟合和二值化转换:

In [251]: r1 = pd.DataFrame(lb.fit_transform(df['Town']), columns=lb.classes_)

输出:

In [252]: r1
Out[252]:
   Berlin  Kiev  Munich  New York  Paris  Zaporizhzhia
0       0     0       0         1      0             0
1       0     0       1         0      0             0
2       0     1       0         0      0             0
3       0     0       0         0      1             0
4       1     0       0         0      0             0
5       0     0       0         1      0             0
6       0     0       0         0      0             1

lb现在已经针对我们在df中拥有的城镇进行了训练。

现在,我们可以使用训练好的lb模型对新的数据集进行二元化(使用lb.transform()函数):

In [253]: new
Out[253]:
       Town
0    Munich
1  New York
2     Dubai  # <--- new (not trained) town

In [254]: r2 = pd.DataFrame(lb.transform(new['Town']), columns=lb.classes_)

In [255]: r2
Out[255]:
   Berlin  Kiev  Munich  New York  Paris  Zaporizhzhia
0       0     0       1         0      0             0
1       0     0       0         1      0             0
2       0     0       0         0      0             0

非常感谢。这正是我在寻找的。您是否还知道一种同时对多列进行热编码的方法?或者我们需要进行多次热编码,然后将结果矩阵/数据框连接在一起吗? - Pierre-Antoine
1
@Pierre,欢迎您!您可以使用MultiLabelBinarizer - MaxU - stand with Ukraine
哦,我明白了。我以为MultiLabelBinarizer是另一种东西。谢谢,这非常有帮助!最后但并非最不重要的,没有办法对数据框中的某些列应用热编码而不失去其他列(并且必须将它们连接回来),对吗? - Pierre-Antoine
@Pierre,我不确定我是否正确理解了你的意思...我建议你打开一个新问题,并提供一个小的可重现数据集和你所需的数据集 - 这将有助于清楚地理解你想要什么... - MaxU - stand with Ukraine
好的,我在这里开了一个新问题:https://dev59.com/7aXja4cB1Zd3GeqPXdm3 - Pierre-Antoine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接