使用 sklearn 进行 LabelEncoder 取回耦合的好方法是什么?
What is the the good way to proceed with LabelEncoder with sklearn to get back the coulples?
我有一个带有分类值的数据框,例如城市名称。
对于ML算法,我需要将数据编码成数值。
我是这样做的:
df[cat_columns] = df[cat_columns].apply(preprocessing.LabelEncoder().fit_transform)
我的问题是,如果我以后想知道编码值 2 对应于哪个城市。
2 可以是例如“巴黎”。
在编码之前,我这样做是为了取回信息:
encoders = {c: preprocessing.LabelEncoder().fit(df[c]) for c in cat_columns}
没用吗?你如何进行?谢谢
LabelEncoder
应该只用于编码您的标签,即您的目标 y
.
要以相同的方式转换分类列,您应该使用 OrdinalEncoder
(however, ordinal encoding might not always be desired - you should look up 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)]
我有一个带有分类值的数据框,例如城市名称。
对于ML算法,我需要将数据编码成数值。
我是这样做的:
df[cat_columns] = df[cat_columns].apply(preprocessing.LabelEncoder().fit_transform)
我的问题是,如果我以后想知道编码值 2 对应于哪个城市。
2 可以是例如“巴黎”。
在编码之前,我这样做是为了取回信息:
encoders = {c: preprocessing.LabelEncoder().fit(df[c]) for c in cat_columns}
没用吗?你如何进行?谢谢
LabelEncoder
应该只用于编码您的标签,即您的目标 y
.
要以相同的方式转换分类列,您应该使用 OrdinalEncoder
(however, ordinal encoding might not always be desired - you should look up 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)]