留出法

                     

贡献者: xzllxls; addis

预备知识 数据,模型评估

   留出法(Hold-out)是评估一个机器学习模型性能的常用方法之一。对于一个整理好的数据集,随机选择一部分样本作为训练数据即训练集,用于训练模型,剩下的部分用于测试模型,作为测试集。

   在划分训练集和测试集的时候,须要遵循的原则之一是保持数据分布的一致性。比如,一个二分类任务,其数据样本的标签值为+或-。那么,在使用留出法划分训练集测试集时,要保证训练集中标签为+(或-)的样本比例与测试集中标签+(或-)的样本比例相同。通常可以采用分层采样的方法来实现这一原则。

   第二个要遵循的原则是多次反复划分,然后取多次测试的平均性能。由于每次随机划分所得到的训练集和测试集中的样本往往不相同,因此在不同的训练样本和测试样本下,所得出的模型性能显然会有一定的差异。为了尽可能消除这种由于随机划分数据集所产生的偏差,可以采用本条原则。

   第三个原则是测试集不可过大或者过小。如果测试集过大,则训练集会过小,由此训练出来的模型可能无法学习到整个原始数据集的规律。反之,如果测试集过小,训练集过大,模型可能会比较容易学习到原始数据中的规律,但由于测试集过小,测试出的性能难以代表模型的真实性能。在机器学习实践中,训练集与测试集的比例通常设置为 3:1 或 4:1。

图
图 1:留出法示意图

1. 知识要点

步骤:

   将所收集到的完整数据集随机划分为训练集和测试集。 在训练集上训练模型,然后在在测试集上评估模型性能。

优点:

缺点:

改进方法:

   考虑到留出法的结果可能受数据划分的影响。人们提出了几种常见的改进方法:

  1. 多次重复划分数据集:多次随机划分数据集并计算平均性能,以减少单次划分带来的不确定性。
  2. 分层抽样:确保训练集和测试集中各类别样本的比例与原始数据集一致,特别适用于类别不平衡的数据集。

2. 编程实战

   给出一个用留出法验证线性回归模型的程序示例。逻辑归回算法基于 scikit-learn 库实现。数据存储与表示基于 numpy 库。

代码示例

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
import numpy as np

# 加载iris数据集
data = load_iris()
X = data.data
y = data.target

# 定义逻辑模型
model = LogisticRegression(max_iter=200)

# 重复Holdout Method的次数
n_splits = 10
accuracies = []

# 反复执行留出法,训练并评估模型,求出分类准确率。
for _ in range(n_splits):
    # 将数据集划分为训练集和测试集
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
    
    # 训练模型
    model.fit(X_train, y_train)
    
    # 评估模型
    y_pred = model.predict(X_test)
    accuracies.append(accuracy_score(y_test, y_pred))

# 输出平均准确率
print("平均准确率:", np.mean(accuracies))

结果与说明

   以上示例程序,对 iris 数据集做 n_splits(=10)次随机划分,每次划分均训练一个逻辑回归模型,,并测试模型分类准确率。最后求出 10 次的平均分类准确率。输出结果如下:

平均准确率: 0.9400000000000001

   注意,由于训练集和测试集是随机划分,因此上述程序每次执行的结果可能不同。

                     

© 小时科技 保留一切权利