LabelEncoder
应该只用于编码你的标签,即你的目标y
。
要以您应该使用的相同方式转换分类列OrdinalEncoder
(但是,可能并不总是需要序数编码 - 您应该查找OneHotEncoder
并确定这是否更适合您的问题)。
让我们使用一个示例数据集来探索正确的转换:
import pandas as pd
df = pd.DataFrame(
{
"country": ["France", "France", "Japan", "Netherlands"],
"city": ["Paris", "Lyon", "Tokyo", "Amsterdam"],
"population": [13024518, 2323221, 37468000, 2480394]
}
)
直接应用于OrdinalEncoder
我们的完整数据集也会导致对数字列进行编码:
>>> from sklearn.preprocessing import OrdinalEncoder
>>> enc = OrdinalEncoder()
>>> enc.fit_transform(df)
array([[0., 2., 2.],
[0., 1., 0.],
[1., 3., 3.],
[2., 0., 1.]])
执行此转换的预期方法是通过使用ColumnTransformer
指定我们要对其执行转换的列:
>>> from sklearn.compose import ColumnTransformer
>>> from sklearn.preprocessing import OrdinalEncoder
>>> ct = ColumnTransformer(
... [("enc", OrdinalEncoder(), ["country", "city"])],
... remainder="passthrough"
... )
>>> ct.fit_transform(df)
array([[0.0000000e+00, 2.0000000e+00, 1.3024518e+07],
[0.0000000e+00, 1.0000000e+00, 2.3232210e+06],
[1.0000000e+00, 3.0000000e+00, 3.7468000e+07],
[2.0000000e+00, 0.0000000e+00, 2.4803940e+06]])
我们可以像这样访问原始类别(注意以下数组中的索引):
>>> ct.named_transformers_["enc"].categories_
[array(['France', 'Japan', 'Netherlands'], dtype=object), array(['Amsterdam', 'Lyon', 'Paris', 'Tokyo'], dtype=object)]