基于sklearn执行线性回归遇TypeError,求问题排查及绘图实现
问题分析与解决方案
错误类型判断
这个问题同时包含语法使用错误和逻辑错误:
- 语法错误:
pd.concat()要求第一个参数是可迭代的pandas对象(比如列表),你直接传入两个Series,触发TypeError。 - 逻辑错误:
- sklearn的
LinearRegression.fit()要求输入的特征矩阵X是二维结构(n行n列),你传入的是一维Series,不符合模型输入规范。 - 拼接失业率和通胀率的方式破坏了数据对应关系——原数据中同一行的利率、失业率、通胀率属于同时间点,拼接后会把失业率全放在前、通胀率全放在后,和X的索引完全不匹配。
- 代码里的ylabel写的是“Natural Gas Opening Price”,但实际y是失业率和通胀率,属于变量对应错误。
X.dropna(axis=0)没有赋值回原变量,等于没处理缺失值。
- sklearn的
修正后的代码
import pandas as pd import matplotlib.pyplot as plt from sklearn.linear_model import LinearRegression from sklearn.impute import SimpleImputer # 加载数据 df1 = pd.read_csv('index.csv', sep=',') # 定义特征X(二维DataFrame)和目标变量y(保持同索引的多列) X = df1[["Effective Federal Funds Rate"]] y = df1[["Unemployment Rate", "Inflation Rate"]] # 用均值填充缺失值,避免丢失过多样本 imputer = SimpleImputer(strategy='mean') X_imputed = imputer.fit_transform(X) y_imputed = imputer.transform(y) # 训练多输出线性回归模型 model = LinearRegression() model.fit(X_imputed, y_imputed) # 输出模型参数 print('系数矩阵(对应失业率、通胀率): ', model.coef_) print('截距项(对应失业率、通胀率): ', model.intercept_) r_squared = model.score(X_imputed, y_imputed) print('R²值: ', r_squared) # 生成变量关系子图 fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5)) # 失业率 vs 联邦基金利率 ax1.scatter(X, y["Unemployment Rate"], alpha=0.5, label='实际数据') ax1.plot(X, model.predict(X_imputed)[:, 0], color='red', label='回归拟合线') ax1.set_xlabel('Effective Federal Funds Rate') ax1.set_ylabel('Unemployment Rate') ax1.set_title('失业率 vs 联邦基金利率') ax1.legend() # 通胀率 vs 联邦基金利率 ax2.scatter(X, y["Inflation Rate"], alpha=0.5, label='实际数据', color='green') ax2.plot(X, model.predict(X_imputed)[:, 1], color='red', label='回归拟合线') ax2.set_xlabel('Effective Federal Funds Rate') ax2.set_ylabel('Inflation Rate') ax2.set_title('通胀率 vs 联邦基金利率') ax2.legend() plt.tight_layout() plt.show()
关键修正点说明
- 修正数据拼接错误:直接从原DataFrame选取多列作为y,保留了数据的时间对应关系,避免索引混乱。
- 调整特征结构:用
df[["列名"]]返回二维DataFrame,符合sklearn模型的输入要求。 - 正确处理缺失值:使用
SimpleImputer填充缺失值,确保模型训练用的是完整数据集。 - 适配多输出回归:sklearn的
LinearRegression天然支持多目标变量回归,直接传入多列y即可,输出的系数矩阵对应每个目标变量的特征系数。 - 图表优化:用子图分别展示两个目标变量与特征的关系,修正标签和标题,让变量关系更直观。
内容的提问来源于stack exchange,提问作者Mario
相关产品推荐
相关产品推荐

