我正在尝试使用 scikit-learn 库的回归器/分类器。我对单热编码功能的格式有点困惑,因为我可以将数据帧或 numpy 数组发送到模型。假设我有名为“a”、“b”和“c”的分类特征。我是否应该将它们放在单独的列中(使用 pandas.get_dummies()
),如下所示:
或者像这样(全部合并)
以及如何告诉 scikit-learn 模型这些是单热编码的分类特征?
最佳答案
您不能将包含合并列表的特征直接传递给模型。您应该首先将单热编码到单独的列中:
- 如果您只是想要快速简单的东西,get_dummies适合开发,但我读过的大多数资料通常首选以下方法。
- 如果您想对输入数据进行编码,请使用 OneHotEncoder (OHE) 对一个或多个列进行编码,然后与您的其他功能合并。 OHE 可以很好地控制输出格式、存储中间数据并进行错误处理。适合生产。
- 如果您需要对单个列(通常但不限于标签)进行编码,请使用 LabelBinarizer单热编码具有单个值的列,或使用 MultiLabelBinarizer对具有多个值的列进行一次性编码。
一旦你有了单热编码数据/标签,你就不需要“告诉”模型某些特征是单热的。您只需使用 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)
关于python - scikit-learn 的单热编码特征的格式应该是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69228598/