learning_curve(学习曲线)

文章目录

  • 一、学习曲线
    • 1.1 学习曲线作用
    • 1.2 学习曲线
    • 1.3 表现能力
    • 1.4 学习曲线的具体操作
  • 二、实例
    • 2.1 模拟数据集
    • 2.2 绘制数据集
    • 2.3 分割数据集
    • 2.4 使用线性回归拟合数据集并绘制学习曲线
    • 2.5 绘制
    • 2.6 分析:随着数据集的增大,所训练出的模型
  • 三、将绘制学习曲线的方法封装成一个函数
    • 3.1 学习曲线封装
    • 3.2 调用封装函数
    • 3.3 使用 plot_squared_error() 函数,绘制线性回归模型的学习曲线
    • 3.4 degree = 2
    • 3.5 degree = 30
    • 3.6 对比 degree=2 和线性回归学习曲线
    • 3.7 对比 degree=2 和 degree=20 两个学习曲线
  • 有趣的事,Python永远不会缺席

数据和模型 https://blog.csdn.net/u010986753/article/details/98526886

模型评价ROC\AUC\查准率\查全率\F-score\混淆矩阵\KS曲线\PR曲线等https://blog.csdn.net/u010986753/article/details/98114068

一、学习曲线

1.1 学习曲线作用

  • 查看模型的学习效果;
  • 通过学习曲线可以清晰的看出模型对数据的过拟合和欠拟合;

1.2 学习曲线

  随着训练样本的逐渐增多,算法训练出的模型的表现能力;

1.3 表现能力

  也就是模型的预测准确率,使用均方误差表示;学习率上体现了模型相对于训练集和测试集两类数据的均方误差。

1.4 学习曲线的具体操作

  • len(X_train) 个训练样本,训练出 len(X_train) 个模型,第一次使用一个样本训练出第一个模型,第二次使用两个样本训练出第二个模型,… ,第 len(X_train) 次使用 len(X_train) 个样本训练出最后一个模型;
  • 每个模型对于训练这个模型所使用的部分训练数据集的预测值:y_train_predict = 模型.predict(X_train[ : i ]);
  • 每个模型对于训练这个模型所使用的部分训练数据集的均方误差:mean_squared_error(y_train[ : i ], y_train_predict);
  • 每个模型对于整个测试数据集的预测值:y_test_predict = 模型.predict(X_test)
  • 每个模型对于整个测试数据集的预测的均方误差:mean_squared_error(y_test, y_test_predict);
  • 绘制每次训练模型所用的样本数量与该模型对应的部分训练数据集的均方误差的平方根的关系曲线:plt.plot([i for i in range(1, len(X_train)+1)],np.sqrt(train_score), label=“train”)
  • 绘制每次训练模型所用的样本数量与该模型对应的测试数据集的预测的均方误差的关系曲线:plt.plot([i for i in range(1, len(X_train)+1)],np.sqrt(test_score), label=“test”)

二、实例

2.1 模拟数据集

import numpy as np
import matplotlib.pyplot as plt

np.random.seed(666)
x = np.random.uniform(-3, 3, size=100)
X = x.reshape(-1, 1)
y = 0.5 * x**2 + x + 2. + np.random.normal(0, 1, size=100)

2.2 绘制数据集

plt.scatter(x, y)
plt.show()
learning_curve(学习曲线)_第1张图片

2.3 分割数据集

from sklearn.model_selection import train_test_split

# random_state=10:随机种子;
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=10)

2.4 使用线性回归拟合数据集并绘制学习曲线

from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
# 存储每一次训练的模型的均方误差
train_score = []
test_score = []

