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

Posted

技术标签:

【中文标题】如何在 Scikit-Learn 中重用 LabelBinarizer 进行输入预测【英文标题】:How to re-use LabelBinarizer for input prediction in Scikit-Learn 【发布时间】:2018-03-21 05:54:36 【问题描述】:

我使用 Scikit-Learn 训练了一个分类器。我正在加载输入以从 CSV 训练我的分类器。我的一些列(例如“Town”)的值是规范的(例如可以是“New York”、“Paris”、“Stockholm”……)。为了使用这些规范列,我正在使用 Scikit-Learn 的 LabelBinarizer 进行 one-hot encoding

这是我在训练前转换数据的方式:

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】:

只需将lb.transform() 用于已经训练好的lb 模型。

演示:

假设我们有以下火车 DF:

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,不客气!你可以使用MultiLabelBinarizer 哦,我明白了。我虽然 MultiLabelBinarizer 是不同的东西。谢谢,这很有帮助!最后但同样重要的是,没有办法在数据帧的某些列上应用热编码而不丢失其他列(并且必须将它们连接回来)对吗? @Pierre,我不确定我是否理解正确......我建议你用一个小的可重复数据集和你想要的数据集打开一个新问题 - 这将有助于清楚地了解你在追求什么…… 好点。我在这里开了一个新问题:***.com/questions/46675870/…

以上是关于如何在 Scikit-Learn 中重用 LabelBinarizer 进行输入预测的主要内容,如果未能解决你的问题,请参考以下文章

如何在 scikit-learn 中缩放输入 DBSCAN

如何在 scikit-learn(用于计算机视觉)中使用我自己的数据集?

如何在 scikit-learn 中正确加载文本数据?

如何在 scikit-learn 中提取 MultinomialNB Pipeline 训练模型中的单词特征?

如何在 scikit-learn 管道中的 CountVectorizer 之前包含 SimpleImputer?

如何在 scikit-learn 中有效地编码数字目标变量?