【问题标题】:One-Hot Encoding of label not needed?不需要标签的 One-Hot 编码?
【发布时间】:2020-11-04 18:07:32
【问题描述】:

我正在尝试理解经典虹膜分类问题的指导教程中的代码块。

最终模型的代码块如下

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 One-Hot Encoded 编码到不同的二进制列中,该模型是如何工作的?我从其他教程的理解是,对于多类分类,我需要先进行一次热编码。

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

【问题讨论】:

    标签: python machine-learning classification one-hot-encoding multilabel-classification


    【解决方案1】:

    我认为您可能会将multiclass(您的情况)与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')
    

    【讨论】:

    • 这是完美的@yatu。正如我所理解的 - SVC 可以处理分类输出,但还有其他分类器确实需要输出为 OneHotEncoded?我正在考虑一个基本的 FNN。
    • 否 @ArvindRaghavan ,对于多类分类,对于其他模型,您通常必须使用 LabelEncoder,它将类编码为整数而不是 OneHotEncoder
    【解决方案2】:

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

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

    【讨论】:

    • 对于分类问题,需要将目标变量编码为数字形式,可以是一种热编码,也可以是数字形式。 SVC 可以处理分类值,因为它在内部对它们进行编码。但一般情况下,您需要对目标进行编码。
    猜你喜欢
    • 2021-08-05
    • 2020-07-18
    • 2021-12-13
    • 1970-01-01
    • 2020-10-08
    • 2017-07-27
    • 1970-01-01
    • 2019-09-07
    • 2018-05-09
    相关资源
    最近更新 更多