学习笔记——Kaggle_Digit Recognizer (SVM算法 Python实现)
2017-03-22 15:17
597 查看
本文是个人学习笔记,该篇主要学习SVM算法概念,并应用sklearn.svm算法包解决Kaggle入门级Digit Recognizer。
SVM 简述
经典SVM思想
SVM 线性不可分
SVM 多分类问题
Python 代码
SVM确定超平面的方式是实现距离超平面最近的点到超平面的距离最大。
图示:
图示:
为了解决线性不可分的情况,则需要引入核函数(Kernel),通过核函数可以将原始样本映射到更高维度上,从而实现在高维度上的线性可分,这样SVM就可以继续有效应用。
图示:
(1) One vs. Others
(2) One vs. One
(3) DAG
(4) 基于决策树
(5) 基于纠错输出编码
具体每种方法的理论和特点,请详参puqutogether的blog。
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)
相关文章推荐
- 学习笔记——Kaggle_Digit Recognizer (KNN算法 Python实现)
- 学习笔记——Kaggle_Digit Recognizer (Random Forest算法 Python实现)
- 学习笔记——Kaggle_Digit Recognizer (朴素贝叶斯 Python实现)
- 一个无聊男人的疯狂《数据结构与算法分析-C++描述》学习笔记 用C++/lua/python/bash的四重实现(7)习题2.8 随机数组的三种生成算法
- k-近邻算法 python实现(学习笔记no.1)
- [kaggle实战] Digit Recognizer -- 从KNN,LR,SVM,RF到深度学习
- kaggle--Digit Recognizer(python实现)
- [kaggle实战] Digit Recognizer -- 从KNN,LR,SVM,RF到深度学习
- Kaggle digit-recognizer PCA+SVM
- 算法学习(1):排序算法-插入排序及python实现
- Python学习笔记-Django实现简单增删改查
- 算法(第四版)学习笔记之java实现能够动态调整数组大小的栈
- python学习笔记:"爬虫+有道词典"实现一个简单的英译汉程序
- python 机器学习算法实现 深度学习笔记
- python学习笔记(日志系统实现)
- 数据结构与算法:python语言描述学习笔记Part3_1
- 【python学习笔记】Python实现协程yield方法和gevent库
- 【Python学习系列九】Python机器学习库scikit-learn实现SVM案例
- 算法(第四版)学习笔记之java实现选择排序
- Python学习笔记-实现探测Web服务质量