机器学习——支持向量机SVM之python实现简单实例一(含数据预处理、交叉验证、参数优化等)

这篇博客介绍了如何使用Python实现支持向量机(SVM),包括数据预处理、训练集与测试集划分、核函数选择、模型评估和参数优化。博主详细讲解了SVM的理论基础,数据清洗、归一化以及如何通过交叉验证确定最佳C和gamma参数。通过实例展示了不同C和gamma值对训练和测试识别率的影响,揭示了过拟合和泛化能力的关系。
摘要由CSDN通过智能技术生成

目录

一、SVM理论

二、numpy的相关函数介绍

三、python实现之准备

1、数据集的下载

2、模块的下载

3、相关模块的导入

四、python实现SVM的步骤

1、读取数据集

2、划分训练样本和测试样本

1). numpy.split(ary, indices_or_sections, axis=0)

2). sklearn.model_selection.train_test_split随机划分训练集与测试集。

3、训练svm分类器(即创建了svm模型)

1)核函数:kernel

2)svm多类问题函数选择

4、计算分类准确率

1)方法1

2) 方法2

3)查看决策函数

5、绘制图像

1)mgrid

2).flat

3)stack

6、结果展示

1)C=1,gamma = 5——训练样本和测试样本的识别率都比较可观

2)C=0.1,gamma=5——训练样本和测试样本的识别率均下降

3)C=100,gamma=5——训练样本识别率高,测试样本低,泛化能力差

小结:gamma不变,c变化

4)c=1,gamma=0.1

5)c=1,gamma=100——过拟合

五、数据的预处理和后处理总结

1、数据处理清洗:

2、数据归一化标准化:

3、参数初始化(C、gamma等)

4、查看决策边界的系数w和截距b

5、评价模型的好坏——ROC曲线

六、完整代码


 


 


一、SVM理论

可见以下文章:

《机器学习——支持向量机SVM之线性模型》

《机器学习——支持向量机SVM之非线性模型低维到高维映射》

《机器学习——支持向量机SVM之非线性模型原问题与对偶问题》

《机器学习——支持向量机SVM之非线性模型原问题转化为对偶问题》

《机器学习——支持向量机SVM之多类问题》

二、numpy的相关函数介绍

《numpy——axis》

什么是随机数及随机数种子

《numpy——mgrid》

《Python——数组重组(flatten、flat、ravel、reshape、resize)》

《Numpy——stack》

三、python实现之准备

【注意】本文的运行环境是windows+Pycharm+python3.7。

1、数据集的下载

本文用的数据集为Iris.data可从UCI数据库中下载,http://archive.ics.uci.edu/ml/datasets/Iris

Iris.data的数据格式如下:共5列,前4列为样本特征,第5列为类别,分别有三种类别Iris-setosa, Iris-versicolor, Iris-virginica。

2、模块的下载

pip install moudule_name

Scikit-Learn库基本实现了所有的机器学习算法,具体使用详见官方文档说明:

http://scikit-learn.org/stable/auto_examples/index.html#support-vector-machines

3、相关模块的导入

SVM使用到的模块有sklearn、numpy、matplotlib等

from sklearn import svm
import numpy as np
import sklearn
import matplotlib.pyplot as plt
import matplotlib

四、python实现SVM的步骤

1、读取数据集

在进行数据集的导入前还需要对数据进行一定的处理,因为在分类中类别标签必须为数字,所以应将Iris.data中的第5列的类别(字符串)通过转换变为数字,具体如下,是通过将类别名的bytes作为字典的key,如何通过key来读取对应的value,进而实现了类别的转换

#define converts(字典)
def Iris_label(s):
    it={b'Iris-setosa':0, b'Iris-versicolor':1, b'Iris-virginica':2 }
    return it[s]

 定义的转换函数为:可实现将类别Iris-setosa, Iris-versicolor, Iris-virginica映射成 0,1,2。 

#1.读取数据集
path='E:\SCUT_study_files\PYTHON\machine_learning/Iris.data'
data=np.loadtxt(path, dtype=float, delimiter=',', converters={4:Iris_label} )
#converters={4:Iris_label}中“4”指的是第5列:将第5列的str转化为label(number)

 读取文件用的是loadtxt函数,其声明如下:

def  loadtxt(fname, dtype=float, comments='#', delimiter=None,converters=None, skiprows=0, usecols=None, unpack=False, ndmin=0)

常用的参数有:

        fname: 文件路径,例 path='F:/Python_Project/SVM/data/Iris.data'

   dtype:样本的数据类型 例dtype=float

          delimiter:分隔符。例 delimiter=','

          converters:将数据列与转换函数进行映射的字典。例 converters={4:Iris_label}含义是将第5列的数据对应转换函数进行转换。

          usecols:选取数据的列。

 

