我在使用Scikit-Learn训练分类器。我从CSV文件中加载数据来训练我的分类器。我的一些列(例如’Town’)的值是标准的(例如可以是’New York’、’Paris’、’Stockholm’等)。为了使用这些标准列,我使用Scikit-Learn的LabelBinarizer进行独热编码。
这是我训练前转换数据的方式:
import pandas as pdfrom sklearn.preprocessing import LabelBinarizerheaders = [ '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来创建用于预测的新输入数据的特征向量。特别是,如果新数据中包含已见过的城市(例如New York),它需要在与训练数据中相同的位置进行编码。
如何在新输入数据上重新应用标签二值化?
(我对Scikit-Learn没有强烈感觉,如果有人知道如何使用Pandas的get_dummies方法也可以。)
回答:
只需对已训练的lb
模型使用lb.transform()
即可。
示例:
假设我们有以下训练数据框:
In [250]: dfOut[250]: Town0 New York1 Munich2 Kiev3 Paris4 Berlin5 New York6 Zaporizhzhia
在一部完成拟合(训练)与转换(二值化):
In [251]: r1 = pd.DataFrame(lb.fit_transform(df['Town']), columns=lb.classes_)
得到结果:
In [252]: r1Out[252]: Berlin Kiev Munich New York Paris Zaporizhzhia0 0 0 0 1 0 01 0 0 1 0 0 02 0 1 0 0 0 03 0 0 0 0 1 04 1 0 0 0 0 05 0 0 0 1 0 06 0 0 0 0 0 1
lb
现在已经针对df
中出现的这些城市进行了训练
现在我们可以使用已训练的lb
模型对新数据集进行二值化(使用lb.transform()):
In [253]: newOut[253]: Town0 Munich1 New York2 Dubai # <--- 新(未训练)的城市In [254]: r2 = pd.DataFrame(lb.transform(new['Town']), columns=lb.classes_)In [255]: r2Out[255]: Berlin Kiev Munich New York Paris Zaporizhzhia0 0 0 1 0 0 01 0 0 0 1 0 02 0 0 0 0 0 0