西瓜书习题3.4 (交叉验证法)
西瓜书习题3.4 (交叉验证法):
选择两个UCI数据集,比较10折交叉验证法和留一法所估计出的对率回归的错误率.
1.数据集长啥样?
于是就下载了一组UCI数据集,它长这样:
至于这些数据是啥意思、UCI又是啥,咱也不知道咱也不敢问qwq~,只知道有748行、5列,在咱眼里它就是一个 (748 * 5)的矩阵。第5列数据是0和1,那它肯定是labels,属于二分类问题。
2.啥是十折交叉验证法?啥是留一法?
k折交叉验证法:
我们将数据集随机分成k份,使用其中 k-1 份进行训练而将另外1份用作测试。该过程可以重复 k 次,每次使用的测试数据不同。
(1)每一次迭代中留存其中一个桶。第一次迭代中留存桶1,第二次留存桶2,其余依此类推。
(2)用其他 k-1 个桶的信息训练分类器(第一次迭代中利用从桶2到桶 k 的信息训练分类器)。
(3)最终返回这 k 次测试结果的accuracy的均值
十折交叉验证法就是 k=10 的情况
留一法则是 k=总样本数 的情况,即每次迭代从总样本取一条数据做测试集,剩余的全做训练集
3.以上一顿分析猛如虎,是时候该撸码实现啦 qwq
import numpy as np
import pandas as pd# sigmoid函数
def sigmoid(z):return 1.0 / (1.0 + np.exp(-z))# 梯度上升算法
def grad(train_X, labels, iters=2000):m, n = train_X.shape# 步长alphaalpha = 0.05# 初始化权重,全设为1weights = np.ones((n, 1))# 2000次迭代for k in range(iters):# 沿着梯度方向,向前移动,并更新权重P = sigmoid(train_X.dot(weights))error = labels - Pweights += alpha * np.dot(train_X.T, error)return weights# predict function 返回一组预测结果,由0或1构成的 (m,1)矩阵
def predict(test_X, weights):m = test_X.shape[0]#由sigmoid函数的性质,z = w * x , z大于0时,sigmoid(Z)>0.5 即预测为1,反之预测为0 p = np.dot(test_X, weights)for k in range(m):if p[k] > 0:p[k] = 1else:p[k] = 0return p# calculate accuracy 计算准确率,一列是预测结果,一列是真实结果,结果相同则计数
def accuracy(predict_Y, Y):m, n = Y.shapeMatched = 0for k in range(m):if predict_Y[k] == Y[k]:Matched += 1else:Matched += 0return Matched / m#数据矩阵化df = pd.read_csv('Transfusion.txt')
df['one'] = 1
#print(df)X = np.hstack((np.mat(df['one']).T,np.mat(df.iloc[:,0:4])))
Y = np.mat(df.iloc[:,4]).T
#print(X,Y)# 留一法:有m个数据样本,k折交叉验证是把样本划分为10等份,留一法就是k=m时的场景,即每次留1个样本做测试集,剩余的全部做训练集
total = X.shape[0]
sum = 0
for k in range(total):test_index = k # 测试集下标test_X = X[k]test_Y = Y[k]train_X = np.delete(X, test_index, axis=0)train_Y = np.delete(Y, test_index, axis=0)# 对率回归weights = grad(train_X, train_Y)# 统计正确率p = predict(test_X, weights)sum += accuracy(p, test_Y)print('''LeaveOneOut's Accuracy: ''', sum / total)#十折交叉验证,把样本分成10等分,在这10份数据中依次抽取一份做测试集,剩余9份做训练集,重复10次
total = X.shape[0]
num_split = int(total / 10)
sum = 0for k in range(10):#选择测试集的下标test_index = range(k * num_split , (k+1) * num_split)test_X = X[test_index]test_Y = Y[test_index]train_X = np.delete(X,test_index,axis=0)train_Y = np.delete(Y,test_index,axis=0)#求对率回归最优参数weights = grad(train_X,train_Y)#print(weights)#统计每次组的正确率p = predict(test_X,weights)sum += accuracy(p,test_Y)#result += predict(test_X,weights)==test_Y ? 1:0#正确次数 / 验证总次数 = 准确率
print('''10-foldCrossValidation's Accuracy: ''',sum/10)
结果是:
LeaveOneOut's Accuracy: 0.783132530120481910-foldCrossValidation's Accuracy: 0.7459459459459458
可以发现留一法准确率高十折交叉验证法将近4个百分点,其实差别不是很大,但使用留一法的运算时间却十分漫长
其原因是十折交叉验证法只需训练10个模型,而留一法则需要训练跟样本数量一样多的模型,而本次样本数量为748,速度慢一大截
可见,在数据集比较大时,留一法并不适用。(例如100万个样本,则需要训练100万个模型,编程几分钟,训练好几天?)
西瓜书习题3.4 (交叉验证法)相关推荐
- 西瓜书习题 - 10.机器学习初步考试
1.当学习器在训练集上把训练样本自身的一些特征当作了所有潜在样本都具有的一般性质时,泛化性能可能会因此下降,这种现象一般称为 ____.(过拟合/欠拟合) 过拟合 2.对于两个样本点 (0,0),(1 ...
- python实现留一法_数据分割:留出法train_test_split、留一法LeaveOneOut、GridSearchCV(交叉验证法+网格搜索)、自助法...
1.10 交叉验证,网格搜索 学习目标 目标 知道交叉验证.网格搜索的概念 会使用交叉验证.网格搜索优化训练模型 1 什么是交叉验证(cross validation) 交叉验证:将拿到的训练数据,分 ...
- R语言第八讲 评估模型之交叉验证法分析案例
题目 评估Auto数据集上拟合多个线性模型所产生的测试错误率.Auto数据集是存在与ISLR程序包中的一个摩托车相关数据的数据集,读者可自行下载ISLR程序包,并将Auto数据集加载. 相关资料 交叉 ...
- 评估方法(交叉验证法、自助法、留出法)
文章目录 留出法 hold-out 交叉验证法 cross validation k折交叉验证 留一法 leave-one-out cross validation 自助法 bootstrapping ...
- python交叉验证法_详解python实现交叉验证法与留出法
在机器学习中,我们经常在训练集上训练模型,在测试集上测试模型.最终的目标是希望我们的模型在测试集上有最好的表现. 但是,我们往往只有一个包含m个观测的数据集D,我们既要用它进行训练,又要对它进行测试. ...
- python 模型交叉验证法_使用交叉验证法(Cross Validation)进行模型评估
scikit-learn中默认使用的交叉验证法是K折叠交叉验证法(K-fold cross validation):它将数据集拆分成k个部分,再用k个数据集对模型进行训练和评分. 1.K折叠交叉验证法 ...
- 交叉验证法与留出法及其python实现
在机器学习中,我们经常在训练集上训练模型,在测试集上测试模型.最终的目标是希望我们的模型在测试集上有最好的表现. 但是,我们往往只有一个包含m个观测的数据集D,我们既要用它进行训练,又要对它进行测试. ...
- 模型训练评估——交叉验证法的介绍
与留出法相似,将数据集D划分为k个子集同样存在多种划分方式. 为减小因样本划分不同而引入的差别,k折交叉验证通常要随机使用不同的划分重复p次,最终的评估结果是这p次k折交叉验证结果的均值,例如常见的有 ...
- [西瓜书习题] 第二章 模型评估与选择
2.1 数据集包含1000个样本,其中500个正例,500个反例,将其划分为包含70%样本的训练集和30%样本的测试集用于留出法评估,试估算共有多少种划分方式. 留出法将数据集划分为两个互斥的集合,为 ...
最新文章
- 用Python解“龟兔赛跑”题
- 检查是否已使用jQuery选中复选框
- OV7670使用经验总结
- Java写 soapclient_Java for Web学习笔记(一一八):【篇外】Soap client
- 何谓程序员?何谓中国的程序员?
- Spring MVC与表单日期提交的问题
- did双重差分法_互助问答第252期:双重差分平行趋势检验等问题
- PPT 下载 | 神策数据曹犟:数据驱动从方法到实践
- C/C++ 位操作 总结
- honeywell扫码枪取消回车_霍尼韦尔条码扫描器常见问题与解决方法
- Google Maps API 简易教程(四)
- 中国十大名校“互撕”往事
- 伟大的程序员是怎样炼成的?
- consul服务下线通知_服务注册中心如何实现秒级服务上下线通知 | SOFARegistry 解析...
- CVPR 2020 最佳论文提名 | 神经网络能否识别镜像翻转
- “荣光医院”急救中心 73 问答
- 电脑上m4a怎么转换成mp3
- 简单易懂的关键词挖掘方法
- 多项式求和(C语言)
- Linux基础-2、基本命令