Sklearn多项式回归Pipeline绘制散点图时特征名称匹配错误排查
问题排查与修正方案
代码中的核心问题
循环语法与参数传递错误
循环语句for feature in X.columns末尾缺少冒号,且调用绘图函数时错误传入固定字符串'feature'而非循环变量feature,导致每次都尝试使用不存在的特征名,直接触发特征名不匹配报错。特征列顺序不匹配
构造X_plot时用字典生成DataFrame,旧版本Python中字典键顺序不固定,而Sklearn的StandardScaler拟合时会记录训练数据的特征顺序和名称,若新数据列顺序不一致,就会触发特征名不匹配错误。手动调用步骤的冗余与风险
单独调用scaler.transform、poly.transform再预测的方式冗余且容易出错,直接使用训练好的Pipeline整体预测能避免这类问题。
修正后的完整代码
import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.pipeline import Pipeline from sklearn.linear_model import LinearRegression from sklearn.preprocessing import PolynomialFeatures, StandardScaler # 假设df是已加载的数据集 sel = ['input1', 'input2', 'input3'] df_X = df[sel] df_Y = df['output'] y = df_Y X = df_X # 构建Pipeline pipeline = Pipeline([ ('scaler', StandardScaler()), ('poly', PolynomialFeatures(degree=2, interaction_only=False, include_bias=False)), ('regressor', LinearRegression(fit_intercept=True)) ]) pipeline.fit(X, y) # 绘图函数修正 def plot_with_trendline(X, y, feature_name): plt.figure(figsize=(8, 6)) # 获取原始特征列顺序 all_features = X.columns.tolist() # 计算原始数据中其他特征的均值 mean_values = X.mean() # 生成当前特征的取值范围 feature_values = np.linspace(X[feature_name].min(), X[feature_name].max(), 100) # 构造预测用DataFrame,严格保持原始特征顺序 X_plot = pd.DataFrame({col: [mean_values[col]]*100 for col in all_features}) X_plot[feature_name] = feature_values # 直接用Pipeline整体预测 y_trendline = pipeline.predict(X_plot) # 绘图 plt.scatter(X[feature_name], y, color='blue', label='数据点') plt.plot(feature_values, y_trendline, color='red', label='趋势线', linewidth=2) plt.xlabel(feature_name) plt.ylabel('目标变量') plt.title(f'{feature_name} 与目标变量的散点图') plt.legend() plt.grid() plt.show() # 循环绘制每个特征的图 for feature in X.columns: plot_with_trendline(X, y, feature)
关键修改说明
- 修复循环语法错误,正确传递循环变量
feature给绘图函数。 - 构造
X_plot时先按原始特征顺序生成均值填充的DataFrame,再替换当前特征取值,确保列顺序与训练数据完全一致,解决特征名/顺序不匹配问题。 - 用
pipeline.predict(X_plot)替代手动调用各步骤transform,简化代码同时避免步骤间格式错误。 - 补充必要的导入语句,确保代码可直接运行。
内容的提问来源于stack exchange,提问作者Filip
相关产品推荐
相关产品推荐

