one-hot使用体会
2017-12-03 20:31
351 查看
在很多机器学习任务中,特征并不总是连续值,而有可能是分类值。比如星期类型,有星期一、星期二、……、星期日,比如浏览器类型有["uses Firefox", "uses
Chrome", "uses Safari", "uses Internet Explorer"]。
对于这些离散型特征,可以用几个数字表示特征值,如用1表示星期一,2表示星期二;也可以用one-hot编码,如用[1,0,0,0,0,0,0]表示星期一,[0,1,0,0,0,0,0]表示星期二。
那什么情况用one-hot编码,什么情况可以不用呢?事实上,之所以用one-hot编码,是为了更合理地计算欧式距离。比如,有一个离散型特征,代表工作类型,该离散型特征,共有三个取值,不使用one-hot编码,其表示分别是x_1 = (1), x_2 = (2), x_3 = (3)。两个工作之间的距离是,(x_1, x_2) = 1, d(x_2, x_3) = 1, d(x_1, x_3) = 2。那么x_1和x_3工作之间就越不相似吗?显然这样的表示,计算出来的特征的距离是不合理。那如果使用one-hot编码,则得到x_1
= (1, 0, 0), x_2 = (0, 1, 0), x_3 = (0, 0, 1),那么两个工作之间的距离就都是sqrt(2).即每两个工作之间的距离是一样的,显得更合理。
对于离散型特征,基于树的方法是不需要使用one-hot编码的,例如随机森林等。基于距离的模型,都是要使用one-hot编码,例如神经网络等。
以下做个实验说明:
一个数据如下,这是对星期类型采用[1,2,3,4,5,6,7]进行编码的方式:
@relation 'day'
@attribute day numeric
@attribute class numeric
@data
1,1100
2,1200
3,1300
4,1400
5,1800
6,2000
7,1800
1,1100
2,1200
3,1300
4,1400
5,1800
6,2000
7,1800
……
在weka中用随机森林RandomForest算法建模,用默认的参数,并进行10折交叉验证的结果如下:
Correlation coefficient 1
Mean absolute error 0
Root mean squared error 0
Relative absolute error 0 %
Root relative squared error 0 %
Total Number of Instances 210
可以看出,误差为0。
在weka中用BP神经网络MultilayerPerceptron建模,用默认的参数,并进行10折交叉验证的结果如下:
Correlation coefficient 0.9645
Mean absolute error 71.9842
Root mean squared error 85.2536
Relative absolute error 23.7056 %
Root relative squared error 26.3015 %
Total Number of Instances 210
可以看出,误差比较高。
换one-hot编码的数据如下:
@relation 'day'
@attribute day1 numeric
@attribute day2 numeric
@attribute day3 numeric
@attribute day4 numeric
@attribute day5 numeric
@attribute day6 numeric
@attribute day7 numeric
@attribute class numeric
@data
1,0,0,0,0,0,0,1100
0,1,0,0,0,0,0,1200
0,0,1,0,0,0,0,1300
0,0,0,1,0,0,0,1400
0,0,0,0,1,0,0,1800
0,0,0,0,0,1,0,2000
0,0,0,0,0,0,1,1800
1,0,0,0,0,0,0,1100
0,1,0,0,0,0,0,1200
0,0,1,0,0,0,0,1300
0,0,0,1,0,0,0,1400
0,0,0,0,1,0,0,1800
0,0,0,0,0,1,0,2000
0,0,0,0,0,0,1,1800
……
在weka中用随机森林RandomForest算法建模,用默认的参数,并进行10折交叉验证的结果如下:
Correlation coefficient 1
Mean absolute error 0
Root mean squared error 0
Relative absolute error 0 %
Root relative squared error 0 %
Total Number of Instances 210
可以看出,误差为0。
在weka中用BP神经网络MultilayerPerceptron建模,用默认的参数,并进行10折交叉验证的结果如下:
Correlation coefficient 1
Mean absolute error 0
Root mean squared error 0
Relative absolute error 0 %
Root relative squared error 0 %
Total Number of Instances 210
可以看出,误差为0。
所以,在基于距离的模型中,对于离散型特征,应该采用one-hot编码方式,而且对于很多神经网络模型,能够很好地处理稀疏特征的情况。
Chrome", "uses Safari", "uses Internet Explorer"]。
对于这些离散型特征,可以用几个数字表示特征值,如用1表示星期一,2表示星期二;也可以用one-hot编码,如用[1,0,0,0,0,0,0]表示星期一,[0,1,0,0,0,0,0]表示星期二。
那什么情况用one-hot编码,什么情况可以不用呢?事实上,之所以用one-hot编码,是为了更合理地计算欧式距离。比如,有一个离散型特征,代表工作类型,该离散型特征,共有三个取值,不使用one-hot编码,其表示分别是x_1 = (1), x_2 = (2), x_3 = (3)。两个工作之间的距离是,(x_1, x_2) = 1, d(x_2, x_3) = 1, d(x_1, x_3) = 2。那么x_1和x_3工作之间就越不相似吗?显然这样的表示,计算出来的特征的距离是不合理。那如果使用one-hot编码,则得到x_1
= (1, 0, 0), x_2 = (0, 1, 0), x_3 = (0, 0, 1),那么两个工作之间的距离就都是sqrt(2).即每两个工作之间的距离是一样的,显得更合理。
对于离散型特征,基于树的方法是不需要使用one-hot编码的,例如随机森林等。基于距离的模型,都是要使用one-hot编码,例如神经网络等。
以下做个实验说明:
一个数据如下,这是对星期类型采用[1,2,3,4,5,6,7]进行编码的方式:
@relation 'day'
@attribute day numeric
@attribute class numeric
@data
1,1100
2,1200
3,1300
4,1400
5,1800
6,2000
7,1800
1,1100
2,1200
3,1300
4,1400
5,1800
6,2000
7,1800
……
在weka中用随机森林RandomForest算法建模,用默认的参数,并进行10折交叉验证的结果如下:
Correlation coefficient 1
Mean absolute error 0
Root mean squared error 0
Relative absolute error 0 %
Root relative squared error 0 %
Total Number of Instances 210
可以看出,误差为0。
在weka中用BP神经网络MultilayerPerceptron建模,用默认的参数,并进行10折交叉验证的结果如下:
Correlation coefficient 0.9645
Mean absolute error 71.9842
Root mean squared error 85.2536
Relative absolute error 23.7056 %
Root relative squared error 26.3015 %
Total Number of Instances 210
可以看出,误差比较高。
换one-hot编码的数据如下:
@relation 'day'
@attribute day1 numeric
@attribute day2 numeric
@attribute day3 numeric
@attribute day4 numeric
@attribute day5 numeric
@attribute day6 numeric
@attribute day7 numeric
@attribute class numeric
@data
1,0,0,0,0,0,0,1100
0,1,0,0,0,0,0,1200
0,0,1,0,0,0,0,1300
0,0,0,1,0,0,0,1400
0,0,0,0,1,0,0,1800
0,0,0,0,0,1,0,2000
0,0,0,0,0,0,1,1800
1,0,0,0,0,0,0,1100
0,1,0,0,0,0,0,1200
0,0,1,0,0,0,0,1300
0,0,0,1,0,0,0,1400
0,0,0,0,1,0,0,1800
0,0,0,0,0,1,0,2000
0,0,0,0,0,0,1,1800
……
在weka中用随机森林RandomForest算法建模,用默认的参数,并进行10折交叉验证的结果如下:
Correlation coefficient 1
Mean absolute error 0
Root mean squared error 0
Relative absolute error 0 %
Root relative squared error 0 %
Total Number of Instances 210
可以看出,误差为0。
在weka中用BP神经网络MultilayerPerceptron建模,用默认的参数,并进行10折交叉验证的结果如下:
Correlation coefficient 1
Mean absolute error 0
Root mean squared error 0
Relative absolute error 0 %
Root relative squared error 0 %
Total Number of Instances 210
可以看出,误差为0。
所以,在基于距离的模型中,对于离散型特征,应该采用one-hot编码方式,而且对于很多神经网络模型,能够很好地处理稀疏特征的情况。
相关文章推荐
- tf.one_hot()使用
- pandas使用get_dummies进行one-hot编码的方法
- 使用numpy生成one_hot
- 使用Flask-Login实现token验证和超时失效使用体会
- c#学习体会:使用 ref 和 out 传递数组(downmoon)
- 第一次使用CSDN 心得体会
- 自己对C++虚函数使用的深刻体会,以及覆写,重载的区别?
- video4linux(v4l)使用摄像头的实例基础教程与体会
- 使用hibernate lazy机制的一点体会
- video4linux(v4l)使用摄像头的实例基础教程与体会
- Hibernate的onetomany和manytoone联合使用(十八)
- 使用mxnet时遇到的问题Operator _zeros cannot be run; requires at least one of FCompute<xpu>......
- (转)抓包工具Wireshark使用体会
- 今日体会之JTabbedPane的使用和JFrame的透明化方法
- ComponentOne WebChart的使用
- tf.one_hot 实例
- 关于ASP.NET中使用MasterPage和PageBase页面基类的一些体会
- 链式调用使用体会
- Ubuntu LTS 系统学习使用体会和实用工具软件汇总 6.04 8.04 10.04 12.04 14.04 16.04
- Linux内存使用的体会