【机器学习】欠拟合与过拟合 01

本文探讨了机器学习中的欠拟合和过拟合问题,介绍了多项式扩展作为解决欠拟合的方法,通过PolynomialFeatures类生成更高阶的特征。同时,文章展示了流水线在模型构建中的应用,如何通过Pipeline类组合多个步骤进行预处理和建模,以简化工作流程并提高模型性能。
摘要由CSDN通过智能技术生成

目录

1 概述

1.1 欠拟合

1.2 过拟合

2 多项式扩展

2.1 多项式拓展规则

2.2 PolynomialFeatures类

2.3 代码

2.4 多项式扩展解决欠拟合

 3.流水线(Pipeline类)


#学习记录#

1 概述

1.1 欠拟合

现象: 欠拟合发生时,模型在训练集上的表现并不理想。这意味着模型的预测值与实际值之间存在较大的误差。简而言之,模型未能有效学习到数据中的关键模式。

产生原因: 通常,欠拟合是由于模型过于简单所致。当模型没有足够的参数或者考虑的特征太少时,它就难以捕捉数据中复杂的结构和关系。

解决方案:

  1. 增加模型复杂度: 选择更复杂的模型可以帮助模型更好地学习和理解数据的特点。
  2. 引入更多特征: 包括新增的或者已有相关特征,可以增强模型的学习能力。
  3. 特征工程: 通过创建新特征,如多项式扩展,可以提供更多的信息,帮助模型学习。
  4. 模型迭代: 增加迭代次数可以让模型有更多的学习机会,直到它找到更好的数据拟合方式。

1.2 过拟合

现象: 过拟合是指模型在训练集上表现出色,但在未知数据集(比如验证集或测试集)上表现不佳。这表明模型过度学习了训练数据的特性,包括一些不具代表性的噪声。

产生原因: 过拟合通常发生在模型过于复杂,参数过多时。这种情况下,模型不仅学习了数据的一般特征,还学习了数据中的随机噪声。

解决方案:

  1. 增加数据量: 更多的数据可以提供更广泛的样本特征,减少噪声的影响。
  2. 降低模型复杂度: 使用更简单的模型或减少模型参数可以减少过拟合的风险。
  3. 特征选择: 删除不相关或噪声较大的特征,专注于最重要的特征。
  4. 正则化技术: 如L1或L2正则化,可以惩罚模型中过于复杂的部分。
  5. Early Stopping: 在验证误差开始增加时停止训练,防止模型过度拟合训练数据。

很明显,图一可以看到欠拟合,而图四过拟合 

2 多项式扩展

2.1 多项式拓展规则

简介: 多项式拓展是一种通过生成新特征将数据从低维空间映射到高维空间的技术。这种转换可以使模型能够拟合更复杂的数据模式。

规则: 设原始数据的特征为输入特征,多项式扩展生成的特征为输出特征。假设进行n阶扩展,则遵循以下规则:

  1. 乘积组合: 对所有输入特征进行乘积组合。
  2. 指数规则: 每个输入特征有一个指数,范围从0到n。
  3. 指数和限制: 遍历所有指数的可能取值,确保所有输入特征的指数之和不超过n。
  4. 输出特征生成: 满足上述条件的每个指数组合构成一个输出特征。

2.2 PolynomialFeatures类

介绍: 在Python的sklearn库中,PolynomialFeatures类提供了多项式扩展的实现功能。

使用方法:

  • powers_属性显示了扩展后每个输入特征的指数组合,以矩阵形式呈现。
  • 矩阵结构:
    • 每列对应一个输入特征,列数等于输入特征数。
    • 每行对应一个输出特征,行数等于输出特征数。
    • 矩阵形状为[输出特征数, 输入特征数]。
    • 每个矩阵元素代表相应输入特征的指数值。
  • 指数解释: powers_[i, j]代表第i个输出特征中,第j个输入特征的指数值。

2.3 代码

导入库:

import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression  # 机器学习的库
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"]=["SimHei"] #设置字体
plt.rcParams["axes.unicode_minus"]=False #该语句解决图像中的“-”负号的乱码问题
# 显示多行结果
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"

多项式扩展 示例

from sklearn.preprocessing import PolynomialFeatures

X = np.array([[1,2],[3,4]])
# degree:拓展的阶数,阶数越高,输出特征越多
# include_bias:是够包含编制,默认为True
poly = PolynomialFeatures(2,include_bias=True)
# 对输入数据进行转换
# 相当于调用fit之后再调用transform
# poly.fit(x)
r = poly.fit_transform(X)
print("转换之后的结果:")
print(r)
print("指数矩阵:")
print(poly.powers_)
print("输入的特征数量:", poly.n_features_in_)
print("输出的特征数量:", poly.n_output_features_)
for x1, x2 in X:
    for e1, e2 in poly.powers_:
        print(x1 ** e1 * x2 ** e2, end="\t")
    print()

