我有一个带有一些分类列的pandas数据框.其中一些包含非整数值.
我目前想要对这些数据应用几种机器学习模型.对于某些模型,有必要进行标准化以获得更好的结果.例如,将分类变量转换为虚拟/指示变量.实际上,为此目的,熊猫有一个名为get_dummies的函数.但是,此函数根据数据返回结果.因此,如果我在训练数据上调用get_dummies,然后在测试数据上再次调用它,则在两种情况下实现的列可能会有所不同,因为测试数据中的分类列只能包含一个子集/不同的可能值集与可能的值相比较培训数据.
因此,我正在寻找其他方法来进行单热编码.
有什么方法可以在python(pandas/sklearn)中进行一次热编码?
Scikit-learn提供编码器sklearn.preprocessing.LabelBinarizer
.
对于编码训练数据,您可以使用fit_transform,它将发现类别标签并创建适当的虚拟变量.
label_binarizer = sklearn.preprocessing.LabelBinarizer() training_mat = label_binarizer.fit_transform(df.Label)
对于测试数据,您可以使用transform使用相同的类别集.
test_mat = label_binarizer.transform(test_df.Label)
在过去,我发现处理这个问题最简单的方法是使用get_dummies
然后强制列在测试和训练之间匹配.例如,您可能会执行以下操作:
import pandas as pd train = pd.get_dummies(train_df) test = pd.get_dummies(test_df) # get the columns in train that are not in test col_to_add = np.setdiff1d(train.columns, test.columns) # add these columns to test, setting them equal to zero for c in col_to_add: test[c] = 0 # select and reorder the test columns using the train columns test = test[train.columns]
这将丢弃您在训练集中未见过的标签信息,但会强制执行一致性.如果您使用这些拆分进行交叉验证,我建议两件事.首先,get_dummies
对整个数据集进行操作以获取所有列(而不是像上面代码中那样仅在训练集上).其次,使用StratifiedKFold进行交叉验证,以便您的拆分包含相关标签.