监督学习-多项式回归-python3

文章介绍了如何利用Python进行多元回归分析,通过训练/测试法确定最佳拟合阶数,以提高模型在测试集上的R²分数。通过sklearn库计算拟合优度,并找到最优的多项式阶数来提升模型的表现。在示例中,数据集包括页面加载速度和购物金额,最终发现6阶多项式提供了最佳的拟合效果。

0.理论

多元回归使用R²衡量整体的拟合度。R²的值越接近1,说明回归直线对观测值的拟合程度越好。拟合度r2计算公式:R2=ESS/TSS=1-RSS/TSS。

1.用训练/测试法找出拟合给定数据集的正确阶数

import matplotlib.pyplot as plt
import numpy as np
from pylab import *
# 生成随机种子
np.random.seed(2)
# 生成页面载入速度和购物金额
pageSpeeds = np.random.normal(3.0, 1.0, 100)
purchaseAmount = np.random.normal(50.0, 30.0, 100) / pageSpeeds
# 画散点图
scatter(pageSpeeds, purchaseAmount)
<matplotlib.collections.PathCollection at 0x1c9269b9570>

请添加图片描述

# 将80%的数据作为训练数据
trainX = pageSpeeds[:80]
testX = pageSpeeds[80:]

trainY = purchaseAmount[:80]
testY = purchaseAmount[80:]
x = np.array(trainX)
y = np.array(trainY)
# 8阶多项式
p = np.poly1d(np.polyfit(x, y, 8))
# 打印8阶多项式方程
print(np.poly1d(p))
       8         7         6         5        4        3        2
0.734 x - 17.01 x + 165.7 x - 881.9 x + 2788 x - 5315 x + 5898 x - 3442 x + 838.4
# 训练集
trainX = np.array(trainX)
trainY = np.array(trainY)
# 8阶多项式
p = np.poly1d(np.polyfit(x, y, 8))
# 打印8阶多项式方程
print(np.poly1d(p))
# 画图
xp = np.linspace(0, 7, 100)
axes = plt.axes()
axes.set_xlim([0,7])
axes.set_ylim([0, 200])
# 散点图
plt.scatter(trainX, trainY)
# 拟合曲线
plt.plot(xp, p(xp), c='r')
plt.show()
       8         7         6         5        4        3        2
0.734 x - 17.01 x + 165.7 x - 881.9 x + 2788 x - 5315 x + 5898 x - 3442 x + 838.4

请添加图片描述

# 查看测试集的拟合度
testx = np.array(testX)
testy = np.array(testY)

axes = plt.axes()
axes.set_xlim([0,7])
axes.set_ylim([0, 200])
plt.scatter(testx, testy)
plt.plot(xp, p(xp), c='r')
plt.show()

请添加图片描述

# 拟合优度
from sklearn.metrics import r2_score
print(r2_score(testy, p(testx)))
0.3001816861141787
# 寻找使拟合优度最高的N次方
def find_degree():
    ans = []
    # 训练集
    X_train = np.array(trainX)
    y_train = np.array(trainY)
    # 测试集
    X_test = np.array(testX)
    y_test = np.array(testY)
    for degree in range(1, 21):
        # 拟合,得到N阶多项式方程
        p = np.poly1d(np.polyfit(X_train, y_train, degree))
        # 预测
        y_pred = p(X_test)
        # 拟合优度
        r2 = r2_score(y_test, y_pred)
        # 存入结果
        ans.append((r2, degree))
    ans.sort(reverse= True)
    print('最优拟合优度为: {}\n最优阶数为: {}'.format(ans[0][0], ans[0][1]))
    # 可视化,查看测试集的拟合度
    axes = plt.axes()
    axes.set_xlim([0,7])
    axes.set_ylim([0, 200])
    plt.scatter(X_test, y_test)
    xp = np.linspace(0, 7, 100)
    plt.plot(xp, p(xp), c='r')
    plt.show()
    
find_degree()
最优拟合优度为: 0.6050119470355618
最优阶数为: 6


C:\Users\Administrator\AppData\Local\Temp\ipykernel_8636\1203016730.py:30: RankWarning: Polyfit may be poorly conditioned
  find_degree()
C:\Users\Administrator\AppData\Local\Temp\ipykernel_8636\1203016730.py:30: RankWarning: Polyfit may be poorly conditioned
  find_degree()
C:\Users\Administrator\AppData\Local\Temp\ipykernel_8636\1203016730.py:30: RankWarning: Polyfit may be poorly conditioned
  find_degree()

请添加图片描述

2. 参考资料

Python数据科学与机器学习:从入门到实践
作者:
[美]弗兰克•凯恩(Frank Kane)

源代码下载:
https://www.ituring.com.cn/book/2426

