第一步:识别问题
- 回归
- 分类(二分类,多分类,多标签)
- 排序
- 混合体(分类+回归)
第二步:探索数据
1.描述性统计
- shape:查看数据的形状
- head:查看数据本身
- info:简单描述,总行数,空值或者数据类型
- value_counts:分类的时候用得多,查看类别的个数
- describe:简单的描述性表述,最大值,最小值,平均值等
- corr(method = 'pearson'):查看列之间的相关性
- skew:通过分析数据的高斯分布来确认数据的偏离情况
2.可视化
- 绘制每个属性的直方图,一般横轴表示数据类型,纵轴表示分布情况
3.步骤
①读取并分析数据质量
②探索性分析每个变量
- 变量是什么类型
- 变量是否有缺失值
- 变量是否有异常值
- 变量是否有重复值
- 变量是否均匀
- 变量是否需要转换
③探索性分析变量与target标签的关系
- 变量与标签是否存在相关性
- 变量与标签是否存在业务逻辑
④变量与标签是否存在业务逻辑
- 连续型变量与连续型变量
- 离散变量与离散变量
- 检查变量之间的正态性
⑤结论
- 变量是否需要筛选,替换和清洗
- 变量是否需要转换
- 变量之间是否需要交叉
- 变量是否需要采样
第三步:数据预处理:数据清洗,数据集成,数据规约和数据变换
1.数据清洗
①八大场景
- 删除多列
- 更改数据类型
- 将分类变量转换成数字变量
- 检查缺失数据(一般为nan)
- 删除列中的字符串
- 删除列中的空格
- 用字符串连接两列(带条件)
- 转换时间戳(从字符串到日期时间格式)
②缺失值处理
- 删除变量:缺失率大于80%
- 定值填充:常用-9999替代
- 统计量填充:数据符合均匀分布时用均值填补,倾斜分布时用中位数填补
- 模型填充:随机森林
③异常值处理
- 根据数量和影响,考虑是否删除
- log变换
- 平均值或中位数替代
- 树模型对异常值鲁棒性较好,不影响模型训练效果
④噪声处理
- 对数据进行分箱操作,等频或等宽分箱,然后用每个箱的平均数,中位数或者边界值(不同的分布,处理方法不同)代替箱中的所有的数,起到平滑数据的作用
- 建立该变量和预测变量的回归模型,根据回归系数和预测变量,反解出自变量的近似值
⑤步骤
- 数据获取:使用read_csv或者read_excel
- 数据探索:使用shape,describe或者info
- 行列操作:使用loc或者iloc函数
- 数据整合:对不同数据源进行整理
- 数据类型转换:对不同字段数据类型进行转换
- 分组汇总:对数据进行各个维度的计算
- 处理重复值,缺失值和异常值以及数据离散化
⑥脏数据问题小结
- 数据缺失:属性值为空
- 数据噪声:数据值不合常理
- 数据不一致:数据前后存在矛盾
- 数据冗余:数据量或者属性数目超出数据分析需要
- 离群点/异常值:偏离大部分值的数据
- 数据重复:在数据集中出现多次的数据
- 数据矛盾:对客观事实的不同维度的描述存在差异
- 数据错误:格式错误,范围错误,包含特殊字符,包含ASCII码的数据等其他不可识别的数据
2.数据集成
将多个数据源中的数据结合成,存放在一个一致的数据存储中
3.数据规约
①维度规约
- 单变量重要性
- pearson相关系数和卡方检验,分析目标变量和单变量的相关性
- 回归系数:训练线性回归或逻辑回归,提取每个变量的表决系数,进行重要性排序
- 树模型的gini指数
- lasso正则化:训练回归模型时加入L1正则化参数,将特征向量稀疏化
②维度变化
- PCA
- SVD
4.数据变换
①规范化处理
- 最大最小规范化:将数据映射到[0,1]区间
- z-score标准化:处理后数据均值为0,方差为1
- log变换:时间序列数据中,数据量级相差较大的变量
②离散化处理
③稀疏化处理
5.数据处理方法
- 对数变换loglp
- 标准缩放standardscaler
- 转换数据类型astype
- 独立编码onehotencoder或者pd.get_dummies
- 标签编码labelencoder
- 修复偏斜特征boxcoxlp
第四步:构造提取特征
1.类别特征:特征值是离散的变量的特征
①1维编码(有1维的内在顺序)
- e.g 衣服:大,中,小
②高维编码(有高维的内在顺序)
- e.g 国家首都:CH,US
- 可以通过算法向量化,也可以通过人工向量化
③one-hot编码(无内在顺序,且类别数较少)
④count编码(统计类别出现频率)
- ps:未引入标签信息
⑤target编码
- ps:引入了标签信息,本质上stacking的弱化版本,需要引入交叉验证防止data leak
⑥stacking编码
- ps:引入了标签信息,通过模型算法进行编码,需要引入交叉验证防止data leak
2.数值特征
- 统计特征:均值,最值,中位数,方差,偏度,峰度
- 交叉特征:数值与数值,组合成新的数值特征
3.连续特征
①分箱
- ps:连续特征离散化,起到防止过拟合的引入非线性作用
②归一化和标准化
- ps:深度学习需要,树模型不需要
4.时间序列
- 一般范式:主体+窗口+函数
- 函数一般是一些统计相关的函数,如min,max,mean,medium,std,peak数量,指数平均,lag,加权平均,增长/下降率,时序L2范数
5.多值特征
- 一个特征对应多个值
- e.g 汽车的温度指标,统计,10 ~ 20度出现次数,20 ~ 30度出现次数
- 多值特征 → 直方图特征
- 直方图特征 → 分布差距特征
- 分布差距 → 各种散度特征
6.时间特征
- 周几,月份
- 季节
- 一年的第几天
- 一年的第几周
- 时间差
- 月末
7.特征组合
- 低阶特征组合:特征+特征
- 高阶特征组合:主要适合CTR预估类的比赛
第五步:特征选择
1.filter
- 方差选择法:计算各个特征的方差,然后根据阈值,选择方差大于阈值的特征
- 相关系数法:计算各个特征对目标值的相关系数以及相关系数的P值
- 卡方检验:检验定性自变量对定性因变量的相关性
- 互信息法
2.wrapper
- 递归特征消除法:使用一个基模型来进行多轮训练,每轮训练后,消除若干权值系数的特征,再基于新的特征集进行下一轮训练
3.embedded
- 基于惩罚项的特征选择法:除了筛选出特征外,同时进行了降维
- 基于树模型的特征选择法
第六步:构建模型
scikit-learn建模三部曲
- 实例化,建立评估模型对象
- 通过模型接口训练模型
- 通过模型接口提取需要的信息
第七步:模型训练
1.数据集按照使用用途可以划分为:
- 训练集:进行模型训练与参数更新
- 验证集:进行模型验证与参数选择
- 测试集:进行验证模型精度
2.模型根据训练阶段分为过拟合和欠拟合
- 过拟合无法避免,只能缓解
缓解过拟合的方法:
- 增加数据量(数据扩增)
- 做正则化(L1或L2)
- 做交叉验证(early stopping)
- 增加随机性(dropout,样本采样)
3.数据划分(模型评估)方法
- 留出法(Hold-out)
- K折交叉验证(K-fold CV)
- 自助采样(Bootstrap)
第八步:模型融合
1.bagging:随机森林
bagging就是采用有放回的方式进行抽样,用抽样的样本建立子模型,对子模型进行训练,这个过程重复多次,最后进行融合。
大概分为两步:
①重复K次
- 有放回地重复抽样建模
- 训练子模型
②模型融合
- 分类问题:voting
- 回归问题:average
2.boosting:adaboost,gbdt,xgboost,lightgbm,catboost
- boosting的思想是一种迭代的方法,每一次训练的时候都更加关心分类错误的样例,给这些分类错误的样例增加更大的权重,下一次迭代的目标就是能够更容易辨别出上一轮分类错误的样例,最终将这些弱分类器进行加权相加
3.stacking
- stacking背后的思想是使用大量基分类器,然后使用另一重分类器来融合它们的预测结果,旨在降低泛化误差
- stacking算法分为2层,第一层是用不同的算法形成n个基础分类器,同时产生一个与原数据集大小相同的新数据集,利用这个新数据集和一个新算法构成第二层的分类器。在训练第二层分类器时采用各基础分类器的输出作为输入,第二层分类器的作用就是对基础分类器的输出进行集成
- 由于stacking模型复杂度过高,比较容易造成过拟合
4.blending
- blending主要是用不相交的数据训练不同的基础模型,将它们的输出取(加权)平均
- blending分为uniform blending和linear blending,前者在分类时使用一人一票的投票方式,回归时采用多个模型的平均值,后者是二次学习,使用线性模型将第一步中学习到的学习器的输出结果组合起来,相当于简化版的stacking