【问题标题】:What should be the format of one-hot-encoded features for scikit-learn?scikit-learn 的 one-hot-encoded 特征的格式应该是什么?
【发布时间】:2021-11-12 15:17:38
【问题描述】:

我正在尝试使用 scikit-learn 库的回归器/分类器。我对单热编码特征的格式有点困惑,因为我可以将数据帧或 numpy 数组发送到模型。假设我有名为“a”、“b”和“c”的分类特征。我是否应该将它们放在单独的列中(使用pandas.get_dummies()),如下所示:

a b c
1 1 1
1 0 1
0 0 1

或者像这样(全部合并)

merged
1,1,1
1,0,1
0,0,1

以及如何告诉 scikit-learn 模型这些是 one-hot-encoded 分类特征?

【问题讨论】:

    标签: python python-3.x scikit-learn one-hot-encoding


    【解决方案1】:

    您不能将包含合并列表的特征直接传递给模型。您应该先将 one-hot 编码到单独的列中:

    • 如果您只是想要快速简单的东西,get_dummies 非常适合开发,但我读过的大多数资料通常都首选以下方法。
    • 如果要对输入数据进行编码,请使用OneHotEncoder (OHE) 对一列或多列进行编码,然后与其他特征合并。 OHE 可以很好地控制输出格式、存储中间数据并进行错误处理。适合生产。
    • 如果您需要对单个列进行编码,通常但不限于标签,请使用LabelBinarizer 对具有单个值的列进行一次热编码,或使用MultiLabelBinarizer 对具有多个值的列进行一次热编码.

    一旦您拥有 one-hot 编码数据/标签,您就无需“告诉”模型某些功能是 one-hot。您只需使用 clf.fit(X_train, y_train) 在数据集上训练模型并使用 clf.predict(X_test) 进行预测。

    OHE 示例

    from sklearn.preprocessing import OneHotEncoder
    import pandas as pd
    
    X = [['Male', 1], ['Female', 3], ['Female', 2]]
    ohe = OneHotEncoder(handle_unknown='ignore')
    X_enc = ohe.fit_transform(X).toarray()
    
    # Convert to dataframe if you need to merge this with other features:
    df = pd.DataFrame(X_enc, columns=ohe.get_feature_names())
    

    MLB 示例

    from sklearn.preprocessing import MultiLabelBinarizer
    import pandas as pd
    
    df = pd.DataFrame({
       'style': ['Folk', 'Rock', 'Classical'],
       'instruments': [['guitar', 'vocals'], ['guitar', 'bass', 'drums', 'vocals'], ['piano']]
    })
    
    mlb = MultiLabelBinarizer()
    encoded = mlb.fit_transform(df['instruments'])
    encoded_df = pd.DataFrame(encoded, columns=mlb.classes_, index=df['instruments'].index)
    
    # Drop old column and merge new encoded columns
    df = df.drop('instruments', axis=1)
    df = pd.concat([df, encoded_df], axis=1, sort=False)
    

    【讨论】:

    • MultiLabelBinarizer() 怎么样?
    • @MehmedB MLB 用于对标签进行编码。为了更清楚,我将 MLB 添加到我的答案中。如果您还有问题,请告诉我。如果您想更具体,请在您的问题中添加代码示例。
    • 那么,最后,这是否意味着我可以发送一个 DataFrame,其中分类特征(单热编码)是否在单独的列中(对于 sklearn 模型)?还是我必须发送一个热编码数组(每一行合并成一个数组而不是单独的列)
    • 它们需要在单独的列中进行一次热编码,并与您拥有的任何其他特征合并(对于输入矩阵X)。如果您对标签 (y) 进行一次性编码,那么您可以在 fit(X, y) 方法中传递在单独列中编码的标签(无需合并到您的特征矩阵,因为标签是在单独的参数中传递的)。
    猜你喜欢
    • 2016-03-02
    • 2016-10-08
    • 2019-10-28
    • 2019-10-20
    • 2016-02-25
    • 2018-02-24
    • 2016-12-18
    • 2020-05-25
    • 2018-06-01
    相关资源
    最近更新 更多