我们运用手里有的数据,选择机器学习方法,建造好了模型,除了评估指标外,我们还可以判断模型的是否错误:
有两种常见的错误类型:
- 欠拟合和过拟合
- 欠拟合,模型过于简单,拟合的不够好,经常发生错误(高偏差)。
相当于一个学生没有认真学习,很多题都没做对。 - 过拟合,模型过于复杂。倾向于记住了训练集数据(高方差),而不是学习数据的特点。
相当于一个学生把所有书本背下来了,会学过的知识,新题就不会了。
-
模型复杂度图表
根据前面学的知识,我们把数据分为训练集和测试集两部分,我们通过模型可以得出:训练集的错误数量和测试集的错误数量。我们使用不同的模型把这些错误都标记出来,如下图模型复杂度图表所示:
从模型复杂度图表上我们可以看出左侧是一个欠拟合模型,具有较高的训练误差和测试误差。右边是过拟合模型,它具有较低的训练误差和较高的测试误差。中间的模型刚刚好,它具有相对较低的训练误差和测试误差。这就是我们应该选择的模型。
我们虽然通过模型复杂度图表选择了最佳模型,但是我们犯了一个致命错误,就是使用了测试集。除了最后一步,任何时候我们都不应该使用测试集。 -
交叉验证
为了达到以上相同的效果并且不动用测试集,我们把训练集再划分,分为:训练集和交叉验证集。测试集照样不动它。
我们更为一般话的模型复杂度图表为:
我们力求在误差和学习能力之间找到一个最佳位置。 -
K-FOLD交叉验证
数据被分为训练集和测试集,那么总是会有些对训练模型有用的数据被浪费了,为了充分利用数据,我们学习K-FOLD交叉验证。
把所有数据分成K份,
每次留出一份作为测试集,其余数据作为训练集,
这样循环K次,求结果的平均值,最终得到模型。
使用sklearn中实现from sklearn.model_selection import KFold kf = KFold(12,3,shuffle = True) #数据集和测试集大小,第三个参数是随机化数据集 for train_indices,test_indices in kf: print train_indices,test_indices
-
学习曲线(判断模型欠拟合过拟合的标准)
前面四个知识点把是为了获得更好的模型对数据的准备,数据准备好了,就可以机器学习了,那么我们如何得知这个模型是欠拟合还是过拟合呢?
例:
我们第一次取4个点,然后分为训练集和交叉验证集,得到训练集的错误数和验证集的错误数。
我们第二次取8个点,然后分为训练集和交叉验证集,得到训练集的错误数和验证集的错误数。
我们第三次取12个点,然后分为训练集和交叉验证集,得到训练集的错误数和验证集的错误数。
把点数作为横坐标,错误数作为纵坐标,画出曲线图。
黄色是验证集的错误曲线,绿色是训练集的错误曲线。
第一幅图是一次函数,第二幅图是二次函数,第三幅图是六次函数。
特点:
第一幅:欠拟合的黄绿曲线接近,但是错误点较高,意思是错误较多。
第二幅:黄绿曲线接近,错误点较低。
第三幅:过拟合的黄绿曲线相隔较远,明显的训练集表现好,交叉验证集表现很差,非常符合过拟合的特点。
这些曲线叫学习曲线,可以用学习曲线来判断欠拟合过拟合,并选出合适的模型。
机器学习过程:
首先使用数据训练一推模型,(训练集)
然后使用交叉验证调蓄那最佳模型,(交叉验证集)得到F1得分,
最后对F1得分较高的模型使用测试集测试模型是否很好。(测试集)
例:逻辑回归
模型 | 训练集训练后的曲线斜率和系数 | 交叉验证后的F1得分 |
---|---|---|
第一个逻辑回顾模型:一次模型 | 0.5 | |
第二个逻辑回顾模型:二次模型 | 0.8 | |
第三个逻辑回顾模型:三次模型 | 0.4 | |
第四个逻辑回顾模型:四次模型 | 0.2 |
逻辑回归中F1得分最高的是0.8,所以我们会使用测试集来验证二次函数的逻辑回顾模型是否很好。总体来看,这些算法参数是多项式的系数。我们先称它为超参数。
例:决策树
我们决定决策树的超参数是深度。意思是根据超参数的值调整模型,现在,我们的超参数是深度,我们就改变决策树的深度值,形成各个模型。
模型 | 训练集训练后的曲线斜率和系数 | 交叉验证后的F1得分 |
---|---|---|
深度为一的模型 | 0.4 | |
深度为二的模型 | 0.5 | |
深度为三的模型 | 0.9 | |
深度为四的模型 | 0.2 |
决策树中F1得分最高的是0.9,所以我们会使用测试集来验证深度为2的决策树模型是否很好。
逻辑回归和决策树的超参数个数都是1,是否有超参数个数为多个的情况呢?答案是有的。
例:支持向量机
超参数有:
内核:可以理解为一次线性,多次多项式
γ
\gamma
γ参数:相当于调整曲线的斜率
如下图所示:
此时超参数就是两个了,我们训练模型的时候就得组合起来看。如何组合?运用网格搜索法。
- 网格搜索
对于存在多个超参数的模型,我们制作一个表格列出所有可能的组合,然后选择最佳组合。
对于上面的支持向量机来说:列是不同的 γ \gamma γ值,行是不同的内核值。用训练集训练数据,用交叉验证集求得F1得分,取最高得分,使用测试集判断模型好坏。
在sklearn中实现网格搜索(更多数据处理部分可参照上几篇博客)#导入 GridSearchCV from sklearn.model_selection import GridSearchCV #选择参数,使用字典,键 (keys) 将是参数的名称,值 (values) 将是每个参数可能值的列表 parameters = {'kernel':['poly', 'rbf'],'C':[0.1, 1, 10]} #创建一个评分机制 (scorer),也就是F1得分 from sklearn.metrics import make_scorer from sklearn.metrics import f1_score scorer = make_scorer(f1_score) #使用参数 (parameter) 和评分机制 (scorer) 创建一个 GridSearch 对象。 # 使用此对象与数据保持一致 (fit the data) # Create the object. grid_obj = GridSearchCV(clf, parameters, scoring=scorer) # Fit the data grid_fit = grid_obj.fit(X, y) #获得最佳估算器 (estimator) best_clf = grid_fit.best_estimator_