MachineLearning入门-11(算法评估)

Posted yuzaihuan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于MachineLearning入门-11(算法评估)的主要内容,如果未能解决你的问题,请参考以下文章

MachineLearning入门-3

MachineLearning入门-7(数据理解)

MachineLearning入门-8(数据可视化)

[MachineLearning]模型评估与模型选择

《机器学习算法入门》即将上市出版,预计2020年6,7月份

azure Machine learing studio 使用示例之 - 使用线性回归算法完成预测评估