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'
嘿,
我的数据集中的“城市”列中有不同的城市名称。我很乐意使用 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'