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)
我正在尝试使用 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)