# for 循环:进行 75 次模型训练,每次训练出 1 个模型,第一次给 1 个数据,第二次给 2 个数据,... ,最后一次给 75 个数据
for i in range(1, 76):
    lin_reg = LinearRegression()
    lin_reg.fit(X_train[:i], y_train[:i])
    # LinearRegression().fit(X_train[:i], y_train[:i])
    
    # 查看模型的预测情况:两种,模型基于训练数据集预测的情况(可以理解为模型拟合训练数据集的情况),模型基于测试数据集预测的情况
    # 此处使用 lin_reg.predict(X_train[:i]),为训练模型的全部数据集
    y_train_predict = lin_reg.predict(X_train[:i])
    train_score.append(mean_squared_error(y_train[:i], y_train_predict))
    
    y_test_predict = lin_reg.predict(X_test)
    test_score.append(mean_squared_error(y_test, y_test_predict))

2.5 绘制

# np.sqrt(train_score):将列表 train_score 中的数开平方
plt.plot([i for i in range(1, 76)], np.sqrt(train_score), label='train')
plt.plot([i for i in range(1, 76)], np.sqrt(test_score), label='test')

# plt.legend():显示图例(如图形的 label);
plt.legend()
plt.show()
learning_curve(学习曲线)_第2张图片

2.6 分析:随着数据集的增大,所训练出的模型

  • 相对于训练数据集的均方误差在逐渐增大:因为随着数据集的增大,样本点的增多,模型越难拟合住所有的数据,相应的均方误差会逐渐的累积,越来越大,但随着训练数据集的增大,均方差的逐渐累积量越来越小,模型相应的会越来越稳定;
  • 相对于测试数据集的测试误差逐渐减小,当数据量增大到一定程度,测试误差趋于相对稳定;
  • 最终的训练误差和测试误差几乎接近,相当于一个级别,不过测试误差比训练误差相对较大一点,因为训练数据集训练出的模型对训练数据集拟合的程度较好,相对的模型对应训练数据集的均方误差相对较小;

三、将绘制学习曲线的方法封装成一个函数

3.1 学习曲线封装

def plot_learning_curve(algo, X_train, X_test, y_train, y_test):
    """绘制学习曲线:只需要传入算法(或实例对象)、X_train、X_test、y_train、y_test"""
    """当使用该函数时传入算法,该算法的变量要进行实例化,如:PolynomialRegression(degree=2),变量 degree 要进行实例化"""
    train_score = []
    test_score = []
    for i in range(1, len(X_train)+1):
        algo.fit(X_train[:i], y_train[:i])
        
        y_train_predict = algo.predict(X_train[:i])
        train_score.append(mean_squared_error(y_train[:i], y_train_predict))
    
        y_test_predict = algo.predict(X_test)
        test_score.append(mean_squared_error(y_test, y_test_predict))
    
    plt.plot([i for i in range(1, len(X_train)+1)],
            np.sqrt(train_score), label="train")
    plt.plot([i for i in range(1, len(X_train)+1)],
            np.sqrt(test_score), label="test")
    
    plt.legend()
    plt.axis([0, len(X_train)+1, 0, 4])
    plt.show()
  • 当使用该函数时传入算法,该算法的变量要进行实例化,如:
    plot_learning_curve(PolynomialRegression(degree=2), X_train, X_test, y_train, y_test)
  • 可以直接传承实例化后的变量,如:lin_reg = LinearRegression(),
    plot_learning_curve(lin_reg, X_train, X_test, y_train, y_test)

3.2 调用封装函数

plot_learning_curve(LinearRegression(), X_train, X_test, y_train, y_test)

3.3 使用 plot_squared_error() 函数,绘制线性回归模型的学习曲线

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error

def PolynomialRegression(degree):
    return Pipeline([
        ('poly', PolynomialFeatures(degree=degree)),
        ('std_scaler', StandardScaler()),
        ('lin_reg', LinearRegression())
    ])

3.4 degree = 2

#Polynomial regression(多项式回归)
#多项式回归可以有degree 2  degree3(3阶),degree越多,可以越好的拟合,同时导致容易过拟合
poly2_reg = PolynomialRegression(degree=2)
plot_learning_curve(poly2_reg, X_train, X_test, y_train, y_test)
learning_curve(学习曲线)_第3张图片

