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.          ])