分割验证快速概述
使用 sklearn 介绍训练、验证和测试数据集的划分。
定义:划分验证(Split Validation)
机器学习中的一个关键步骤是使用一种称为“划分验证”的技术,将数据划分为两个独立的数据集。
-
第一个数据集称为训练数据,用于构建预测模型。
-
第二个数据集称为测试数据,保留用于评估由训练数据生成的模型的准确性。
-
训练数据与测试数据通常按 70/30 或 80/20 的比例划分,其中训练数据占较大比例。当模型经过训练并使用测试数据验证其准确性后,即可投入使用,对新的输入数据进行预测。
尽管模型会在训练集和测试集上都运行,但模型仅基于训练数据构建。
测试数据仅作为输入来生成预测结果,并用于评估模型的准确性,它不会参与模型的构建过程,也不应被用来优化模型。由于测试数据不能用于模型的构建和调优,数据科学家有时会引入第三个独立的数据集,称为验证集。
在使用训练集建立初始模型后,可将验证集输入模型,根据其反馈结果调整模型的超参数。最终,使用测试集评估模型的预测误差。
为了最大化数据的利用效率,可以将验证集和测试集重新用作训练数据。具体做法是在模型正式部署前,将这些已使用的数据与原始训练数据合并,以进一步优化模型。
但需要注意的是,一旦原始的验证集或测试集被用于训练,它们就不再适合作为验证集或测试集使用。
训练集与测试集
在 Python 中实现划分验证,可以使用 Scikit-learn 提供的 train_test_split 函数,需先从 sklearn.model_selection 模块导入该函数:
1from sklearn.model_selection import train_test_split
在使用该函数之前,需要先设定好特征变量 X 和目标变量 y:
1import pandas as pd 2df = pd.read_csv('~/Downloads/advertising.csv') 3X = df[['Daily Time Spent on Site', 'Age', 'Area Income', 'Daily Internet Usage', 'Ad Topic Line', 'Country']] 4y = df['Clicked on Ad']
此时即可使用以下参数创建训练集和测试集:
train_size(可选)、test_size、random_state(可选)和shuffle(可选)。
1X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=10, shuffle=True)
本例中,训练集与测试集按 70/30 划分,并启用数据打乱,随机种子设为 10,以便后续代码复现结果。
验证集
截至目前,Scikit-learn 尚未提供专门用于创建训练/验证/测试三向划分的函数。
一个简便的解决方案是将初步划分出的测试集再次进行分割,如下所示:
1X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4)
这样设置后,训练数据占 60%,测试数据占 40%。随后将测试数据再按 50/50 分割,使最终的测试集和验证集各占原始数据的 20%。
1X_test, X_val, y_test, y_val = train_test_split(X_test, y_test, test_size=0.5)
1from sklearn.model_selection import train_test_split 2 3import pandas as pd 4df = pd.read_csv('advertising.csv') 5X = df[['Daily Time Spent on Site', 'Age', 'Area Income', 'Daily Internet Usage', 'Ad Topic Line', 'Country']] 6y = df['Clicked on Ad'] 7 8X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=10, shuffle=True) 9 10X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4) 11 12X_test, X_val, y_test, y_val = train_test_split(X_test, y_test, test_size=0.5)