交叉验证的目的是更准确的获得模型的参数,而不是训练出最终模型。你没有理解交叉验证的过程:)
对于一组参数,假设叫p1。交叉验证把数据分成了三份,假设叫a,b,c。
用ab训练,c做测试,会得到一个这组参数p1训练出的模型的得分,假设叫score_ab;
用ac训练,b做测试,会得到一个这组参数p1训练出的模型的得分,假设叫score_ac;
用bc训练,a做测试,会得到一个这组参数p1训练出的模型的得分,假设叫score_bc;
我们在课程中用的cross_val_score,返回的就是这三个score
score_ab,score_ac和score_bc的平均值,叫做score1。这个score1,可以更好的描述参数p1的效果。因为,此时,我们得到这个score,一定程度刨除了随机化分数据及带来的影响。(所有的数据都有机会即当训练数据集,又当测试数据集)。
如果,再来一组参数p2,我们可以使用同样的这种方式,计算出score2。
我们比较score1和score2的高低,就可以知道这两组参数谁更好。我们最终要用更好的那组参数:)
请再仔细理解一下课程中以knn为例使用交叉验证找模型参数的代码:
best_k, best_p, best_score = 0, 0, 0for k in range(2, 11):
for p in range(1, 6):
knn_clf = KNeighborsClassifier(weights="distance", n_neighbors=k, p=p)
scores = cross_val_score(knn_clf, X_train, y_train) # 理解这里!
score = np.mean(scores) #理解这里!
if score > best_score:
best_k, best_p, best_score = k, p, score
print("Best K =", best_k)print("Best P =", best_p)print("Best Score =", best_score)
加油!:)