输出结果:

转换之后的结果:
[[ 1.  1.  2.  1.  2.  4.]
 [ 1.  3.  4.  9. 12. 16.]]
指数矩阵:
[[0 0]
 [1 0]
 [0 1]
 [2 0]
 [1 1]
 [0 2]]
输入的特征数量: 2
输出的特征数量: 6
1	1	2	1	2	4	
1	3	4	9	12	16

2.4 多项式扩展解决欠拟合

扩展前:

# 构造非线性数据
x = np.linspace(0,10,50)
# 构造非线性数据
y = x*np.sin(x)
# 为x扩展一个维度,从一维变成二维,也可以通过reshape来实现同样的功能
X = x.reshape(-1, 1)
lr = LinearRegression()
lr.fit(X,y)
plt.scatter(x,y,c='g',label= '样本数据')
plt.plot(x,lr.predict(X),'r-',label = '拟合线')
plt.legend()
plt.title(f'$R^2$:{lr.score(X,y):.3f}')

输出 

 多项式拓展:

# 构造非线性数据
x = np.linspace(0,10,50)
# 构造非线性数据
y = x*np.sin(x)
# 为x扩展一个维度,从一维变成二维,也可以通过reshape来实现同样的功能
X = x.reshape(-1, 1)
figure,ax = plt.subplots(3,2)
figure.set_size_inches(15,15)
ax = ax.ravel()

# 进行1阶到6阶的多项式扩展(1阶相当于没有扩展)
for n in range(1,7):
    poly = PolynomialFeatures( n,include_bias = False)
    X_transform = poly.fit_transform(X)
    lr = LinearRegression()
    lr.fit(X_transform,y)
    ax[n-1].set_title(f'{n}阶扩展,拟合度:{lr.score(X_transform,y):.3f}')
    ax[n-1].scatter(x,y,c='g',label='样本数据')
    ax[n-1].plot(x,lr.predict(X_transform),'r-',label='拟合线')
    ax[n-1].legend()

 输出:

 3.流水线(Pipeline类)

概述: 流水线(Pipeline类)是一种将多个评估器(estimators)组合成一个单一的评估器的技术。在机器学习的预处理和建模过程中,它能够简化工作流程,并保持代码的清晰性和模块化。

工作原理: 流水线按顺序执行一系列评估器,每个评估器代表流程中的一个步骤。流水线本身模仿了其包含的最后一个评估器的方法。

执行流程:

  • 对于fit或fit_transform方法:
    • 对于流水线中的前n-1个评估器,按顺序对每个评估器调用fit_transform方法。
    • 对于最后一个评估器,调用fit方法(不执行transform)。
    • 每个步骤的输出成为下一步的输入。
  • 对于其他方法(如predict):
    • 对于流水线中的前n-1个评估器,依次调用transform方法。
    • 对于最后一个评估器,调用相应的方法(如predict)。
    • 每一步的输出同样成为下一步的输入。

实例:

  • 当调用流水线的fit方法时,数据将经过每个步骤的fit_transform处理,直至最后一个评估器执行fit。
  • 当调用predict方法时,数据将依次通过每个步骤的transform方法,最后在最终评估器上执行predict。
from sklearn.pipeline import Pipeline
x = np.linspace(0, 10, 50)
y = x * np.sin(x)
X = x[:, np.newaxis]
# 定义流水线的步骤。类型为一个列表,列表中的每个元素是元组类型,
# 格式为:[(步骤名1,评估器1), (步骤名2, 评估器2),……, (步骤名n, 评估器n)
steps = [("poly", PolynomialFeatures(include_bias=False)), ("lr", LinearRegression())]
pipe = Pipeline(steps)
# 设置流水线的参数。所有可用的参数,可以通过pipeline.get_params()获取。
pipe.set_params(poly__degree=8)
pipe.fit(X, y)
score = pipe.score(X, y)
plt.title(f"8阶,拟合度:{score:.3f}")
plt.scatter(X, y, c="g", label="样本数据")
plt.plot(X, pipe.predict(X), "r-", label="拟合线")

上面介绍了如何解决欠拟合的方法,下一篇我们将介绍正则化方法来解决过拟合问题。

以上

学习在于总结和坚持,共勉

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值