训练集、测试集与验证集
在这篇文章中,我们将看到如何训练、测试和验证数据集。
分割数据集的根本目的是评估训练好的模型在归纳到新数据时的效果如何。这种分割可以通过使用scikit-learn的train_test_split函数来实现。
训练集
这是一个模型训练的实际数据集,即模型看到并从这些数据中学习,以预测结果或做出正确的决定。大多数训练数据都是从一些资源中收集的,然后进行预处理和组织,以提供模型的适当性能。训练数据的类型决定了模型的概括能力,即训练数据的质量和多样性越好,模型的性能就越好。这些数据占该项目总数据的60%以上。
示例:
# Importing numpy & scikit-learn
import numpy as np
from sklearn.model_selection import train_test_split
# Making a dummy array to
# represent x,y for example
# Making a array for x ranging
# from 0-15 then reshaping it
# to form a matrix of shape 8x2
x = np.arange(16).reshape((8,2))
# y is just a list of 0-7 number
# representing target variable
y = range(8)
# Splitting dataset in 80-20 fashion .i.e.
# Testing set is 20% of total data
# Training set is 80% of total data
x_train, x_test, y_train, y_test = train_test_split(x,y,
train_size=0.8,
random_state=42)
# Training set
print("Training set x: ",x_train)
print("Training set y: ",y_train)
输出:
Training set x: [[ 0 1]
[14 15]
[ 4 5]
[ 8 9]
[ 6 7]
[12 13]]
Training set y: [0, 7, 2, 4, 3, 6]
解释:
- 首先,我们使用NumPy库创建了一个8×2形状的虚拟矩阵来表示输入的x,还有一个0到7的整数列表表示我们的目标变量y。
- 现在,为了将我们的数据集分成训练和测试数据,我们使用了sklearn库中一个名为train_test_split的函数。
- 输入的数据x和目标变量y作为参数传递给函数,然后根据train_size给定的大小将数据集分成两部分,即如果train_size=0.8,那么数据集将以这样的方式被分割,训练集将是给定数据集的80%,测试集将是给定数据集的20%。
- 由于我们指定random_state为正数,train_test_split函数将随机分割数据。
测试集
这个数据集独立于训练集,但具有某种类似的类别概率分布,被用作评估模型的基准,只在模型的训练完成后使用。测试集通常是一个经过适当组织的数据集,具有模型在现实世界中使用时可能面临的各种场景的数据。通常情况下,验证集和测试集的组合被用作测试集,这并不是一个好的做法。如果模型在训练数据上的准确性大于在测试数据上的准确性,那么这个模型就被认为是过拟合了。这些数据大约是项目总数据的20-25%。
示例:
# Importing numpy & scikit-learn
import numpy as np
from sklearn.model_selection import train_test_split
# Making a dummy array to represent x,y for example
# Making a array for x ranging from 0-15 then
# reshaping it to form a matrix of shape 8x2
x = np.arange(16).reshape((8, 2))
# y is just a list of 0-7 number representing
# target variable
y = range(8)
# Splitting dataset in 80-20 fashion .i.e.
# Training set is 80% of total data
# Testing set is 20% of total data
x_train, x_test, y_train, y_test = train_test_split(x, y,
test_size=0.2,
random_state=42)
# Testing set
print("Testing set x: ", x_test)
print("Testing set y: ", y_test)
输出:
Testing set x: [[ 2 3]
[10 11]]
Testing set y: [1, 5]
解释:
- 为了展示train_test_split函数是如何工作的,我们首先使用NumPy库创建了一个8×2形状的虚拟矩阵来表示输入的x,还有一个0到7的整数列表表示我们的目标变量y。
- 现在,为了将我们的数据集分成训练和测试数据,输入数据x和目标变量y作为参数传递给函数,然后根据test_size给出的大小将数据集分成两部分,即如果test_size=0.2,那么数据集将以这样的方式被分割,测试集将是给定数据集的20%,训练集将是给定数据集的80%。
- 由于我们指定random_state为正数,train_test_split函数将随机分割数据。
验证集
验证集被用来微调模型的超参数,被认为是模型训练的一部分。模型只看到这些数据进行评估,但不从这些数据中学习,为模型提供一个客观的无偏见的评估。当验证数据集的损失大于训练数据集的损失时,验证数据集也可用于回归,中断模型的训练,即减少偏见和方差。这个数据大约占项目总数据的10-15%,但这可能会根据超参数的数量而改变,也就是说,如果模型有相当多的超参数,那么使用大的验证集会得到更好的结果。现在,只要模型在验证数据上的准确度大于训练数据上的准确度,那么该模型就被认为具有良好的泛化能力。
示例:
# Importing numpy & scikit-learn
import numpy as np
from sklearn.model_selection import train_test_split
# Making a dummy array to represent x,y for example
# Making a array for x ranging from 0-23 then reshaping it
# to form a matrix of shape 8x3
x = np.arange(24).reshape((8,3))
# y is just a list of 0-7 number representing
# target variable
y = range(8)
# Splitting dataset in 80-20 fashion .i.e.
# Training set is 80% of total data
# Combined set of testing & validation is
# 20% of total data
x_train, x_Combine, y_train, y_Combine = train_test_split(x,y,
train_size=0.8,
random_state=42)
# Splitting combined dataset in 50-50 fashion .i.e.
# Testing set is 50% of combined dataset
# Validation set is 50% of combined dataset
x_val, x_test, y_val, y_test = train_test_split(x_Combine,
y_Combine,
test_size=0.5,
random_state=42)
# Training set
print("Training set x: ",x_train)
print("Training set y: ",y_train)
print(" ")
# Testing set
print("Testing set x: ",x_test)
print("Testing set y: ",y_test)
print(" ")
# Validation set
print("Validation set x: ",x_val)
print("Validation set y: ",y_val)
输出:
Training set x: [[ 0 1 2]
[21 22 23]
[ 6 7 8]
[12 13 14]
[ 9 10 11]
[18 19 20]]
Training set y: [0, 7, 2, 4, 3, 6]
Testing set x: [[15 16 17]]
Testing set y: [5]
Validation set x: [[3 4 5]]
Validation set y: [1]
解释:
- 为了得到验证集,使用NumPy库创建了一个8×3形状的虚拟矩阵来表示输入x。
- 现在要把数据集分成三部分就有点麻烦了。首先,数据集被分为两部分,输入数据x和目标变量y被作为参数传给函数,然后函数根据train_size给出的大小将数据集分为两部分(我们将从中得到我们的训练集),即如果train_size=0.8,那么数据集将以这样的方式划分,训练集将是给定数据集的80%,另一个集将是给定数据集的20%。
- 所以现在我们有了验证和测试的组合集,占最初给定数据集的20%。这个数据集被进一步分割,得到验证集和测试集,然后将上述分布的输出作为参数再次传递给train_test_split,它将合并的数据集按照test_size给出的大小分成两部分,即如果test_size=0.5,那么数据集将被分割成测试集和验证集的50%。