《Python数据分析与数据挖掘实战》第九章学习——支持向量机

第九章主要是对支持向量机(SVM)的应用,应用领域是水质评价,即利用支持向量机对图像数据进行训练,从而对水质类别进行分类。
关于支持向量机的理论内容,支持向量机通俗导论(理解SVM的三层境界)这篇文章讲得非常详细,博主主要对书中的实战部分进行整理。
首先,对数据进行导入,并构造特征和标签。
代码如下:

#-*- coding:utf-8 -*-
import pandas as pd
import numpy as np
inputfile='D:/ProgramData/PythonDataAnalysiscode/chapter9/demo/data/moment.csv'
data=pd.read_csv(inputfile,encoding='gbk')
data=data.take(np.random.permutation(len(data)))
data=data.as_matrix()
data_train=data[:int(0.8*len(data)),:]
data_test=data[int(0.8*len(data)):,:]

#构造特征和标签
x_train=data_train[:,2:]*30
y_train=data_train[:,0].astype(int)
x_test=data_test[:,2:]*30
y_test=data_test[:,0].astype(int)

值得一提的是,原书中,打乱数据用的是random.shuffle,经过实践,此函数打乱后的数据并不是我们想要的结果。此处应该用以下三种方法来打乱数据:

data.sample(frac=1)
【from sklearn.utils import shuffle
shuffle(data)】data.take(np.random.permutation(len(data)))】

然后,导入算法,训练模型。
代码如下:

#导入模型相关的函数,建立并训练模型
from sklearn import svm
model=svm.SVC()
model.fit(x_train,y_train)
import pickle
#保存模型
pickle.dump(model,open('D:/ProgramData/PythonDataAnalysiscode/chapter9/demo/data/svm.model','wb'))

最后,对测试集数据进行预测,并画出训练数据和测试数据预测的混淆矩阵图。
书中并没有对预测结果的混淆矩阵进行可视化,博主参照其他资料,将混淆矩阵绘图函数代码记录如下:

import matplotlib.pyplot as plt
import itertools
def plot_confusion_matrix(cm, classes,
                          normalize=False,
                          title='Confusion matrix',
                          cmap=plt.cm.Blues):
    """
    This function prints and plots the confusion matrix.
    Normalization can be applied by setting `normalize=True`.
    """
    plt.imshow(cm, interpolation='nearest', cmap=cmap)
    plt.title(title)
    plt.colorbar()
    tick_marks = np.arange(len(classes))
    plt.xticks(tick_marks, classes, rotation=45)
    plt.yticks(tick_marks, classes)

    if normalize:
        cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]

    thresh = cm.max() / 2.
    for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):
        plt.text(j, i, cm[i, j],
                 horizontalalignment="center",
                 color="white" if cm[i, j] > thresh else "black")

    plt.tight_layout()
    plt.ylabel('True label')
    plt.xlabel('Predicted label')

具体混淆矩阵运行代码如下:

from sklearn import metrics
cm_train=metrics.confusion_matrix(y_train,model.predict(x_train))
cm_test=metrics.confusion_matrix(y_test,model.predict(x_test))
fig=plt.figure(figsize=(10,5))
ax=fig.add_subplot(121)
plot_confusion_matrix(cm_train,classes=range(5),title='Confusion matrix on train-set')
ax=fig.add_subplot(122)
plot_confusion_matrix(cm_test,classes=range(5),title='Confusion matrix on test-set')
plt.show()

输出结果如下图:
这里写图片描述
支持向量机在训练集上的准确率有93.3%,但其在测试集上的准确率却只有79.5%。说明模型方差较大,可能存在过拟合。
但是由于我们前面将数据进行了打乱,因此每一次运行的结果都有所不同,经几次运行,在测试集上的准确率最高的达到92.68%,这应该与数据量的限制有关系。
这说明支持向量机模型对于水质评价分类效果较好,但是数据量太少,需要更多的数据,这样才能得到更为稳定的结果。
最后,这一章的实践较为简单,但支持向量机的理论部分还是需要好好理解,其应用还是非常广泛的。

猜你喜欢

转载自blog.csdn.net/sinat_33519513/article/details/79016885