3.5 评估算法
通过不同的算法来创建模型,并评估它们的准确度,以便找到最合适的算法。将按照下面的步骤进行操作:
(1)分离出评估数据集。
(2)采用10折交叉验证来评估算法模型。
(3)生成6个不同的模型来预测新数据。
(4)选择最优模型。
3.5.1 分离出评估数据集
模型被创建后需要知道创建的模型是否足够好。在选择算法的过程中会采用统计学方法来评估算法模型。但是,我们更想知道算法模型对真实数据的准确度如何,这就是保留一部分数据来评估算法模型的主要原因。下面将按照80%的训练数据集,20%的评估数据集来分离数据。代码如下:
# 分离数据集 array=dataset.values X=array[:, 0:4] Y=array[:, 4] validation_size=0.2 seed=7 X_train, X_validation, Y_train, Y_validation=\ train_test_split(X, Y, test_size=validation_size, random_state=seed)
现在就分离出了X_train和Y_train用来训练算法创建模型,X_validation和Y_validation在后面会用来验证评估模型。
3.5.2 评估模式
在这里将通过10折交叉验证来分离训练数据集,并评估算法模型的准确度。10折交叉验证是随机地将数据分成10份:9份用来训练模型,1份用来评估算法。后面我们会使用相同的数据对每一种算法进行训练和评估,并从中选择最好的模型。
3.5.3 创建模型
对任何问题来说,不能仅通过对数据进行审查,就判断出哪个算法最有效。通过前面的图表,发现有些数据特征符合线性分布,所有可以期待算法会得到比较好的结果。接下来评估六种不同的算法:
线性回归(LR)。
线性判别分析(LDA)。
K近邻(KNN)。
分类与回归树(CART)。
贝叶斯分类器(NB)。
支持向量机(SVM)。
这个算法列表中包含了线性算法(LR和LDA)和非线性算法(KNN、CART、NB和SVM)。在每次对算法进行评估前都会重新设置随机数的种子,以确保每次对算法的评估都使用相同的数据集,保证算法评估的准确性。接下来就创建并评估这六种算法模型。代码如下:
# 算法审查 models={} models['LR']=LogisticRegression() models['LDA']=LinearDiscriminantAnalysis() models['KNN']=KNeighborsClassifier() models['CART']=DecisionTreeClassifier() models['NB']=GaussianNB() models['SVM']=SVC() # 评估算法 results=[] forkey inmodels: kfold=KFold(n_splits=10, random_state=seed) cv_results=cross_val_score(models[key], X_train, Y_train, cv=kfold, scoring='accuracy') results.append(cv_results) print('%s: %f(%f)'%(key, cv_results.mean(), cv_results.std()))
3.5.4 选择最优模型
现在已经有了六种模型,并且评估了它们的精确度。接下来就需要比较这六种模型,并选出准确度最高的算法。执行上面的代码,结果如下:
LR: 0.966667(0.040825) LDA: 0.975000(0.038188) KNN: 0.983333(0.033333) CART: 0.975000(0.038188) NB: 0.975000(0.053359) SVM: 0.991667(0.025000)
在这六种算法中有一个分类与回归树算法(CART),树算法生成的树模型可以通过图像的方式展示出来,树模型的可视化请参考附录A。
通过上面的结果,很容易看出SVM算法具有最高的准确度得分。接下来创建一个箱线图,通过图表来比较算法的评估结果。代码如下:
# 箱线图比较算法 fig=pyplot.figure() fig.suptitle('Algorithm Comparison') ax=fig.add_subplot(111) pyplot.boxplot(results) ax.set_xticklabels(models.keys()) pyplot.show()
执行结果如图3-4所示。
图3-4