您的位置:首页 > 编程语言 > Python开发

学习笔记——Kaggle_Digit Recognizer (SVM算法 Python实现)

2017-03-22 15:17 597 查看
本文是个人学习笔记,该篇主要学习SVM算法概念,并应用sklearn.svm算法包解决Kaggle入门级Digit Recognizer。

SVM 简述
经典SVM思想

SVM 线性不可分

SVM 多分类问题

Python 代码

SVM 简述

之前参考学习很多大小牛的总结,发现对SVM理论的阐述主要还是结合数学上的推导过程。这种方式必然是严谨并且如果完整验证也有助于更通透的理解SVM机制。但对于只想理解核心概念并侧重应用上来说,则内容会有些过于庞大。因此为了方便自己学习,本文简化对SVM机制的描述,只阐述核心概念而忽略数学推导。

经典SVM思想

简而言之,SVM的训练目标就是获得一个分割超平面, 而该平面是分类决策边界,平面两边分别代表两类。因此,经典SVM算法只适用于两类分类问题。

SVM确定超平面的方式是实现距离超平面最近的点到超平面的距离最大。

图示:



SVM 线性不可分

经典SVM的应用前提之一就是待分类点是线性可分的,但实际则更多存在线性不可分,如下图示。

图示:



为了解决线性不可分的情况,则需要引入核函数(Kernel),通过核函数可以将原始样本映射到更高维度上,从而实现在高维度上的线性可分,这样SVM就可以继续有效应用。

图示:



SVM 多分类问题

经典SVM只能处理简单的二分类问题,所以对样本需要进行多分类判断时,就要对经典SVM在方法上进行一些拓展。总体来说,有五种基本方式:

(1) One vs. Others

(2) One vs. One

(3) DAG

(4) 基于决策树

(5) 基于纠错输出编码

具体每种方法的理论和特点,请详参puqutogether的blog

Python 代码

Python 的Sklearn包集成了SVM算法,我们这里用的NuSVC来处理Digit Recognizer的多分类问题,需要知道的是NuSVC处理多分类是基于One vs One的方法。详情请参自行查阅官方文档或puqutogether的blog

import pandas as pd
import numpy as np
import time
from sklearn.svm import NuSVC

def data_load():

# 利用pandas读取csv文件内容
train_ttl=pd.read_csv('D:\Program files\JetBrains\digit recognizer\Raw data\\train.csv')
train_label=pd.DataFrame(train_ttl['label'])
train_data=pd.DataFrame(train_ttl.ix[:,1:])
test_data=pd.read_csv('D:\Program files\JetBrains\digit recognizer\Raw data\\test.csv')

# dataframe归整化
test_data[test_data!=0]=1

# train_data[train_data!=0]=1
m, n = train_data.shape  # 这里似乎因为dataframe太大,用bool判断更改时总会异常跳出,所以选择循环更改,但慢
for i in range(m):
for j in range(n):
if train_data.ix[i, j] != 0:
train_data.ix[i, j] = 1

return train_data,train_label,test_data

#利用Python Sklearn包,进行test样本集分类判别
def svm_classify(traindata,trainlabel,testdata):

svm_clf = NuSVC()#设置参数
svm_clf.fit(traindata,trainlabel.values.ravel())#训练Train样本
svm_result=svm_clf.predict(testdata)#预测Test样本

return svm_result

if __name__=='__main__':
start = time.clock()
traindata,trainlabel,testdata=data_load()#加载raw data

m,n=testdata.shape
result_labels=svm_classify(traindata,trainlabel,testdata)

#将结果转化成Dataframe结构
result={}
ImageId=np.arange(m)+1
result['Label']=result_labels
result_frame=pd.DataFrame(result,index=ImageId)

#导出结果
result_frame.to_csv('D:\Program files\JetBrains\digit recognizer\Raw data\\result_svm.csv')
end = time.clock()
print('总耗时:', (end - start)/60)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python学习笔记