scikit-learn 的单热编码特征的格式应该是什么?

What should be the format of one-hot-encoded features for scikit-learn?

我正在尝试使用 scikit-learn 库的 regressor/classifiers。我对单热编码功能的格式有点困惑,因为我可以将数据帧或 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 模型这些是单热编码的分类特征?

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

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

一旦你有了 one-hot 编码 data/labels,你不需要“告诉”模型某些特征是 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)