本文简单谈谈机器学习中应该注意的一些问题。仅供大家参考学习和讨论。
1. 特征预处理
机器学习中的输入数据必须是数值类型的,但是现实问题中不免会有一些类别类型的数据,比如性别,颜色,婚姻状况等等,这些类别的数据是无法直接用于机器学习的。那么如何将这类数据转变成数值类型的数据呢?通常可以利用one hot 编码或者标签编码将这类数据变换成数值类型的数据。
比如性别,性别可以分为男,女,这种数据可以利用标签编码来将其变换成数值类型的特征,比如男变换成0,女变换成1。如果性别中还包含未知,或者保密,此时可以将数据通过one hot 编码将其变成四个变量,性别_男,性别_女,性别_未知,性别_保密,这四个变量的取值都是0,1取值的,某个用户的性别属性属于哪种,哪个变量取值就是1,其余变量取值为0。比如某个用户性别为男,那么对应的特征为[性别_男,性别_女,性别_未知,性别_保密]=[1,0,0,0]。
容易看出,如果利用one hot 编码会使得特征个数增加,如果利用标签编码,不会使得特征个数增加,这是因为利用标签编码变换特征时,只是将原来的特征变换为0或者1。
2. 时间序列数据的交叉验证
针对时间序列类型的数据集,交叉验证不能用一般的k折交叉验证或者留一法来验证。这是因为,时间序列类型的数据比较特殊,在某个时间段的特征在另一个时间段不一定具有相同的特征。另外,如果采用采样的方法,有可能导致验证时会在先于训练集中时间点的数据上验证,这种测试是不合理的。
对于时间序列类型的数据,可以利用前向链式策略来验证,比如k折交叉验证:
fold 1 : training [1], test [2]
fold 2 : training [1 2], test [3]
......
fold k : training [1 2 ... k], test [k+1]
其中下标表示时间序列的单位,比如日,月,年等。
3. 缺失值
给定一个数据集,如果其中某个特征中缺失值的比例比较高,处理的方法可以参考以下几种做法。
第一种,将缺失值设为一种特殊类别的数据,将其作为一种特殊情形。
第二种,将相应的特征直接剔除掉。