如何绘制多项式回归曲线?Python实现遇阻求助
解决多项式回归曲线绘制问题
核心问题分析
- 数据加载错误:直接把URL赋值给
data再转DataFrame的方式无效,必须用pd.read_csv加载数据集的具体文件。 - 缺失回归曲线绘制逻辑:当前代码仅在绘制不同多项式阶数、Lasso alpha下的训练/测试误差散点,完全没有生成并绘制回归曲线的相关代码。
- 绘图逻辑混乱:两种模型的误差点堆在同一张图里,不利于观察,回归曲线和误差分析应分开展示。
修正后的完整可运行代码
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
相关产品推荐
相关产品推荐

