分享

交叉验证

 公彦栋 2017-09-05

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


[python] view plain copy
  1. from sklearn.datasets import load_iris # iris数据集  
  2. from sklearn.model_selection import train_test_split # 分割数据模块  
  3. from sklearn.neighbors import KNeighborsClassifier # K最近邻(kNN,k-NearestNeighbor)分类算法  
  4.   
  5. #加载iris数据集  
  6. iris = load_iris()  
  7. X = iris.data  
  8. y = iris.target  
  9.   
  10. #分割数据并  
  11. X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=4)  
  12.   
  13. #建立模型  
  14. knn = KNeighborsClassifier()  
  15.   
  16. #训练模型  
  17. knn.fit(X_train, y_train)  
  18.   
  19. #将准确率打印出  
  20. print(knn.score(X_test, y_test))  
  21. # 0.973684210526     基础验证的准确率  


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

交叉验证的基本思想是把在某种意义下将原始数据(dataset)进行分组,一部分做为训练集(train set),另一部分做为验证集(validation set or test set),首先用训练集对分类器进行训练,再利用验证集来测试训练得到的模型(model),以此来做为评价分类器的性能指标。


[python] view plain copy
  1. from sklearn.cross_validation import cross_val_score # K折交叉验证模块  
  2.   
  3. #使用K折交叉验证模块  
  4. scores = cross_val_score(knn, X, y, cv=5, scoring='accuracy')  
  5.   
  6. #将5次的预测准确率打印出  
  7. print(scores)  
  8. # [ 0.96666667  1.          0.93333333  0.96666667  1.        ]  
  9.   
  10. #将5次的预测准确平均率打印出  
  11. print(scores.mean())  
  12. # 0.973333333333  

三、准确率和平均方差

一般来说准确率(accuracy)会用于判断分类(Classification)模型的好坏。
[python] view plain copy
  1. import matplotlib.pyplot as plt #可视化模块  
  2.   
  3. #建立测试参数集  
  4. k_range = range(1, 31)  
  5.   
  6. k_scores = []  
  7.   
  8. #藉由迭代的方式来计算不同参数对模型的影响,并返回交叉验证后的平均准确率  
  9. for k in k_range:  
  10.     knn = KNeighborsClassifier(n_neighbors=k)  
  11.     scores = cross_val_score(knn, X, y, cv=10, scoring='accuracy')  
  12.     k_scores.append(scores.mean())  
  13.   
  14. #可视化数据  
  15. plt.plot(k_range, k_scores)  
  16. plt.xlabel('Value of K for KNN')  
  17. plt.ylabel('Cross-Validated Accuracy')  
  18. plt.show()  
从图中可以得知,选择12~18k值最好。高过18之后,准确率开始下降则是因为过拟合(Over fitting)的问题。


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

由图可以得知,平均方差越低越好,因此选择13~18左右的K值会最好。



四、由学习曲线(Learning Curve)来检视过拟合(Overfitting)的问题

[python] view plain copy
  1. from sklearn.learning_curve import learning_curve #学习曲线模块  
  2. from sklearn.datasets import load_digits #digits数据集  
  3. from sklearn.svm import SVC #Support Vector Classifier  
  4. import matplotlib.pyplot as plt #可视化模块  
  5. import numpy as np  
加载digits数据集,其包含的是手写体的数字,从0到9。数据集总共有1797个样本,每个样本由64个特征组成, 分别为其手写体对应的8×8像素表示,每个特征取值0~16。
[python] view plain copy
  1. digits = load_digits()  
  2. X = digits.data  
  3. y = digits.target  
观察样本由小到大的学习曲线变化, 采用K折交叉验证 cv=10, 选择平均方差检视模型效能 scoring='mean_squared_error', 样本由小到大分成5轮检视学习曲线(10%, 25%, 50%, 75%, 100%):
[python] view plain copy
  1. train_sizes, train_loss, test_loss = learning_curve(  
  2.     SVC(gamma=0.001), X, y, cv=10, scoring='mean_squared_error',  
  3.     train_sizes=[0.1, 0.25, 0.5, 0.75, 1])  
  4.   
  5. #平均每一轮所得到的平均方差(共5轮,分别为样本10%、25%、50%、75%、100%)  
  6. train_loss_mean = -np.mean(train_loss, axis=1)  
  7. test_loss_mean = -np.mean(test_loss, axis=1)  
可视化图形:
[python] view plain copy
  1. plt.plot(train_sizes, train_loss_mean, 'o-', color="r",  
  2.          label="Training")  
  3. plt.plot(train_sizes, test_loss_mean, 'o-', color="g",  
  4.         label="Cross-validation")  
  5.   
  6. plt.xlabel("Training examples")  
  7. plt.ylabel("Loss")  
  8. plt.legend(loc="best")  
  9. plt.show()  




    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多