贡献者: xzllxls; addis
留出法(Hold-out)是评估一个机器学习模型性能的常用方法之一。对于一个整理好的数据集,随机选择一部分样本作为训练数据即训练集,用于训练模型,剩下的部分用于测试模型,作为测试集。
在划分训练集和测试集的时候,须要遵循的原则之一是保持数据分布的一致性。比如,一个二分类任务,其数据样本的标签值为+或-。那么,在使用留出法划分训练集测试集时,要保证训练集中标签为+(或-)的样本比例与测试集中标签+(或-)的样本比例相同。通常可以采用分层采样的方法来实现这一原则。
第二个要遵循的原则是多次反复划分,然后取多次测试的平均性能。由于每次随机划分所得到的训练集和测试集中的样本往往不相同,因此在不同的训练样本和测试样本下,所得出的模型性能显然会有一定的差异。为了尽可能消除这种由于随机划分数据集所产生的偏差,可以采用本条原则。
第三个原则是测试集不可过大或者过小。如果测试集过大,则训练集会过小,由此训练出来的模型可能无法学习到整个原始数据集的规律。反之,如果测试集过小,训练集过大,模型可能会比较容易学习到原始数据中的规律,但由于测试集过小,测试出的性能难以代表模型的真实性能。在机器学习实践中,训练集与测试集的比例通常设置为 3:1 或 4:1。
将所收集到的完整数据集随机划分为训练集和测试集。 在训练集上训练模型,然后在在测试集上评估模型性能。
考虑到留出法的结果可能受数据划分的影响。人们提出了几种常见的改进方法:
给出一个用留出法验证线性回归模型的程序示例。逻辑归回算法基于 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
注意,由于训练集和测试集是随机划分,因此上述程序每次执行的结果可能不同。
 
 
 
 
 
 
 
 
 
 
 
友情链接: 超理论坛 | ©小时科技 保留一切权利