机器学习作业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
- 机器学习作业5
- coursera 机器学习作业
- 机器学习作业1
- 机器学习作业2
- 机器学习作业笔记
- 机器学习作业3
- 机器学习作业4
- 机器学习作业6
- 机器学习作业7
- 机器学习作业8
- 【机器学习】作业8
- 机器学习作业9
- 机器学习技法第一次作业
- 机器学习技法作业7
- 机器学习技法第二次作业
- 机器学习基石第二次作业
- 机器学习技法第三次作业
- 《机器学习基石》作业一
- 报名 | “阳奉阴违”的半监督学习算法
- html之jQuery .end()妙用
- JNI编程
- 2017-10-23 & 2017-10-24 集训总结
- 《深入理解java虚拟机》学习笔记6——类加载机制
- 机器学习作业5
- [Usaco2006 Dec]Wormholes 虫洞
- matlab多行注释
- 安卓的历史
- kafka(2)--多节点
- Uva 725 Division (技巧暴力)
- Warning[Pa082]: undefined behavior: the order of volatile accesses is undefined in this statement
- 1212: [视频]【计算几何】判断线段相交(跨立实验)
- 有没有会做c++计算器的