数据科学必备:掌握训练集、验证集与测试集的划分

数据科学必备:掌握训练集、验证集与测试集的划分在数据科学与机器学习领域,一个模型能否在先前未观测到的新数据上表现良好,这种能力被称为泛化(generalization)。模型的泛化能力是衡量其有效性的重要指标,也是机器学习面临的主要挑战之一。

大家好,欢迎来到IT知识分享网。

数据科学必备:掌握训练集、验证集与测试集的划分

在数据科学与机器学习领域,一个模型能否在先前未观测到的新数据上表现良好,这种能力被称为泛化(generalization)。模型的泛化能力是衡量其有效性的重要指标,也是机器学习面临的主要挑战之一。为了实现良好的泛化能力,我们的算法必须在新数据上表现出色,而不仅仅是在训练数据上取得高精度。

模型过度学习训练数据(即过拟合)是一个常见的问题。过拟合的模型在训练数据上表现优异,但在实际部署后遇到新数据时却表现不佳。为了避免这一问题,我们需要一种机制来评估模型的泛化能力。这就是为什么在模型训练过程中,需要将数据划分为训练集、验证集和测试集。

训练集用于训练模型,使其学习数据的模式;验证集用于调整模型的参数和选择最佳模型;测试集则用于评估模型的最终性能。通过这种数据划分,我们可以有效地防止模型过拟合,并确保其在实际应用中的表现。

我们下来理解误差及泛化误差,由误差关系导致的过拟合和欠拟合以及模型的能力:

  • 误差:误差包括训练误差(training error)和泛化误差(generalization error)(也称为测试误差,test error);机器学习的核心目标是降低泛化误差。
  • 过拟合:过拟合是指训练误差和和测试误差之间的差距太大。
  • 欠拟合:欠拟合是指模型不能在训练集上获得足够低的误差。
  • 容量:模型的容量是指其拟合各种函数的能力。

容量和误差之间的典型关系如下图。训练误差和测试误差表现得非常不同。在图的左端, 训练误差和泛化误差都非常高。这是 欠拟合机制(underfitting regime)。当我们增加容量时, 训练误差减小,但是训练误差和泛化误差之间的间距却不断扩大。最终,这个间距的大小超过了训练误差的下降,我们进入到了 过拟合机制(overfitting regime),其中容量过大,超过了 最佳容量(optimal capacity)

数据科学必备:掌握训练集、验证集与测试集的划分

接下来,我们将详细介绍如何科学地划分数据集,以及不同数据集在模型训练中的具体作用和意义。掌握这些数据划分技巧,将帮助你构建出更加稳健和可靠的机器学习模型。

训练-验证-测试(数据集)划分的定义

训练-验证-测试(数据集)划分是一种评估机器学习模型(无论是分类还是回归)性能的技术。你将一个给定的数据集分成三个子集。以下是对每个数据集角色的简要描述。

  • 训练数据集(Train Dataset):用于学习(由模型进行)的数据集,即拟合机器学习模型参数的数据。
  • 验证数据集(Valid Dataset):用于在调整模型超参数时,对训练数据集上拟合的模型进行无偏评估的数据集。也在其他形式的模型准备中发挥作用,如特征选择、阈值选择等。
  • 测试数据集(Test Dataset):用于对训练数据集上拟合的最终模型进行无偏评估的数据集。
数据科学必备:掌握训练集、验证集与测试集的划分

接下来介绍两种将数据划分为训练集、验证集和测试集的方法:

  • 随机划分
  • 使用时间序列组件划分

随机划分(Splitting Randomly)

你不能使用与训练相同的数据来评估模型的预测性能。最好使用模型之前未见过的新数据来评估模型。随机划分数据是最常用的方法,用于进行这种无偏评估。

数据科学必备:掌握训练集、验证集与测试集的划分

使用 Sklearn(train_test_split)

下面的代码是如何使用 使用 Sklearn(train_test_split) 两次来创建我们所需比例的训练集、验证集和测试集。

import pandas as pd from sklearn.model_selection import train_test_split df = pd.read_csv('Iris.csv') train_size=0.8 X = df.drop(columns = ['Species']).copy() y = df['Species'] X_train, X_rem, y_train, y_rem = train_test_split(X,y, train_size=0.8) test_size = 0.5 X_valid, X_test, y_valid, y_test = train_test_split(X_rem,y_rem, test_size=0.5) print(X_train.shape,y_train.shape) print(X_valid.shape,y_valid.shape) print(X_test.shape,y_test.shape)
数据科学必备:掌握训练集、验证集与测试集的划分

使用 Fast_ml(train_valid_test_split)

下面的代码是如何使用Fast_ml(train_valid_test_split)一行代码来创建我们所需比例的训练集、验证集和测试集。

from fast_ml.model_development import train_valid_test_split X_train, y_train, X_valid, y_valid, X_test, y_test = \ train_valid_test_split(df, target = 'Species',train_size=0.8, valid_size=0.1, test_size=0.1) print(X_train.shape,y_train.shape) print(X_valid.shape,y_valid.shape) print(X_test.shape,y_test.shape)
数据科学必备:掌握训练集、验证集与测试集的划分

使用时间序列组件进行划分

使用时间序列变量是一种更可靠的划分数据集的方法,特别是当数据集中包含日期变量,并且我们希望预测未来的某些事情时。因此,我们必须使用最新的样本来创建验证集和测试集。主要思想是总是选择一个能忠实代表模型将来遇到的数据的样本子集。

数据科学必备:掌握训练集、验证集与测试集的划分

自定义代码

下面的代码是如何编写自定义代码,在对数据进行排序后,创建我们所需比例的训练集、验证集和测试集。数据参考:https://www.kaggle.com/c/bluebook-for-bulldozers/data。

import pandas as pd df = pd.read_csv('TrainAndValid.csv', parse_dates=['saledate'], low_memory=False) train_size = 0.8 valid_size=0.1 train_index = int(len(df)*train_size) df.sort_values(by = 'saledate', ascending=True, inplace=True) df_train = df[0:train_index] df_rem = df[train_index:] valid_index = int(len(df)*valid_size) df_valid = df[train_index:train_index+valid_index] df_test = df[train_index+valid_index:] X_train, y_train = df_train.drop(columns='SalePrice').copy(), df_train['SalePrice'].copy() X_valid, y_valid = df_valid.drop(columns='SalePrice').copy(), df_valid['SalePrice'].copy() X_test, y_test = df_test.drop(columns='SalePrice').copy(), df_test['SalePrice'].copy() print(X_train.shape , y_train.shape) print(X_valid.shape , y_valid.shape) print(X_test.shape , y_test.shape)
数据科学必备:掌握训练集、验证集与测试集的划分

使用 Fast_ml(train_valid_test_split)

下面的代码是如何使用Fast_ml(train_valid_test_split),在对数据进行排序后,创建我们所需比例的训练集、验证集和测试集。所有这些操作仅需一行代码。

from fast_ml.model_development import train_valid_test_split X_train, y_train, X_valid, y_valid, X_test, y_test =\ train_valid_test_split( df, target = 'SalePrice',method='sorted', sort_by_col='saledate', train_size=0.8, valid_size=0.1, test_size=0.1) print(X_train.shape , y_train.shape) print(X_valid.shape , y_valid.shape) print(X_test.shape , y_test.shape)
数据科学必备:掌握训练集、验证集与测试集的划分

数据集的划分比例取决于数据样本总数和模型类型。样本多时,训练集应较大;超参数少的模型可减少验证集大小,而超参数多的模型则需较大验证集。对于没有或难以调优的超参数的模型,可能不需要验证集。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/85093.html

(0)

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信