1、完整的机器学习建模流程
1. 实际问题抽象成数学问题
2. 获取数据
3. 特征工程
4. 训练模型、诊断、调优
5. 模型验证、误差分析
6.模型融合
7. 上线运行
https://blog.csdn.net/czl389/article/details/77658965一个完整的建模案例
2、几个使用过的分类模型
K近邻(当K为1时也称最近邻)https://scikit-learn.org/stable/modules/neighbors.html,机器学习分类算法中算是比较简单的算法,它的优点在于非常容易解释,难点在于如何选择合适的K值
K值较小,则模型复杂度较高,容易发生过拟合,学习的估计误差会增大,预测结果对近邻的实例点非常敏感。
K值较大可以减少学习的估计误差,但是学习的近似误差会增大,与输入实例较远的训练实例也会对预测起作用,使预测发生错误,k值增大模型的复杂度会下降。
对于类域的交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为适合。
在应用中,k值一般取一个比较小的值,通常采用交叉验证法来来选取最优的K值。
https://blog.csdn.net/weixin_39881922/article/details/80419270一篇不错的文章
https://blog.csdn.net/weixin_41060109/article/details/80878325利用交叉验证选择K值,可视化
https://blog.csdn.net/sinat_33150417/article/details/83273922 knn的调参
注意:在类别平衡情况下使用,对异常值不敏感。
朴素贝叶斯:基于贝叶斯定理的分类器,假设特征之间是相互独立的,称之为‘朴素’。https://scikit-learn.org/stable/modules/naive_bayes.html
可以高效处理高维数据
对小规模的数据表现很好,能处理多分类任务,对缺失数据不太敏感,算法也比较简单
支持向量机:https://scikit-learn.org/stable/modules/svm.html,目前最火的算法之一,可以处理线性分类或者非线性分类,根据核函数的选择来定。
1)一般推荐在做训练之前对数据进行归一化,当然测试集中的数据也需要归一化。。
2)在特征数非常多的情况下,或者样本数远小于特征数的时候,使用线性核,效果已经很好,并且只需要选择惩罚系数C即可。
3)在选择核函数时,如果线性拟合不好,一般推荐使用默认的高斯核'rbf'。这时我们主要需要对惩罚系数C和核函数参数γ。进行调参,通过多轮的交叉验证选择合适的惩罚系数C和核函数参数γ。
4)理论上高斯核不会比线性核差,但是这个理论却建立在要花费更多的时间来调参上。所以实际上能用线性核解决问题我们尽量使用线性核。
5)对缺失数据敏感
在高维数据中表现良好,在特征维度远大于样本数目时仍然高效,但要注意过拟合问题。
决策树: https://scikit-learn.org/stable/modules/tree.html ,易于理解和解释,可进行决策树的可视化,需要进行类别不均衡处理,容易过拟合。能够同时处理数据型和常规型属性,需要提前进行缺失值处理。决策树一般作为集成学习的基分类器使用。不必担心异常值或者数据是否线性可分。
逻辑回归:https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression,属于分类模型,有很多正则化模型方法解决多重共线性问题,可以便利地观测样本概率,可以轻松地利用新数据来更新模型(使用在线梯度下降算法,online gradient descent)。
缺点
容易欠拟合,一般准确度不太高
不能很好地处理大量多类特征或变量;
只能处理两分类问题(在此基础上衍生出来的softmax可以用于多分类),且必须线性可分;
对于非线性特征,需要进行转换;
随机森林:https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html#sklearn.ensemble.RandomForestClassifier 属于集成模型,它的基分类器是决策树,集成方法是Bagging,一般比其他算法效果优良,它能够处理很高维度的数据,并且不用做特征选择,在训练完后,它能够给出哪些feature比较重要。可以将oob_score设置为True,来查看模型的泛化能力。实现比较简单,训练速度快,可以处理不平衡数据。
缺点:
在噪音大的数据集上容易过拟合。
对于有不同取值的属性的数据,取值划分较多的属性会对随机森林产生更大的影响,所以随机森林在这种数据上产出的属性权值是不可信的。
3、数据预处理
这一部分占建模过程很大比例,我们拿到的数据一般是比较杂乱的,一般要进行缺失值、异常值处理,对于需要将数据归一化的模型还要进行归一化处理,一般建议进行归一化处理,这样可以提升模型的训练速度。
https://scikit-learn.org/stable/modules/preprocessing.html#preprocessing
在进行数据处理时,需要用到python里面的pandas模块,如果遇到困难,去查pandas的官方文档,里面有很多例子。
缺失值查看可以直接用df.isnull().sum()来查看每一列的空值,注意我们拿到的数据可能不存在空值,原因在于别人把空值填成0了。缺失值可视化可以用missingno模块,缺失值如果不多直接删除整条记录即可。
异常值,可以通过箱型图等来进行可视化。异常值不是缺失值,更不是错误值,同样是真实情况的表现,之所以觉得一个数据异常,是因为我们能够用到的数据量不够大,无法准确地代表整个此类数据的分布。如果把异常值放在海量数据的大背景下,那么这个异常值也就不那么异常了。
针对一些非数值型特征,要把他们转换为数值类型,这样才可以投入模型,上面给的网址有此类特征处理方法,当然具体使用哪种编码还要视情况而定,一般独热编码常用,labelcoder不常用。处理时最好将特征处理为有序的,处理成数值类型时最好要包含原有信息。
对于类别,也要定义为数值标签。
4、类别不平衡
https://imbalanced-learn.org/en/stable/api.html
很多算法是要求类别均衡时使用的,所以在建模之前要查看下类别均衡问题,一般类别比例超过4:1,视为不平衡,此时就需要进行类别均衡处理,可参照上面网站。
5、特征选择
https://scikit-learn.org/stable/modules/feature_selection.html
分为单变量特征选择和多变量特征选择。可以利用基于模型的特征排序生成一个特征重要性的条形图。
6、训练时一些注意事项
训练集、测试集、验证集
在使用数据集训练模型之前,我们需要先将整个数据集分为训练集、验证集、测试集。训练集是用来训练模型的,通过尝试不同的方法和思路使用训练集来训练不同的模型,再通过验证集使用交叉验证来挑选最优的模型,通过不断的迭代来改善模型在验证集上的性能,最后再通过测试集来评估模型的性能。
为保证训练集、验证集、测试集都在同一个分布上,我们需要把数据打乱,再随机划分。
小规模数据
传统地采用70%/30%的划分原则,就是指将整个数据集中的70%用于模型的训练也就是训练集,整个数据集中的30%用于模型的测试也就是测试集,其实这里的测试集被称为验证集或者开发集会更适合。如果想要加入验证集,可能划分标准就改成了60%/20%/20%,也就是指将整个数据集的60%划分为训练集,20%划分为验证集,20%划分为验证集。
大规模数据
可以采用98%/1%/1%的规则来划分数据集。
建议
在有些数据集的划分中,没有真正的测试集,也就是只有训练集和测试集。利用训练集来训练模型,然后通过测试模型在测试集上的表现来调整超参和采用不同的策略来提高模型在测试集上的表现,而没有真正的测试集来评估模型的性能,缺少真正的测试集可能会导致模型过拟合,使用这种方式在测试集上所获取的模型评估是不可靠的。建议不要省略验证集,利用验证集来调整模型,利用测试集来评估模型的指标。如果模型上线的指标要求比较高时,可以适当的加大测试集的数量以此来获取更高精度的评估指标,建议不要超过30%。
模型评估与选择
https://scikit-learn.org/stable/modules/model_evaluation.html#scoring-parameter
二分类可以选择precision,recall,F1-score,以及AUC,ROC
多分类不能选择AUC,ROC,一般选择F1-score。
选择模型评价指标也要根据实际情况来选择。
模型选择,可以使用交叉验证得分来进行选择,评价指标选上述的,当然在选择模型时还应该考虑模型的运行时间。
某位大神测试了179种分类模型在UCI所有的121个数据上的性能,发现Random Forests 和 SVM 性能最好。
注意
如果算法在开发集上过拟合,则需要获取更多的开发集数据。
如果开发集与测试集的数据分布和实际数据分布不同,则需要获取新的开发集和测试集。
如果评估指标无法对最重要的任务目标进行度量,则需要修改评估指标。
7、参数调优
https://scikit-learn.org/stable/modules/grid_search.html
主要介绍网格搜索法。
首先确定需要调优的参数,确定参数的数值范围,某些参数是需要组合起来一起调优的,选择一个适合的scoring来进行调参。
可以在尝试中确定参数范围,比如随机森林参数max_depth,当我们将参数范围设置为[1,10],通过网格搜索法最优参数是10,这时我们可以继续将参数范围修改到[5,20],以此类推,是一个不断尝试的过程。
不断查看我们的调优后的模型效果,比如对两个参数调优后,可看目前这两个确定参数下的模型是否比调优之前(最初的模型)效果好。当然有些参数可能默认的就是最好。
下面是一个大牛经验所得分类模型一般需要调节的参数
8、查看模型是否过拟合或者欠拟合
判断过拟合或者欠拟合。https://scikit-learn.org/stable/modules/learning_curve.html
1、当训练集和测试集的误差收敛但却很高时,为高偏差。
左上角的偏差很高,训练集和验证集的准确率都很低,很可能是欠拟合。
我们可以增加模型参数,比如,构建更多的特征,减小正则项。
此时通过增加数据量是不起作用的。
2、当训练集和测试集的误差之间有大的差距时,为高方差。
当训练集的准确率比其他独立数据集上的测试结果的准确率要高时,一般都是过拟合。
右上角方差很高,训练集和验证集的准确率相差太多,应该是过拟合。
我们可以增大训练集,降低模型复杂度,增大正则项,或者通过特征选择减少特征数。
理想情况是是找到偏差和方差都很小的情况,即收敛且误差较小。