废话不多说,直接放我这次期末大作业内容。zgpa_train.csv中存放着训练数据, zgpa_test.csv为测试数据,根据训练数据预测测试数据中未来的开盘价,收盘价,最高价,最低价及成交量。
算法要求:要求至少使用一种机器学习算法。
什么LSTM(当时模型误差训练出来只有5%的错误率,确实不错了)RNN,我在写的时候,直接炸裂,根本不会啊!直接上最基础的线性回归算法,对训练集和测试集的数据进行比较,嘿嘿嘿,主打的就是一个快速解决期末大作业!(实际上花了很久很久时间!)
先讲一下思路:使用pandas库读取训练集和测试集的数据,并对空值进行处理。接下来,合并了训练集和测试集的数据,并将日期列转换为日期时间类型,并按日期排序。然后,使用matplotlib.pyplot库绘制了每列数据关于日期的折线图,分别展示了开盘价、最高价、最低价、收盘价和成交量。接着,提取了训练集和测试集的特征和目标变量,并创建了一个线性回归模型。使用训练集数据对模型进行训练,并在测试集上进行预测。然后,计算了预测结果的均方误差(MSE)、平均绝对误差(MAE)和判定系数(R2)。接下来,生成了预测结果文件,并保存为CSV格式。最后,我用matplotlib.pyplot库绘制了预测结果与测试集数据的对比折线图,分别展示了开盘价、最高价、最低价、收盘价和成交量。这些做题思路涵盖了数据清洗、特征提取、模型训练和预测、性能评估以及结果可视化等关键步骤。
数据处理细节:
1.处理空值:在代码中,我使用了dropna()函数来删除包含空值的行。这样可以确保数据集中不包含空值。
train_data = train_data.dropna()
test_data = test_data.dropna()
2.合并数据集:我使用了concat()函数来合并训练集和测试集的数据,并将结果存储在all_data变量中。
all_data = pd.concat([train_data, test_data])
3.转换日期列:使用pd.to_datetime()函数将日期列转换为日期时间类型。这将确保日期以正确的格式进行排序和显示。
all_data['date'] = pd.to_datetime(all_data['date'])
4.排序数据:使用sort_values()函数按日期对数据进行排序,以确保数据按照日期的顺序进行绘制和处理。
all_data = all_data.sort_values(by='date')
淋过的雨,我将为你撑伞!
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
# 读取训练集和测试集数据
train_data = pd.read_csv('zgpa_train.csv')
test_data = pd.read_csv('zgpa_test.csv')
# 处理空值
train_data = train_data.dropna()
test_data = test_data.dropna()
# 合并训练集和测试集数据
all_data = pd.concat([train_data, test_data])
# 将日期列转换为日期时间类型
all_data['date'] = pd.to_datetime(all_data['date'])
# 按日期排序数据
all_data = all_data.sort_values(by='date')
# 获取数据列名称
columns = ['open', 'high', 'low', 'close', 'volume']
# 逐列生成折线图
for column in columns:
plt.figure() # 创建新的图表
plt.plot(all_data['date'], all_data[column]) # 绘制折线图
# 设置图例和标题
plt.legend([column.capitalize()])
plt.title('Stock Data: {}'.format(column.capitalize()))
plt.xlabel('Date')
plt.ylabel('Value')
# 显示图形
plt.show()
# 提取特征和目标变量
train_features = train_data[['open', 'high', 'low', 'volume']]
train_target = train_data['close']
test_features = test_data[['open', 'high', 'low', 'volume']]
test_target = test_data['close']
# 创建线性回归模型
model = LinearRegression()
# 在训练集上训练模型
model.fit(train_features, train_target)
# 在测试集上进行预测
predictions = model.predict(test_features)
# 计算均方误差
mse = mean_squared_error(test_target, predictions)
print('均方误差(MSE):{:.2f}'.format(mse))
# 计算平均绝对误差
mae = mean_absolute_error(test_target, predictions)
print('平均绝对误差(MAE):{:.2f}'.format(mae))
# 计算判定系数
r2 = r2_score(test_target, predictions)
print('判定系数(R2):{:.2f}'.format(r2))
# 生成预测结果文件
result_df = pd.DataFrame({'date': test_data['date'],
'open': ['{:.2f}'.format(x) for x in predictions],
'high': ['{:.2f}'.format(x) for x in predictions],
'low': ['{:.2f}'.format(x) for x in predictions],
'close': ['{:.2f}'.format(x) for x in predictions],
'volume': ['{:.0f}'.format(x) for x in test_data['volume']]})
result_df.to_csv('项目一submitDHC.csv', index=False)
# 读取测试集数据
test_data = pd.read_csv('zgpa_test.csv')
# 将日期列转换为日期时间类型
test_data['date'] = pd.to_datetime(test_data['date'])
# 按日期排序测试集数据
test_data = test_data.sort_values(by='date')
# 读取预测结果数据
prediction_data = pd.read_csv('大作业submitDHC.csv')
# 将日期列转换为日期时间类型
prediction_data['date'] = pd.to_datetime(prediction_data['date'])
# 按日期排序预测结果数据
prediction_data = prediction_data.sort_values(by='date')
# 获取数据列名称
columns = ['open', 'high', 'low', 'close', 'volume']
# 绘制折线图
for column in columns:
plt.figure() # 创建新的图表
# 绘制测试集数据折线图
plt.plot(test_data['date'], test_data[column], label='Test Data')
# 绘制预测结果数据折线图
plt.plot(prediction_data['date'], prediction_data[column], label='Prediction')
# 设置图例和标题
plt.legend()
plt.title('Comparison: {} - Test Data vs Prediction'.format(column.capitalize()))
plt.xlabel('Date')
plt.ylabel('Value')
# 显示图形
plt.show()