精华内容
下载资源
问答
  • 在之前,此函数位置在sklearn.learning_curve.validation_curve(),现在,此函数的位置在sklearn.model_selection.validation_curve()。 validation_curve()的作用 我们知道误差是由偏差(bias)、方差(variance)...
  • 简单来说,就是用学习曲线(learning curve)来判断模型状态:过拟合还是欠拟合。 学习曲线是根据不同训练集大小,模型在训练集和验证集上的得分变化曲线。也就是以样本数为横坐标,训练和交叉验证集上的得分(如准确...

    Learning Curve

    学习曲线是什么?

    简单来说,就是用学习曲线(learning curve)来判断模型状态:过拟合还是欠拟合。

    学习曲线是根据不同训练集大小,模型在训练集和验证集上的得分变化曲线。也就是以样本数为横坐标,训练和交叉验证集上的得分(如准确率)为纵坐标。learning curve可以帮助我们判断模型现在所处的状态:过拟合(overfiting / high variance) or 欠拟合(underfitting / high bias,模型欠拟合、过拟合、偏差和方差平衡 时对应的学习曲线如下图所示:
    在这里插入图片描述
    (1)左上角的图中训练集和验证集上的曲线能够收敛。在训练集合验证集上准确率相差不大,却都很差。这说明模拟对已知数据和未知都不能进行准确的预测,属于高偏差。这种情况模型很可能是欠拟合。可以针对欠拟合采取对应的措施。
    欠拟合措施:
    我们可以增加模型参数(特征),比如,构建更多的特征,减小正则项。
    采用更复杂的模型
    此时通过增加数据量是不起作用的。(为什么?)
    (2)右上角的图中模型在训练集上和验证集上的准确率差距很大。说明模型能够很好的拟合已知数据,但是泛化能力很差,属于高方差。模拟很可能过拟合,要采取过拟合对应的措施。
    过拟合措施:
    我们可以增大训练集,降低模型复杂度,增大正则项,
    或者通过特征选择减少特征数,即做一下feature selection,挑出较好的feature的subset来做training

    (3)理想情况是找到偏差和方差都很小的情况,即收敛且误差较小。如右角的图。

    from sklearn.model_selection  import learning_curve
    from sklearn.datasets import load_digits
    from sklearn.svm import SVC
    import matplotlib.pyplot as plt
    import numpy as np
    
    digits = load_digits()
    X = digits.data  
    y = digits.target
    print(X.shape)  # (1797, 64)
    train_sizes,train_loss, val_loss = learning_curve(
        SVC(gamma=0.001), X, y, cv=10, scoring='neg_mean_squared_error',
        train_sizes=[0.1,0.25,0.5,0.75,1]  # 在整个过程中的10%取一次,25%取一次,50%取一次,75%取一次,100%取一次
    )
    

    learning_curve函数中参数解释:

    • SVC(gamma=0.001)表示我们所使用的的分类器是SVC
    • X : 输入的feature,numpy类型
    • y : 输入的target
    • cv : 做cross-validation的时候,数据分成的份数,其中一份作为cv集,其余n-1份作为training(默认为3份),我们这里做了10份,
    • train_sizes: 随着训练集的增大,选择在10%,25%,50%,75%,100%的训练集大小上进行采样loss
    print(train_sizes)  # [ 161  404  808 1212 1617]
    print(train_loss)
    print(val_loss)
    train_loss_mean = -np.mean(train_loss, axis=1)
    val_loss_mean = -np.mean(val_loss,axis=1)
    plt.plot(train_sizes, train_loss_mean, 'o-',color='r',label='Training')
    plt.plot(train_sizes,val_loss_mean,'o-',color='g', label='Cross-validation')
    plt.xlabel('Training examples')
    plt.ylabel('Loss')
    plt.legend(loc='best')
    plt.show()
    

    train_loss输出如下:

    [[-0.         -0.09937888 -0.09937888 -0.09937888 -0.09937888 -0.09937888
      -0.09937888 -0.09937888 -0.09937888 -0.09937888]
     [-0.         -0.03960396 -0.03960396 -0.03960396 -0.03960396 -0.03960396
      -0.03960396 -0.03960396 -0.03960396 -0.03960396]
     [-0.         -0.01980198 -0.01980198 -0.06435644 -0.01980198 -0.01980198
      -0.01980198 -0.01980198 -0.01980198 -0.01980198]
     [-0.         -0.01650165 -0.01320132 -0.01320132 -0.01320132 -0.01320132
      -0.01320132 -0.01320132 -0.01320132 -0.01320132]
     [-0.02226345 -0.03215832 -0.00989487 -0.03215832 -0.03215832 -0.03215832
      -0.03215832 -0.03215832 -0.03215832 -0.00989487]]
    

    test_loss输出如下:

    [[-1.26666667e+00 -1.43333333e+00 -3.96666667e+00 -9.73888889e+00
      -6.95000000e+00 -5.24444444e+00 -3.02777778e+00 -5.25139665e+00
      -3.48044693e+00 -4.85474860e+00]
     [-1.81111111e+00 -1.13333333e+00 -1.35555556e+00 -3.06666667e+00
      -2.08333333e+00 -2.85000000e+00 -8.38888889e-01 -1.94413408e+00
      -5.41899441e-01 -1.35195531e+00]
     [-1.71111111e+00 -3.61111111e-01 -5.11111111e-01 -9.61111111e-01
      -6.16666667e-01 -5.88888889e-01 -1.22222222e-01 -9.16201117e-01
      -7.76536313e-01 -1.14525140e+00]
     [-1.22222222e+00 -3.61111111e-01 -4.44444444e-01 -7.00000000e-01
      -5.55555556e-01 -2.66666667e-01 -8.88888889e-02 -1.11731844e-02
      -9.21787709e-01 -8.43575419e-01]
     [-9.33333333e-01 -0.00000000e+00 -2.66666667e-01 -2.83333333e-01
      -2.77777778e-01 -3.61111111e-01 -8.88888889e-02 -5.58659218e-03
      -9.21787709e-01 -4.18994413e-01]]
    

    Validation curve

    from sklearn.model_selection  import validation_curve
    from sklearn.datasets import load_digits
    from sklearn.svm import SVC
    import matplotlib.pyplot as plt
    import numpy as np
    
    digits = load_digits()
    X = digits.data
    y = digits.target
    param_range = np.logspace(-6,-2.3,5) # 参数范围从-6到-2.3,之间 取5个点
    train_loss, validation_loss = validation_curve(
        SVC(), X, y, param_name='gamma', param_range=param_range , cv=10, scoring='neg_mean_squared_error'
    ) # 对于SVC()分类器中的gamma参数设置取值范围param_range
    
    print(train_loss)
    print(validation_loss)
    train_loss_mean = -np.mean(train_loss, axis=1)
    validation_loss_mean = -np.mean(validation_loss,axis=1)
    plt.plot(param_range,train_loss_mean, 'o-',color='r',label='Training')
    plt.plot(param_range,validation_loss_mean,'o-',color='g', label='Cross-validation')
    plt.xlabel('gamma')
    plt.ylabel('Loss')
    plt.legend(loc='best')
    plt.show()
    

    输出结果如下:

    [[-1.04347557e+01 -1.04329004e+01 -1.04329004e+01 -1.04242424e+01
      -1.04199134e+01 -1.04199134e+01 -1.04199134e+01 -1.35568603e+01
      -9.54017305e+00 -9.39431397e+00]
     [-1.84415584e+00 -2.09338281e+00 -2.14038343e+00 -1.71552257e+00
      -1.72232529e+00 -2.21150278e+00 -2.14409400e+00 -2.16687268e+00
      -1.81582200e+00 -1.99381953e+00]
     [-3.37043908e-01 -5.62152134e-01 -4.28571429e-01 -4.32282004e-01
      -4.76190476e-01 -4.68769326e-01 -4.74335189e-01 -5.61804697e-01
      -3.96168109e-01 -3.93695921e-01]
     [-6.24613482e-02 -7.48299320e-02 -2.04081633e-02 -4.26716141e-02
      -7.48299320e-02 -2.04081633e-02 -4.20531849e-02 -4.20271941e-02
      -4.20271941e-02 -1.23609394e-02]
     [-0.00000000e+00 -0.00000000e+00 -0.00000000e+00 -0.00000000e+00
      -0.00000000e+00 -0.00000000e+00 -0.00000000e+00 -0.00000000e+00
      -0.00000000e+00 -0.00000000e+00]]
    [[-1.03666667e+01 -1.03833333e+01 -1.03833333e+01 -1.04611111e+01
      -1.05000000e+01 -1.05000000e+01 -1.05000000e+01 -1.44357542e+01
      -9.02234637e+00 -1.04078212e+01]
     [-4.01111111e+00 -1.65555556e+00 -1.50555556e+00 -5.84444444e+00
      -2.69444444e+00 -1.56666667e+00 -8.66666667e-01 -1.56424581e+00
      -5.07821229e+00 -1.74301676e+00]
     [-1.40000000e+00 -6.33333333e-01 -4.44444444e-01 -2.53888889e+00
      -1.12777778e+00 -4.16666667e-01 -4.11111111e-01 -1.11731844e-02
      -3.55307263e+00 -1.39106145e+00]
     [-7.33333333e-01 -0.00000000e+00 -3.16666667e-01 -8.33333333e-01
      -2.77777778e-01 -3.61111111e-01 -8.88888889e-02 -5.58659218e-03
      -9.44134078e-01 -6.14525140e-01]
     [-2.18333333e+00 -1.90555556e+00 -9.38888889e-01 -3.68333333e+00
      -1.20555556e+00 -2.54444444e+00 -1.61111111e-01 -1.46927374e+00
      -2.31843575e+00 -1.82122905e+00]]
    

    print(train_loss.shape) # (5, 10)
    print(validation_loss.shape) # (5, 10): 因为参数取了5个点,将训练集和验证集分为了10份cv=10,每一个参数对应10个loss
    在这里插入图片描述
    SVC()分类器在不同gamma参数下,它在训练集和交叉验证上的分数如下:当gamma=0时,他们的loss都很大,说明欠拟合;当gamma=0.006时,他们的loss都很低,效果不错;当gamma=0.005时,验证集上的loss很大,而训练集上的loss变小,说明发生了过拟合。因此我们会选择gamma=0.006时,在测试集上进行测试。

    验证曲线(validation_curve)和学习曲线(sklearn.model_selection.learning_curve())的区别是,验证曲线的横轴为某个超参数,如一些树形集成学习算法中的max_depth、min_sample_leaf等等。
    从验证曲线上可以看到随着超参数设置的改变,模型可能从欠拟合到合适,再到过拟合的过程,进而选择一个合适的位置,来提高模型的性能。

    一般我们需要把一个数据集分成三部分:train、validation和test,我们使用train训练模型,并通过在 validation数据集上的表现不断修改超参数值(例如svm中的C值,gamma值等),当模型超参数在validation数据集上表现最优时,我们再使用全新的测试集test进行测试,以此来衡量模型的泛化能力。

    展开全文
  • validation_curve验证曲线函数 from sklearn.model_selection import validation_curve#导入验证曲线函数 from sklearn.datasets import load_boston from sklearn.linear_model import Ridge#导入sklearn的岭回归...

    validation_curve验证曲线函数

    from sklearn.model_selection import validation_curve#导入验证曲线函数
    from sklearn.datasets import load_boston
    from sklearn.linear_model import Ridge#导入sklearn的岭回归模块
    
    boston=load_boston()
    

    将原始数据打乱为随机顺序

    # 将原始数据打乱为随机顺序
    import numpy as np
    np.random.seed(666)
    x,y=boston.data,boston.target
    indices=np.arange(y.shape[0])
    np.random.shuffle(indices)
    x,y=x[indices],y[indices]
    

    返回评价结果

    # 返回评价结果
    train_scores,test_scores=validation_curve(Ridge(),x,y,'alpha',np.logspace(-10,10,200))
    

    绘制验证曲线

    # 绘制验证曲线
    import matplotlib.pyplot as plt
    %matplotlib inline
    
    plt.scatter(np.logspace(-10,10,200),np.mean(test_scores,axis=1))
    
    展开全文
  • D:\ProgramData\Anaconda3\lib\site-packages\sklearn\cross_validation.py:41: DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refa...

    D:\ProgramData\Anaconda3\lib\site-packages\sklearn\cross_validation.py:41: DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20.

     

    主要意思 :  主要意思是说在0.18版本中,cross_validation被废弃了,在 0.20版本中,将被删除

     

    解决办法:

     from sklearn.learning_curve import validation_curve 修改为: from sklearn.model_selection import validation_curve

    即 从  model_selection 中导入  validation_curve 模块

     

     

     

     

     

     

    展开全文
  • python 检视过拟合之validation_curve

    千次阅读 2018-12-05 15:20:12
    validation_curve: 展示某一个因子,不同取值的算法的得分  通过这种曲线可以更加直观看出改变模型中的参数,有没有出现过拟合 validation_curve(estimator, X, y, param_name, param_range, groups=None, cv=None...

    validation_curve: 展示某一个因子,不同取值的算法的得分
                                通过这种曲线可以更加直观看出改变模型中的参数,有没有出现过拟合

    validation_curve(estimator, X, y, param_name, param_range, groups=None, cv=None, scoring=None, n_jobs=1, pre_dispatch='all', verbose=0)
                    estimator:实现了fit 和 predict 方法的对象
                    X : 训练的向量
                    y : 目标相对于X分类或回归
                    param_name:将被改变的变量名称
                    param_range:param_name对应的变量的取值
                    cv:如果传入整数,测试数据将分成对应的分数,其中一份作为cv集,其余n-1作为traning(默认为3份)
    结果返回;(train_scores, test_scores)
                    train_scores:训练集的得分
                    test_scores;测试集的得分

    print(__doc__)
    
    import matplotlib.pyplot as plot
    import numpy as np
    import time
    
    from sklearn.datasets import load_digits
    from sklearn.svm import SVC
    from sklearn.model_selection import validation_curve
    
    startTime = time.clock()
    #print(startTime)
    digits = load_digits()  ##创建1797个64维的数字图像数据点,返回(data,target)
    x, y = digits.data, digits.target
    
    param_range = np.logspace(-6, -1, 5)
    #print(param_range)
    train_scores, test_scores = validation_curve(
        SVC(), ##
        x, y,param_name='gamma', param_range=param_range,
        cv=10,scoring='accuracy', n_jobs=1 )
    
    train_scores_mean = np.mean(train_scores, axis=1)   #axis=1, 就算每一行的均值
    train_scores_std = np.std(train_scores, axis=1)
    test_scores_mean = np.mean(test_scores, axis=1)
    test_scores_std = np.std(test_scores, axis=1)
    
    plot.title('Validation Curve with SVM')
    plot.xlabel('$\gamma$')
    plot.ylabel('Score')
    plot.ylim(0.0, 1.1)
    lw = 2
    
    # plot.plot(param_range, train_scores_mean, 'o-', color='r', label='Training')
    # plot.plot(param_range, test_scores_mean,'o-', color='g', label='Cross-validation')
    
    plot.semilogx(param_range, train_scores_mean, label='Traing score',
                  color='darkorange', lw=lw)
    plot.fill_between(param_range, train_scores_mean - train_scores_std,
                      train_scores_mean + train_scores_std, alpha=0.2,
                      color='darkorange', lw=lw)
    plot.semilogx(param_range, test_scores_mean, label='Cross-calidation score',
                  color='navy', lw=lw)
    plot.fill_between(param_range, test_scores_mean - test_scores_std,
                      test_scores_mean + test_scores_std, alpha=0.2,
                      color='navy', lw=lw)
    
    plot.legend(loc='best')
    #打出运行时间
    print(time.clock() - startTime) #43.409535299999995
    plot.show()

     结果:

    。。。待续

    展开全文
  • 介绍 Scikit-learn提供了learning_curve类,方便获得和训练的...机器学习的方法中往往涉及到超参数的调整,本文利用validation_curve函数,以load_digit数据集和SGD分类为例,通过可视化的方式来考察不同超参数和性能
  • python学习learning_curvevalidation_curve

    千次阅读 2017-09-06 11:37:00
    validation_curve是展示某个因子,不同取值的算法得分 # -*- coding: utf-8 -*- """ Created on Wed Sep 06 09:55:13 2017 @author: 飘的心 """ from sklearn.model_selection import learning_curve
  • validation_curve from sklearn.datasets import load_digits from sklearn.svm import SVC import matplotlib.pyplot as plt import numpy as np digits = load_digits() X = digits.data y = ...
  • import numpy as np import matplotlib.pyplot as plt from sklearn.svm import LinearSVC from sklearn.datasets import load_digits ...from sklearn.model_selection import validation_curve #模型选择...
  • validation_curve检视过拟合

    千次阅读 2022-01-09 22:45:13
    from sklearn.model_selection import validation_curve from sklearn.datasets import load_digits from sklearn.svm import SVC import matplotlib.pyplot as plt import numpy as np digits = load_digits() x =...
  • 怎么画 下面用SVC为例,调用validation_curve: 复制代码 import matplotlib.pyplot as plt import numpy as np from sklearn.datasets import load_digits from sklearn.svm import SVC from sklearn.learning_...
  • train_scores, test_scores = validation_curve( SVC(), X, y, param_name= "gamma" , param_range=param_range, cv= 10 , scoring= "accuracy" , n_jobs= 1 ) 画图时,横轴为 param_range ,纵轴为 train_...
  • D:\ProgramData\Anaconda3\lib\site-packages\sklearn\cross_validation.py:41:DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refac...
  • train_scores, validation_scores = validation_curve(classifer, X, y, 'n_estimators', parameter_grid, cv=5) print("训练数据的准确率:", train_scores) print("验证数据的准确率:", validation_scores) # ...
  • 学习曲线Learning Curve、常见学习曲线形态及解读、验证曲线Validation Curve、验证曲线+学习曲线对比 目录 学习曲线Learning Curve、常见学习曲线形态及解读、验证曲线Validation Curve、验证曲线+学习曲线对比...
  • 使用学习曲线和交叉验证来评估你的模型是过拟合,欠拟合,还是刚刚好

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,148
精华内容 2,459
关键字:

validation_curve