MachineLearning入门-11(算法评估)

评估就是估计算法在预测新数据时候能达到什么程度,但这不是对算法准确度的保证。

当评估完算法模型之后,可以用整个数据集(训练数据集和评估数据集的合集)重新训练算法,生成最终的算法模型。

接下来将学习4种不同的分离数据集的方法,用来分离训练数据集和评估数据集,并用其评估算法模型:

分离训练数据集和评估数据集

K折交叉验证分离

弃一交叉验证分离

重复随机评估。训练数据集分离



分离训练数据集和评估数据集

最简单的方法就是将评估数据集和训练数据集完全分开,采用评估数据集来评估算法模型。通常将67%的数据集作为训练集,将33%的数据作为评估集。这是一种非常简洁。快速的数据分离技术,通常在具有大量数据。数据分布比较平衡,或者对问题的展示比较平均的情况下非常有效。

下面给出一个简单的按照67%,34%的比例分离数据,来评估逻辑回归模型的例子。

 1 #数据集分离
 2 from pandas import read_csv
 3 from sklearn.model_selection import train_test_split
 4 from sklearn.linear_model import LogisticRegression
 5
 6 filename=‘/home/aistudio/work/pima_data1.csv‘
 7 names=[‘preg‘,‘plas‘,‘pres‘,‘skin‘,‘test‘,‘mass‘,‘pedi‘,‘age‘,‘class‘]
 8 data=read_csv(filename,names=names)
 9 #将数据分为输入数据和输出数据
10 array=data.values
11 x=array[:,0:8]
12 y=array[:,8]
13 test_size=0.33
14 seed=4
15 x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=test_size,random_state=seed)
16 model=LogisticRegression()
17 model.fit(x_train,y_train)
18 result=model.score(x_test,y_test)
19 print(‘算法评估结果:%.3f‘ % (result*100))
算法评估结果:80.315

为了让算法模型具有良好的可复用性,在指定了分离数据大小的同时,还指定了数据随机的粒度(seed=4),将数据随机进行分离。通过指定随机粒度,可以确保每次执行程序得到相同的结果,这有助于比较两个不同的算法生成的模型结果。为了保证算法比较是在相同条件下执行的,必须保证训练数据集和评估数据集是相同的。

K折交叉验证分离交叉验证是用来验证分类器性能的一种统计分析方法,有时也称作循环估计,在统计学上是将数据集样本切割成小子集的使用方法。基本思想是按照某种规则将原始数据进行分组,一部分作为训练数据集,另外一部分作为评估数据集。K折交叉验证是将原始数据集分成K组(一般是均分),将每个子集数据分别做一次验证集,其余的K-1组子集作为训练集,这样会得到K个模型,再用这K个模型最终的验证集的分类准确率的平均数,作为此K折交叉验证下分类器的性能指标。K一般大于等于2,实际操作时一般从3开始取值,只有在原始数据集和数据量比较小的时候才会尝试取2.K折交叉验证可以有效避免过学习及欠学习状态的发生,最后得到的结果也比较有说服力。通常情况下,K的取值为3,5,10.
 1 #数据集分离
 2 from pandas import read_csv
 3 from sklearn.model_selection import KFold
 4 from sklearn.model_selection import cross_val_score
 5 from sklearn.linear_model import LogisticRegression
 6
 7 filename=‘/home/aistudio/work/pima_data1.csv‘
 8 names=[‘preg‘,‘plas‘,‘pres‘,‘skin‘,‘test‘,‘mass‘,‘pedi‘,‘age‘,‘class‘]
 9 data=read_csv(filename,names=names)
10 #将数据分为输入数据和输出数据
11 array=data.values
12 x=array[:,0:8]
13 y=array[:,8]
14 num_folds=10
15 seed=7
16 kfold=KFold(n_splits=num_folds,random_state=seed)
17 model=LogisticRegression()
18
19 result=cross_val_score(model,x,y,cv=kfold)
20 print(‘算法评估结果:%.3f%% (%.3f%%)‘ % (result.mean()*100,result.std()*100))

执行的结果给出了评估得分及标准方差如下:

算法评估结果:76.951% (4.841%)

弃一交叉验证分离如果原始数据集有N个样本,那么弃一交叉验证就是N-1个交叉验证,即每个样本单独作为验证集,其余的N-1个样本作为训练集,所以弃一交叉验证会得到N个模型,用这N个模型最终的验证集的分类准确率的平均数作为此次弃一交叉验证分类器的性能指标。相较于K折交叉验证,弃一交叉验证有两个显著的优点:
  • 每一个回合中几乎所有的样本都用于训练模型,因此最接近原始样本的分布,这样评估所得到的结果比较可靠。
  • 实验过程中没有随机因素会影响实验数据,确保实验过程是可以被复制的。

