精华内容
下载资源
问答
  • 学习曲线

    千次阅读 2019-09-25 15:21:46
    1、学习曲线是什么? 学习曲线就是通过画出不同训练集大小时训练集和交叉验证的准确率,可以看到模型在新数据上的表现,进而来判断模型是否方差偏高或偏差过高,以及增大训练集是否可以减小过拟合。 学习曲线能...

    1、学习曲线是什么?

    学习曲线就是通过画出不同训练集大小时训练集和交叉验证的准确率,可以看到模型在新数据上的表现,进而来判断模型是否方差偏高或偏差过高,以及增大训练集是否可以减小过拟合。

    学习曲线能判定偏差和方差问题

    1、当训练集和测试集的误差收敛但却很高时,为高偏差。 

    左上角的偏差很高,训练集和验证集的准确率都很低,很可能是欠拟合。 
    我们可以增加模型参数,比如,构建更多的特征,减小正则项。 
    此时通过增加数据量是不起作用的。

    2、当训练集和测试集的误差之间有大的差距时,为高方差。 

    当训练集的准确率比其他独立数据集上的测试结果的准确率要高时,一般都是过拟合。 
    右上角方差很高,训练集和验证集的准确率相差太多,应该是过拟合。 
    我们可以增大训练集,降低模型复杂度,增大正则项,或者通过特征选择减少特征数。
    理想情况是是找到偏差和方差都很小的情况,即收敛且误差较小。

     

    3、验证曲线

    通过验证曲线判定过拟合于欠拟合。

    验证曲线是一种通过定位过拟合于欠拟合等诸多问题的方法,帮助提高模型性能的有效工具。

    验证曲线绘制的是准确率与模型参数之间的关系。


     

    展开全文
  • 机器学习 学习曲线 Python实现学习曲线及案例解析 学习曲线 如果数据集的大小为 mmm,则通过下面的流程即可画出学习曲线: 把数据集分成训练数据集和交叉验证数据集。 取训练数据集的 20%20\%20% 作为训练样本,训练...

    机器学习 学习曲线 Python实现学习曲线及案例解析

    学习曲线

    如果数据集的大小为 mm,则通过下面的流程即可画出学习曲线:

    • 把数据集分成训练数据集和交叉验证数据集。
    • 取训练数据集的 20%20\% 作为训练样本,训练出模型参数。
    • 使用交叉验证数据集来计算训练出来的模型的准确性。
    • 以训练数据集的准确性,交叉验证的准确性作为纵坐标,训练数据集个数作为横坐标,在坐标轴上画出上述步骤计算出来的模型准确性。
    • 训练数据集增加 10%10\%,跳到步骤3继续执行,直到训练数据集大小为 100%100\% 为止。

    学习曲线要表达的内容是,当训练数据集增加时,模型对训练数据集你和的准确性以及交叉验证数据集预测的准确性的变化规律

    实例:画出学习曲线

    生成一个在y=xy=\sqrt{x}附件波动的点来作为训练样本。

    import numpy as np
    n_dots = 200
    
    X = np.linspace(0, 1, n_dots)
    y = np.sqrt(X) + 0.2 * np.random.rand(n_dots) - 0.1
    
    # 因为 sklearn 的接口里,需要用到 n_sample x n_feature 的矩阵
    # 所以需要转化为 200 x 1 的矩阵
    
    X = X.reshape(-1, 1)
    y = y.reshape(-1, 1)
    

    需要构造一个多项式模型

    在scikit-learn里,需要用 Pipeline 来构造多项式模型,Pipeline 的意思是流水线,即这个流水线里可以包含多个数据处理模型,前一个模型处理完,转到下一个模型处理。

    from sklearn.pipeline import Pipeline
    from sklearn.preprocessing import PolynomialFeatures
    from sklearn.linear_model import LinearRegression
    
    def polynomial_model(degree=1):
        polynomial_features = PolynomialFeatures(degree=degree, include_bias=False)
        linear_regression = LinearRegression()
        # 这是一个流水线,先增加多项式阶数,然后再用先行回归算法来拟合数据
        pipeline = Pipeline([('polynomial_features', polynomial_features), ("linear_regression", linear_regression)])
        return pipeline
    

    polynomial_model()函数生成一个多项式模型,其中参数 degree 表示多项式的阶数
    ,比如polynomail_model(3)将生成一个三阶多项式的模型。

    在scikit-learn里面,我们不用自己去实现学习曲线算法,直接使用 sklearn.model_selection.learning_curve()函数来画出学习曲线,它会自动把训练样本的数量按照预定的规则逐渐增加,然后画出不同的训练样本数量时的模型准确性。
    其中 train_sizes 参数就是指定训练样本数量的变化规则,比如 train_sizes=np.linspace(.1, 1.0, 5)表示把训练样本数量从 0.110.1\sim1 分成五等分,生成 [0.1,0.352,0.55,0.775,1][ 0.1, 0.352, 0.55, 0.775, 1] 的序列,从序列中取出训练样本数量百分比,逐个计算在当前训练样本数量情况下训练出来的模型准确性。

    from sklearn.model_selection import learning_curve
    from sklearn.model_selection import ShuffleSplit
    import matplotlib.pyplot as plt
    
    def plot_learning_curve(estimator, title, X, y, ylim=None, cv=None, n_jobs=1, train_sizes=np.linspace(.1, 1.0, 5)):
        plt.title(title)
        if ylim is not None:
            plt.ylim(*ylim)
        plt.xlabel("Training examples")
        plt.ylabel("Score")
        train_sizes, train_scores, test_scores = learning_curve(estimator, X, y, cv=cv, n_jobs=n_jobs, train_sizes=train_sizes)
        train_scores_mean = np.mean(train_scores, 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)
        plt.grid()
        
        plt.fill_between(train_sizes, train_scores_mean - train_scores_std, train_scores_mean + train_scores_std, alpha=0.1, color="r")
        plt.fill_between(train_sizes, test_scores_mean - test_scores_std, test_scores_mean + test_scores_std, alpha=0.1, color="g")
        plt.plot(train_sizes, train_scores_mean, 's--', color="r", label="Training score")
        plt.plot(train_sizes, test_scores_mean, 'o-', color="g", label="Cross-validation score")
        
        plt.legend(loc="best")
        return plt
    

    这个函数实现的功能就是画出模型的学习曲线。

    其中有个细节需要注意,当计算模型的准确性时,是随机从数据集中分配出训练样本和交叉验证样本,这样会导致数据分布不均匀。
    即同样训练样本数量的模型,由于随机分配,导致每次计算出来的准确性都不一样。
    为了解决这个问题,我们在计算模型的准确性时,多次计算,并求准确性的的平均值和方差。
    上述代码中 plt.fill_between() 函数会把模型准确性的平均值的上下方差的空间里用颜色填充。
    然后用plt.plot()函数画出模型准确性的平均值。上诉函数画出了训练样本的的准确性,也画出了交叉验证样本的准确性。

    使用ploynomial_model()函数构造出3个模型,分别是一阶多项式、三阶多项式、十阶多项式,分别画出这3个模型的学习曲线。
    # 为了让学习曲线更平滑,计算10次交叉验证数据集的分数
    cv = ShuffleSplit(n_splits=10, test_size=0.2, random_state=0)
    titles = ['Learning Curves (Under Fitting)', 'Learning Curves', 'Learning Curves (Over Fitting)']
    degrees = [1, 3, 10]
    
    plt.figure(figsize=(18, 4), dpi=200)
    for i in range(len(degrees)):
        plt.subplot(1, 3, i + 1)
        plot_learning_curve(polynomial_model(degrees[i]), titles[i], X, y, ylim=(0.75, 1.01), cv=cv)
    
    plt.show()
    

    在这里插入图片描述
    左图:一阶多项式,欠拟合;
    中图:三阶多项式,较好地拟合了数据集;
    右图:十阶多项式,过拟合。
    虚线:针对训练数据集计算出来的分数,即针对训练数据集拟合的准确性,
    实线:针对交叉验证数据集计算出来的分数,即针对交叉验证数据集预测的准确性。

    从左图我们可以观察到,当模型欠拟合(High Bias, Under Fitting)时,随着训练数据集的增加,交叉验证数据集的准确性(实线)逐渐增大,逐渐和训练数据集的准确性(虚线)靠近,但其总体水平比较低,收敛在 0.880.88 左右。其训练数据集的准确性也比较低,收敛在 0.900.90 左右。这就是过拟合的表现。从这个关系可以看出来,当发生高偏差时,增加训练样本数量不会对算法准确性有较大的改善

    从右图我们可以观察到,当模型过拟合(High Variance, Over Fitting)时,随着训练数据集的增加,交叉验证数据集的准确性(实线)也在增加,逐渐和训练数据集的准确性(虚线)靠近,但两者之间的间隙比较大。
    训练数据集的准确性很高,收敛在 0.950.95 左右,是三者中最高的,但其交叉验证数据集的准确性值却较低,最终收敛在 0.910.91 左右。

    中图,我们选择的三阶多阶式较好地拟合了数据,最终训练数据集的准确性(虚线)和交叉验证数据集的准确性(实线)靠得很近,最终交叉验证数据集收敛在 0.930.93 附近,训练数据集的准确性收敛在 0.940.94 附近。3个模型对比,这个模型的准确性最好。

    当需要改进学习算法时,可以画出学习曲线,以便判断算法时处在高偏差还是高分差问题。
    学习曲线是诊断模型算法准确性的一个非常重要的工具。

    过拟合和欠拟合的特征

    到此,我们可以总结出过拟合和欠拟合的特点如下。

    • 过拟合:模型对训练数据集的准确性比较高,其成本 Jtrain(θ)J_{train}(\theta)比较低,对交叉验证数据集的准确性比较低,其成本 Jcv(θ)J_{cv}(\theta) 比较高。
    • 欠拟合:模型对训练数据集的准确性比较低,其成本 Jtrain(θ)J_{train}(\theta)比较高,对交叉验证数据集的准确性夜比较低,其成本 Jcv(θ)J_{cv}(\theta) 也比较高。

    一个好的机器学习算法应该是对训练数据集准确性高、成本低,即较准确地拟合数据,同时对交叉验证数据集准确性高、成本低、误差小,即对未知数据有良好的预测性。

    展开全文
  • 机器学习的学习曲线和验证曲线

    千次阅读 2019-01-14 17:16:03
    最近在复盘优达学城的机器学习项目, 重新写了一下波斯顿放假预测的项目,除了模型的选择及网格搜索进行选择参数的相关知识外,还着重复习了关于学习曲线和复杂度曲线(验证曲线)  首先学习曲线和复杂度曲线...

             最近在复盘优达学城的机器学习项目, 重新写了一下波斯顿放假预测的项目,除了模型的选择及网格搜索进行选择参数的相关知识外,还着重复习了关于学习曲线和复杂度曲线(验证曲线)

            首先学习曲线和复杂度曲线(验证曲线)的区别,学习曲线是指在参数值确定的情况下,训练集和验证集的得分情况的对比,复杂度曲线(验证集曲线)是展示某个参数在取不同值时候,训练集与测试集得分情况的对比。

            学习曲线的X轴是数据的数量,y轴是得分;复杂度曲线(验证曲线)的x轴是一个参数的值:比如max_depth(1,2,3,4,5,6,7,8,9,10),y轴是训练集和测试集在各个参数取值情况下的得分

     

     上面两张图分别是学习曲线和复杂度曲线

     

    下面来说一下学习曲线或者验证曲线的数据集合的划分

    1 ShuffleSplit 划分

    上面的两个图中就是用ShuffleSplit 方式对数据集合进行划分的,代码如下:

    cv = ShuffleSplit(features.shape[0], n_iter = 10, test_size = 0.2, random_state = 0)
    train_sizes = np.rint(np.linspace(1, data.shape[0]*0.8 - 1, 9)).astype(int)
    
    train_sizes, train_score, test_score = curves.learning_curve(
        XGBRegressor(), X, y, cv=cv, train_sizes=train_sizes,scoring =score_fun
        )
    
    train_score_mean = np.mean(train_score,axis=1)
    strain_score_std = np.std(train_score)
    test_score_mean = np.mean(test_score,axis=1)
    test_score_stu = np.stu(train_score,axis=1)

    在学习曲线函数中,通过cv 参数来设置划分的数据集,有几种方式:

    (1)如上边代码,cv 是按照某种方式划分好的数据集

    (2)cv=10,这种cv 是数字格式,是直接采用n-fold 的交叉检验的方式进行,直接设置n的值即可

    (3)自己手动划分

    #数据集合中有490条数据 index 是从0-489
    train_index = np.arange(0,391)
    test_index = np.arange(391,489)
    
    #构建cv 集合
    test_cv = [[train_index,test_index]]
    
    #学习曲线 cv参数传入test_cv
    sizes,train_scores,test_scores = curves.learning_curve(regressor,features,prices,cv=test_cv,train_sizes=train_sizes)
    

    下面看下学习曲线的画法,代码如下:

    sizes,train_scores,test_scores = curves.learning_curve(regressor,features,prices,cv=cv,train_sizes=train_sizes)
    
    train_std = np.std(train_scores, axis = 1)
    train_mean = np.mean(train_scores, axis = 1)
    test_std = np.std(test_scores, axis = 1)
    test_mean = np.mean(test_scores, axis = 1)
    
    depth = 4
    ax = fig.add_subplot(2,2,1)
    ax.plot(sizes, train_mean, 'o-', color = 'r', label = 'Training Score')
    ax.plot(sizes, test_mean, 'o-', color = 'g', label = 'Training Score')
    ax.fill_between(sizes, train_mean - train_std,train_mean + train_std, alpha = 0.15, color = 'r')
     ax.fill_between(sizes, test_mean - test_std, test_mean + test_std, alpha = 0.15, color = 'g')
        
     ax.set_ylabel('Score')
     ax.set_title('max_depth = %s'%(depth))
     ax.set_ylim([-0.05, 1.05])
    

     来看下这三种划分方式的学习曲线情况:

    (1)shuffleSplit 划分:cv=ShuffleSplit(.......) cv=cv,对于这个数据集 很适合

    (2) cv=10 交叉验证 n-fold 划分方式

    可以看出学习曲线变化很大

    (3) 手动划分 test_cv=[[train_index,test_index]] ,cv=test_cv

    由此可以看出,对于同一个数据集,划分的方式不同,其验证曲线会有很大差别 。

     

     

    展开全文
  • JAVA学习曲线

    2019-02-08 09:45:25
    JAVA学习曲线
                   

     

    和学习一般技能的过程没啥区别。

    整体上是不懂,入门,自认为很懂,越来越不懂,发现真的懂了,发现还是没懂。。。。

     

    所以,不要指望一开始就能掌握所有东西.

     

    基本方向是

     

    先 Java SE,然后根据个人爱好,转向

    B/S的企业级应用 Java EE

    C/S的应用程序,包括插件开发, Java GUI

    手机开发 Java ME

     

    然后开始标准的螺旋形学习。

     

    学习一点,用一点,然后努力的用,迅速提高一点。

     

    然后开始接触更深的知识,由于精力有限且接触一些新知识,这段时间整体水平或者某个技术的水平会下降(因为不常用了),不过随着你对新技术的理解,会更好的和以前掌握的知识进行融合,你会发现和学习到一些更合理,更优雅的方法去完成以前相同的功能,你会有种脱胎换骨的感觉,再次迎来了学习曲线的高点,然后你再次进入下一个循环。

     

    个人一直做B/S开发,所以写一下我的学习过程,仅供参考。

     

    从php转行到java.

     

    我直接先学习的JSP+JavaBean编程。

     

    不过许多类的概念都不是很清楚,所以看了一点面向对象的基础的书籍,当然顺便也熟悉了java类的一些基本用法。

     

    然后完成了邮件客户端的功能,此时已经可以做最基本的页面应用了。

     

    然后知道了除了tomcat,还有weblogic,websphere, 然后接触到了EJB 这个东西。

     

    然后用了大约2年时间,学习这个东西,并基本熟悉了在JBuilder + Weblogic 下面开发EJB应用的内容。

     

    然后由于工作关系,又干了1年多的php

     

    然后又开始学习java, 不过EJB基本放弃了,改用Spring+Hibernate,注意没有struts。

     

     

     

    其中的2个高点,一是在完成了邮件客户端,第二个就是在用EJB完成了公司的基本数据交换的Web Service.

     

    低点就是转EJB的时候,以及停用EJB以后的那个阶段。

     

    这几年,基本属于缓慢下降的曲线了,不过由于多熟悉了一些设计模式的东西,发现以前费劲信息实现的一些东西,已经有现成的理论支持了,以前接触面太小了,做了许多的无用功哦。

     

    现在的资料多,所以你的学习曲线很可能上升的很陡峭,下降的很缓慢。

     

    不过每个人能有几个曲线,我就不好说了。 一般不经过某个痛苦的磨练过程,很难得到一个质的提高。如同习武里面的【闭门修炼】或者遇到了【高人指点】或者机缘巧合,学会了【九阳神功】。

     

     

     

               

    再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

    展开全文
  • 【机器学习】学习曲线和验证曲线

    千次阅读 2018-02-05 10:30:26
    提高学习算法性能的简单但功能强大的判定工具:学习曲线,验证曲线 学习曲线 学习曲线能判定偏差和方差问题   高偏差与高方差: 以上模型应用于训练和交叉验证准确率很低,此模型未能很好打的拟合...
  • 本文目录什么是学习曲线学习曲线作用绘制学习曲线学习曲线的解读完整代码 什么是学习曲线 学习曲线就是通过画出不同训练集大小时训练集和验证数据集的准确率,可以看到不同训练集训练出的模型在新数据上的表现,进而...
  • python学习曲线

    2020-02-17 15:52:05
    资料主要分为两部分:一...这个学习曲线是我在某马论坛上看到的,觉得不错就推荐给大家,同时也感谢某马的开源免费精神,猪哥也是受益颇多! 三、优质资源 我把这些资源分为了七个不同的阶段,从零基础开始难度是...
  • 小白机器学习学习曲线 自己机器学习的曲线,希望能帮助其他入门小白。还有当然不能完全是小白,还是需要些编程和数学基础的。 一、必要条件: 1.会python; 2.会基本的线性代数。 如果线性代数都忘了,可以看《台大...
  • 模型的评估和选择 控制变量法,EEE ∝\propto∝ 模型、数据量,其中 EEE 表示误差,一般转化为得分 Score, 0≤0 \leq0≤ Score ≤1\leq 1≤1 ...学习曲线,E∝M0DE \propto M_0DE∝M0​D,其中 ...
  • .net学习曲线

    2013-04-09 10:25:55
    .net学习曲线
  • 他们就是学习曲线(learning curve)和验证曲线(validation curve)。学习曲线可以判断学习算法是否过拟合或者欠拟合。使用学习曲线判别偏差和方差问题如果一个模型相对于训练集来说过于复杂,比如参数太多,则模型很...
  • 回归的学习曲线

    2020-08-24 22:25:58
    回归器的学习曲线 做作业的时候瞎写了个画回归器学习曲线的函数,一些简单的回归的学习曲线基本上可以用这个函数完成。 def regressor_draw_learn_curve(regressor, X, Y, start, end, step_para, step=1, method=...
  • Python学习曲线

    2019-10-22 15:55:02
    经历长达近一个月的资源筛选过程终于结束,总共1.5T百度网盘的资源经过:去重、筛选、整理、归档之后一份粗略的Python学习曲线资源已经成型,虽然中间经历了很多坎坷,不过最终还是完成。猪...
  • 学习曲线与交叉验证

    2018-06-01 21:08:51
    我们可以通过学习曲线来检测模型是`欠拟合`,`过拟合`还是`刚刚好`。
  • 学习曲线分析在现代企业中的应用提要学习曲线是一种通过生产者行为学习与经验积累而得到改进的生产产出的特征函数,利用学习曲线可以科学地制定成本计划,改善作业计划、劳动定额与劳力规划、质量改善等。...
  • 机器学习笔记——学习曲线的绘制为何要绘制学习曲线学习曲线高偏差(bias)的情况高方差(variance)情况重点总结高方差(high variance)高偏差(high bias)如何改变 λ 对拟合函数的影响来看看在神经网络上的应用 ...
  • Python学习曲线图.png

    2019-11-14 07:23:34
    Python学习曲线图,是对python学习过程的总结和指导,该图有利于python新手对今后职业的规划,以及对行业的了解。
  • 学习曲线和遗忘曲线

    千次阅读 2015-08-13 01:51:59
    学习曲线的定义为"在一定时间内获得的技能或知识的速率",又称练习曲线(practice curves)。 人们为了知道学习进程中的现象和进步的快慢的详情,作为以后努力的指针,应用统计图的方法作一条线,把它表示出来。...
  • 机器学习-学习曲线

    千次阅读 2018-01-19 10:23:38
    转载自:点击打开链接学习曲线是一条关于样本个数和经验损失函数之间的曲线,对机器学习中的过程进行判断,进一步调整学习参数,提高假设模型的泛化能力。在上面的图中,蓝线表示经验损失函数随着训练样本的增多而变...

空空如也

空空如也

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

学习曲线