×

多项式回归——验证数据集与交叉验证

hqy hqy 发表于2025-02-28 18:36:48 浏览13 评论0百度已收录

抢沙发发表评论

交叉验证

通过训练数据得到的模型,如果在测试数据上偏差较大,这种情况称为对训练数据过拟合,但如果模型能很好的拟合测试样本,也不能说模型是准确的,因为可能存在测试数据的过拟合。为了得到可靠的模型,常用以下方法。 之前只是将数据分为训练数据和测试数据两部分,改进一下可以将数据分为三份,分别是训练数据、验证数据和测试数据。

训练数据训练出最初的模型,之后使用验证数据进行验证和调参,最后使用测试数据测试。注意,只有测试数据不参与模型训练。  但这样的方式也存在一个问题,数据的划分存在随机性,怎么能够将随机性造成的影响降到最低,应当使用交叉验证的方式。

如图给出交叉验证的原理,将训练数据(可以理解为训练数据和验证数据的总称)分为k份,通过不同的组合方式训练出多个模型。通过对每个模型进行测试,计算当前参数下模型准确度的最高的进行作为最优模型,这个衡量标准通常选用准确度均值作为标准进行衡量。 加入现在训练一个KNN模型,通过for循环对参数进行调整

import numpy as npimport sklearn.datasets as datasetfrom sklearn.model_selection import train_test_splitfrom sklearn.neighbors import KNeighborsClassifierfrom sklearn.model_selection import cross_val_score加载数据data = dataset.load_digits()X = data.datay = data.targetX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4,random_state=666)通过for循环进行调试best_score = -1best_k = 0best_p = 0for k in range(210):for p in range(16):        knn_clf = KNeighborsClassifier(n_neighbors=k, p=p, weights=distance)        knn_clf.fit(X_train, y_train)        score = knn_clf.score(X_test, y_test)if score > best_score:            best_score = score            best_k = k            best_p = pprint(best K is , best_k)print(best p is , best_p)print(best score is , best_score)

得到的最佳的k,p和准确度为

best K is3best p is4best score is0.9860917941585535

使用交叉验证获取最佳参数

通过交叉验证进行调参knn_clf = KNeighborsClassifier()scores = cross_val_score(knn_clf, X_train, y_train)print(scores)#放入for循环中获取最佳参数best_score = -1best_k = 0best_p = 0for k in range(210):for p in range(16):        knn_clf = KNeighborsClassifier(n_neighbors=k, p=p, weights=distance)        knn_clf.fit(X_train, y_train)        scores = cross_val_score(knn_clf, X_train, y_train)        score = np.mean(scores)if score > best_score:            best_score = score            best_k = k            best_p = pprint(best K is , best_k)print(best p is , best_p)print(best score is , best_score)

交叉验证在sklearn中被封装在model_selection包下的cross_val_score中,传入参数有,通过第一个print()函数,得到的输出

[0.988950280.977777780.96629213]

可见当前数据被分为三份,通过交叉验证的方式得到的每个组合的准确度为0.98895028、0.97777778和0.96629213。3是默认的分割分数,可以通过cv参数调整数据被分割的份数。 之后通过for循环的方式指定KNN参数并使用交叉验证获取准确度平均值最高者为最优的模型得到结果

best K is2best p is2best score is0.9823599874006478

和之前单纯用for循环的结果不同了,best score不如之前高,但由于交叉验证的准确度计算方式的不同和使用交叉验证尽可能避免随机性带来的影响,可能该模型的准确性在实际情况下会更好。