sklearn的LinearSVC
参考
- 廖雪峰的官方网站:安装python2.7
- 官网:下载python2.7
- csdn:windows Git Bash 无法运行python文件的解决方法
- 知乎:gitbash中只调用python没反应但如果后面添加了具体.py文件可以执行,是怎么回事?
- 官网:Support Vector Machines
- csdn:Python2.7中安装sklearn
- 官网:下载anaconda
- 官网:Installing scikit-learn
- csdn:scikit-learn学习之SVM算法
- 官网:sklearn.svm.LinearSVC
- csdn:Python之Numpy详细教程
- 博客园:Python之Numpy库常用函数大全(含注释)
- csdn:Python加载csv文件的两种方式
- stackoverflow:Numpy.dot TypeError: Cannot cast array data from dtype(‘float64’) to dtype(‘S32’) according to the rule ‘safe’
- 菜鸟教程:Python File(文件) 方法
- 博客园:Python写入到csv文件存在空行的解决方法
- 官网:Preprocessing data
目录
一、准备工作
1. 安装python2.7
- 下载python2.7
- 运行MSI包,并进行设置,一定要选
pip
和Add python.exe to Path
- 打开cmd,输入
python
,此时可以看到版本号,证明python安装成功
- 一般情况下,开gitbash再输入
python
是没有反应的,因为一开始装gitbash的时候默认选项是安装Use MinTTY
,并不支持交互操作。如果想让gitbash支持交互操作,可以参照windows Git Bash 无法运行python文件的解决方法。 - 如果输入
python
之后显示:python不是内部或外部命令,那么就是环境变量没有成功添加,可以参照安装python2.7的情况二。
2. 安装sklearn
- 安装sklearn之前,要把相关的依赖包先装了
- 有时候会中途出错安装失败,可以考虑重新装
- 安装时间有可能比较长,最好在cmd里操作,因为在gitbash里安装的时候会看不到安装的进度。
(1)安装numpy包
- 可以直接用python的
pip install
$ pip install numpy
- 也可以下载anaconda,用anaconda来安装,下同
$ conda install numpy
(2)安装scipy包
$ pip install scipy
(3)安装matplotlib包
$ pip install matplotlib
(4)安装scikit-learn包
$ pip install -U scikit-learn
3. SVM
(1)算法
- SVM的介绍可以去官网Support Vector Machines查看
- 博客scikit-learn学习之SVM算法将函数里面的相关变量都详细讲解了一遍
(2)注意
- 因为处理的数据较多而且是多分类问题,为了节省时间提高效率,选择
LinearSVC
代替SVC或NuSVC。SVC用于二分类问题很方便,但是用于多分类问题的开销较大,而LinearSVC既可以用于二分类问题,也可以用于多分类问题,而且效率较高。 - 为了提高准确率,再应用LinearSVC进行训练之前要先对数据进行
预处理
,使数据规范化,在一定的均值和方差下分布得较为均匀。 - 由于是读入
csv
文件,如果直接用csv.reader
要注意格式转换,即字符串和浮点数,否则在训练完数据集进行预测时,编译器会报错。 - 用
csv.writer
要注意写入的格式用二进制,不然会产生空行。
4. 实现
(1)csv文件读入
- 因为注释里面涉及中文,所以第二行
# -*- coding: utf-8 -*-
要指定编码方式为utf-8,否则系统会报错 numpy
包是用来定义数组的,里面涉及包括很多数组使用的函数,部分用法和讲解见Python之Numpy详细教程,更多函数见Python之Numpy库常用函数大全(含注释)- 文件读写可以直接用
csv
包里面自带的读写功能,就不需要用readlines
了。至于try
和finally
也不需要,可以直接用with open(filename, 'rb') as file
来表示。 - 因为所有文件数据读入以后,每一个数据的数据类型会从原来的float64变成s32。如果不把数据类型转换回float64,之后的计算中会报错。转换的方法是利用map(type, name)函数,但是map函数不能对整个嵌合的list进行转换,所以需要将list里面的内容逐行转换。
- 因为LinearSVC后续的计算是基于numpy完成的,所以有必要将list类型转换成numpy的array类型。
#!/urs/bin/python
# -*- coding: utf-8 -*-
import csv
import numpy as np
from sklearn.svm import LinearSVC
from sklearn import preprocessing
xarr = []
yarr = []
# 读入
with open('train.csv', 'rb') as f: # rb是以二进制读入,避免出错
lines = csv.reader(f) # 读入全部文件内容
for line in lines: # lines是一个list,存储每一行数据
line.remove(line[0]) # 数据第一列是label,需要去掉
tempy = line.pop() # 数据最后一列是y,需要另外存
ty = map(int, tempy) # 逐行转换
tx = map(float, line)
xarr.append(line) # 用append函数插入list
yarr.append(tempy)
x = np.array(xarr) # 类型转换,list转numpy.array
y = np.array(yarr)
f.close()
- 如果没有进行s32转float64,编译的时候会出现如下错误:Numpy.dot TypeError: Cannot cast array data from dtype(‘float64’) to dtype(‘S32’) according to the rule ‘safe’。
(2)csv文件写入
open
里面选择的模式务必选择wb
,即二进制方式写入,否则写进去的全部内容中间都会隔了一个空行,网上有说用newline=''
的,可是不知道是python版本问题还是包的问题,编译一直报错,所以没有用那个方法。- 和读入类似,也是先把全部内容读入,然后一行一行操作。
import csv
import numpy as np
trainer = [[1,2],[2,3],[1,4]]
# 写入
with open('./tempr.csv','wb') as csvfile1:
writer = csv.writer(csvfile1)
m = len(trainer)
for i in range(m): # 计算行数,然后逐行写入
writer.writerow(trainer[i])
csvfile1.close()
(3)数据预处理
- 数据预处理可以提高LinearSVC的准确率,昨晚交作业到
kaggle
的时候,经过预处理后准确率提高了17%左右。那其实还是挺有用的,因为LinearSVC的变量没有SVC的多,而且很多都已经默认了,官网上给的tips里面关于修改LinearSVC变量选项的也不多,其实基本上用默认的就好,所以提高准确率的话可以考虑对数据进行预处理。
from sklearn import preprocessing
x = [[1,0],[1,2],[2,3]]
tester = [[1,-1],[2,0],[1,3],[3,0]]
scaler = preprocessing.StandardScaler().fit(x) # 对训练数据预处理
xScale = scaler.transform(x) # 得到预处理后的scale模型
testerScale = scaler.transform(tester) # 将同一个scale模型应用到测试数据集上
(4)训练和预测
clf
是用来获取LinearSVC
的,fit
就是拟合。predict
就是预测了,它会返回一个list,list里面装着预测结果。- 如果
print clf.fit(xScale, y)
的话,会看到整个LinearSVC函数名及里面的变量取值都打印出来。
from sklearn.svm import LinearSVC
xScale = [[1,1],[2,2],[1,3],[0,1],[2,1]]
y = [1,2,1,0,2]
testerScale = [[1,2],[2,0],[1,-1],[2,3]]
# 训练
clf = LinearSVC()
clf.fit(xScale, y)
# 预测
result = clf.predict(testerScale)
二、编译运行
- 打开cmd,输入下列命令行
# 编译运行trainCode.py文件
> python trainCode.py