2、划分训练样本和测试样本

#2.划分数据与标签
x,y=np.split(data,indices_or_sections=(4,),axis=1) #x为数据,y为标签,axis是分割的方向,1表示横向,0表示纵向,默认为0
x=x[:,0:2] #为便于后边画图显示(二维显示),只选取前两维度。若不用画图,可选取前四列x[:,0:4]
train_data,test_data,train_label,test_label =sklearn.model_selection.train_test_split(x,
                                                                                      y,
                                                                                      random_state=1,#作用是通过随机数来随机取得一定量得样本作为训练样本和测试样本
                                                                                      train_size=0.6,
                                                                                      test_size=0.4)
#train_data:训练样本,test_data:测试样本,train_label:训练样本标签,test_label:测试样本标签

 

1). numpy.split(ary, indices_or_sections, axis=0)

ary:要分割的数组

indices_or_sections:若等于一个整数,则将数组均匀地分成N份,若等于一个1-D数组,则会沿着指定的方向进行分割,1-D数组的元素个数为n,则数组会被分割成n+1份

可参考以下的说明:

indices_or_sections : int or 1-D array
        If `indices_or_sections` is an integer, N, the array will be divided
        into N equal arrays along `axis`.  If such a split is not possible,
        an error is raised.

        If `indices_or_sections` is a 1-D array of sorted integers, the entries
        indicate where along `axis` the array is split.  For example,
        ``[2, 3]`` would, for ``axis=0``, result in

          - ary[:2]
          - ary[2:3]
          - ary[3:]

        If an index exceeds the dimension of the array along `axis`,
        an empty sub-array is returned correspondingly.

axis:是切割的方向,等于0时表示将沿纵向进行切割,即按照多少行为一组进行切割,axis=1时,沿横向进行切割,即按照多少列为一组进行切割。

具体可参考:

  • 44
    点赞
  • 351
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
### 回答1: 机器学习实战Python基于支持向量机SVM)是一种强大的分类器算法。SVM是一种监督学习方法,可以用于解决二分类和多分类问题。 SVM的基本思想是找到一个最佳的超平面,将数据分割成不同的类别。超平面被定义为在n维空间中具有n-1维的子空间。这个子空间可以将不同类别的数据点分开,并且尽可能地最大化边界。这就意味着SVM在分类时尽量避免误分类,并且对于新的未知数据具有较好的泛化能力。 在Python中,我们可以使用scikit-learn库中的SVM实现机器学习任务。首先,我们需要导入必要的库和数据集。然后,我们可以对数据集进行预处理,如特征缩放和数据划分。接下来,我们可以创建一个SVM分类器,并使用训练数据进行模型的训练。训练完成后,我们可以使用测试数据进行预测,并评估模型的性能。 SVM还有一些重要的参数需要调节,如C和gamma。C表示惩罚项的权重,用于控制分类器的错误率和边界的平衡。较大的C值会减小错误率,但可能导致边界过拟合。gamma表示径向基函数核的参数,影响分类器的决策边界的灵活性。较大的gamma值会导致边界更加精确地拟合训练数据,但可能导致过拟合。 总的来说,机器学习实战Python基于支持向量机SVM)是一个强大的分类器算法,可以用于解决二分类和多分类问题。在实际应用中,我们需要注意调节参数,使得分类器具有良好的泛化能力。 ### 回答2: 机器学习实战是一本非常实用的书籍,其中详细介绍了如何使用Python编程语言基于支持向量机SVM)进行机器学习实践。 支持向量机是一种强大的监督学习算法,可以用于解决分类和回归问题。该算法通过寻找一个最优的超平面来分割样本空间,使得不同类别的样本尽可能远离超平面。实际上,SVM通过最大化支持向量与超平面的距离,来确保分类的准确性和泛化能力。 在书籍中,作者通过经典的例子和详细的代码示例,展示了如何应用Python编程语言和scikit-learn库来构建和训练SVM模型。读者将学会如何准备数据集,进行特征选择和数据预处理,选择合适的SVM参数以及评估模型的性能。 此外,书中还强调了交叉验证、网格搜索和模型调优等重要概念。这些概念是整个机器学习过程中不可或缺的一部分,能够帮助我们提高模型的准确性和可靠性。 机器学习实战还提供了丰富的示例和应用,涵盖了多个领域,如文本分类、手写数字识别和人脸识别等。通过这些实例,读者可以深入理解SVM在实际问题中的应用。 总而言之,机器学习实战是一本非常实用的书籍,提供了丰富的例子和代码,使读者能够快速上手并应用SVM算法解决实际问题。无论是对于初学者还是有一定机器学习经验的人来说,这本书都是一本值得推荐的学习资料。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

有情怀的机械男

你的鼓励将是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值