评估算法

在获取数据集后,从数据集中总结规律有很多种算法,那如何判断这些算法中的哪一个更适合当前的数据分析呢?此时,可以利用数据集对算法进行评估。评估就是估计算法在预测新数据的时候能达到什么程度,但这不是对算法准确度的的保证。当评估完算法模型之后,可以用整个数据集重新训练算法,生成最终的算法模型。以下为四种不同的分离数据集的方法:

  • 分离训练数据集和评估数据集
  • K折交叉验证分离
  • 弃一交叉验证分享
  • 重复随机评估、训练数据集分离

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

要使用已有的数据来评估算法,最简单的方法就是将评估数据集和训练集完全分开,采用评估数据集来评估算法模型。将原始数据集分为两部分:一部分用来训练算法生成模型,一部分通过模型来预测结果,并与已知的结果进行比较,来评估算法模型的准确度。通常数据集分配比例为67%训练、33%评估。

该方法的应用场景为:具有大量数据、数据分布比较平衡,或者对问题的展示比较平均的情况下

使用示例:

1
2
3
4
5
6
7
8
9
10
11
12
#导入csv步骤省略
#设置评估比较
test_size=0.33
#设置数据随机的粒度
seed=4
#对数据进行分离
X_train,X_test,Y_traing,Y_test=train_test_split(X,Y,test_size=test_size,random_state=seed)
model=LogisticRegression()
#测试逻辑回归算法
model.fit(X_train,Y_traing)
result=model.score(X_test,Y_test)
print("算法评估结果:%.3f%%" % (result*100))

K折交叉验证分离

K折交叉验证是指将原始数据集分成K组,将每个子集数据分别做一次验证集,其余的K-1个子集作为训练集,如此,可得K个模型,再用这K个模型最终的验证集的分类准确率的平均数,作为此K折交叉验证下分类器的性能指标。

使用示例:

1
2
3
4
5
6
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))

一般情况下,K的取值为3,5,10,如果数据集中数据量特别小,可以使用2。K折交叉验证是用来评估机器学习算法的黄金准则。

弃一交叉验证分离

弃一交叉验证与K折有一定的类似的地方,都是取出数据集的一部分作为训练集,剩余部分作为验证集,如此反复,互为训练集又互为验证集。只不过,弃一交叉验证的面更广,如果有原始数据有N个样本,那么弃一交叉验证就是N-1个交叉验证。其优势显而易见,全面、可靠,其劣势也同样明显,量大,计算成本高。

使用示例:

1
2
3
4
loocv=LeaveOneOut()
model=LogisticRegression()
result=cross_val_score(model,X,Y,cv=loocv)
print("算法评估结果: %.3f%% (%.3f%%)" % (result.mean() * 100,result.std() * 100 ))

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

这是一种扩展后的K折交叉验证,其重复多次后,基本与交叉验证分离类似了。

弃一及重复两种方法,通常会用于平衡评估算法、模型训练的速度及数据集的大小。

声明:该系列读书笔记所引用知识点均出于《机器学习,Python实践》