此文章要讲的是如何判断模型是否过拟合,如何修正它,以及修正好的模型,如何保存,以便留到下次使用。
首先要先搞清楚一个概念,什么是过拟合?
过拟合,按照我自己的理解就是,学习得太猛了,太细枝末节了,导致自己不会举一反三,平时做题做的都是一类,练习的时候都是满分,等到考试的时候题目条件稍微一变化,就不会做了。
欠拟合,就是学的太水了,平时练习题都没最好,考试当然死得惨。
所以可以把过拟合当成书呆子学书,欠拟合就是学渣学书,都考不好。
如何解决模型的这个问题呢?那就要先看看下面一节中的例子。
首先我们先看一个例子。这个例子是引用自带的数字数据计算出,利用SVC来对数据进行拟合,画出测试集与训练集的mse(最小均方误差)曲线,拟合程度就是要看随着datasizes的加大,训练集和测试集的mse应该要趋于一致,并且都比较小。否则就是欠拟合或者过拟合。过拟合时训练集的mse效果非常好,测试集的就不行了。
import numpy as np
from sklearn import datasets
from sklearn.model_selection import learning_curve
from sklearn.svm import SVC
import matplotlib.pyplot as plt
#加载自带数据 digits
digits = datasets.load_digits()
x = digits.data
y = digits.target
#划分训练集与测试集,拟合模型
train_sizes,train_loss,test_loss = learning_curve(SVC(gamma=0.001),x,y,
cv=10,
scoring='neg_mean_squared_error',
train_sizes=[0.1,0.25,0.5,0.75,1])
train_loss_mean = -np.mean(train_loss,axis=1)
test_loss_mean = -np.mean(test_loss,axis=1)
plt.plot(train_sizes,train_loss_mean,'o-',color='r',label='Training')
plt.plot(train_sizes,test_loss_mean,'o-',color='g',label='Cross-validation')
plt.xlabel('Training examples')
plt.ylabel('Loss')
plt.legend('best')
plt.show()
在这个例子中我们要使用from sklearn.model_selection import learning_curve,来计算train_sizes,train_loss,test_loss。
可以看出训练集和测试集的mse是趋于平稳的,证明拟合效果不错。
如果得出的效果不佳,我们就可以通过改变模型里的参数,来观察整个模型的拟合程度,进而修正模型的拟合程度。
已经训练好的模型,如何保存下来,用作下次使用呢?很简单。
有如下几种方法。
第一,利用pickle
import pickle
with open(‘你要保存模型的路径+文件名’,‘wb’)as f:
pickle.dump(clf,f) clf是你要保存的模型的名字。
这样就已经存放好了。
如果下次要使用的话,就是:
with open(‘路径+文件名’,‘rb’)as f:
clf2 = pickle.load(f)
clf2.predict(你需要预测的数据)
就Ok啦~
第二 joblib
from sklearn.externals import joblib
#save
joblib.dump(clf,'path+文件名')
#restore
clf3 = joblib.load('文件名')
文件名的后缀都是xx.pickle。
以上是跟着莫烦python sklearn库的学习笔记全部。