<think>嗯,我现在要介绍一下Python机器学习中的线性回归基础。首先,我需要确认自己对线性回归的理解是否正确。线性回归是一种用于预测连续数值的监督学习算法,对吧?它的基本思想是找到自变量和因变量之间的线性关系,然后根据这个关系进行预测。 那线性回归的数学模型是什么呢?应该是类似y = wx + b这样的形式,其中w是权重,b是偏置项。对于多元线性回归,可能会有多个特征,所以公式应该是y = w1x1 + w2x2 + ... + wnxn + b。这里的目标是找到最佳的w和b,使得预测值和实际值的误差最小,通常使用最小二乘法来优化。 接下来,我需要考虑如何在Python中实现线性回归。常用的库应该是scikit-learn,里面的LinearRegression类应该可以直接用。不过在使用之前,可能需要先导入必要的库,比如numpy处理数据,pandas读取数据,matplotlib进行可视化,还有sklearn本身。 数据预处理的步骤也很重要。比如,数据是否需要标准化或归一化?线性回归对特征的尺度敏感吗?我记得如果特征尺度差异大,可能会影响梯度下降的收敛速度,所以可能需要做特征缩放。不过scikit-learn的线性回归是否自动处理这些呢?可能不是,所以预处理步骤可能需要自己完成。 然后,分割数据集为训练集和测试集,用train_test_split函数。训练模型之后,评估指标通常用均方误差(MSE)或者R²分数。R²分数越接近1,说明模型拟合得越好。 有没有可能出现过拟合或者欠拟合的情况?线性回归本身比较简单,可能容易欠拟合,特别是在数据存在非线性关系的时候。这时候可能需要考虑多项式回归或者其他更复杂的模型。 举个例子,比如用波士顿房价数据集,但听说这个数据集已经被移除了,可能需要用其他数据集替代,比如加利福尼亚房价数据集。加载数据,处理数据,分割,训练,预测,评估这些步骤都要走一遍。 另外,可能需要可视化结果,比如画出回归线,或者残差图,看看预测值和实际值的差异分布。残差应该随机分布,没有明显的模式,否则可能模型有问题。 还有,线性回归的假设条件,比如线性关系、误差项的正态性、同方差性、无自相关、无多重共线性等,这些假设是否满足会影响模型的效果。如果数据不满足这些假设,可能需要做一些变换或者使用其他方法。 总之,步骤大概是:导入库,加载数据,数据预处理,分割数据集,训练模型,预测,评估,可视化,最后检查假设是否成立。可能还要讨论一下模型的系数,看看每个特征对目标变量的影响大小和方向。 在写代码示例的时候,需要注意正确导入库,处理数据,比如处理缺失值,可能需要用SimpleImputer填充,或者删除有缺失的样本。特征工程部分是否需要加入多项式特征?如果是线性回归基础的话可能不需要,但可以提到更高阶的方法。 最后,总结线性回归的优缺点,比如简单、可解释性强,但可能无法捕捉复杂关系。适用场景是当因变量和自变量之间存在线性或近似线性的关系时。</think>### 线性回归基础介绍 #### 一、核心概念 线性回归是**监督学习**中用于预测连续型变量的基础算法,核心是建立自变量(特征)$X$ 与因变量(目标值)$y$ 之间的线性关系。其数学表达式为: $$ y = w_1x_1 + w_2x_2 + \dots + w_nx_n + b $$ 其中: - $w_i$:特征权重(系数) - $b$:偏置项(截距) #### 二、核心步骤 1. **目标函数** 最小化预测值与真实值的**均方误差**(MSE): $$ \text{MSE} = \frac{1}{n}\sum_{i=1}^n (y_i - \hat{y}_i)^2 $$ 2. **求解方法** - **正规方程**:直接通过矩阵运算求解权重(适用于小数据集) $$ w = (X^T X)^{-1} X^T y $$ - **梯度下降**:迭代优化权重(适合大数据集) --- #### 三、Python实现(以加利福尼亚房价数据集为例) ##### 1. 导入库 ```python import numpy as np import pandas as pd from sklearn.datasets import fetch_california_housing from sklearn.linear_model import LinearRegression from sklearn.model_selection import train_test_split from sklearn.metrics import mean_squared_error, r2_score ``` ##### 2. 数据加载与预处理 ```python # 加载数据集 data = fetch_california_housing() X = data.data # 特征矩阵 (20640个样本 × 8个特征) y = data.target # 目标值 (房价中位数) # 分割数据集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) ``` ##### 3. 模型训练与预测 ```python # 创建模型 model = LinearRegression() # 训练模型 model.fit(X_train, y_train) # 预测 y_pred = model.predict(X_test) ``` ##### 4. 模型评估 ```python # 计算MSE和R²分数 mse = mean_squared_error(y_test, y_pred) r2 = r2_score(y_test, y_pred) print(f"MSE: {mse:.2f}, R²: {r2:.2f}") ``` ##### 5. 查看权重与截距 ```python print("权重:", model.coef_) # 每个特征的影响系数 print("截距:", model.intercept_) ``` --- #### 四、关键注意事项 1. **特征缩放** - 若使用梯度下降,建议通过`StandardScaler`标准化数据 2. **多重共线性** - 高度相关的特征会导致权重不稳定,可通过方差膨胀因子(VIF)检测 3. **假设检验** - 残差应满足正态性、独立性、同方差性(可通过QQ图、残差图诊断) --- #### 五、优缺点分析 | **优点** | **缺点** | |------------------------------|------------------------------| | 计算效率高,适合大数据集 | 无法捕捉非线性关系 | | 结果可解释性强(权重含义明确) | 对异常值敏感 | | 可作为复杂模型的基线模型 | 需严格满足统计假设 | --- #### 六、适用场景 - 房价预测、销售额预测等**连续值预测** - 分析特征与目标变量之间的**线性关系强度** - 作为其他算法(如正则化回归、神经网络)的基础组件 通过上述步骤,您可快速掌握线性回归的核心原理与Python实现方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值