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

Sklearn多项式回归Pipeline绘制散点图时特征名称匹配错误排查

问题排查与修正方案

代码中的核心问题

  1. 循环语法与参数传递错误
    循环语句for feature in X.columns末尾缺少冒号,且调用绘图函数时错误传入固定字符串'feature'而非循环变量feature,导致每次都尝试使用不存在的特征名,直接触发特征名不匹配报错。

  2. 特征列顺序不匹配
    构造X_plot时用字典生成DataFrame,旧版本Python中字典键顺序不固定,而Sklearn的StandardScaler拟合时会记录训练数据的特征顺序和名称,若新数据列顺序不一致,就会触发特征名不匹配错误。

  3. 手动调用步骤的冗余与风险
    单独调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 11:23:18