zoukankan      html  css  js  c++  java
  • 使用交叉验证法(Cross Validation)进行模型评估

    • scikit-learn中默认使用的交叉验证法是K折叠交叉验证法(K-fold cross validation):它将数据集拆分成k个部分,再用k个数据集对模型进行训练和评分.

    1.K折叠交叉验证法(K-fold cross validation)

    #############################  使用交叉验证法对模型进行评估 #######################################
    #导入红酒数据集
    from sklearn.datasets import load_wine
    #导入交叉验证工具
    from sklearn.model_selection import cross_val_score
    #导入用于分类的支持向量机模型
    from sklearn.svm import SVC
    #载入红酒数据集
    wine = load_wine()
    #设置SVC的核函数为linear
    svc = SVC(kernel='linear')
    #使用交叉验证法对SVC进行评分
    scores = cross_val_score(svc,wine.data,wine.target,cv=3)
    #打印结果
    print('交叉验证得分:{}'.format(scores))
    
    交叉验证得分:[0.83333333 0.95 ]
    #使用.mean()来获得分数平均值
    print('交叉验证平均分:{:.3f}'.format(scores.mean()))
    
    交叉验证平均分:0.928
    #设置cv参数为6
    scores = cross_val_score(svc,wine.data,wine.target,cv=6)
    #打印结果
    print('交叉验证得分:
    {}'.format(scores))
    
    交叉验证得分:
    [0.86666667 0.9        0.93333333 0.96666667 1.         1.        ]
    #计算交叉验证平均分
    print('交叉验证平均分:{:.3f}'.format(scores.mean()))
    
    交叉验证平均分:0.944
    #打印红酒数据集的分类标签
    print('酒的分类标签:
    {}'.format(wine.target))
    
    酒的分类标签:
    [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
     0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
     1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
     1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
     2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2]
    • 如果用不分层的K折叠的交叉验证法,那么在拆分数据集的时候,有可能每个子集中都是同一个标签,这样的话模型评分都不会太高,而分层k折叠交叉验证法的优势在于,它会在每个不同分类中进行拆分,确保每个子集中都有数量一致的不同分类的标签.

    2.随机差分交叉验证(shuffle-split cross-validation)

    #导入随机差分工具
    from sklearn.model_selection import ShuffleSplit
    #设置拆分的份数为10个
    shuffle_split = ShuffleSplit(test_size=.2,train_size=.7,n_splits = 10)
    #对拆分好的数据集进行交叉验证
    scores = cross_val_score(svc,wine.data,wine.target,cv=shuffle_split)
    #打印交叉验证得分
    print('随机拆分交叉验证模型得分:
    {}'.format(scores))
    #计算交叉验证平均分
    print('随机拆分交叉验证平均分:{:.3f}'.format(scores.mean()))
    
    随机拆分交叉验证模型得分:
    [0.94444444 0.97222222 0.97222222 0.97222222 0.94444444 0.97222222
     0.97222222 0.97222222 0.94444444 1.        ]
    随机拆分交叉验证平均分:0.967

    3.一个一个试(leave-one-out)

    • 其原理和k折叠交叉验证相似,不同的是,它把每一个数据点都当成一个测试集,所以测试集中有多少样本,它就要迭代多少次.针对于小数据集来说,其评分是最高的
    #导入LeaveOneOut
    from sklearn.model_selection import LeaveOneOut
    #设置cv参数为leaveoneout
    cv = LeaveOneOut()
    #重新进行交叉验证
    scores = cross_val_score(svc,wine.data,wine.target,cv=cv)
    #打印迭代次数
    print('打印迭代次数:{}'.format(len(scores)))
    #打印评分结果
    print('模型平均分:{:.3f}'.format(scores.mean()))
    
    打印迭代次数:178
    模型平均分:0.955

    总结 : 

      我们为什么要使用交叉验证法?  

      当我们使用train_test_split方法进行数据集的拆分时,train_test_split用的是随机拆分的方法,万一我们拆分的时候,测试集中都是比较容易进行分类或者回归的数据,而训练集中都比较难,那么模型的得分就会偏高,反之模型的得分就会偏低.我们也不太可能把所有的random_state遍历一遍,而交叉验证法正好弥补了这个缺陷,它的工作原理导致它要对多次拆分进行评分再取平均值,这样就不会出现我们前面所说的问题了.

    文章引自 : 《深入浅出python机器学习》

  • 相关阅读:
    Spring data jpa使用枚举
    IO
    Tomcat相关问题
    flex中为控件添加监听器并计算
    导出excel
    webService常见问题
    从指定的路径中查找含有特殊字符串的文件
    flex中日期的格式化
    flex与后台及页面间对象的传递
    打印时有选择的打印
  • 原文地址:https://www.cnblogs.com/weijiazheng/p/10963882.html
Copyright © 2011-2022 走看看