学习曲线的绘制(个人自定义源码)

学习曲线:

随着训练样本的增多,模型在训练集和测试集的表现趋于一致。根据训练集合测试集的表现可以判断模型是过拟合和欠拟合。
查了很多关于sklearn的learning_curve的资料,没有找到其内部原理的文章,因此根据学习曲线的概念手动编写代码。

学习曲线的绘制过程如下:

(1)求出训练集的大小t=len(x_train)。
(2)训练集是一个长度为t的数据集,首先选择第一个数据进行建模,得到模型model1,然后使用model1在验证集上验证,得到评价分数score1;然后选择训练集的前2个数据进行建模,得到模型model2,然后使用model2在验证集上验证,得到评价分数score2;然后选择训练集的前3个数据,…重复上述操作,直到使用训练集的所有数据建模,并得到验证集的分数scoret。
(3)画图,横坐标为训练集的数据个数,纵坐标为在该训练个数下得到的评价分数score。
其中第2步中,如果定义了trainsize,则不需要循环t次,只需要按照trainsize定义的去计算。比如trainsize=[0.1,0.5,0.8,0.9,1.0],t=1000,则第二步只需要计算训练集为0.1t=100,0.5t=500,0.8t=800,0.9t=900,t=1000数量的时候,只需要循环5次。

示例代码

from sklearn.metrics import mean_squared_error
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression

#构造一个6个特征的训练集,并以0.8为分割点,划分训练集和测试集
x = np.random.uniform(low=-1,high=1,size=(5000,6))
y = [3.4*i[0]+2.4*i[1]-0.9*i[2]+0.5*i[3]+0.7*i[4]-1.2*i[5]+np.random.uniform(low=-0.03,high=0.03) for i in x]
t = int(0.8*len(x))
X_train = x[:t]
y_train = y[:t]
X_test = x[t:]
y_test = y[t:]

#构造学习曲线函数
def learningCurve(model,X_train,y_train,X_test,y_test,trainsize):
    #model是使用的模型,trainsize指使用多少个训练样本来求测试集的mse。
    length = len(X_train)
    #用来存储横坐标
    xlist = []
    #存储纵坐标的训练数据的mse
    ylist_train = []
    #存储纵坐标的测试数据的mse
    ylist_test = []
    for i in trainsize:
        cutpoint = int(length*i)
        if cutpoint == 0:
        #为了防止在trainsize里有训练数据为0的时候,保证训练数据最少有1个。
            cutpoint = 1
        tempdatax = X_train[:cutpoint]
        tempdatay = y_train[:cutpoint]
        model.fit(tempdatax,tempdatay)
        result_train = model.predict(tempdatax)
        result_test = model.predict(X_test)
        mse_train = mean_squared_error(tempdatay,result_train)
        mse_test = mean_squared_error(y_test,result_test)
        xlist.append(cutpoint)
        ylist_train.append(mse_train)
        ylist_test.append(mse_test)
    fig,axes = plt.subplots(1,1)
    axes.plot(xlist,ylist_train,'k-')
    axes.plot(xlist,ylist_test,'r-')
    plt.show()

#使用学习曲线函数画图
trainsize = np.linspace(0.01,0.999,20)
model = LinearRegression()
learningCurve(model,X_train,y_train,X_test,y_test,trainsize)

效果图

在这里插入图片描述
图中可以看出,训练集随着训练数据的增加,mse逐渐增大,而测试集随着训练数据的增加,mse逐渐减小。两条曲线随着训练数据的增大,趋于相同。

总结

本示例只是回归模型学习曲线画图。如果针对分类模型,纵坐标可以使用准确率来替代。希望可以为你的学习带来一点点的贡献。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MFC(Microsoft Foundation Class)是微软开发的一个应用程序框架,它简化了Windows图形用户界面(GUI)应用程序的开发。要使用MFC绘制动态曲线,我们可以通过调用MFC提供的绘图函数来实现。 首先,我们需要在MFC应用程序的视图类中的OnDraw函数中进行绘图。在该函数中,我们可以使用一系列绘图函数来绘制静态曲线,例如MoveTo和LineTo函数。然而,要实现动态曲线的绘制,我们需要将这些绘图函数与计时器或消息处理函数结合起来。 一种常见的方法是使用计时器,在每次计时器触发时,更新曲线的绘制位置。我们可以定义一个计时器,并在计时器消息函数中更新曲线的坐标。在OnDraw函数中,我们使用这些更新后的坐标来绘制曲线。这样就可以实现动态曲线的绘制了。 另一种方法是使用消息处理函数来实现动态曲线的绘制。我们可以在窗口类中重载PreTranslateMessage函数,捕获鼠标或键盘消息,并在其处理过程中更新曲线的坐标。然后在OnDraw函数中使用这些更新后的坐标来绘制曲线。 无论使用哪种方法,我们都需要定义曲线的坐标,例如一个数组来存储X轴和Y轴的坐标点。然后在OnDraw函数中使用这些坐标来绘制曲线。通过不断更新这些坐标,曲线就可以实现动态效果。 当然,以上只是一个实现动态曲线绘制的思路,具体的源码实现可能因个人需求而有所不同。但是无论怎样,考虑到MFC的特点和功能,我们可以利用MFC提供的绘图函数和消息处理机制来方便地实现动态曲线的绘制

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值