本部分仅介绍数值类特征的one-hot,关于文本的one-hot请参考上一部分。
数值one-hot可以使用pandas.cut()和get_dummies()或者sklearn.OnehotEncoder。
此外,skearn的preprocessing.KBinsDiscretizer类和Binarizer类也可以用于数值分箱。
pandas方式
基本思路是先使用cut()对数值进行分箱,分箱后使用get_dummies()得到onehot值。API:
https://pandas.pydata.org/docs/reference/api/pandas.cut.html?highlight=cut#pandas.cut
https://pandas.pydata.org/docs/reference/api/pandas.get_dummies.html
我们先对数据进行分箱:
我们这里使用的是指定分隔值的方式,还可以简单的指定平均分成N个等分等,详见cut()的API。
lst = np.arange(0,100, 3)
print(lst)
[ 0 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69
72 75 78 81 84 87 90 93 96 99]
lst_bins = pd.cut(lst, [-1,10,50,100])
print(lst_bins)
[(-1, 10], (-1, 10], (-1, 10], (-1, 10], (10, 50], ..., (50, 100], (50, 100], (50, 100], (50, 100], (50, 100]]
Length: 34
Categories (3, interval[int64]): [(-1, 10] < (10, 50] < (50, 100]]
我们看一下每个区间的数量:
print(pd.value_counts(lst_bins))
(50, 100] 17
(10, 50] 13
(-1, 10] 4
dtype: int64
但这样分箱后不是很适合阅读,所以我们可以加上标签:
lst_bins = pd.cut(lst, [-1,10,50,100], labels=['1','2','3'])
print(lst_bins)
['1', '1', '1', '1', '2', ..., '3', '3', '3', '3', '3']
Length: 34
Categories (3, object): ['1' < '2' < '3']
我们还可以简单的将数据分箱成N份:
lst_bins2 = pd.cut(lst, 5, labels=['1