2

嘿,

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

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

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

最好的问候,兰阮

4

2 回答 2

3

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

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

一种简单的解决方案是放弃astype('int8')转换:

df['city_enc'] = LabelEncoder().fit_transform(df['City']) # defaults to 'int64'
于 2021-07-01T12:15:23.153 回答
2

您的问题是转换为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或以上作为替代方案。

于 2021-07-01T12:15:14.720 回答