one-hot编码

为什么要使用onehot编码呢?因为大部分的机器学习模型需要的事连续的特征,特征有可能是分类值时就需要对特征进行处理,数字表示的时候效率就会提高很多,

自然状态码为:000,001,010,011,100,101
独热编码为:000001,000010,000100,001000,010000,100000
这样做的好处主要有:
解决了分类器不好处理属性数据的问题
在一定程度上也起到了扩充特征的作用

eg:
特征ID化:
0 user1
1 user2
2 item1
3 item2
4 item3
5 item4
6 category“18-25”
7 category “26-40”
8 category “40-60”
9 price feature

5 0:1 3:1 6:1 9:20
user1 23 years old 20 dollars on item2

5是target,代表要训练的目标,用户的打分情况,0/1代表用户,2/3/4/5代表item。6-8代表年龄段,9代表价格
eg:
0:1 代表user 1 然后是1;
2:1 代表item1 1;
6:1 代表年龄在18到25岁 1;
9:20 代表花了20块钱;

one-hot编码之后会造成矩阵稀疏的问题:
因为有类别的项目被置1了,剩余项目还是0,比如第一行:
5 0:1 2:1 6:1 9:20→编码之后为 5 0:1 1:0 2:1 3:0 4:0 5:0 6:1 7:0 8:0 9:20
而矩阵的稀疏问题会导致二次项训练不充分,无法达到想要的解,所以通过fm算法,将矩阵分解,计算出隐藏向量,然后计算用户的打分情况。

我们基于python和Scikit-learn写一个简单的例子:
from sklearn import preprocessing
enc = preprocessing.OneHotEncoder()
enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]])
enc.transform([[0, 1, 3]]).toarray()
输出结果:
array([[ 1., 0., 0., 1., 0., 0., 0., 0., 1.]])

你可能感兴趣的:(机器学习算法)