note_7:sklearn的LinearSVC

sklearn的LinearSVC


参考


目录


一、准备工作

1. 安装python2.7

  • 下载python2.7
  • 运行MSI包,并进行设置,一定要选pipAdd 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
$ conda install numpy
(2)安装scipy包
$ pip install scipy
(3)安装matplotlib包
$ pip install matplotlib
(4)安装scikit-learn包
$ pip install -U scikit-learn

3. SVM

(1)算法
(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了。至于tryfinally也不需要,可以直接用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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值