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

数据集不同阶数拟合曲线对比及代码报错解决求助

问题修复与解决方案

错误原因

scikit-learn的线性模型(包括Pipeline中的LinearRegression)要求输入的特征矩阵X必须是二维数组(形状为(样本数, 特征数)),但你的X是一维数组(形状为(40,)),不符合模型输入规范,因此触发ValueError。

核心修复步骤

将一维的X转换为二维数组,根据数据类型选择对应方式:

  • 若X是numpy数组:执行X = X.reshape(-1, 1),-1会自动匹配样本数,最终得到(40,1)的二维结构。
  • 若X是pandas Series:执行X = X.to_frame(),直接转为单列DataFrame(天然二维结构)。

完整优化代码

以下是修复后并补充绘图功能的完整代码,同时修正了偏差的计算逻辑(原代码偏差计算有误):

import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.pipeline import Pipeline
from sklearn.metrics import mean_squared_error

# 替换为你的真实数据集,此处为模拟示例
np.random.seed(42)
X = np.linspace(0, 10, 40)
y = 2*X**3 - 5*X**2 + 3*X + np.random.normal(0, 50, 40)

# 修复X为二维数组
X = X.reshape(-1, 1)

error_list = []
bias_squared_list = []
variance_list = []
degrees = range(1, 5)

# 生成平滑绘图用的连续X值
X_plot = np.linspace(X.min(), X.max(), 100).reshape(-1, 1)

plt.figure(figsize=(12, 8))
for idx, degree in enumerate(degrees):
    # 构建多项式回归管道
    polynomial_regression = Pipeline([
        ("poly_features", PolynomialFeatures(degree=degree, include_bias=False)),
        ("lin_regressor", LinearRegression())
    ])
    
    polynomial_regression.fit(X, y)
    y_predict = polynomial_regression.predict(X)
    y_plot = polynomial_regression.predict(X_plot)
    
    # 计算MSE
    mse = mean_squared_error(y, y_predict)
    error_list.append(mse)
    
    # 计算偏差平方:E[(y - E[y_pred])²]
    bias_squared = np.mean((y - np.mean(y_predict)) ** 2)
    bias_squared_list.append(bias_squared)
    
    # 计算方差:Var(y_pred)
    variance = np.var(y_predict)
    variance_list.append(variance)
    
    # 绘制拟合曲线
    plt.subplot(2, 2, idx+1)
    plt.scatter(X, y, label='原始数据', alpha=0.6)
    plt.plot(X_plot, y_plot, color='red', label=f'{degree}阶拟合')
    plt.title(f'{degree}阶多项式拟合')
    plt.xlabel('X')
    plt.ylabel('y')
    plt.legend()

plt.tight_layout()
plt.show()

# 输出各阶数的评估指标
print("阶数 | MSE | 偏差平方 | 方差")
print("-----------------------------")
for degree, mse, bs, var in zip(degrees, error_list, bias_squared_list, variance_list):
    print(f"{degree:^4d} | {mse:.2f} | {bs:.2f} | {var:.2f}")

关键说明

  1. 偏差与方差的正确计算:

    • 偏差平方:衡量预测值均值与真实值的偏离程度,公式为E[(y - E[y_pred])²],对应代码中的np.mean((y - np.mean(y_predict)) ** 2)。
    • 方差:衡量预测值之间的离散程度,公式为Var(y_pred),对应np.var(y_predict)。
    • 理论上,MSE = 偏差平方 + 方差 + 噪声方差,三者数值会大致符合该关系。
  2. 绘图优化:

    • 使用X_plot生成更密集的X值,让拟合曲线更平滑,避免仅用原始数据点绘制导致的折线效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 22:55:16