解决问题的关键
1.知道你到底要什么【真正的需求】
2.知道我给你的是不是你要的【提供的是否符合需求】
何为好的模型?
泛化能力强,能很好的适用于未见样本(unseen instance)的模型。
泛化误差
在”未来“样本上的误差
经验误差
在训练集上的误差,亦称”训练误差“
过拟合&欠拟合
过拟合(Overfitting):
把训练数据里面的特性学出来了,而这个特性不是一般规律(学太多,学到了不该学的东西),表现在未来的数据上(泛化误差上升,而训练误差仍呈现下降趋势)
欠拟合(Underfitting):
学的太少,容易犯错
## Overfitting是机器学习里的核心内容,找到好的模型就是找到过拟合与欠拟合的平衡点
## 所有的算法、所有的技术都是在缓解Overfitting!!
** 对于一个新的算法重点要思考它是怎样环节Overfitting,以及这种环节何时会失效
模型选择(Model Selection)
三个关键问题
1.如何获得测试结果? => 评估方法
2.如何评估性能优劣?=> 性能度量
3.如何判断实质差别?=> 比较检验
一、评估方法
关键:怎么获得“测试集”(test set)?
## 测试集应该与训练集”互斥“
常见方法:
1. 留出法(hold-out)
2.交叉验证法(cross validation)
3. 自助法(bootstrap)
留出法
将拥有的数据集分成两部分,一部分用来训练(训练集),另一部分用来限额是(测试集)
注意:
· 保持数据分布一致性(eg. 分层采样:根据类别的均匀分布的采样)
· 多次重复划分(eg. 100次随机划分,平均掉样本随即切分所造成的影响)
· 测试集不能太大、不能太小,常选用 1/5~1/3 -> Why?👇
eg. 选取80个样本训练出来的模型(记作M80)来近似所有数据(100个样本)训练出来的模型(记作M100),而其余20个样本则用来测试得出模型性能(记作Err20)来近似Err100
因此:
样本越多所得出的结果越准确,逼近能力越好=>两边都是越多越好=>矛盾 => 经验上采用1/5~1/3
## 划分数据后训练测试的过程只起到一个选择模型的作用,选定之后应该把整个数据合起来再训练一下这个模型
k-折交叉验证法
每次选出一个样本作为测试集,其他样本作为训练集,再把所有测试结果平均得出最终结果
# 交叉验证法解决留出法中可能存在的有一部分样本一直未被选中的问题
留一法(LOO)
用M99的估计来逼近M100的估计
-> 训练的模型和真正要得到的模型很近似,但是测试可能会有偏差
eg. 一个班有50个男生和50个女生,推测进来的是男生或是女生,猜测精度应为50%。留下一个男生作为测试集,剩下50个女生和49个男生作为训练集,模型会判断来的是女生,所得到模型的精度为0,结果错误。
自助法
用100个数据做模型,从中采100个样本做模型训练,采取的样本用完再放回,使得未来还有未采用的样本用做测试
自助法基于”自助采样“(bootstrap sampling),亦称“有放回采样”、“可重复采样”。
“包外估计”(out-of-bag estimation)
随机重复采样,采完后放回,将所采样本作为训练集,而未被采样过的样本作为测试集,所测试出来的结果称为“包外估计”。
eg.盒子内有十个球,每次摸一个球复制一份再放回去 -> 原来有十个球,现在还有十个球
原来有100个数据做模型,可以采样一个数据集,用100个样本做模型,同时里面未出现的数据可以留出来做测试,其中,未出现的数据的概率估计即为“包外估计”
缺陷:
1.训练数据的分布有所改变 -> 模型对于某些数据的重要性可能得到高估 -> 无法使训练数据视
为同等重要
## 适用范围:训练分布不太重要 or 数据量不够时适用
2.训练集与原样本集同规模
二、性能度量
性能度量(performance measure)是衡量模型泛化能力的评价标准,反映了任务需求
使用不同的性能度量往往会导致不同的评判结果
## 模型的“好坏”,不仅取决于算法和数据,还取决于任务需求
均方误差/二次误差/平方误差:
常用于回归(regression)任务
公式如下:
错误率 VS 精度:
常用于分类任务
错误率公式:
精度公式:
查准率 VS 查全率:
常用于复杂问题
## 复杂问题的分类结果常用混淆矩阵来表示
# TP(true positive)&TN(ture negative):预测结果和真实情况相同 -> 模型做对;
反之,FP(false positive)&FN为模型做错了
查准率(precision) —— 模型预测结果的准确率
查全率(recall) —— 所有正样本里面找出了多少
F1度量
——把查准率和查全率结合起来的均衡的方法
公式如下:
** 若对查准率 / 查全率有不同偏好:
三、比较检验
常用方法
统计假设检验(hypothesis test)为学习器性能比较提供了重要依据
两个学习器的比较:
· 交叉验证t检验 (基于成对t检验)
利用两个学习器的误差估计结果的差值的均值加上其标准差来判断是否属于一个分布 (基于一个值的误差)
eg. k折交叉检验;5x2交叉检验
· McNemar检验 (基于列联表,卡方检验)
用于考虑反对角线上的点,然后再基于卡方检验来比较
# 列联表:类似上面提到的分类结果混淆矩阵混淆矩阵,不过行和列分别为不同学习器的估计结果
调参与验证集
参数
算法的参数:一般由人工设定,亦称“超参数”
模型的参数:一般由学习确定
调参过程相似:先产生若干模型,然后基于某种评估方法进行选择
## 调参数本身就是在做一个模型选择,每一个模型就是一种参数对这个算法跟数据的实例化
## 参数调的好不好往往对最终性能有关键影响
验证集(validation set)
训练集中专门留出来用来调参数的部分
训练集 VS 测试集 VS 验证集
训练集:用来建立模型模型
验证集:把原来的训练集的数据分割出一部分用来调参数
测试集:用来了解模型的性能
关系如下:
训练集 | 测试集 |
↓
训练集 | 验证集 | 测试集 |
## 算法参数选定后,要用“训练集+验证集”重新训练最终模型,然后再把这个模型放到测试集上测试才能得到它的性能
## 调参数的过程也是训练的一部分,所以验证集只能从训练集中取出,而测试集则单独用作性能评估,测试集在训练过程中一定是没有用到的