超参数与模型验证
模型验证就是在选择模型和超参数之后,通过对训练数据进行学习,对比模型对已知数据的预测值与实际值的差异。模型验证的正确方法是使用留出集评估模型性能,即先从训练模型中的数据中留出一部分,然后用这部分留出来的数据检验模型性能。
但是,使用留出集使得模型失去了一部分训练机会,解决这个问题的方法是交叉验证,也就是做一组拟合,让数据的每个子集既是训练集,又是验证集。
#使用sklearn API实现交叉验证
#使用k近邻分类器,数据是鸢尾花数据集
from sklearn.datasets import load_iris
from sklearn.cross_validation import cross_val_score
from sklearn.neighbors import KNeighborsClassifier
iris = load_iris()
x = iris.data
y = iris.target
model = KNeighborsClassifier(n_neighbors=1)
cross_val_score(model, x, y, cv=5)
#输出结果
Out[20]: array([0.96666667, 0.96666667, 0.93333333, 0.93333333, 1. ])
Scikit-Learn为不同的应用场景提供了各种交叉验证方法,都以迭代器形式在corss_validation模块中实现。例如,我们每次只用一个样本做测试,其他样本全用于训练。这种交叉检验类型成为LOO(leave-one-out)交叉验证。
from sklearn.cross_validation import LeaveOneOut
scores = cross_val_score(model, x, y, cv=LeaveOneOut(len(x)))
scores.mean()
#输出结果
0.96
选择最优模型
“最优模型”的问题基本上可以看成是找出偏差和方差的平衡点的问题。使用复杂度较低的模型(高偏差)时,训练数据往往欠拟合,说明模型对训练数据和新数据都缺乏预测能力。而使用复杂度较高的模型(高方差)时,训练数据往往过拟合,说明模型对训练数据预测能力强,但是对新数据的预测能力很很差。当使用复杂度适中的模型时,验证曲线得分很高。说明再该模型复杂度条件下,偏差与方差达到均衡状态。