数据集不同阶数拟合曲线对比及代码报错解决求助
问题修复与解决方案
错误原因
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}")
关键说明
偏差与方差的正确计算:
- 偏差平方:衡量预测值均值与真实值的偏离程度,公式为
E[(y - E[y_pred])²],对应代码中的np.mean((y - np.mean(y_predict)) ** 2)。 - 方差:衡量预测值之间的离散程度,公式为
Var(y_pred),对应np.var(y_predict)。 - 理论上,MSE = 偏差平方 + 方差 + 噪声方差,三者数值会大致符合该关系。
- 偏差平方:衡量预测值均值与真实值的偏离程度,公式为
绘图优化:
- 使用
X_plot生成更密集的X值,让拟合曲线更平滑,避免仅用原始数据点绘制导致的折线效果。
- 使用
内容的提问来源于stack exchange,提问作者FZL
相关产品推荐
相关产品推荐

