You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何绘制多项式回归曲线?Python实现遇阻求助

解决多项式回归曲线绘制问题

核心问题分析

  1. 数据加载错误:直接把URL赋值给data再转DataFrame的方式无效,必须用pd.read_csv加载数据集的具体文件。
  2. 缺失回归曲线绘制逻辑:当前代码仅在绘制不同多项式阶数、Lasso alpha下的训练/测试误差散点,完全没有生成并绘制回归曲线的相关代码。
  3. 绘图逻辑混乱:两种模型的误差点堆在同一张图里,不利于观察,回归曲线和误差分析应分开展示。

修正后的完整可运行代码

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

# 1. 正确加载数据集
url = "https://archive.ics.uci.edu/ml/machine-learning-databases/blood-transfusion/transfusion.data"
df = pd.read_csv(url)

# 2. 提取特征和目标变量(保留你原代码的列选择逻辑)
x = df.iloc[:, 2:3].values  # 转为numpy数组方便后续处理
y = df.iloc[:, -1].values

# 3. 划分训练集和测试集
x_train = x[:-20]
x_test = x[-20:]
y_train = y[:-20]
y_test = y[-20:]

# --------------------------
# 第一部分:绘制多项式回归曲线(选典型阶数对比展示)
# --------------------------
plt.figure(figsize=(12, 8))

# 生成连续排序的x值,保证回归曲线平滑不混乱
x_plot = np.linspace(x.min(), x.max(), 100).reshape(-1, 1)

degrees = [1, 3, 5, 7]
colors = ['blue', 'green', 'orange', 'red']

for idx, degree in enumerate(degrees):
    # 多项式特征转换
    poly_regr = PolynomialFeatures(degree=degree)
    x_train_poly = poly_regr.fit_transform(x_train)
    x_plot_poly = poly_regr.transform(x_plot)  # 用transform避免数据泄露
    
    # 训练模型
    clf = LinearRegression()
    clf.fit(x_train_poly, y_train)
    
    # 预测绘图用的x值
    y_plot_pred = clf.predict(x_plot_poly)
    
    # 绘制回归曲线和原始数据点
    plt.scatter(x_train, y_train, color='gray', alpha=0.5, label='训练数据点' if idx==0 else "")
    plt.plot(x_plot, y_plot_pred, color=colors[idx], linewidth=2, label=f'多项式阶数 {degree}')

plt.xlabel(df.columns[2])  # 显示特征列名
plt.ylabel(df.columns[-1])  # 显示目标列名
plt.title('多项式回归曲线对比')
plt.legend()
plt.grid(True)
plt.show()

# --------------------------
# 第二部分:多项式回归阶数与误差关系(折线图更直观)
# --------------------------
plt.figure(figsize=(10, 6))
train_errors = []
test_errors = []

for i in range(1, 11):
    poly_regr = PolynomialFeatures(degree=i)
    x_train_poly = poly_regr.fit_transform(x_train)
    x_test_poly = poly_regr.transform(x_test)
    
    clf = LinearRegression()
    clf.fit(x_train_poly, y_train)
    
    train_pred = clf.predict(x_train_poly)
    test_pred = clf.predict(x_test_poly)
    
    train_errors.append(mean_squared_error(y_train, train_pred))
    test_errors.append(mean_squared_error(y_test, test_pred))

plt.plot(range(1,11), train_errors, color='green', marker='o', label='训练MSE')
plt.plot(range(1,11), test_errors, color='black', marker='s', label='测试MSE')
plt.xlabel('多项式阶数')
plt.ylabel('均方误差(MSE)')
plt.title('多项式回归阶数与误差关系')
plt.legend()
plt.grid(True)
plt.show()

# --------------------------
# 第三部分:Lasso回归Alpha值与误差关系
# --------------------------
plt.figure(figsize=(10, 6))
lasso_train_errors = []
lasso_test_errors = []

for i in range(1, 11):
    clf = Lasso(alpha=i)
    clf.fit(x_train, y_train)
    
    train_pred = clf.predict(x_train)
    test_pred = clf.predict(x_test)
    
    lasso_train_errors.append(mean_squared_error(y_train, train_pred))
    lasso_test_errors.append(mean_squared_error(y_test, test_pred))

plt.plot(range(1,11), lasso_train_errors, color='red', marker='o', label='训练MSE')
plt.plot(range(1,11), lasso_test_errors, color='brown', marker='s', label='测试MSE')
plt.xlabel('Lasso Alpha值')
plt.ylabel('均方误差(MSE)')
plt.title('Lasso回归Alpha与误差关系')
plt.legend()
plt.grid(True)
plt.show()

关键修改说明

  • 数据加载:用pd.read_csv直接读取数据集URL,解决原代码无法加载数据的问题。
  • 回归曲线绘制:生成x_plot连续排序的x值,避免曲线乱序;用transform而非fit_transform处理绘图数据,防止数据泄露。
  • 误差可视化优化:将散点改为折线图,更清晰展示误差随参数变化的趋势。
  • 绘图拆分:把回归曲线、多项式误差、Lasso误差分成三个独立图表,避免视觉混乱。

内容的提问来源于stack exchange,提问作者iamanewbiecoder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 07:01:11