LabelEncoder().fit_transform 给我负值?

LabelEncoder().fit_transform gives me negative values?

嘿,

我的数据集中的“城市”列中有不同的城市名称。我很乐意使用 LabelEncoder() 对其进行编码。但是,我得到了非常令人沮丧的负值结果

df['city_enc'] = LabelEncoder().fit_transform(df['City']).astype('int8')

新的 city_enc 列给出了从 -128 到 127 的值。我不明白为什么 LabelEncoder().fit_transform 给出负值?我希望它会给出从 0 到 (n-1) 的值。谁能给我解释一下?

此致, 兰阮

您的问题是类型 int8 的转换,它只能对值 -128 到 127 进行编码。检查此示例:

import pandas as pd
from sklearn.preprocessing import LabelEncoder


df = pd.DataFrame({
    'City': [i for i in range(129)]
})

le = LabelEncoder()

案例 1:

df['City_enc1'] = le.fit_transform(df['City'])
print(df['City_enc1'])

>>> 0        0
1        1
2        2
3        3
4        4
      ... 
124    124
125    125
126    126
127    127
128    128
Name: City_enc1, Length: 129, dtype: int64

案例二:

df['City_enc2'] = le.fit_transform(df['City']).astype('int8')
print(df['City_enc2'])

>>> 0        0
1        1
2        2
3        3
4        4
      ... 
124    124
125    125
126    126
127    127
128   -128
Name: City_enc2, Length: 129, dtype: int8

看到由于第二种情况的转换,LabelEncoder不得不使用负值。

最好完全不转换或选择 int16 或更高版本作为替代方案。

很可能这是因为您正在尝试对超过 128 (0 ... 127) 个不同的城市进行编码(您可以使用 len(df['City'].unique()) 进行检查)。

当您随后强制转换为 int8 时,您最终会得到负值,以确保所有标签都是不同的。使用 int8 你有 256 个不同的值 (-128 ... 127)。例如,如果您将 129 个不同的值编码为 int8,您将使用所有 0 ... 127 个正值,并且将为一项分配标签 -128.

一个简单的解决方案是只删除 astype('int8') 转换:

df['city_enc'] = LabelEncoder().fit_transform(df['City']) # defaults to 'int64'