机器学习基本概念 交叉验证

在机器学习里,通常来说我们不能将全部数据用于训练模型,否则我们将没有数据集对该模型进行测试,从而评估我们的模型的准确率。而如果我们随机的去选择一个划分点,可能并不能发挥这个模型最好的效果,因为最终模型与参数将极大程度依赖于你对训练集和测试集的划分方法。为了解决这一问题,我们可以使用交叉验证(Cross-Validation)的方法。

 

1.交叉验证方法一:LOOCV

LOOCV方法只用一个数据作为测试集,其他的数据都作为训练集,并将此步骤重复N次(N为数据集的数据数量)。结果就是我们最终训练了n个模型,每次都能得到一个MSE(这个东西一般用来评估回归模型的性能,MSE的值越小,说明预测模型精确度越高)。而计算最终test MSE则就是将这n个MSE取平均。

比起我们随机去划分数据集,LOOCV有很多优点。首先它不受测试集合训练集划分方法的影响,因为每一个数据都单独的做过测试集。同时,其用了n-1个数据训练模型,也几乎用到了所有的数据,保证了模型的bias(关于这个部分可以看看这里)更小。不过LOOCV的缺点也很明显,那就是计算量过于大,是test set approach耗时的n-1倍。

当然,为了解决计算成本太大的弊端,又有人提供了新的方法,使得LOOCV计算成本和只训练一个模型一样快。

2.交叉验证方法二:K-fold Cross Validation

 

另外一种折中的办法叫做K折交叉验证,和LOOCV的不同在于,我们每次的测试集将不再只包含一个数据,而是多个,具体数目将根据K的选取决定。比如,如果K=5,那么我们利用五折交叉验证的步骤就是:

 

 

step1.将所有数据集分成5份

step2.不重复地每次取其中一份做测试集,用其他四份做训练集训练模型,之后计算该模型在测试集上的MSE_i

step3.将5次的MSE_i取平均得到最后的MSE

 

这里要提到的一点是关于K的选取:

K越大,每次投入的训练集的数据就越多,模型的Bias越小。但是K越大,又意味着每一次选取的训练集之前的相关性越大(考虑最极端的例子,当k=N,也就是在LOOCV里,每次都训练数据几乎是一样的)。而这种大相关性会导致最终的test error具有更大的Variance。

一般来说,根据经验我们一般选择k=5或10。

 

3.scikit-learn中的交叉验证:

 

 

 
# -*- coding:utf-8 -*- import numpy as np from sklearn.model_selection import train_test_split, cross_val_score # 第一个东西用来划分数据集,第二个用来评分 from sklearn import svm from sklearn import datasets from sklearn.neighbors import KNeighborsClassifier from sklearn import metrics iris = datasets.load_iris() # 交叉验证简单来说有两个办法 # way 1 # 支持向量机举例 clf = svm.SVC(kernel='linear', C=1) scores = cross_val_score(clf, iris.data, iris.target, cv=5) # 这里cv表示的是数据集被划分的份数 也就是k-fold的数目 print scores # way 2 # knn举例 for i in range(1,5):  X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=i) # test_size设置训练集占比20%  # random_state是在设置随机种子,若填1,其他参数一样的情况下得到的随机数组是一样的。而填0或不填,每次都会不一样。  print "random_state is ", i,", and accuracy score is:", knn = KNeighborsClassifier(n_neighbors=5) knn.fit(X_train, y_train) y_pred = knn.predict(X_test) print metrics.accuracy_score(y_test, y_pred) 

 

这样我们就实现了两个基本的交叉验证了。

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值