上QQ阅读APP看书,第一时间看更新
3.4 效果验证
效果验证是机器学习非常重要的一个环节,最常使用的是交叉验证。常见的验证过程如图3-15所示。以SVM为例,导入SVM库以及Scikit-Learn自带的样本库datasets:
图3-15 常见验证过程
>>> import numpy as np >>> from sklearn.model_selection import train_test_split >>> from sklearn import datasets >>> from sklearn import svm
获取样本数据:
>>> iris = datasets.load_iris() >>> iris.data.shape, iris.target.shape ((150, 4), (150, ))
为了保证效果,使用函数train_test_spli随机分割样本为训练样本和测试样本:
>>> X_train, X_test, y_train, y_test = train_test_split( ... iris.data, iris.target, test_size=0.4, random_state=0) >>> X_train.shape, y_train.shape ((90, 4), (90, )) >>> X_test.shape, y_test.shape ((60, 4), (60, ))
调用SVM进行训练:
>>> clf = svm.SVC(kernel='linear', C=1).fit(X_train, y_train)
判断预测结果与测试样本标记的结果,得到准确率:
>>> clf.score(X_test, y_test) 0.96...
为了提高验证的准确度,比较常见的方法是使用K折交叉验证。所谓K折交叉验证,就是初始采样分割成K个子样本,一个单独的子样本被保留作为验证模型的数据,其他K-1个样本用来训练。交叉验证重复K次,每个子样本验证一次,平均K次的结果或者使用其他结合方式,最终得到一个单一估测。三折交叉验证原理图见图3-16。这个方法的优势在于,同时重复运用随机产生的子样本进行训练和验证,每次的结果验证一次,十折交叉验证是最常用的。还是上面的例子,十折交叉验证实现如下:
图3-16 三折交叉验证原理图
>>> from sklearn.model_selection import cross_val_score >>> clf = svm.SVC(kernel='linear', C=1) >>> scores = cross_val_score(clf, iris.data, iris.target, cv=5) >>> scores array([ 0.96..., 1. ..., 0.96..., 0.96..., 1. ])