使用 scikit-learn 验证机器学习模型
介绍
构建机器学习模型是预测建模的重要组成部分。然而,如果没有适当的模型验证,训练后的模型在未知数据上表现良好的信心就永远不会高。模型验证有助于确保模型在新数据上表现良好,并有助于选择最佳模型、参数和准确度指标。
在本指南中,我们将学习下面提到的几种模型验证技术的基础知识和实现:
- 保持验证
- K 折交叉验证。
- 分层 K 折交叉验证
- 留一交叉验证。
- 重复随机测试训练分割
问题陈述
本指南的目的是建立一个分类模型来检测糖尿病,并学习如何使用多种技术对其进行验证。我们将使用包含 768 个观测值和 9 个变量的糖尿病数据集,如下所述:
- 怀孕 - 怀孕的次数。
- 葡萄糖——血浆葡萄糖浓度。
- 舒张压 - 舒张压(毫米汞柱)。
- 三头肌-皮褶厚度(毫米)。
- 胰岛素 - 小时血清胰岛素(mu U/ml)。
- bmi——BMI(体重(公斤)/身高(米))。
- dpf-糖尿病谱系功能。
- 年龄——年龄(岁)。
- 糖尿病 - “1” 表示患有糖尿病,而“0” 表示没有患糖尿病。这是目标变量。
步骤
在本指南中,我们将遵循以下步骤:
步骤 1——加载所需的库和模块。
第 2 步——读取数据并执行基本数据检查。
步骤 3-为特征和响应变量创建数组。
步骤4-尝试不同的模型验证技术。
以下部分将介绍这些步骤。
步骤 1 - 加载所需的库和模块
# Import required libraries
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import sklearn
# Import necessary modules
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
from math import sqrt
from sklearn import model_selection
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import KFold
from sklearn.model_selection import LeaveOneOut
from sklearn.model_selection import LeavePOut
from sklearn.model_selection import ShuffleSplit
from sklearn.model_selection import StratifiedKFold
第 2 步 - 读取数据并执行基本数据检查
下面的第一行代码将数据作为 pandas 数据框读入,而第二行打印形状 - 9 个变量的 768 个观测值。第三行给出变量的转置汇总统计数据。
dat = pd.read_csv('diabetes.csv')
print(dat.shape)
dat.describe().transpose()
输出:
(768, 9)
| | count | mean | std | min | 25% | 50% | 75% | max |
|-------------|-------|------------|------------|--------|----------|----------|-----------|--------|
| pregnancies | 768.0 | 3.845052 | 3.369578 | 0.000 | 1.00000 | 3.0000 | 6.00000 | 17.00 |
| glucose | 768.0 | 120.894531 | 31.972618 | 0.000 | 99.00000 | 117.0000 | 140.25000 | 199.00 |
| diastolic | 768.0 | 69.105469 | 19.355807 | 0.000 | 62.00000 | 72.0000 | 80.00000 | 122.00 |
| triceps | 768.0 | 20.536458 | 15.952218 | 0.000 | 0.00000 | 23.0000 | 32.00000 | 99.00 |
| insulin | 768.0 | 79.799479 | 115.244002 | 0.000 | 0.00000 | 30.5000 | 127.25000 | 846.00 |
| bmi | 768.0 | 31.992578 | 7.884160 | 0.000 | 27.30000 | 32.0000 | 36.60000 | 67.10 |
| dpf | 768.0 | 0.471876 | 0.331329 | 0.078 | 0.24375 | 0.3725 | 0.62625 | 2.42 |
| age | 768.0 | 33.240885 | 11.760232 | 21.000 | 24.00000 | 29.0000 | 41.00000 | 81.00 |
| diabetes | 768.0 | 0.348958 | 0.476951 | 0.000 | 0.00000 | 0.0000 | 1.00000 | 1.00 |
查看“糖尿病”变量的摘要,我们发现平均值为 0.35,这意味着数据集中约 35% 的观察值患有糖尿病。因此,基线准确率为 65%,我们构建的模型绝对应该超过这个基线基准。
步骤 3 - 为特征和响应变量创建数组
下面的代码行分别创建特征和因变量的数组。
x1 = dat.drop('diabetes', axis=1).values
y1 = dat['diabetes'].values
步骤 4 - 尝试不同的模型验证技术
在创建特征数组和响应变量后,我们将开始讨论各种模型验证策略。
保留验证方法 - 训练集和测试集分割
保留验证方法是指创建训练集和保留集,也称为“测试”集或“验证”集。训练数据用于训练模型,而未见数据用于验证模型性能。常见的分割比例为 70:30,而对于小型数据集,该比例可以是 90:10。
我们将对糖尿病数据集使用 70:30 的比例分割。第一行代码将数据分为训练数据和测试数据。第二行实例化 LogisticRegression() 模型,而第三行在训练数据上拟合模型。第四行使用训练后的模型在测试数据上生成分数,而第五行打印准确度结果。
# Evaluate using a train and a test set
X_train, X_test, Y_train, Y_test = model_selection.train_test_split(x1, y1, test_size=0.30, random_state=100)
model = LogisticRegression()
model.fit(X_train, Y_train)
result = model.score(X_test, Y_test)
print("Accuracy: %.2f%%" % (result*100.0))
输出:
Accuracy: 74.46%
我们可以看到,该模型在测试数据上的准确率约为 74%。上述技术很有用,但也有缺陷。分割非常重要,如果出错,可能会导致模型过度拟合或欠拟合新数据。可以使用重采样方法纠正此问题,该方法使用完整数据的随机选择子集多次重复计算。我们将在本指南的以下部分讨论流行的交叉验证技术。
K 折交叉验证
在 k 折交叉验证中,数据被分成 k 折。模型在 k-1 折上进行训练,其中保留一折进行测试。重复此过程以确保数据集的每一折都有机会成为保留集。完成此过程后,我们可以使用平均值或/和标准差来总结评估指标。
我们将使用 10 倍交叉验证来解决问题。第一行代码使用 'scikit-learn' 中的 'model_selection.KFold' 函数并创建 10 倍。第二行实例化 LogisticRegression() 模型,而第三行拟合模型并生成交叉验证分数。参数 'x1' 和 'y1' 分别代表预测变量和响应数组。'cv' 参数指定交叉验证分割的数量。第四行打印平均准确度结果。
kfold = model_selection.KFold(n_splits=10, random_state=100)
model_kfold = LogisticRegression()
results_kfold = model_selection.cross_val_score(model_kfold, x1, y1, cv=kfold)
print("Accuracy: %.2f%%" % (results_kfold.mean()*100.0))
输出:
Accuracy: 76.95%
使用 k 倍交叉验证的模型的平均准确率为 76.95%,高于我们在保留验证方法中实现的 74%。
分层 K 折交叉验证
分层 K 折方法是 k 折交叉验证的一种变体,它返回分层折叠,即每组包含与完整数据大致相同的目标标签比例。
下面的代码行重复了上面讨论的 k 折交叉验证的步骤,除了几个变化。第一行创建分层 KFolds 而不是 k 折,然后将此调整传递给第三行代码中的“cv”参数。
skfold = StratifiedKFold(n_splits=3, random_state=100)
model_skfold = LogisticRegression()
results_skfold = model_selection.cross_val_score(model_skfold, x1, y1, cv=skfold)
print("Accuracy: %.2f%%" % (results_skfold.mean()*100.0))
输出:
Accuracy: 76.96%
使用分层 k 倍交叉验证的模型的平均准确率为 76.96%。
留一交叉验证 (LOOCV)
LOOCV 是一种交叉验证技术,其中折叠的大小为“1”,“k”设置为数据中的观测值数量。当训练数据大小有限且要测试的参数数量不多时,这种变体很有用。
下面的代码行重复了上面讨论的步骤,除了几个变化。第一行创建了留一交叉验证而不是 k 倍验证,然后将此调整传递给第三行代码中的“cv”参数。
loocv = model_selection.LeaveOneOut()
model_loocv = LogisticRegression()
results_loocv = model_selection.cross_val_score(model_loocv, x1, y1, cv=loocv)
print("Accuracy: %.2f%%" % (results_loocv.mean()*100.0))
输出:
Accuracy: 76.82%
使用留一交叉验证的模型平均准确率为 76.82%。
重复随机测试训练分割
该技术是传统训练测试分割和 k 倍交叉验证方法的混合。在该技术中,我们以训练测试集的方式对数据进行随机分割,然后重复分割和评估算法的过程多次,就像交叉验证方法一样。
下面的代码行重复了上面讨论的 LOOCV 方法的步骤,除了第一行和第三行代码中的几个变化。
kfold2 = model_selection.ShuffleSplit(n_splits=10, test_size=0.30, random_state=100)
model_shufflecv = LogisticRegression()
results_4 = model_selection.cross_val_score(model_shufflecv, x1, y1, cv=kfold2)
print("Accuracy: %.2f%% (%.2f%%)" % (results_4.mean()*100.0, results_4.std()*100.0))
输出:
Accuracy: 74.76% (2.52%)
使用重复随机训练测试分割方法的模型的平均准确率为 74.76%。
结论
在本指南中,您了解了使用 scikit-learn 的各种模型验证技术。该指南使用糖尿病数据集并构建了分类器算法来预测糖尿病的检测。
各种技术的平均准确度结果总结如下:
- 保留验证方法:准确率为 74.46%
- K 折交叉验证:平均准确率为 76.95%
- 分层 K 折交叉验证:平均准确率为 76.96%
- 留一法交叉验证:平均准确率为 76.82%
- 重复随机测试训练分割:平均准确率为 74.76%
我们可以得出结论,交叉验证技术提高了模型的性能,是一种更好的模型验证策略。可以通过进行探索性数据分析、数据预处理、特征工程或尝试其他机器学习算法(而不是我们在本指南中构建的逻辑回归算法)来进一步改进模型。
要了解有关使用scikit-learn构建机器学习模型的更多信息,请参阅以下指南:
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~