介绍
将数据集划分为两部分,训练集与测试集,这也是简单任务中常用的方法,其实没有很好地体现交叉验证的思想
使用代码
# 导入库
from sklearn.model_selection import train_test_split
# 划分训练集与测试集,参数分别为总数据集,测试集的比例
train, test = train_test_split(data, test_size=0.2)
介绍
将数据集划分为k个子集,每次采用k-1个子集作为训练集,剩下的一个作为测试集,然后再重新选择,使每一个子集都做一次测试集,所以整个过程总共训练k次,得到k组结果,最后将这k组结果取平均,得到最终结果,这就是交叉验证的思想
使用代码
# 导入库
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
# 设置K值,这里假设K=5
k_fold = KFold(n_splits=5, shuffle=True, random_state=42)
# 初始化模型,这里以随机森林为例
model = RandomForestClassifier()
# 使用K折交叉验证
scores = cross_val_score(model, X, y, cv=k_fold)
介绍
与k折验证思想一致,只是子集的数量和数据集的大小一样,往往在数据集较小的时候使用这种方法
介绍
在分类任务中,我们可以用混淆矩阵来判断模型的性能,混淆矩阵记录了A类被分为B类的次数,以下是一个动物识别任务的混淆矩阵,要知道cat被预测成了几次dog,那么就查看混淆矩阵的第1行第2列
使用代码
# 导入库
from sklearn.metrics import confusion_matrix
# 打印混淆矩阵,参数为真实结果与预测结果
print(confusion_matrix(y, y_pred))
要解释精度与召回率,我们先定义几个量
TP:模型预测为正且真实值为正的数量 FP:模型预测为正且真实值为负的数量 FN:模型预测为负且真实值为正的数量
精度就是模型正确预测的正类在所有预测为正类中的比例
召回率就是模型正确预测的正类在所有正类中的比例
可能还是有点混淆?其实精度高就是宁愿不预测,也不愿意预测错,召回率高就是宁愿预测错,也不愿意遗漏正类,我们具体来看两个场景
在地震预测中,我们是要提高召回率还是精度?显而易见,召回率,因为我们宁愿预测器错误地提醒我们,也不愿意当地震来临时它不报警
那么在食品检测中呢?当然要提高精度,因为我们宁愿健康的食品被误判为不合格,也不愿意有不合格的食品进入市场
召回率与精度两个指标不可兼得,我们要根据具体任务做出取舍
# 导入库
from sklearn.metrics import precision_score, recall_score
# 使用精度评估函数,参数是真实结果与预测结果
print(precision_score(y, y_pred))
# 使用召回率评估函数,参数是真实结果与预测结果
print(recall_score(y, y_pred))
偏差衡量一个模型预测结果和真实值的差距,偏差高往往代表模型欠拟合
方差衡量模型在不同数据集上预测的差异,方差高往往代表模型过拟合
具有高偏差的模型对训练数据和新数据的表现都较差,因为它们未能捕捉到数据的复杂性。
具有高方差的模型在训练数据上可能表现得很好,但对新数据的泛化能力差,因为它们过于依赖于训练数据的细节。
机器学习模型性能测量对于评估模型的质量、选择最佳模型、调整模型超参数以及在实际应用中预测新数据都具有重要意义。