3.5 degree = 30

plot_learning_curve(PolynomialRegression(degree=20), X_train, X_test, y_train, y_test)
learning_curve(学习曲线)_第4张图片

3.6 对比 degree=2 和线性回归学习曲线

learning_curve(学习曲线)_第5张图片

  对于欠拟合情况,和最佳的情况相比较,相对的 train 和 test 两根曲线趋于稳定的位置,比最佳的两个曲线趋于稳定的位置较高:说明,无论对于训练数据集还是测试数据集,相应的误差都比较大,这是因为本身模型选的不正确,即使在训练数据集上,误差也比较大;

3.7 对比 degree=2 和 degree=20 两个学习曲线

learning_curve(学习曲线)_第6张图片
  • 对于过拟合情况,在训练数据集上,相应的误差和最佳时的误差差不多,甚至当 degree 取值更大时,过拟合的误差比最佳时的误差小;
  • 对于过拟合情况,测试数据集的误差相比较大,并且从图上看出,测试数据集的误差曲线距离训练数据集的误差曲线较远:说明,此时模型的泛化能力不够好,对于新的数据预测误差较大;
'''
【干货来了|小麦苗IT资料分享】
★小麦苗DB职场干货:https://mp.weixin.qq.com/s/Vm5PqNcDcITkOr9cQg6T7w
★小麦苗数据库健康检查:https://share.weiyun.com/5lb2U2M
★小麦苗微店:https://weidian.com/s/793741433?wfr=c&ifr=shopdetail
★各种操作系统下的数据库安装文件(Linux、Windows、AIX等):链接:https://pan.baidu.com/s/19yJdUQhGz2hTgozb9ATdAw  提取码:4xpv
★小麦苗分享的资料:https://share.weiyun.com/57HUxNi
★小麦苗课堂资料:https://share.weiyun.com/5fAdN5m
★小麦苗课堂试听资料:https://share.weiyun.com/5HnQEuL
★小麦苗出版的相关书籍:https://share.weiyun.com/5sQBQpY
★小麦苗博客文章:https://share.weiyun.com/5ufi4Dx
★数据库系列(Oracle、MySQL、NoSQL):https://share.weiyun.com/5n1u8gv
★公开课录像文件:https://share.weiyun.com/5yd7ukG
★其它常用软件分享:https://share.weiyun.com/53BlaHX
★其它IT资料(OS、网络、存储等):https://share.weiyun.com/5Mn6ESi
★Python资料:https://share.weiyun.com/5iuQ2Fn
★已安装配置好的虚拟机:https://share.weiyun.com/5E8pxvT
★小麦苗腾讯课堂:https://lhr.ke.qq.com/
★小麦苗博客:http://blog.itpub.net/26736162/
'''


'''
如需转发,请注明出处:小婷儿的博客python    https://blog.csdn.net/u010986753

  CSDN https://blog.csdn.net/u010986753

  博客园 https://www.cnblogs.com/xxtalhr/

有问题请在博客下留言或加作者:
  微信:tinghai87605025 联系我加微信群
  QQ :87605025
  QQ交流群:py_data 483766429
  公众号:DB宝

证书说明
  OCP证书说明连接 https://mp.weixin.qq.com/s/2cymJ4xiBPtTaHu16HkiuA

  OCM证书说明连接 https://mp.weixin.qq.com/s/7-R6Cz8RcJKduVv6YlAxJA
'''

有趣的事,Python永远不会缺席

欢迎关注小婷儿的博客

  文章内容来源于小婷儿的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解!!!

   小婷儿的python正在成长中,其中还有很多不足之处,随着学习和工作的深入,会对以往的博客内容逐步改进和完善哒。重要的事多说几遍。。。。。。

你可能感兴趣的:(模型评价)