但弃一交叉验证的缺点是计算成本高,因为需要建立的模型数量与原始数据样本数量相同,当原始数据样本数据量相当多时,弃一交叉验证在实际运行上便有困难,需要花费大量的实践来完成算法的运算与评估,除非每次训练分类器得到模型的速度很快,或者可以用并行化计算

减少计算量。

 1 #数据集分离
 2 from pandas import read_csv
 3 from sklearn.model_selection import LeaveOneOut
 4 from sklearn.model_selection import cross_val_score
 5 from sklearn.linear_model import LogisticRegression
 6
 7 filename=‘/home/aistudio/work/pima_data1.csv‘
 8 names=[‘preg‘,‘plas‘,‘pres‘,‘skin‘,‘test‘,‘mass‘,‘pedi‘,‘age‘,‘class‘]
 9 data=read_csv(filename,names=names)
10 #将数据分为输入数据和输出数据
11 array=data.values
12 x=array[:,0:8]
13 y=array[:,8]
14 loocv=LeaveOneOut()
15 model=LogisticRegression()
16
17 print(‘Start------------‘)
18 result=cross_val_score(model,x,y,cv=loocv)
19 print(‘算法评估结果:%.3f%% (%.3f%%)‘ % (result.mean()*100,result.std()*100))
20 print(‘End------------‘)
Start------------
算法评估结果:76.823% (42.196%)
End------------可以看到利用此方法计算出的标准方差和K折交叉验证的结果有较大的差距。

重复随机分离数据集与训练数据集另外一种K折交叉验证的用途是随机分离数据为训练数据集和评估数据集,但是重复这个过程多次,就如同交叉验证分离。下面实例就是将数据按照67%,33%的比例分离,然后重复这个过程10次。
 1 #数据集分离
 2 from pandas import read_csv
 3 from sklearn.model_selection import ShuffleSplit
 4 from sklearn.model_selection import cross_val_score
 5 from sklearn.linear_model import LogisticRegression
 6
 7 filename=‘/home/aistudio/work/pima_data1.csv‘
 8 names=[‘preg‘,‘plas‘,‘pres‘,‘skin‘,‘test‘,‘mass‘,‘pedi‘,‘age‘,‘class‘]
 9 data=read_csv(filename,names=names)
10 #将数据分为输入数据和输出数据
11 array=data.values
12 x=array[:,0:8]
13 y=array[:,8]
14 n_splits=10
15 test_size=0.33
16 seed=7
17 kfold=ShuffleSplit(n_splits=n_splits,test_size=test_size,random_state=seed)
18 model=LogisticRegression()
19
20 print(‘Start------------‘)
21 result=cross_val_score(model,x,y,cv=kfold)
22 print(‘算法评估结果:%.3f%% (%.3f%%)‘ % (result.mean()*100,result.std()*100))
23 print(‘End------------‘)
Start------------
算法评估结果:76.535% (1.672%)
End------------

小结
  • K折交叉验证是用来评估机器学习算法的黄金准测。通常会取K为3,5,10来分离数据
  • 分离训练数据集和评估数据集。因为执行效率比较高,通常会用于算法的执行效率比较低,或者具有大量数据的时候
  • 弃一交叉验证和重复随机分离评估数据集与训练数据集这两种方法,通常会用于平衡评估算法、模型训练的速度及数据集的大小
  • 还有一条黄金准则就是,当不知道如何选择分离数据集的方法时,请选择K折交叉验证来分离数据集;当不知如何设定K时,就设置K=10

原文地址:https://www.cnblogs.com/yuzaihuan/p/12400300.html

时间: 2024-10-12 17:16:18

MachineLearning入门-11(算法评估)的相关文章

MachineLearning入门-4

查看数据本身也是一个很好理解数据的方法,通过查看数据可以直观的看到数据的特征,数据的类型以及大概的数据分布范围. 1 #查看数据的前10行 2 print(dataset.head(10)) separ-length separ-width petal-length petal-width class 0 5.1 3.5 1.4 0.2 Iris-setosa 1 4.9 3.0 1.4 0.2 Iris-setosa 2 4.7 3.2 1.3 0.2 Iris-setosa 3 4.6 3.

隐马尔科夫模型HMM(二)前向后向算法评估观察序列概率

