不需要标签的一次性编码?

One-Hot Encoding of label not needed?

我正在尝试理解 classic Iris 分类问题的指导教程中的代码块。

最终模型的代码块如下

chosen_model = SVC(gamma='auto')
chosen_model.fit(X_train,Y_train)
predictions = chosen_model.predict(X_valid)

在 this image 中,您可以看到 X_train 和 Y_train 中存在的数据类型。这些是 Numpy 数组。 Y_train 包含 Iris 物种作为字符串。

我的问题很简单:即使我没有将 Y_train 单热编码到不同的二进制列中,为什么模型仍然有效?我对其他教程的理解是,对于 multi-class classification,我需要先进行 one-hot 编码。

代码运行良好,我想掌握何时需要 One-Hot Encode 以及何时不需要。谢谢!

据我所知,从未对输出进行过一次热编码。您需要对一个特征进行一次热编码,这样模型就不会混淆某些颜色大于其他颜色。当您计算输出时,模型使用基于 类 的概率分布。所以这里不会有任何问题。

简而言之,您应该只对输入特征而不是输出特征进行一次热编码 类。

我认为您可能混淆了 multiclass (your case) with a multioutput 分类。

在多类分类问题中,您的输出应该只是一个目标列,您将训练模型在该列的 类 中进行分类。你必须分成单独的目标列,在这种情况下你必须预测 n 不同的 类 每个样本 ,但事实并非如此,你只想要每个样本的目标之一。

因此对于多类分类,不需要对目标进行 OneHotEncode,因为您只需要一个目标列(在 SVC 中也可以是分类的)。您 必须使用 OneHotEncoder 或其他一些编码器进行编码的是 分类 输入特征,它必须是数字.

此外,SVC 可以处理分类目标,因为它 LabelEncode 在内部是它们:

from sklearn.datasets import load_iris
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split

X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y)
y_train_categorical = load_iris()['target_names'][y_train]
# array(['setosa', 'setosa', 'versicolor',...

sv = SVC()
sv.fit(X_train, y_train_categorical)
sv.classes_
# array(['setosa', 'versicolor', 'virginica'], dtype='<U10')