Python sklearn各分类算法及调参调优(二)

Python sklearn各分类算法及调参调优(二)

最近在学习分类算法及Python的相关实现,比较有趣,在此将所了解的内容归纳,分享一下,整体内容主要包含以下几点:

  • 通过seaborn实现数据集不同特征之间的关系以及分布的可视化;
  • 通过train_test_split、StratifiedKFold实现不同的训练集/测试集的构建;
  • 基于不同方式所构建的训练集/测试集,在K近邻、支持向量机、决策树等分类算法下的识别率差异;
  • 通过GridSearchCV实现分类算法参数的最优化组合;
  • 考虑到文章篇幅过长,计划使用四个章节完成介绍,本文为第二章节,主要介绍通过train_test_split、StratifiedKFold实现不同的训练集、测试集的构建。

    数据集背景

    首先先简单介绍下数据集,如下:

    数据描述

  • 数据来源:Index of /ml/machine-learning-databases/iris
  • 实例数量:150(三个类各50个)
  • 属性数量:4个特征数值属性、一个预测属性,属性信息如下:1. 萼片长度(厘米);2. 萼片宽度(厘米);3.花瓣长度(厘米);4. 花瓣宽度(厘米);5. 类(Iris Setosa——山鸢尾,Iris Versicolour——杂色鸢尾,Iris Virginica——维吉尼亚鸢尾)
  • 缺少属性值:None
  • 类别分布:3个类别各占33.3%。
  • 数据样例

    iris.data文件数据样例,如下:

    5.1,3.5,1.4,0.2,Iris-setosa4.9,3.0,1.4,0.2,Iris-setosa4.7,3.2,1.3,0.2,Iris-setosa4.6,3.1,1.5,0.2,Iris-setosa5.0,3.6,1.4,0.2,Iris-setosa

    使用 sklearn.model_selection.train_test_split按比例随机划分训练集和测试集

    train_test_split函数用于将矩阵随机划分为训练子集和测试子集,并返回划分好的训练集、测试集特征(5.1,3.5,1.4,0.2)和训练集、测试集类型标注(Iris-setosa)。

    方法说明:

    X_train,X_test, y_train, y_test =cross_validation.train_test_split(train_data,train_target,test_size=0.3, random_state=0)

    主要参数解释:

  • train_data:所要划分的样本特征集
  • train_target:所要划分的样本结果
  • test_size:测试集占比,若为浮点时,表示测试集占总样本的百分比;若为整数时,表示测试样本样本数;若为None时,test size自动设置成0.25
  • train_size:训练集占比,设置方式同test_size
  • random_state:随机数的种子
  • 随机数种子:

    其实就是该组随机数的编号,在需要重复试验的时候,保证得到一组一样的随机数。比如你每次都填1,其他参数一样的情况下你得到随机数组是一样的。但填0或不填,每次都不一样。

    随机数的产生取决于种子,随机数和种子之间的关系遵从以下两个规则:

    种子不同,产生不同的随机数;种子相同,即使实例不同也产生相同的随机数。

    实现方式

    随机划分出训练集和测试集后,使用
    preprocessing.MinMaxScaler()对训练集、测试集每类特征值进行了归一化处理(按列归一化)。

    Python sklearn各分类算法及调参调优(二)

    为了方便查看,我们选取了样本集中的15个样本进行了随机划分,test_size =0.8 ,即80%为训练集、20%为测试集,划分结果如下:

    Python sklearn各分类算法及调参调优(二)

    使用 sklearn.model_selection.StratifiedKFold分层采样,确保训练集,测试集中各类别样本的比例与原始数据集中相同。

    对于监督学习而言,我们希望模型对于未知数据的泛化能力强,所以就需要模型验证这一过程来体现不同的模型对于未知数据的表现效果。

    最先我们用训练准确度(用全部数据进行训练和测试)来衡量模型的表现,这种方法会导致模型过拟合;为了解决这一问题,我们将所有数据分成训练集和测试集两部分,我们用训练集进行模型训练,得到的模型再用测试集来衡量模型的预测表现能力,这种度量方式叫测试准确度,这种方式可以有效避免过拟合。

    但测试准确度的一个缺点是其样本准确度是一个高方差估计(high varianceestimate),所以该样本准确度会依赖不同的测试集,其表现效果不尽相同。

    StratifiedKFold用法类似Kfold,但是他采用分层采样,能够确保训练集,测试集中各类别样本的比例与原始数据集中相同。将全部训练集S分成n_splits=k个不相交的子集,假设S中的训练样例个数为m,那么每一个自己有m/k个训练样例,相应的子集为{s1,s2,…,sk}。每次从分好的子集里面,拿出一个作为测试集,其他k-1个作为训练集,在k-1个训练集上训练出学习器模型,把这个模型放到测试集上,得到分类率的平均值,作为该模型或者假设函数的真实分类率。

    参数说明

  • n_splits:折叠次数,默认为3,至少为2。
  • shuffle:在每次划分时,是否进行洗牌。①若为Falses时,其效果等同于random_state等于整数,每次划分的结果相同;②若为True时,每次划分的结果都不一样,表示经过洗牌,随机取样的
  • random_state:随机种子数,在shuffle==True时使用,默认使用np.random。
  • 实现

    Python sklearn各分类算法及调参调优(二)

    为了方便查看,我们选取了样本集中的15个样本进行分层采样交叉切分,划分了5个不相交子集,也就是5组训练/测试集,其中部分结果如下:

    Python sklearn各分类算法及调参调优(二)

    若对你有所帮助,欢迎大家评论、留言、关注,感谢支持!

    关联阅读

    Python sklearn各分类算法及调参调优(一)

    Python sklearn各分类算法及调参调优(二)

    Python sklearn各分类算法及调参调优(三)

    Python sklearn各分类算法及调参调优(四)

    Python sklearn各分类算法及调参调优(二)

    来源:软件测试开发技术栈

    声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

    上一篇 2019年3月21日
    下一篇 2019年3月21日

    相关推荐