likes
comments
collection
share

机器学习之训练集、测试集和交叉验证

作者站长头像
站长
· 阅读数 4

在机器学习领域,训练集、测试集和交叉验证是常用的数据集划分方法,用于评估和优化机器学习算法的性能。

训练集和测试集

训练集和测试集是最基本的数据集划分方法。在这种方法中,将原始数据集划分为两个互斥的部分:训练集和测试集。通常将大部分数据用于训练模型,少部分数据用于测试模型。训练集用于训练模型,测试集用于评估模型的性能。

训练集是用于训练模型的数据集,通常占据整个数据集的大部分,我们使用训练集中的数据来调整模型的参数,使其可以对输入的数据进行正确的预测。在训练过程中,模型通过不断地调整自己的参数来最小化损失函数,使得预测结果与真实值之间的误差尽可能小。

测试集是用于测试模型性能的数据集,通常占据整个数据集的一小部分。测试集的作用是验证模型在未知数据上的预测能力,如果模型在测试集上的表现很好,那么说明模型具有较好的泛化能力。如果模型在测试集上的表现很差,那么说明模型可能过拟合了训练数据,需要调整模型的参数或使用更加复杂的模型。

在Python中,可以使用Scikit-learn库的train_test_split()函数来划分数据集。下面是一个示例代码:

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

其中,X和y分别是特征和目标变量的数据,test_size参数指定测试集的比例,random_state参数指定随机数生成器的种子,以确保每次运行结果相同。

在实际使用中,应该根据具体的问题选择合适的数据集划分方法,并根据模型的性能指标选择最优的模型。

交叉验证

交叉验证(Cross Validation,CV)是一种常用的模型评估方法,它通过反复使用数据,对模型进行评估和选择,可以有效避免过拟合和欠拟合的问题。交叉验证将数据集分成若干个子集(通常是5或10个),然后每次将其中一个子集作为测试集,其余子集作为训练集,对模型进行训练和测试。如下图所示,将数据集分成5个子集,每次使用其中一个子集作为测试集,其余子集作为训练集,最后将测试结果取平均值作为模型的性能指标。

交叉验证的目的是评估模型在新数据上的性能。对于一个具有固定的数据集的问题,一次划分仅能提供有限的信息。然而,不同的划分方式将给出不同的评估结果。因此,进行多次交叉验证,每次都采用不同的划分方式,可以减少评估结果的方差,更加准确地估计模型在新数据上的性能。

以下是一个使用交叉验证评估模型性能的示例代码:

from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LinearRegression
from sklearn.datasets import load_boston

boston = load_boston()
X, y = boston.data, boston.target

reg = LinearRegression()
scores = cross_val_score(reg, X, y, cv=5)

print("CV scores:", scores)
print("Mean CV score:", np.mean(scores))

其中,cross_val_score()是Scikit-Learn提供的用于交叉验证的函数,reg是一个线性回归模型,X和y是特征和目标变量的数据,cv参数指定交叉验证的次数,这里设为5。交叉验证的结果存储在scores变量中,可以打印出每次交叉验证的得分,以及平均得分。

在实际使用中,交叉验证可以用于评估各种机器学习算法的性能,如线性回归、支持向量机、决策树等。同时,交叉验证也可以用于调参,例如在网格搜索中,使用交叉验证选择最优的参数组合。

k折交叉验证

k折交叉验证是交叉验证的一种特殊形式,也是一种常用的模型评估方法,它可以在有限的数据集上有效地评估模型性能。k折交叉验证的基本思想是将原始数据集分成k个大小相似的互斥子集,其中k-1个子集用于训练模型,剩余的1个子集用于测试模型。将这个过程重复k次,每次选用不同的子集作为测试集,最终得到k个测试结果的平均值作为模型的性能指标。

下面是k折交叉验证的示例代码:

from sklearn.model_selection import KFold
from sklearn.linear_model import LinearRegression
import numpy as np

X = np.array([[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]])
y = np.array([3, 7, 11, 15, 19])

kf = KFold(n_splits=5)
scores = []

for train_index, test_index in kf.split(X):
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]
    reg = LinearRegression()
    reg.fit(X_train, y_train)
    score = reg.score(X_test, y_test)
    scores.append(score)

print(np.mean(scores))

在这个示例中,我们使用sklearn库中的KFold类来实现k折交叉验证。首先,我们定义了一个大小为5的KFold对象,即将数据集分成5个互斥的子集。然后,在每次循环中,我们使用KFold类的split()方法获取当前测试集和训练集的索引,然后使用这些索引从原始数据集中获取相应的训练集和测试集。接下来,我们训练了一个线性回归模型,并使用测试集评估了模型的性能。最后,我们将k次测试结果的平均值打印出来作为模型的性能指标。

需要注意的是,k折交叉验证并不是唯一的模型评估方法,也不是适用于所有情况的最佳方法。在使用时,应该根据具体的问题选择合适的数据集划分方法,并根据模型的性能指标选择最优的模型。

总结

训练集、测试集、交叉验证和k折交叉验证是机器学习中常用的模型评估方法,它们的作用是在模型训练过程中对模型的性能进行评估,从而确定模型的泛化能力。

训练集是用于训练模型的数据集,通常是将原始数据集按照一定的比例划分出来的,一般占总数据集的60%~80%。测试集是用于测试模型性能的数据集,通常是将原始数据集中未被训练过的数据划分出来的,一般占总数据集的20%~40%。模型在训练集上进行训练,在测试集上进行测试,通过测试集的表现来评估模型的性能。

交叉验证是一种比较常用的模型评估方法,它将原始数据集分成k个子集,每次使用其中k-1个子集进行训练,使用剩余的1个子集进行测试,循环k次,得到k个模型性能评估指标的平均值。这样做的好处是能够充分利用数据集中的所有数据,避免数据集划分不均匀造成的误差。

k折交叉验证是交叉验证的一种特例,它将数据集分成k个相等大小的子集,每次使用其中一个子集作为测试集,剩余的k-1个子集作为训练集,循环k次,得到k个模型性能评估指标的平均值。k折交叉验证是一种比较稳健的评估方法,通常k取值为5或10。

总之,训练集、测试集、交叉验证和k折交叉验证是机器学习中常用的模型评估方法,它们都是通过在训练集和测试集上验证模型性能,从而评估模型的泛化能力。在选择合适的评估方法时,应该根据具体问题的特点和数据集的分布进行选择,同时也需要结合模型的性能指标进行综合考虑。