ds,emotion_val,predict,topic
02/01,1.6666666666666667,0,zns
02/02,1.6666666666666667,0,zns
02/03,0.06666666666666667,0,zns
02/04,1.6666666666666667,0,zns
02/05,1.4,0,zns
02/06,0.9333333333333333,0,zns
02/07,0.6,0,zns
02/08,2.0,0,zns
02/09,1.4666666666666666,0,zns
02/10,1.2,0,zns
02/11,0.9333333333333333,0,zns
02/12,1.4,0,zns
02/13,1.2,0,zns
02/14,1.7333333333333334,0,zns
02/15,1.4666666666666666,0,zns
02/16,2.0,0,zns
02/17,1.4,0,zns
02/18,1.4666666666666666,0,zns
02/19,1.9333333333333333,0,zns
02/20,1.7333333333333334,0,zns
02/21,2.0,0,zns
02/22,1.0666666666666667,0,zns
02/23,1.7333333333333334,0,zns
02/24,1.4,0,zns
02/25,1.4,0,zns
02/26,1.6666666666666667,0,zns
02/27,1.0666666666666667,0,zns
02/28,1.6666666666666667,0,zns
02/29,2.0,0,zns
03/01,1.6666666666666667,0,zns
03/02,2.0,0,zns
03/03,1.4666666666666666,0,zns
03/04,1.7333333333333334,0,zns
03/05,1.7333333333333334,0,zns
03/06,1.7333333333333334,0,zns
03/07,1.9333333333333333,0,zns
03/08,1.6,0,zns
03/09,1.2,0,zns
03/10,1.4666666666666666,0,zns
03/11,1.9333333333333333,0,zns
03/12,1.7333333333333334,0,zns
03/13,1.6,0,zns
03/14,1.7333333333333334,0,zns
03/15,1.0666666666666667,0,zns
03/16,1.4,0,zns
03/17,1.4,0,zns
03/18,1.4,0,zns
03/19,0.6,0,zns
03/20,1.6666666666666667,0,zns
03/21,2.0,0,zns
03/22,1.2,0,zns
03/23,1.1333333333333333,0,zns
03/24,1.3333333333333333,0,zns
03/25,1.4666666666666666,0,zns
03/26,2.0,0,zns
03/27,1.7333333333333334,0,zns
03/28,0.8666666666666667,0,zns
03/29,2.0,0,zns
03/30,1.2666666666666666,0,zns
03/31,1.4666666666666666,0,zns
04/01,1.4666666666666666,0,zns
04/02,1.3333333333333333,0,zns
04/03,1.4666666666666666,0,zns
04/04,2.0,0,zns
04/05,1.7333333333333334,0,zns
04/06,2.0,0,zns
04/07,0.6666666666666666,0,zns
04/08,1.7333333333333334,0,zns
04/09,1.4666666666666666,0,zns
04/10,1.7333333333333334,0,zns
04/11,1.4,0,zns
04/12,1.4666666666666666,0,zns
04/13,1.7333333333333334,0,zns
04/14,1.7333333333333334,0,zns
04/15,0.6666666666666666,0,zns
04/16,0.5333333333333333,0,zns
04/17,2.0,0,zns
04/18,1.2,0,zns
04/19,1.4,0,zns
04/20,1.2,0,zns
04/21,2.0,0,zns
04/22,1.7333333333333334,0,zns
04/23,1.4666666666666666,0,zns
04/24,1.6666666666666667,0,zns
04/25,1.4,0,zns
04/26,1.4666666666666666,0,zns
04/27,2.0,0,zns
04/28,1.7333333333333334,0,zns
04/29,2.0,0,zns
04/30,1.4,0,zns
05/01,1.4,0,zns
05/02,2.0,0,zns
05/03,1.4666666666666666,0,zns
05/04,2.0,0,zns
05/05,2.0,0,zns
05/06,1.9333333333333333,0,zns
05/07,1.0666666666666667,0,zns
05/08,1.7333333333333334,0,zns
05/09,0.8,0,zns
05/10,1.7333333333333334,0,zns
05/11,0.6666666666666666,0,zns
05/12,2.0,0,zns
05/13,1.2,0,zns
05/14,0.6666666666666666,0,zns
05/15,2.0,0,zns
05/16,1.3333333333333333,0,zns
05/17,1.4666666666666666,0,zns
05/18,1.1333333333333333,0,zns
05/19,1.2,0,zns
05/20,1.6666666666666667,0,zns
05/21,0.8,0,zns
05/22,2.0,0,zns
05/23,1.8666666666666667,0,zns
05/24,1.4666666666666666,0,zns
05/25,1.4666666666666666,0,zns
05/26,2.0,0,zns
05/27,1.4666666666666666,0,zns
05/28,1.6666666666666667,0,zns
05/29,1.4666666666666666,0,zns
05/30,2.0,0,zns
05/31,2.0,0,zns
数据展示
import numpy as np
import matplotlib.pyplot as plt
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from keras.layers import Dropout
import pandas as pd
import os
from keras.models import Sequential, load_model
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_squared_error
# 将整型变为float
dataframe = pd.read_csv('dataraw1.csv', usecols=[2], engine='python')
dataset = dataframe.values
dataset = dataset.astype('float32')
# 归一化 在下一步会讲解
scaler = MinMaxScaler(feature_range=(0, 1))
dataset = scaler.fit_transform(dataset)
train_size = int(len(dataset) * 0.65)
trainlist = dataset[:train_size]
testlist = dataset[train_size:]
def create_dataset(dataset, timesteps=36, predict_size=6): # 构造数据集
datax = [] # 构造x
datay = [] # 构造y
for each in range(len(dataset) - timesteps - predict_steps):
x = dataset[each:each + timesteps, 0]
y = dataset[each + timesteps:each + timesteps + predict_steps, 0]
datax.append(x)
datay.append(y)
return np.array(datax), np.array(datay)
timesteps = 9
predict_steps = 10
trainX, trainY = create_dataset(trainlist, timesteps, predict_steps)
testX, testY = create_dataset(testlist, timesteps, predict_steps)
trainX = np.reshape(trainX, (trainX.shape[0], trainX.shape[1], 1))
testX = np.reshape(testX, (testX.shape[0], testX.shape[1], 1))
# create and fit the LSTM network
model = Sequential()
model.add(Bidirectional(LSTM(128, input_shape=(timesteps, 1), return_sequences=True)))
model.add(Dropout(0.5))
model.add(Bidirectional(LSTM(128, return_sequences=True)))
model.add(Bidirectional(LSTM(64, return_sequences=False)))
model.add(Dense(predict_steps))
model.compile(loss="mean_squared_error", optimizer="adam")
model.fit(trainX, trainY, epochs=1000, batch_size=10)
model.save(os.path.join("DATA", "Test" + ".h5"))
# make predictions
predict_xlist = []
predict_y = [] # 添加预测y列表
predict_xlist.extend(dataset[dataset.shape[0] - timesteps:dataset.shape[0], 0].tolist())
while len(predict_y) < 30:
predictx = np.array(predict_xlist[
-timesteps:]) # 从最新的predict_xlist取出timesteps个数据,预测新的predict_steps个数据(因为每次预测的y会添加到predict_xlist列表中,为了预测将来的值,所以每次构造的x要取这个列表中最后的timesteps个数据词啊性)
predictx = np.reshape(predictx, (1, timesteps, 1)) # 变换格式,适应LSTM模型
lstm_predict = model.predict(predictx)
predict_xlist.extend(lstm_predict[0]) # 将新预测出来的predict_steps个数据,加入predict_xlist列表,用于下次预测
# invert
lstm_predict = scaler.inverse_transform(lstm_predict)
predict_y.extend(lstm_predict[0])
l = predict_y
y_ture = np.array(dataset[-30:])
train_score = np.sqrt(mean_squared_error(y_ture, predict_y))
print("train score RMSE: %.2f" % train_score)
dataframe1 = pd.read_csv('dataraw.csv', usecols=[0])
dfd = dataframe1.values
topic = []
date = dfd[-1][0]
date1 = []
pre = []
pla = []
tes = []
testPredict = predict_y
for jk in range(0, len(testPredict)):
tes.append(testPredict[jk])
if jk < 9 :
date1.append('6/0'+str(jk + 1))
else:
date1.append('6/' + str(jk + 1))
topic.append('trump')
pre.append('1')
pla.append('1')
data = {
'ds': date1,
'emotion_val': tes,
'topic': topic,
'predict': pre
}
df = pd.DataFrame(data)
df.to_csv('Result.csv', index=False)
dataframe11 = pd.read_csv('result5.csv', usecols=[2], engine='python')
dataset11 = dataframe11.values
dataset11 = dataset11.astype('float32')
kk = dataset11.tolist()
kk = kk[:len(l)]
zz = []
for i in range(len(l)):
zz.append(kk[i][0])
plt.plot(l)
plt.plot(dataset11)
plt.show()
data111 = pd.DataFrame({
'Result':l,
'Target': zz
})
corr = data111.corr()
print(corr)
kl = np.sqrt(mean_squared_error(l,zz))
print('mean_squared_error:'+str(kl))
双向LSTM尝试
结果不如普通的LSTM