机器学习作业5

来源:互联网 发布:java中cgi是什么 编辑:程序博客网 时间:2024/06/06 01:27

使用SkLearn中的SVM进行学习

这次的作业还是很简单的。可能是由于SVM实现起来难度太大吧,老师就不要求我们实现了,直接用库就好啦!这酸爽~

那么首先准备数据。这次的数据其实并不是太好,用了UCI上面一个糖尿病相关的数据,共有8个维度,最后一个数字表示类别(0或1)。感觉SVM在这个数据集上表现不是很好,随后的实验也验证了这一点。

首先是安装 SkLearn。如果你和我一样,安装 Python 的时候没有选择 Anaconda,那装 SkLearn 可能得吃点苦头了。安装SkLearn之前,要先安装好 Numpy+MKL 以及 Scipy 这两个库。要注意 Numpy 并不是普通的 Numpy,我之前就是因为直接用 pip 安装的 Numpy,导致 SkLearn 一直运行失败。所以,安装的时候请先把以前安装的 Numpy 乖乖卸掉,Windows 系统下卸载步骤如下:

打开 Cmd 或者 PowerShell
输入 pip uninstall numpy

如果安装了其他的库,最好一并卸掉。然后登录这个奇怪的网站下载 Numpy+MKL(找不到直接 Ctrl + F 查找),以及 SkLearn。注意版本要一致。下载速度似乎非常慢,亲测迅雷可以加速。下好以后,在文件所在目录打开 Cmd,输入pip install 文件名.whl,先装 Numpy+MKL 以及 Scipy,后装 SkLearn。

然后就可以开始写代码了。代码实在太简单,首先读取数据,然后直接fit,这里我用了几种不同的核函数分别试验。训练数据和测试数据之比为3:1

from sklearn import svmimport numpy as np# 数据维度是 8 维,第 9 维是标签ATTR_DIM = 8if __name__ == '__main__':    print('正在初始化分类器和数据')    classifier_rbf = svm.SVC(kernel='rbf')    classifier_linear = svm.SVC(kernel='linear')    classifier_sigmoid = svm.SVC(kernel='sigmoid')    lines = open('Data/Diabetes.data').readlines()    raw = np.zeros([len(lines), 9])    for idx in range(len(lines)):        this_line = np.array(lines[idx].split(','), np.float32)        raw[idx] = this_line    np.random.shuffle(raw)    train_count = len(lines) * 3 // 4    train, test = np.transpose(raw[0:train_count]), np.transpose(raw[train_count:])    data_train, label_train = np.transpose(train[0:ATTR_DIM]), np.array(train[ATTR_DIM], np.int32)    data_test, label_test = np.transpose(test[0:ATTR_DIM]), np.array(test[ATTR_DIM], np.int32)    classifier_rbf.fit(data_train, label_train)    res_rbf = np.sum(np.abs(label_test - classifier_rbf.predict(data_test)))    classifier_linear.fit(data_train, label_train)    res_linear = np.sum(np.abs(label_test - classifier_linear.predict(data_test)))    classifier_sigmoid.fit(data_train, label_train)    res_sigmoid = np.sum(np.abs(label_test - classifier_sigmoid.predict(data_test)))    total = len(label_test)    print('验证RBF核函数分类器的准确率为:%.2f%%' % ((total - res_rbf) * 100 / total))    print('验证线性核函数分类器的准确率为:%.2f%%' % ((total - res_linear) * 100 / total))    print('验证Sigmoid核函数分类器的准确率为:%.2f%%' % ((total - res_sigmoid) * 100 / total))

代码总体来说没啥好注释的。读入数据的时候先进行打乱,然后分离开训练数据和测试数据,通过矩阵转置操作分离出 data 和 label,然后分别喂给不同的分类器即可。

最后看下结果

正在初始化分类器和数据
验证RBF核函数分类器的准确率为:65.62%
验证线性核函数分类器的准确率为:79.17%
验证Sigmoid核函数分类器的准确率为:65.62%

可见准确率并不是很高,其中线性核函数效果最好,勉强接近80%。
本次作业源码链接:https://coding.net/u/dapanbest/p/MLHomeworks/git/tree/master/SVM
这次就不撒花了,还有一题TAT