隐马尔科夫模型HMM(一)HMM模型 隐马尔科夫模型HMM(二)前向后向算法评估观察序列概率 隐马尔科夫模型HMM(三)鲍姆-韦尔奇算法求解HMM参数(TODO) 隐马尔科夫模型HMM(四)维特比算法解码隐藏状态序列(TODO) 在隐马尔科夫模型HMM(一)HMM模型中,我们讲到了HMM模型的基础知识和HMM的三个基本问题,本篇我们就关注于HMM第一个基本问题的解决方法,即已知模型和观测序列,求观测序列出现的概率. 1. 回顾HMM问题一:求观测序列的概率 首先我们回顾下HMM模型的问题一.这个

MySQL入门-11:数据的增、删、改

1.数据插入 2.数据更新 3.数据删除 4.更新和删除的指导原则 1.数据插入-INSERT 插入数据可以使用以下几种方式: 插入完整的行 插入行的一部分 插入多行 插入某些查询的结果 Syntax: INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]     [INTO] tbl_name [(col_name,...)]     {VALUES | VALUE} ({expr | DEFAULT},...),(...),...

图像配准建立仿射变换模型并用RANSAC算法评估

当初选方向时就因为从小几何就不好.缺乏空间想像能力才没有选择摄影测量方向而是选择了GIS.昨天同学找我帮他做图像匹配,这我哪里懂啊,无奈我是一个别人有求于我,总是不好意思开口拒绝的人.于是乎就看着他给的一章节内容开始写程序了,今天总算给他完成了.做的比较简单,中间也遇到了不少问题,尤其是计算量大的问题,由于老师给的数据是粗配准过的数据, RANSAC算法评估时就简化了下. 理论内容: 第5章 图像配准建立几何变换模型 特征点建立匹配关系之后,下一步就是求解图像之间的变换关系.仿射变换能够很好的表

ASP.NET MVC 入门11、使用AJAX

asp.net mvc 支持微软自身Ajax 和 JQuery框架 asp.net mvc View视图可以理解为 一个包含"<%%>"变量引和的模板. Script与HTML优雅分离参见: http://www.cnblogs.com/QLeelulu/archive/2008/10/22/1317214.html ASP.NET MVC 入门11.使用AJAX

Cesium入门11 - Interactivity - 交互性

Cesium入门11 - Interactivity - 交互性 Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coinidea.com/ 最后,让我们添加一些鼠标交互.为了提高我们的geocache标记的可见性,当用户在标记上hovers时,我们可以改变它们的样式来突出显示. 为了实现这一点,我们将使用拾取pick,一种Cesium的特征,从3D场景中返回数据,在观看者画布上给出像素位置. 这里有以下几种不同的picking: Sc

MachineLearning入门-3

机器学习中的HelloWorld项目 这个项目是针对鸢尾花(Iris Flowers)进行分类的一个项目,数据集是含鸢尾花的三个亚属得分类信息,通过机器学习算法生成一个模型,自动分类新数据到这三个亚属的某一个中.项目中使用的鸢尾花数据集是一个非常容易理解的数据集,这个数据集具有以下特点: 所有的特征数据都是数字,不需要考虑如何导入和处理数据 这是一个分类问题,可以很方便的通过有监督学习算法来解决问题 这是一个多分类问题,也许需要一些特殊的处理 所有的特征数值采用相同的单位,不需要进行尺度的转换

MOD 10,11算法(GB/T 17710-1999 数据处理 校验码系统 )的 Python实现

以上是算法简要说明,以下代码为Python实现,不过注意代码中的N=15,不是16. 1 # GB/T 17710 双模校验算法 2 # QQ 3257132998 3 4 def GB_Code(str): 5 str=str.replace(' ','') 6 7 p=10 8 for j in range(1,15): 9 numerator=(p+int(str[j-1]))%10 10 if(numerator==0): 11 numerator=10 12 p=(numerator*

Python零基础入门(11)-------dict 字典表

dict 字典表属于映射的数据类型 特性:通过键(key),而不是通过下标访问数据 包含任意对象的无序集合 可变长度,可任意嵌套 属于"可变映射" 分类 对象引用表(Hash Table) 声明:   d = { } 是一个空的字典表.字典表是一个 {key: value} 的形式.key 只能是不可变的元素(可变类型List就不可以). 从下面图片你也可以看出 dict 字典表 是一个无序的集合.是通过内部Hash算法排序的 key 只能是不可变类型的数据.可变类型就会抛出错误信息