使用 OrdinalEncoder 进行编码:如何将级别作为用户输入?

数据挖掘 机器学习 scikit-学习 数据清理 预处理 编码
2021-10-12 02:13:13

我正在尝试使用以下方法进行序数编码:

from sklearn.preprocessing import OrdinalEncoder

我将尝试用一个简单的数据集来解释我的问题。

X = pd.DataFrame({'animals':['low','med','low','high','low','high']})
enc = OrdinalEncoder()
enc.fit_transform(X.loc[:,['animals']])

array([[1.],
       [2.],
       [1.],
       [0.],
       [1.],
       [0.]])

它按字母顺序标记,但如果我尝试:

enc = OrdinalEncoder(categories=['low','med','high'])
enc.fit_transform(X.loc[:,['animals']])

Shape mismatch: if n_values is an array, it has to be of shape (n_features,).

我不明白。我希望能够决定如何进行标记。

我考虑过这样做:

level_mapping={'low':0,'med':1,'high':2}
X['animals']=data['animals'].replace(level_mapping)

但是,我的数据集中有大量具有相似类别的特征。

谢谢。

1个回答

我不确定你是否知道这一点,但我试图在这个完全相同的问题上找到答案,但在我看来并没有任何好的答案。不过我终于想通了。OrdinalEncoder 能够对数据帧中的多个列进行编码。所以,当你实例化 OrdinalEncoder() 时,你给 categories 参数一个列表列表:

enc = OrdinalEncoder(categories=[list_of_values_cat1, list_of_values_cat2, etc])

具体来说,在上面的示例中,您只需将 ['low', 'med', 'high'] 放在另一个列表中:

end = OrdinalEncoder(categories=[['low', 'med', 'high']])
enc.fit_transform(X.loc[:,['animals']])
>>array([[0.],
         [1.],
         [0.],
         [2.],
         [0.],
         [2.]])
# Now 'low' is correctly mapped to 0, 'med' to 1, and 'high' to 2

要了解如何使用各自的序数值对多个列进行编码,请尝试以下操作:

# Sample dataframe with 2 ordinal categorical columns: 'temp' and 'place'
categorical_df = pd.DataFrame({'my_id': ['101', '102', '103', '104'],
                               'temp': ['hot', 'warm', 'cool', 'cold'], 
                               'place': ['third', 'second', 'first', 'second']})

# In the 'temp' column, I want 'cold' to be 0, 'cool' to be 1, 'warm' to be 2, and 'hot' to be 3
# In the 'place' column, I want 'first' to be 0, 'second' to be 1, and 'third' to be 2
temp_categories = ['cold', 'cool', 'warm', 'hot']
place_categories = ['first', 'second', 'third']

# Now, when you instantiate the encoder, both of these lists go in one big categories list:
encoder = OrdinalEncoder(categories=[temp_categories, place_categories])

encoder.fit_transform(categorical_df[['temp', 'place']])
>>array([[3., 2.],
         [2., 1.],
         [1., 0.],
         [0., 1.]])