• 使用交叉验证法(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机器学习》

  • 相关阅读:
    Lucene实践之IndexFile
    java利用pdfbox处理pdf
    java通过dom4j处理xml文档
    CouchBase 2.5Kb数据无法编辑的解决办法
    Strutes2标签url
    Strutes2标签iterator
    2.23Java基础总结 ①内存图,内存加载过程②内存叠加③动态绑定
    2.23 Java基础总结 ①toString方法②equals③this和super④final⑤常量
    数学趣题——魔幻方阵
    数学趣题——谁在说谎
  • 原文地址:https://www.cnblogs.com/weijiazheng/p/10963882.html
Copyright © 2020-2023  润新知