我有多个由类别变量组成的列,这些变量的形式为0-4之间的整数值。但是,所有列都属于同一类别。我尝试使用scikit learning中的OneHotEncoder,但是它不能解决列中缺少的类别,当在我的神经网络模型上测试看不见的数据时,这会引起问题。下面的代码显示了我需要编码的数据类型
>>> df = pd.DataFrame(np.random.randint(low=0, high=4, size=(5, 5)),
columns=['color1', 'color2', 'color3', 'color4', 'color5'])
>>> df
color1 color2 color3 color4 color5
0 0 1 2 3 1
1 3 1 0 1 1
2 0 1 0 3 0
3 0 2 0 1 2
4 0 2 0 3 2
>>> df_onehotencoder = OneHotEncoder(sparse=False)
>>> df2 = df_onehotencoder.fit_transform(df)
>>> df2
array([[1., 0., 1., 0., 0., 1., 0., 1., 0., 1., 0.],
[0., 1., 1., 0., 1., 0., 1., 0., 0., 1., 0.],
[1., 0., 1., 0., 1., 0., 0., 1., 1., 0., 0.],
[1., 0., 0., 1., 1., 0., 1., 0., 0., 0., 1.],
[1., 0., 0., 1., 1., 0., 0., 1., 0., 0., 1.]])
这仅针对该列中存在的类别而不是缺少的类别为每个列生成并排列。我需要为每一列使用相等数量的编码列,即缺少的类别将全为零。另外,解码此OneHotEncoded数组的最佳选择是什么,这样我就可以轻松地将预测的输出解码为实际的整数值。
答案 0 :(得分:1)
从sklearn==0.20
开始,OneHotEncoder具有categories
参数,您可以在其中提供列表列表以及给定列的所有可能值。
import pandas as pd
df = pd.DataFrame([[0, 1, 2, 3, 1],
[3, 1, 0, 1, 1],
[0, 1, 0, 3, 0],
[0, 2, 0, 1, 2],
[0, 2, 0, 3, 2]], columns=['color1', 'color2', 'color3', 'color4', 'color5'])
from sklearn.preprocessing import OrdinalEncoder, OneHotEncoder
# Get all the unique values if we don't have them
unique_values = pd.unique(df.values.ravel())
ohe = OneHotEncoder(categories=[unique_values]*len(df), sparse=False)
encoded = pd.DataFrame(ohe.fit_transform(
df), columns=ohe.get_feature_names(df.columns))
>>> encoded
color1_0 color1_1 color1_2 color1_3 color2_0 color2_1 0
0 1.0 0.0 0.0 0.0 0.0 1.0 ...
1 0.0 0.0 0.0 1.0 0.0 1.0 ...
2 1.0 0.0 0.0 0.0 0.0 1.0 ...
3 1.0 0.0 0.0 0.0 0.0 0.0 ...
4 1.0 0.0 0.0 0.0 0.0 0.0 ...
要恢复原始班级,您可以执行inverse_transform
:
>>> ohe.inverse_transform(encoded)
array([[0, 1, 2, 3, 1],
[3, 1, 0, 1, 1],
[0, 1, 0, 3, 0],
[0, 2, 0, 1, 2],
[0, 2, 0, 3, 2]], dtype=int64)