使用 scikit-learn 验证机器学习模型

发布日期:2026-07-11 11:54:03   来源 : 杭州电子商务研究院    浏览量 :18
杭州电子商务研究院 发布日期:2026-07-11 11:54:03  
18

介绍

构建机器学习模型是预测建模的重要组成部分。然而,如果没有适当的模型验证,训练后的模型在未知数据上表现良好的信心就永远不会高。模型验证有助于确保模型在新数据上表现良好,并有助于选择最佳模型、参数和准确度指标。

在本指南中,我们将学习下面提到的几种模型验证技术的基础知识和实现:

  1. 保持验证
  2. K 折交叉验证。
  3. 分层 K 折交叉验证
  4. 留一交叉验证。
  5. 重复随机测试训练分割

问题陈述

本指南的目的是建立一个分类模型来检测糖尿病,并学习如何使用多种技术对其进行验证。我们将使用包含 768 个观测值和 9 个变量的糖尿病数据集,如下所述:

  1. 怀孕 - 怀孕的次数。
  2. 葡萄糖——血浆葡萄糖浓度。
  3. 舒张压 - 舒张压(毫米汞柱)。
  4. 三头肌-皮褶厚度(毫米)。
  5. 胰岛素 - 小时血清胰岛素(mu U/ml)。
  6. bmi——BMI(体重(公斤)/身高(米))。
  7. dpf-糖尿病谱系功能。
  8. 年龄——年龄(岁)。
  9. 糖尿病 - “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 的各种模型验证技术。该指南使用糖尿病数据集并构建了分类器算法来预测糖尿病的检测。

各种技术的平均准确度结果总结如下:

  1. 保留验证方法:准确率为 74.46%
  2. K 折交叉验证:平均准确率为 76.95%
  3. 分层 K 折交叉验证:平均准确率为 76.96%
  4. 留一法交叉验证:平均准确率为 76.82%
  5. 重复随机测试训练分割:平均准确率为 74.76%

我们可以得出结论,交叉验证技术提高了模型的性能,是一种更好的模型验证策略。可以通过进行探索性数据分析、数据预处理、特征工程或尝试其他机器学习算法(而不是我们在本指南中构建的逻辑回归算法)来进一步改进模型。

要了解有关使用scikit-learn构建机器学习模型的更多信息,请参阅以下指南:

  1. Scikit 机器学习
  2. <font style="ve
以上内容来自杭州电子商务研究院推送
关注
关于我们
热门推荐
合作伙伴
免责声明:本站部分资讯来源于网络,如有侵权请及时联系客服,我们将尽快处理
Copyright © 2025-2027 ToB产业网址导航 公安备案 浙公网安备33010602013138号 浙ICP备16025413号-9
支持 反馈 关注 数据