sklearn实现非线性回归模型

本文介绍如何使用sklearn库将非线性回归模型转换为线性模型进行训练,通过实例展示了从数据预处理到模型训练的全过程,并对比了一元线性模型与多项式回归模型的拟合效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

sklearn实现非线性回归模型

前言: sklearn实现非线性回归模型的本质是通过线性模型实现非线性模型,如何实现呢?sklearn就是先将非线性模型转换为线性模型,再利用线性模型的算法进行训练模型。

一、线性模型解决非线性模型的思想
1、样本数据如下

xy
145000
250000
360000
480000
5110000
6150000
7200000
8300000
9500000
101000000

2、假设样本数据符合线性模型 y = a0 + a1x,则可以直接利用sklearn的线性回归模型方法训练该模型

3、但是假设样本数据符合非线性模型 y = a0x0 + a1x1 + a2x2 + a3x3 ,(其中x0=1)那么我们如何将该非线性模型转为线性模型呢?sklearn的解释思路是从样本数据中的自变量下手的,它首先通过计算将样本数据修改为下表
x0 x1 x2 x3 y
[[ 1. 1. 1. 1.]
[ 1. 2. 4. 8.]
[ 1. 3. 9. 27.]
[ 1. 4. 16. 64.]
[ 1. 5. 25. 125.]
[ 1. 6. 36. 216.]
[ 1. 7. 49. 343.]
[ 1. 8. 64. 512.]
[ 1. 9. 81. 729.]
[ 1. 10. 100. 1000.]]
4、根据上面的样本数据,也就把 y = a0x0 + a1x1 + a2x2 + a3x3 ^非线性回归模型转换为了y = a0x0 + a01x1 + a2x2 + a3x3的线性回归模型了,这样就可以利用sklearn的线性回归模型算法进行训练非线性回归模型了

二、 具体实现代码如下

import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression

# 读取数据
data = np.genfromtxt('job.csv', delimiter=',')
x_data = data[1:, 1]
y_data = data[1:, 2]

# 一维数据通过增加维度转为二维数据
x_2data = x_data[:, np.newaxis]
y_2data = data[1:, 2, np.newaxis]

# 训练一元线性模型
model = LinearRegression()
model.fit(x_2data, y_2data)

plt.plot(x_2data, y_2data, 'b.')
plt.plot(x_2data, model.predict(x_2data), 'r')

# 定义多项式回归:其本质是将变量x,根据degree的值转换为相应的多项式(非线性回归),eg: degree=3,则回归模型
# 变为 y = theta0 + theta1 * x + theta2 * x^2 + theta3 * x^3
poly_reg = PolynomialFeatures(degree=3)
# 特征处理
x_ploy = poly_reg.fit_transform(x_2data)  # 这个方法实质是把非线性的模型转为线性模型进行处理,
# 处理方法就是把多项式每项的样本数据根据幂次数计算出相应的样本值(详细理解可以参考我的博文:https://blog.youkuaiyun.com/qq_34720818/article/details/103349452)

# 训练线性模型(其本质是非线性模型,是由非线性模型转换而来)
lin_reg_model = LinearRegression()
lin_reg_model.fit(x_ploy, y_2data)

plt.plot(x_2data, y_2data, 'b.')
plt.plot(x_2data, lin_reg_model.predict(x_ploy), 'r')

plt.show()

三、实现结果
在这里插入图片描述

可以很明显的看错曲线比直线的拟合效果好

四、数据下载
链接:https://pan.baidu.com/s/1YoUUJkbSGQsyy50m-LQJYw
提取码:rwek

### 如何用 sklearn 实现非线性回归模型训练 尽管 `sklearn` 主要用于构建线性模型,但它可以通过特征变换的方式实现非线性回归模型的训练。其核心思想是通过对原始输入变量进行多项式扩展或其他形式的映射,将原本复杂的非线性关系化为适合线性模型拟合的形式[^1]。 #### 特征工程中的多项式扩展 为了使线性模型能够适应非线性数据分布,通常会引入高阶项或交互项来增强模型表达能力。这一步骤可通过 `PolynomialFeatures` 类完成,该类允许指定所需的最大幂次以及是否包含偏置项。例如: ```python from sklearn.preprocessing import PolynomialFeatures poly = PolynomialFeatures(degree=2, include_bias=False) X_poly = poly.fit_transform(X) ``` 上述代码片段展示了如何创建二次多项式的特征矩阵 `X_poly`,其中每一列代表原特征的不同组合及其平方值[^4]。 #### 使用 Ridge 回归作为基础估计器 考虑到过拟合风险,在实际应用中推荐采用带正则化的线性方法如岭回归 (Ridge Regression),它不仅具备良好的泛化性能还能有效控制参数规模。借助于 `RidgeCV` 自动调整超参 alpha 的特性,可进一步简化调优流程并提升效率[^2]: ```python from sklearn.linear_model import RidgeCV ridge_cv = RidgeCV(alphas=[0.1, 1.0, 10.0], cv=5) ridge_cv.fit(X_poly, y) print(f"最佳alpha值:{ridge_cv.alpha_}") print(f"回归系数:\n{ridge_cv.coef_}") ``` 这里定义了一个基于交叉验证选取最优惩罚强度 Alpha 值的 Ridge 模型实例,并打印出了最终选定的最佳 Alpha 和对应的权重向量 Coefficients[]. 综上所述,整个过程分为两步走策略:第一步是对自变量做必要的预处理操作;第二步则是挑选合适的预测工具加以运用。如此这般便能成功达成目标—即利用 SkLearn 库来进行非线性的回规建模工作啦!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mekeater

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值