机器学习为什么需要交叉验证?怎么使用k-fold cross validation(k-折叠交叉验证)

介绍这个非常重要的概念,希望在训练算法时能帮助各位。

机器学习为什么需要交叉验证?怎么使用k-fold cross validation(k-折叠交叉验证)_第1张图片

概念和思维解读

叉验证的目的:在实际训练中,模型通常对训练数据好,但是对训练数据之外的数据拟合程度差。用于评价模型的泛化能力,从而进行模型选择

交叉验证的基本思想:把在某种意义下将原始数据(dataset)进行分组,一部分做为训练集(train set),另一部分做为验证集(validation set or test set),首先用训练集对模型进行训练,再利用验证集来测试模型的泛化误差。另外,现实中数据总是有限的,为了对数据形成重用,从而提出k-折叠交叉验证。

对于个分类或回归问题,假设可选的模型为k-折叠交叉验证就是将训练集的1/k作为测试集,每个模型训练k次,测试k次,错误率为k次的平均,最终选择平均率最小的模型Mi。

机器学习为什么需要交叉验证?怎么使用k-fold cross validation(k-折叠交叉验证)_第2张图片

1、 将全部训练集S分成k个不相交的子集,假设S中的训练样例个数为m,那么每一个子集有m/k个训练样例,相应的子集称作{}。

2、 每次从模型集合M中拿出来一个,然后在训练子集中选择出k-1个

{}(也就是每次只留下一个),使用这k-1个子集训练后,得到假设函数。最后使用剩下的一份作测试,得到经验错误。

3、 由于我们每次留下一个(j从1到k),因此会得到k个经验错误,那么对于一个,它的经验错误是这k个经验错误的平均。

4、 选出平均经验错误率最小的,然后使用全部的S再做一次训练,得到最后的。



代码使用案例


一、选择正确的Model基础验证法

from sklearn.datasets import load_iris # iris数据集  
from sklearn.model_selection import train_test_split # 分割数据模块  
from sklearn.neighbors import KNeighborsClassifier # K最近邻(kNN,k-NearestNeighbor)分类算法  
#加载iris数据集  
iris = load_iris()  
X = iris.data  
y = iris.target  
#分割数据并  
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=4)  
#建立模型  
knn = KNeighborsClassifier()  
#训练模型  
knn.fit(X_train, y_train)  
#将准确率打印出  
print(knn.score(X_test, y_test))  
# 0.973684210526     基础验证的准确率  


二、选择正确的Model交叉验证法(Cross-validation)

cv= 5

from sklearn.cross_validation import cross_val_score # K折交叉验证模块  
#使用K折交叉验证模块  
scores = cross_val_score(knn, X, y, cv=5, scoring='accuracy')  
#将5次的预测准确率打印出  
print(scores)  
# [ 0.96666667  1.          0.93333333  0.96666667  1.        ]  
#将5次的预测准确平均率打印出  
print(scores.mean())  
# 0.973333333333  


三、准确率和平均方差

一般来说准确率(accuracy)会用于判断分类(Classification)模型的好坏。

import matplotlib.pyplot as plt #可视化模块  
#建立测试参数集  
k_range = range(1, 31)  
k_scores = []  
#藉由迭代的方式来计算不同参数对模型的影响,并返回交叉验证后的平均准确率  
for k in k_range:  
   knn = KNeighborsClassifier(n_neighbors=k)  
   scores = cross_val_score(knn, X, y, cv=10, scoring='accuracy')  
   k_scores.append(scores.mean())  
#可视化数据  
plt.plot(k_range, k_scores)  
plt.xlabel('Value of K for KNN')  
plt.ylabel('Cross-Validated Accuracy')  
plt.show()  


结果如图,从图中可以得知,选择12~18的k值最好。高过18之后,准确率开始下降则是出现过拟合了。




一般来说平均方差(Mean squared error)会用于判断回归(Regression)模型的好坏。
import matplotlib.pyplot as plt  
k_range = range(1, 31)  
k_scores = []  
for k in k_range:  
   knn = KNeighborsClassifier(n_neighbors=k)  
   loss = -cross_val_score(knn, X, y, cv=10, scoring='mean_squared_error')  
   k_scores.append(loss.mean())  
plt.plot(k_range, k_scores)  
plt.xlabel('Value of K for KNN')  
plt.ylabel('Cross-Validated MSE')  
plt.show()  

结果如下图,当K取13~20时,平方误差最小,模型最好。

你可能感兴趣的:(机器学习为什么需要交叉验证?怎么使用k-fold cross validation(k-折叠交叉验证))