机器学习流程很简单,就是明确问题-处理数据-训练-预测(实际预测时产生的数据继续拿来训练迭代,滚雪球 模型会越来越好 记得保存每个阶段的模型方便回滚) 未来数据的分布可能发生变化,需要更新模型
做算法需要一个行业专家-行业上的指导 然后数据科学家-偏全栈 模型训练 模型部署 资源管理 SDE软件工程师等
kaggle上有各种多种多样的现成的数据集 还有huggingface等
data=pd.read_csv
data.shape
data.head() 列出前几行
data.dtypes 查看各特征数据类型,用来检查数据
data.describe() 查看各特征的最大最小值啊均值个数中位数等,用来检查数据分布
data[‘type’].value_counts()[0:10] 查看特征前10个最多的数据值
data[cols].corr() 对cols特征的相互相关性
null_sum=data.isnull().sum() 看数据每列有多少空数据
lc=data.columns(null_sum>len(data)*0.3) 列出缺失值高于3成的特征
data.drop(colums=lc,inplace=True) 去掉缺失值高于3成的特征,第二个参数是对源数据修改
常用的4种归一化
min-max,自己确定最大b最小a值,(x-xmin)/(xmax-xmin)乘以(b-a)+a
z-score,减均值除方差,结果均值0方差1
整数变换,除以10的n次方,正负一之间
log变换,取log,对数值变化很大的分布均匀,并且log曲线可知 它对低的误差更敏感,比如100w房子的误差1000无所谓、但1w房子误差1000很有所谓
很多数值预测分布范围大的都取log,分布均匀些,预测也预测log值
增加特征:特征的分桶区间-粗粒度、onehot类别-只取主要 次要的全为一个类、年月日星期时分秒、特征组合的类别(需要看是否确实相关)-原来的特征可以不用了
图像特征以前都是用sift,现在都是之间用预训练模型了,用imagenet的预训练模型的前一段卷积(最后几层去掉)、最后的结果就是图片特征直接拿来用
决策树
决策树是工业界用的最多的模型,毕竟最简单,并且有还不错的结果-不怎么需要调参就意味着不怎么会出错,可以作为第一选择用作为baseline
一个好处是可解释,每个枝节点的类别都可以看到
一个坏处是对噪音很敏感,解决方法就是集成学习,比如RF,第二是做回归不好 节点太多过拟合
Bagging 把多个不那么稳定的模型把它们放在一起得到一个相对稳定的模型(并行化),用来降低方差,特别是当整个用来做bagging的模型是不稳定的模型的时候效果最佳(随机森林)
它就是训练多个模型,每个模型就是通过在训练数据中通过bootstrap采样训练而来
bootstrap就是每一次用m个样本,随机在训练数据中采样m个样本,且会放回继续采样
·
Boosting是说把n个弱一点的模型组合在一起变成一个比较强的模型(序列化),用于降低偏差,常见的比如GBDT(需要顺序训练,在大的训练集上会比较吃亏)、XGBoost lightGBM(有用加速算法)
Gradient boosting是boosting的一种,每一次弱的模型是去拟合 在标号上的残差,可以认为是每次去拟合给定损失函数的负梯度方向
lightGBM意思的是快的gradient boosting machine,使用了加速算法,构建树的时候快一点
·
stacking(模型融合,竞赛常用,比前两个效果好,成本挺大),和bagging类似 多个模型一起 降低方差,区别就是可以用很多不同的模型
每个不同模型的输出结果可以连接成向量,最后加个dense全连接,也学习模型结果的连接,其实也可以取平均就行
可以堆叠多层的stacking,第一层输出的向量再第二道学习(输入可以再concat上最开始的输入 类似残差结构)…,不过多层会重新训练很多次 容易过拟合(或者数据分两份ab,a第一层训练的结果加上b来做第二层的训练。也可以K折预测小模型叠加。不过我觉得还是大道至简,走偏了,优化最基础的或者探索新的范式更好)
要画出训练误差和泛化误差的曲线
训练误差肯定会随着训练一直降低,但泛化误差可能到一个最低又上去了
所以不是训练的越多越好,你应该在泛化误差最低的时候就提前终止,不必追求极致的训练误差
·
复杂的数据用复杂的模型,简单的用简单的最好
当数据的要求越来越复杂的时候,模型也得换更复杂的
·
有时候会出现假的高准确率(新手老手都会出现 并且不是故意的),是因为训练和测试集还是有重合的,比如图像变换时有很多重复的同一个样本、或者几个数据来源结合时有冗余的,然后打乱同时被分到了两个数据集
如果模型能覆盖所有业务数据场景可以 比如imagenet已经穷举了所有图片分类,但如果不是 那就要检查问题了 是你分数据集的问题 要保证两个数据集相对独立,不能自己骗自己
·
论文里都会吧模型每层列出来,然后还有各种超参数的大小调参范围(学习率[1e-6,1e-1],批量[8,16,512],优化算法参数,L2参数)
所有范围内的超参数可能性组合起来,做超参数的优化(需要好好选择超参数的范围和组合,有些论文的一些超参数是可以用的-有很多具有一般性)
最常用的随机搜索:随机选n组都做训练得到结果看看什么好,连续训练时阶段性输出目前最好的结果是什么,如果后期就不增长了就可以中途停了(因为是随机的参数,所有当前最好的结果具有一般性)
还可以先用n个训练很少的m次看看效果,然后选择好的那一半n/2训练2m次,依次减半加半,最后就能找到这n个组合里面相对最好的结果,成本变低了(每次都是n*m的成本,可以控制成本)
我之前是人工盯着,控制变量法调整每个超参数,从大到小一直找到最好,如果你能确定超参数的范围的话就用随机搜索吧,其实还一个原因就是数据和模型都大训练太费资源、所以我就盯着、随时调整
1,数据探索
2,特征工程
3,初步预测
4,变量衍生和PCA降维(加减乘除 新增很多个特征 使用PCA对衍生特征进行降维,提取其中权重较大的特征,并和原来的特征合并)
5,多模型融合预测
先随便搞个结果提交看看,效果估计不好
然后在特征工程下手,主要从特征X和Y的相关性重要性、特征与特征之间的相关性、特征衍生和降维三方面展开。反复修改(迭代)
做时除了原来的特征 相关性比较后,【加入新特征】,比如特征大于一个阈值次数比例、特征数据的方差 峰度等,【还有行业方向业务理解增加的特征】,用pd.DataFrame简单快捷(怎么顺手怎么来吧 不认为pd更好)
有的变量对结果影响很大 确定性的,可以【直接写规则】ifelse不用训练了
训练前,【先看下训练测试集的特征分布图boxplot】,看差异大不大
如某特征差异比较大,会影响模型在预测集上的表现,应考虑删除
#还查看特征和label分布关系、线性关系的强弱
看相关性可以不用公式,而是直接用逻辑回归(lr.coef_看相关性) FM(rdf.feature_importances_看重要性) KNN lightGBM进行预测查看特征重要性
用cross_val_score来判断模型拟合的好坏
多模型融合预测
模型一开始用逻辑回归,但从实际看,单一的弱模型 和 “弱+强模型+模型融合”的半监督学习模型,差距还是挺大的。
最终的预测模型共两层:第一层使用KNN、逻辑回归、随机森林(可通过网格搜索对参数进行调优),对数据进行拟合,将拟合结果作为新的“特征”并入原始数据集,再使用LGB(LightGB)作为模型第二层对新数据集进行拟合,形成最终的预测结果。
参考自
https://blog.csdn.net/weixin_60929208/article/details/128140635