至于SVM的数学理解,强烈推荐如下三篇知乎博文,我是自学视频学习的,但是如下三篇博文讲的是真的好啊,完全跟我在视频里学习到的是一样的,我很激动啊。
https://zhuanlan.zhihu.com/p/28660098
https://zhuanlan.zhihu.com/p/28954032
https://zhuanlan.zhihu.com/p/77750026

这三篇写的真的是用心极力推荐啊。我就不自己重复工作了,为了搞懂这点,或者说初步搞懂这点,我花了两天的时间,因为自己的数学能力有点薄弱。

我们这一篇主要讲解各个核函数和一些参数的调试过程。
我们拿乳腺癌数据进行学习
第一步,先加载数据。且简单查看一下。

from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
import matplotlib.pyplot as plt
import numpy as np
from time import time
import datetime# 第一步骤:加载数据
breast_cancer = load_breast_cancer()
x = breast_cancer.data
y = breast_cancer.target
print(x.shape)
print(y.shape)
print(breast_cancer.feature_names)
print(breast_cancer.target_names)# 随便挑选两个特征来可视化一下数据
plt.scatter(x[:, 0], x[:, 1], c=y, cmap='rainbow')
plt.show()
plt.scatter(x[:, 2], x[:, 3], c=y, cmap='rainbow')
plt.show()

第二步:我们尝试使用不同的核函数来拟合

