如何在 Scikit Learn 的分类器中使用 one-hot 编码的标称特征?

数据挖掘 机器学习 scikit-学习 nlp 熊猫
2021-10-12 16:28:35

我正在研究歌曲数据集的流派分类问题。由于流派是一个名义特征,我使用 sklearn 的 LabelBinarizer 为数据集中的每一行获取此特征的 one-hot 编码。然后我留下了一个数据框(df_train_num),它有两列,本质上都是数字,还有一个 Series 对象,其中每一行的值都是一个 numpy 数组——该类型的单热编码。我现在想在这些数据上拟合一个分类器。我所做的是:

svm_classifier = LinearSVC()
svm_classifier.fit(df_train_num,df_train_genre)

这给了我:

ValueError:未知标签类型:“未知”

究竟是什么导致了这个错误?我是否不允许在 中使用带有 DataFrame 对象的 Series 对象来适应分类器?尽管替换df_train_genredf_train_genre.values以便将 numpy 数组直接传递给 fit 方法也不会改变任何内容。同样的错误。

这是两个 pandas 对象的视图:

df_train_num.head(5)

Unique_Word_Count   Sentiment Polarity
157277                  126   0.027766
90109                   114  -0.199545
106224                  16    0.000000
221087                  103  -0.058025
247082                  409  -0.170143

df_train_genre.head(5)

157277    [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...
90109     [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, ...
106224    [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...
221087    [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...
247082    [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...
Name: Genre_Encoded, dtype: object
3个回答

我认为您应该尝试使用 pd.get_dummies 对类别进行编码;这将在数​​据框中创建新列,然后使用该 df 将其传递给分类器。

我使用 sklearn 的 LabelBinarizer 为数据集中的每一行获取此功能的 one-hot 编码。

我认为这可能是错误的。看看这里而是按列执行相同的操作然后我想fit方法应该可以正常工作。

LinearSVC对整数目标进行多类分类;您不需要使用 LabelBinarizer。参见例如https://scikit-learn.org/stable/auto_examples/svm/plot_iris_svc.html (其中 iris.target 在{0,1,2})。