学习资料:https://github.com/datawhalechina/hands-on-data-analysis
第三章 模型搭建和评估
经过前面的两章的知识点的学习,完成了对数据的基本了解,数据清洗,特征工程,数据可视化。这一章是使用数据,运用我们的数据以及结合业务来得到某些我们需要知道的结果。简单说就是:选择模型—输入数据—得到输出结果—评价模型-调整模型。
数据处理与载入库
1 | import pandas as pd |
划分数据集
划分数据的方法
对于数据集的划分一般有三种方法:留出法,交叉验证法和自助法:
①留出法
留出法是直接将数据集D划分为两个互斥的集合,其中一个集合作为训练集S,另一个作为测试集T。需要注意的是在划分的时候要尽可能保证数据分布的一致性,即避免因数据划分过程引入额外的偏差而对最终结果产生影响。为了保证数据分布的一致性,通常我们采用分层采样的方式来对数据进行采样。
- 通常,会将数据集D中大约2/3~4/5的样本作为训练集,其余的作为测试集。
- 分层抽样:抽样时,将总体分成互不交叉的层,然后按照一定的比例,从各层独立地抽取一定数量的个体,将各层取出的个体合在一起作为样本。分层抽样可以避免样本不平衡的问题。
②交叉验证法
k折交叉验证通常将数据集D分为k份,其中k-1份作为训练集,剩余的一份作为测试集,这样就可以获得k组训练/测试集,可以进行k次训练与测试,最终返回的是k个测试结果的均值。交叉验证中数据集的划分依然是依据分层采样的方式来进行。
对于交叉验证法,其k值的选取往往决定了评估结果的稳定性和保真性,通常k值选取10。
当k=1的时候,我们称之为留一法
③自助法
我们每次从数据集D中取一个样本作为训练集中的元素,然后把该样本放回,重复该行为m次,这样我们就可以得到大小为m的训练集,在这里面有的样本重复出现,有的样本则没有出现过,我们把那些没有出现过的样本作为测试集。
进行这样采样的原因是因为在D中约有36.8%的数据没有在训练集中出现过。留出法与交叉验证法都是使用分层采样的方式进行数据采样与划分,而自助法则是使用有放回重复采样的方式进行数据采样
数据集划分总结
- 对于数据量充足的时候,通常采用留出法或者k折交叉验证法来进行训练/测试集的划分;
- 对于数据集小且难以有效划分训练/测试集时使用自助法;
- 对于数据集小且可有效划分的时候最好使用留一法来进行划分,因为这种方法最为准确
划分数据的代码实现
我们使用 train_test_split
函数来进行划分,同时采用分层抽样以确保每个类别在训练集和测试集中的比例与整体数据集相似。
函数的基本使用如下:
1 | from sklearn.model_selection import train_test_split |
其中:
X
:特征数据y
:标签数据test_size
:测试集的大小。可以是一个介于0到1之间的浮点数,表示测试集的比例,或者是一个整数,表示测试集的样本数量。random_state
:随机数生成器的种子或RandomState实例。这可以确保每次运行代码时都获得相同的划分,从而保证结果可以复现。
后续补上k折交叉验证和自助法的代码!
模型的创建·训练·预测
接下来,创建并训练两个模型:逻辑回归模型和随机森林分类器。逻辑回归虽然名为“回归”,但实际上是一种用于分类任务的线性模型。随机森林则是一种集成方法,通过构建多个决策树并结合它们的输出来进行分类。
挖个坑,机器学习算法介绍和集成学习算法
逻辑回归模型
1 | # 创建逻辑回归模型实例(默认参数) |
随机森林分类器
1 | # 创建随机森林分类器实例(默认参数) |
继续挖坑,模型调参方法
模型预测
在模型训练完成后,使用 predict
方法来进行预测,使用 predict_proba
方法来获取预测的概率值。此外,还可以使用分类报告(classification_report
)来评估模型的性能。
1 | # 使用逻辑回归模型进行预测 |
分类报告提供了每个类别的精确度(precision)、召回率(recall)和F1分数等指标,有助于更全面地评估模型的性能。同时,预测的概率值可以用于绘制ROC曲线、计算AUC值等进一步评估模型的方法。
- 预测标签的概率提供了模型对某个样本属于某个类别的信心水平。这可以帮助我们更好地理解模型的决策过程,并在需要时调整决策阈值。
模型评估
在机器学习中,模型评估是至关重要的一步。它帮助我们了解模型在未见过的数据上的表现,即模型的泛化能力。通过模型评估,我们可以决定是否信任模型的预测结果,以及是否需要对模型进行进一步的调整或优化。
交叉验证
将数据集多次划分,并训练多个模型,以获得更稳定、全面的评估结果。最常用的交叉验证方法是k折交叉验证,其中k是用户指定的数字,通常取5或10。
代码实现:交叉验证
1 | from sklearn.model_selection import cross_val_score |
k折越多的影响
当k折数增加时,每次迭代用于训练和验证的数据集将变得更小,可能导致评估结果的方差增大。但是,增加k折数也会使得每次迭代的训练和验证数据集更接近于整个数据集,从而可能获得更准确的评估结果。所以在选择k值时需要在方差和偏差之间做取舍。
混淆矩阵
混淆矩阵是评估二分类问题性能的一种工具。它通过比较模型的预测标签和真实标签来计算各类别的正确和错误分类数量。从混淆矩阵中,我们可以计算出准确率、精确率、召回率和F1分数等指标。
代码实现:混淆矩阵和分类报告
1 | from sklearn.metrics import confusion_matrix, classification_report |
自己实现混淆矩阵时的注意事项
确保正确计算真正例(True Positives)、假正例(False Positives)、真负例(True Negatives)和假负例(False Negatives)的数量。
ROC曲线
ROC曲线是一种用于评估二分类问题性能的图形工具。它绘制了真正例率(True Positive Rate,TPR)与假正例率(False Positive Rate,FPR)之间的关系。ROC曲线下的面积(AUC)越大,表示模型的性能越好。
代码实现:ROC曲线绘制
1 | from sklearn.metrics import roc_curve, auc |
多分类问题的ROC曲线绘制
对于多分类问题,可以将其拆分为多个二分类问题,并为每个类别绘制一个ROC曲线。另一种方法是使用一对一(One-vs-One)或一对多(One-vs-Rest)策略来计算每个类别的TPR和FPR,并绘制相应的ROC曲线。但是这种方法可能会使图形变得复杂且难以解释。因此通常会选择其他评估指标来处理多分类问题。
从ROC曲线中获取信息
ROC曲线提供了模型在不同阈值下的性能表现。通过观察曲线的形状和AUC值,我们可以评估模型的分类能力。例如,如果ROC曲线靠近左上角(TPR高且FPR低),则表明模型具有较好的分类性能。此外,我们还可以根据具体需求选择合适的阈值来平衡真正例率和假正例率。