2017-10-09 52 views
3

我使用Scikit-Learn培训了一个分类器。我正在加载输入以从CSV中训练我的分类器。我的一些专栏(例如'Town')的价值是规范的(例如可以是'纽约','巴黎','斯德哥尔摩',...)。为了使用这些规范列,我正在使用Scikit-Learn的LabelBinarizer进行单热编码如何在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,了解一种强烈的感觉,如果有人知道如何与大熊猫get_dummies方法是罚款也做到这一点。)

回答

3

只需使用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 
+0

非常感谢。这正是我所期待的。你是否也知道在同一时间对几列进行热编码的方法?或者我们需要做几次热编码并将结果矩阵/数据帧连接在一起? –

+1

@皮尔,欢迎您!你可以使用[MultiLabelBinarizer](http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.MultiLabelBinarizer.html) – MaxU

+0

哦,我明白了。我虽然MultiLabelBinarizer是不同的。谢谢,这非常有帮助! 最后但并非最不重要的是,没有办法将热门编码应用于数据框的某些列,而不会丢失其他列(并且必须将它们连接回去)。 –

相关问题