请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

交叉验证训练的模型用哪个呢?

老师,交叉验证把训练数据集分成三份,然后可以训练出三个模型,三个模型的参数(比如线性回归的theta参数)很可能不一样,那请问最终要用哪个模型的参数呢?

正在回答

1回答

交叉验证的目的是更准确的获得模型的参数,而不是训练出最终模型。你没有理解交叉验证的过程:)


对于一组参数,假设叫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)


加油!:)

2 回复 有任何疑惑可以回复我~
  • 提问者 人土土zzzzz #1
    老师,您说的“交叉验证的目的是更准确的获得模型的参数”,这里的参数是指超参数吗?就是交叉验证不是为了获得模型的参数,而是为了获得模型的超参数,可以这么理解吗?
    回复 有任何疑惑可以回复我~ 2018-10-12 10:44:20
  • liuyubobobo 回复 提问者 人土土zzzzz #2
    对!超参数和模型参数是两回事儿。超参数是你可以选择的。模型参数你不能选择,只能通过训练计算出来。交叉验证可以获得一个更加准确的模型评分(相比train test split),从而得到一组更准确的超参数:)
    回复 有任何疑惑可以回复我~ 2018-10-12 10:55:57
  • 提问者 人土土zzzzz #3
    非常感谢!
    回复 有任何疑惑可以回复我~ 2018-10-12 11:37:28
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信