troysps 2020-03-03
评估就是估计算法在预测新数据时候能达到什么程度,但这不是对算法准确度的保证。
当评估完算法模型之后,可以用整个数据集(训练数据集和评估数据集的合集)重新训练算法,生成最终的算法模型。
接下来将学习4种不同的分离数据集的方法,用来分离训练数据集和评估数据集,并用其评估算法模型:
分离训练数据集和评估数据集
K折交叉验证分离
弃一交叉验证分离
重复随机评估。训练数据集分离
分离训练数据集和评估数据集
最简单的方法就是将评估数据集和训练数据集完全分开,采用评估数据集来评估算法模型。通常将67%的数据集作为训练集,将33%的数据作为评估集。这是一种非常简洁。快速的数据分离技术,通常在具有大量数据。数据分布比较平衡,或者对问题的展示比较平均的情况下非常有效。
下面给出一个简单的按照67%,34%的比例分离数据,来评估逻辑回归模型的例子。
#数据集分离 from pandas import read_csv from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression filename=‘/home/aistudio/work/pima_data1.csv‘ names=[‘preg‘,‘plas‘,‘pres‘,‘skin‘,‘test‘,‘mass‘,‘pedi‘,‘age‘,‘class‘] data=read_csv(filename,names=names) #将数据分为输入数据和输出数据 array=data.values x=array[:,0:8] y=array[:,8] test_size=0.33 seed=4 x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=test_size,random_state=seed) model=LogisticRegression() model.fit(x_train,y_train) result=model.score(x_test,y_test) 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.
#数据集分离 from pandas import read_csv from sklearn.model_selection import KFold from sklearn.model_selection import cross_val_score from sklearn.linear_model import LogisticRegression filename=‘/home/aistudio/work/pima_data1.csv‘ names=[‘preg‘,‘plas‘,‘pres‘,‘skin‘,‘test‘,‘mass‘,‘pedi‘,‘age‘,‘class‘] data=read_csv(filename,names=names) #将数据分为输入数据和输出数据 array=data.values x=array[:,0:8] y=array[:,8] num_folds=10 seed=7 kfold=KFold(n_splits=num_folds,random_state=seed) model=LogisticRegression() result=cross_val_score(model,x,y,cv=kfold) print(‘算法评估结果:%.3f%% (%.3f%%)‘ % (result.mean()*100,result.std()*100))
执行的结果给出了评估得分及标准方差如下:
算法评估结果:76.951% (4.841%)
弃一交叉验证分离如果原始数据集有N个样本,那么弃一交叉验证就是N-1个交叉验证,即每个样本单独作为验证集,其余的N-1个样本作为训练集,所以弃一交叉验证会得到N个模型,用这N个模型最终的验证集的分类准确率的平均数作为此次弃一交叉验证分类器的性能指标。相较于K折交叉验证,弃一交叉验证有两个显著的优点:
但弃一交叉验证的缺点是计算成本高,因为需要建立的模型数量与原始数据样本数量相同,当原始数据样本数据量相当多时,弃一交叉验证在实际运行上便有困难,需要花费大量的实践来完成算法的运算与评估,除非每次训练分类器得到模型的速度很快,或者可以用并行化计算
减少计算量。
#数据集分离 from pandas import read_csv from sklearn.model_selection import LeaveOneOut from sklearn.model_selection import cross_val_score from sklearn.linear_model import LogisticRegression filename=‘/home/aistudio/work/pima_data1.csv‘ names=[‘preg‘,‘plas‘,‘pres‘,‘skin‘,‘test‘,‘mass‘,‘pedi‘,‘age‘,‘class‘] data=read_csv(filename,names=names) #将数据分为输入数据和输出数据 array=data.values x=array[:,0:8] y=array[:,8] loocv=LeaveOneOut() model=LogisticRegression() print(‘Start------------‘) result=cross_val_score(model,x,y,cv=loocv) print(‘算法评估结果:%.3f%% (%.3f%%)‘ % (result.mean()*100,result.std()*100)) print(‘End------------‘)
Start------------
算法评估结果:76.823% (42.196%) End------------可以看到利用此方法计算出的标准方差和K折交叉验证的结果有较大的差距。
重复随机分离数据集与训练数据集另外一种K折交叉验证的用途是随机分离数据为训练数据集和评估数据集,但是重复这个过程多次,就如同交叉验证分离。下面实例就是将数据按照67%,33%的比例分离,然后重复这个过程10次。
#数据集分离 from pandas import read_csv from sklearn.model_selection import ShuffleSplit from sklearn.model_selection import cross_val_score from sklearn.linear_model import LogisticRegression filename=‘/home/aistudio/work/pima_data1.csv‘ names=[‘preg‘,‘plas‘,‘pres‘,‘skin‘,‘test‘,‘mass‘,‘pedi‘,‘age‘,‘class‘] data=read_csv(filename,names=names) #将数据分为输入数据和输出数据 array=data.values x=array[:,0:8] y=array[:,8] n_splits=10 test_size=0.33 seed=7 kfold=ShuffleSplit(n_splits=n_splits,test_size=test_size,random_state=seed) model=LogisticRegression() print(‘Start------------‘) result=cross_val_score(model,x,y,cv=kfold) print(‘算法评估结果:%.3f%% (%.3f%%)‘ % (result.mean()*100,result.std()*100)) print(‘End------------‘)
Start------------ 算法评估结果:76.535% (1.672%) End------------
小结