引言
这篇文章不涉及很多代码的部分,主要是机器学习处理数据的一些基本概念和流程。写这篇blog的原因是对前一段时间的总结。前一段时间参加阿里天池的贵州交通大数据的比赛,使用了很多机器学习的方法和模型(xgboost 和lightgbm),但是当时只限于知道接口的使用和接口的作用,不了解原理或者知识点很凌乱。所以打算趁着十一的空闲时间把知识点梳理一下。 主要的进度是根据“七月在线”的教程来进行的。接下来开始第一部分,“机器学习的基本流程”。不足的地方以后再补充。
首先有这么一句话,“数据和特征决定了机器学习的上限,而算法和模型只是逼近这个上限而已”,嗯嗯,数据处理和特征工程很重要,大概占据70%的工作量,而模型选择、模型调参、模型融合占据30%的工作量。
接下来看看数据分析的流程:
一、认识数据
- 数据的分布,比如分类问题中,正负样本均衡很重要,即正样本数:负样本数接近1:1比较好。
-
数据的类型
数值型,是否跨度很大,比如[1,10000],这样会导致收敛很慢,常常归一化、标准化; 或者出现“长尾”数据,使用log归一化;或者离散化(把0-100分一类,100-200分类,等等)。
类别性(category),一般使用one-hot编码。
- 数据的维度,比如rgb颜色有三维数据,来表示一个颜色lable。
- 数据是否有缺省值。
二、数据预处理:
- 数据清洗:
- 去除异常值。
- 缺省值过多的特征:丢弃。
- 数据采样:
这个主要针对分类的问题。如果正:负=1:100, 那么很显然,分类结果全判负,正确率就很高,这是由于样本不均衡造成的。
常用的采样方法:这里假设正:负=1:10- 上/下采样:上采样就是把数据集中的正样本重复9遍,加入数据集。下采样道理一样。
数据的分布,比如分类问题中,正负样本均衡很重要,即正样本数:负样本数接近1:1比较好。 - loss权重,损失函数中,增加正样本的权重(这没有实践过)。
- 抽样训练,即把负样本分成10份,每份都和正样本一起训练,所以有10个分类器,最终分类结果就是10个分类器bagging(voting投票)的结果。
- 上/下采样:上采样就是把数据集中的正样本重复9遍,加入数据集。下采样道理一样。
- 可视化:
比如画出二维的图,看看某维数据和label的二维关系图,可以使用scikit-learn中的matplotlib或者tableau。
如果维度很大,可以使用t-sne来可视化。
三、特征工程,这一步最重要,最后附上图:
- 单个特征的预处理:
- 归一化、标准化:数据跨度比较大,不利于收敛。
- log:避免“长尾”数据。
- 类别型数据:one-hot编码。
- 特征有缺失值:按照缺失值的数量多少来处理
- 少:填充。可以用前后值得填充,或者平均数,或者-9999(让模型自己学习缺省值)。
- 中等:特征离散化,缺省值单独作为一个类别。
- 多:丢弃这个特征。
-
特征提取:
(1)数值型
(2)类别型
(3)时间型:这个着重说一下,常见的有如下- 具体的日期,year, month, day, hour, minute, weekday.
- isWeekend, isHoliday
- 离节假日的距离。 比如距离“双十一”的天数,双十一的前一天,双十一的后一天等等。
- 一周内发生了多少次。
- 距离峰值(谷值)的距离。
- 切分时间段,比如“饭点”和“非饭点”。
(4)统计型:分位数、中位数、平均数、std等等。
(5)还有(3)和(4)的组合。
(6)文本型:这个不熟悉。- n-gram,词频。 比如bag of words.
- TF-IDF.
四、建立模型:
xgboost ,lightgbm
五、模型融合:
stacking,有点累,回头再写。