实现线性回归模型时遇ValueError:股价数据维度不匹配
线性回归模型实现时的ValueError问题
报错信息
Shape of passed values is (13, 1), indices imply (22, 1)
问题背景
刚接触Python统计分析和机器学习基础,在实现基于SPY收盘价的线性回归模型时遇到上述报错,调整数据范围后仍未解决。
相关代码
# sklearn for importing regression model from sklearn.linear_model import LinearRegression # pandas and numpy are used for data manipulation import pandas as pd import numpy as np # matplotlib and seaborn are used for plotting graphs import matplotlib.pyplot as plt import seaborn # yfinance is used to fetch data import yfinance as yf # get S&P500 ticker stock_data = yf.download('SPY','2021-06-23','2022-11-23') # Only keep close columns stock_data = stock_data[['Close']] # Drop rows with missing values stock_data = stock_data.dropna() # Plot the closing price stock_data.Close.plot(figsize=(10,5)) plt.ylabel("SPY Prices") plt.show() # 3-day and 9-day moving average stock_data['S_3'] = stock_data['Close'].shift(1).rolling(window=3).mean() stock_data['S_9']= stock_data['Close'].shift(1).rolling(window=9).mean() stock_data= stock_data.dropna() # Explanatory Variables X = stock_data[['S_3','S_9']] X.head() # Dependent Variable y = stock_data['Close'] y.head() t=.8 t = int(t*len(stock_data)) # Train dataset X_train = X[:t] y_train = y[:t] # Test dataset X_test = X[t:] y_test = y[t:] linear = LinearRegression().fit(X_train,y_train) predicted_price = linear.predict(X_test) predicted_price = pd.DataFrame(predicted_price, index=y_test.index, columns = ['price']) predicted_price.plot(figsize=(10,5)) y_test.plot() plt.legend(['predicted_price','actual_price']) plt.ylabel("SPY Price") plt.show()
问题分析与解决
核心原因
报错本质是预测结果数组长度与指定的索引长度不匹配。用y_test.index作为predicted_price的索引时,linear.predict(X_test)返回的结果行数和y_test的行数不一致。
导致该问题的常见诱因:
- 股票数据存在节假日休市情况,日期索引不连续,基于索引切片时容易出现隐形的长度偏差
- 移动平均、缺失值删除操作后,索引连续性被破坏,直接用
X[t:]和y[t:]划分数据集,可能因索引错位导致两者长度不一致
解决步骤
1. 改用位置索引划分数据集
避免日期索引干扰,用iloc按位置切片,确保训练集、测试集的特征和目标变量长度完全匹配:
# 替换原数据集划分代码 t = int(0.8 * len(stock_data)) X_train = X.iloc[:t] y_train = y.iloc[:t] X_test = X.iloc[t:] y_test = y.iloc[t:]
2. 验证数据长度一致性
在预测前先确认X_test和y_test的长度,排查是否存在偏差:
print(len(X_test), len(y_test))
若输出的两个数值相等,再执行预测和后续操作。
3. 可选:重置连续索引
如果索引混乱问题频繁出现,可以重置数据集的索引为连续整数,彻底避免索引错位:
# 在删除缺失值后添加该行代码 stock_data = stock_data.reset_index(drop=True)
修正后完整代码
from sklearn.linear_model import LinearRegression import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn import yfinance as yf # 获取并清理基础数据 stock_data = yf.download('SPY','2021-06-23','2022-11-23') stock_data = stock_data[['Close']].dropna() # 绘制收盘价走势 stock_data.Close.plot(figsize=(10,5)) plt.ylabel("SPY Prices") plt.show() # 计算移动平均并清理缺失值 stock_data['S_3'] = stock_data['Close'].shift(1).rolling(window=3).mean() stock_data['S_9']= stock_data['Close'].shift(1).rolling(window=9).mean() stock_data= stock_data.dropna() # 重置索引(可选) stock_data = stock_data.reset_index(drop=True) # 划分特征与目标变量 X = stock_data[['S_3','S_9']] y = stock_data['Close'] # 按位置划分训练集、测试集 t = int(0.8 * len(stock_data)) X_train = X.iloc[:t] y_train = y.iloc[:t] X_test = X.iloc[t:] y_test = y.iloc[t:] # 训练模型并生成预测结果 linear = LinearRegression().fit(X_train,y_train) predicted_price = linear.predict(X_test) # 格式化预测结果并绘图对比 predicted_price = pd.DataFrame(predicted_price, index=y_test.index, columns=['price']) predicted_price.plot(figsize=(10,5)) y_test.plot() plt.legend(['predicted_price','actual_price']) plt.ylabel("SPY Price") plt.show()
内容的提问来源于stack exchange,提问作者Tayrohn Jackson
相关产品推荐
相关产品推荐