# 第二步骤:查看不同的核函数下的表现哈
Xtrain, Xtest, Ytrain, Ytest = train_test_split(x, y, test_size=0.7, random_state=2)
kernels = ['linear', 'poly', 'rbf', 'sigmoid']
for kernel in kernels:time0 = time()clf = SVC(kernel=kernel,degree=1,  # 多项式的d参数gamma='auto',cache_size=5000).fit(Xtrain, Ytrain)  # 可以使用的内存缓存,单位是Mprint('The accuracy under %s kernel is %f' % (kernel, clf.score(Xtest, Ytest)))print(datetime.datetime.fromtimestamp(time() - time0).strftime('%M:%S:%f'))

输出如下:
The accuracy under linear kernel is 0.939850
00:00:116686
The accuracy under poly kernel is 0.942356
00:00:008981
The accuracy under rbf kernel is 0.614035
00:00:013000
The accuracy under sigmoid kernel is 0.614035
00:00:002995

说明在poly核函数下,拟合乳腺癌数据是又快又好啊,rbf和sigmoid核函数的虽然也挺快,但是效果却及其差。
在我们印象中啊,rbf可以很强大吧,几乎可以做到很多数据集的吧,但是这里的效果确实很不好。
我们来分析下数据。

# 查看数据的分布
import pandas as pd
data = pd.DataFrame(x)
print(data.describe([0.01, 0.05, 0.1, 0.25, 0.5, 0.75, 0.90, 0.99]).T)

从结果来看呢,数据存在量纲不统一的问题,很多数据偏差有点大。

我们先来重新进行数据的标准化

from sklearn.preprocessing import StandardScaler
x = StandardScaler().fit_transform(x)
data = pd.DataFrame(x)
print(data.describe([0.01, 0.05, 0.1, 0.25, 0.5, 0.75, 0.90, 0.99]).T)

此时,每一特征的均值接近于0,方差接近于1,都是标准正太分布了。

我们这时候再来一次。

# 第二步骤:查看不同的核函数下的表现哈
Xtrain, Xtest, Ytrain, Ytest = train_test_split(x, y, test_size=0.7, random_state=2)
kernels = ['linear', 'poly', 'rbf', 'sigmoid']
for kernel in kernels:time0 = time()clf = SVC(kernel=kernel,degree=1,  # 多项式的d参数gamma='auto',cache_size=5000).fit(Xtrain, Ytrain)  # 可以使用的内存缓存,单位是Mprint('The accuracy under %s kernel is %f' % (kernel, clf.score(Xtest, Ytest)))print(datetime.datetime.fromtimestamp(time() - time0).strftime('%M:%S:%f'))

输出如下:
The accuracy under linear kernel is 0.952381
00:00:002958
The accuracy under poly kernel is 0.969925
00:00:000998
The accuracy under rbf kernel is 0.969925
00:00:002992
The accuracy under sigmoid kernel is 0.957393
00:00:002035

诶?这下就好多了吧。几个核函数都提高了,Rbf的表现是最好的啊,而且速度也都是提升了。可以得出,数据的标准化是多么重要啊。
所以我们得出一个经验,在执行svm之前啊,先进行数据的无量纲化和标准化。
在执行svm之前啊,先进行数据的无量纲化和标准化。
在执行svm之前啊,先进行数据的无量纲化和标准化。

至于还有一些参数,比如说是gamma,我们来试着使用学习曲线来看看。
在上面代码运行的基础上,数据经过了那个标准化:

scores = []
gammas = np.linspace(0.001, 1, 100)
for i in gammas:clf = SVC(kernel='rbf',# degree=1,  # 多项式的d参数gamma=i,cache_size=5000).fit(Xtrain, Ytrain)  # 可以使用的内存缓存,单位是Mscores.append(clf.score(Xtest, Ytest))print(max(scores), gammas[scores.index(max(scores))])
plt.plot(gammas, scores)
plt.show()

如果我们使用多项式核函数,那么就会涉及3个参数,gamma,degree和coef,我们一般取degree是1,我们试着找出其他两个参数来看看。
我们使用网格搜索,数据同样需要提前标准化啊:

from sklearn.model_selection import StratifiedShuffleSplit, GridSearchCVtime0 = time()gamma_range = np.linspace(0.001, 0.1, 10)
coef0_range = np.linspace(0, 5, 10)param_grid = {'gamma': gamma_range, 'coef0': coef0_range}
cv = StratifiedShuffleSplit(n_splits=10, test_size=0.3, random_state=34)
svc = SVC(kernel='poly', degree=1, cache_size=2000)
grid = GridSearchCV(estimator=svc, param_grid=param_grid, cv=cv)
grid.fit(x, y)print('best parameters are %s and the score is %0.5f' % (grid.best_params_, grid.best_score_))
print(datetime.datetime.fromtimestamp(time() - time0).strftime('%M:%S:%f'))

在软间隔的问题上有一个参数C(自行学习),软间隔其实就是在噪声的影响下,允许一小点的训练误差,来达到更好的泛化效果,这个参数如何作用呢?

scores = []
kernels = ['linear', 'rbf']
C_range = np.linspace(0.001, 1, 100)
for k in kernels:score = []for c in C_range:clf = SVC(kernel=k,# degree=1,  # 多项式的d参数gamma='auto',C=c,cache_size=5000).fit(Xtrain, Ytrain)  # 可以使用的内存缓存,单位是Mscore.append(clf.score(Xtest, Ytest))scores.append(score)for i in range(len(kernels)):plt.plot(C_range, scores[i], label=kernels[i])plt.legend()  # 显示图例
plt.show()

《scikit-learn》SVM(一)相关推荐

  1. python笔迹识别_python_基于Scikit learn库中KNN,SVM算法的笔迹识别

    之前我们用自己写KNN算法[网址]识别了MNIST手写识别数据 [数据下载地址] 这里介绍,如何运用Scikit learn库中的KNN,SVM算法进行笔迹识别. 数据说明: 数据共有785列,第一列 ...

  2. Scikit Learn: 在python中机器学习

    Warning 警告:有些没能理解的句子,我以自己的理解意译. 翻译自:Scikit Learn:Machine Learning in Python 作者: Fabian Pedregosa, Ga ...

  3. [转载]Scikit Learn: 在python中机器学习

    原址:http://my.oschina.net/u/175377/blog/84420 目录[-] Scikit Learn: 在python中机器学习 载入示例数据 一个改变数据集大小的示例:数码 ...

  4. scikit - learn 做文本分类

    文章来源: https://my.oschina.net/u/175377/blog/84420 Scikit Learn: 在python中机器学习 Warning 警告:有些没能理解的句子,我以自 ...

  5. 机器学习与Scikit Learn学习库

    摘要: 本文介绍机器学习相关的学习库Scikit Learn,包含其安装及具体识别手写体数字案例,适合机器学习初学者入门Scikit Learn. 在我科研的时候,机器学习(ML)是计算机科学领域中最 ...

  6. 【scikit-learn】如何用Python和SciKit Learn 0.18实现神经网络

    本教程的代码和数据来自于 Springboard 的博客教程.本文的作者为 Jose Portilla,他是网络教育平台 Udemy 一门数据科学类课程的讲师. GitHub 链接:https://g ...

  7. python scikit learn 关闭开源_scikit learn 里没有神经网络?

    本教程的代码和数据来自于 Springboard 的博客教程,希望能为你提供帮助.作者为 Jose Portilla,他是网络教育平台 Udemy 一门数据科学类课程的讲师. GitHub 链接:ht ...

  8. python基于svm的异常检测_[scikit learn]:异常检测-OneClassSVM的替代方案

    不幸的是,scikit目前只学习implements一类支持向量机和用于离群点检测的鲁棒协方差估计 通过检查2d数据上的差异,可以尝试比较这些方法(as provided in the doc):im ...

  9. python scikit learn 封装_python的scikit-learn的主要模块和基本使用

    在从事数据科学的人中,最常用的工具就是R和Python了,每个工具都有其利弊,但是Python在各方面都相对胜出一些,这是因为scikit-learn库实现了很多机器学习算法. 加载数据(Data L ...

  10. Query意图分析:记一次完整的机器学习过程(scikit learn library学习笔记)

    所谓学习问题,是指观察由n个样本组成的集合,并根据这些数据来预测未知数据的性质. 学习任务(一个二分类问题): 区分一个普通的互联网检索Query是否具有某个垂直领域的意图.假设现在有一个O2O领域的 ...

最新文章

  1. 【算法笔记】莫比乌斯反演(包含定理,两种形式的证明及入门经典模板)
  2. 一线大厂!真实!近距离!接触大数据时代
  3. SQL 注入 OrderBy/0ctf simplesqlin
  4. 威纶和s7200通讯线_PLC通讯,西门子plc通讯知识汇总学习
  5. jenkins搭建流水线项目
  6. 注册不到两年半Github标星39k+,吴恩达、李航老师的作品的笔记和代码实现
  7. python数据科学-多变量数据分析
  8. osgi 如何引入包_OSGi Testsuite:引入类名过滤器
  9. activemq网络桥接_ActiveMQ –经纪人网络解释–第4部分
  10. 移动端设备判断,ios,android,判断设备,安卓
  11. 力扣628. 三个数的最大乘积
  12. 使用SQL Server数据工具和Visual Studio Online进行连续部署
  13. boost基础——variant的原理及基本用法
  14. python报表自动化系列 - Excel单元格(Cell)索引范围对应的所有单元格
  15. elk 概念整理 集群状态 - yellow
  16. php漫画源码,小涴熊漫画CMS:开源的PHP漫画源码
  17. Java基础-Java语言简介
  18. 微信小程序 input 事件
  19. 除了孙宇晨 币圈还有这些人入不得、出不去
  20. mybatis中的事务

热门文章

  1. spark job运行参数优化
  2. 安装和卸载mysql
  3. 云在天之南——我的七天七夜(率性苍山洱海)
  4. Openbiz Cubi 企业级应用程序开发(一)
  5. 在Jetty服务器上安装SSL证书
  6. 容器编排技术 -- Kubernetes kubectl create service nodeport 命令详解
  7. Forever让NodeJS应用后台执行
  8. 五、C#入门—流程控制
  9. python从零开始基础入门——开发环境搭建
  10. 利用Git查看项目代码总行数