新手深度学习,Keras BP神经网络;MySQL数据源训练、测试集;模型保存到Redis、
from sklearn.metrics import r2_score
r2_score验证准确度
但是为负数,求大佬指教!谢谢
import keras
from keras.models import Sequential
from keras.layers import Dense, Flatten, Activation,Dropout
from keras.models import Model
from keras.callbacks import ModelCheckpoint,Callback
import numpy as np
import matplotlib.pyplot as plt
from keras import initializers
from keras.optimizers import Adam
import pandas as pd
from sqlalchemy import create_engine
from numpy import arange
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
# 初始化数据库连接,使用pymysql模块
# MySQL的用户:root, 密码:123456, 端口:3306,数据库:test
engine = create_engine('mysql+pymysql://root:123456@hadoop01:3306/nufront-nt')
# 查询语句,选出employee表中的所有数据
sql = ''' select * from mymlp_sport ; '''
# read_sql_query的两个参数: sql语句, 数据库连接
df = pd.read_sql_query(sql, engine)
# 输出employee表的查询结果
# pandas dataFrame转list
data = np.array(df.values.tolist())
# # print(data)
# guiyidata_1 = maxminnorm(data)
test_data = data[13:]
# # print("data", data)
# # print("guiyidata", guiyidata)
# # test_data = data[13:]
# x_test_data = test_data[:,0:8]
# guiyidata_2 = maxminnorm(data[:13])
# # print("testData", x_test_data)
# print(guiyidata_2)
################################
# 数据准备
###############################
train_data = data[:8]
valid_data = data[9:13]
x_train_data = sc.fit_transform(train_data[:, 0:8])
y_train_data = train_data[:, 8:9]
x_valid_data = sc.fit_transform(valid_data[:, 0:8])
y_valid_data = valid_data[:, 8:9]
print("x_train_data", x_train_data)
print("y_train_data", y_train_data)
print("x_valid_data", x_valid_data)
print("y_valid_data", y_valid_data)
# 归一化、、、
################################
# 创建模型
###############################
print(x_train_data.shape)
BATCH_SIZE = len(x_train_data)
EPOCHS = 200
model = Sequential()
# 输入层64个特征(具体需要再确认)、激活函数relu、维度784
model.add(Dense(8, input_shape=(8,),activation='relu', kernel_initializer='random_uniform',bias_initializer='random_uniform'))
#model.add(Dropout(0.5))
# # 一层隐含层,隐含层元素个数待定
model.add(Dense(units=10, activation='relu'))
#model.add(Dropout(0.2))
# # 输出层,暂定2个
model.add(Dense(units=1))
# 交叉熵损失函数、adam优化器、
model.compile(loss='mse', optimizer=Adam(lr=0.009))
# 模型结构
model.summary()
################################
# 模型训练
###############################
# remote = callbacks.RemoteMonitor(root='http://localhost:9000')
H = model.fit(x_train_data, y_train_data, batch_size=BATCH_SIZE,epochs=EPOCHS,validation_data=(x_valid_data, y_valid_data), shuffle=True, verbose=1)
# score = model.evaluate(samples, labels, batch_size=32, verbose=1)
# print('Test score:', score[0])
# print('Test accuracy:', score[1])
################################
# sklearn 准确率
###############################
from sklearn.metrics import r2_score
a = model.predict(x_valid_data)
pred_acc = r2_score(y_valid_data, a)
print('pred_acc',pred_acc)
N = np.arange(0, EPOCHS)
plt.style.use("ggplot")
plt.figure()
plt.plot(N, H.history["loss"], label="train_loss")
plt.plot(N, H.history["val_loss"], label="val_loss")
# plt.plot(N, H.history["mean_squared_error"], label="mean_squared_error")
# plt.plot(N, H.history["val_mean_squared_error"], label="val_mean_squared_error")
plt.title("Training Loss and Accuracy")
plt.xlabel("Epoch #")
plt.ylabel("Loss/Accuracy")
plt.legend()
#plt.savefig(args["plot"])
# ################################
# # 模型保存至Redis
# ###############################
# from redis import StrictRedis
# import pickle
# redis = StrictRedis(host='hadoop01', port=6379, db=1, password='123456')
# ################################
# # 多次训练已准确度作为考量、保存最优模型
# ###############################
# if not redis.get("sport_MLP_Net_acc"):
# redis.set("sport_MLP_Net", model.to_json())
# redis.set("sport_MLP_Net_weights", pickle.dumps(model.get_weights(), protocol=pickle.HIGHEST_PROTOCOL))
# redis.set("sport_MLP_Net_acc", np.float(pred_acc))
# print("Redis模型初始化保存...")
# else:
# if np.float(pred_acc) > float( redis.get("sport_MLP_Net_acc")):
# redis.set("sport_MLP_Net", model.to_json())
# redis.set("sport_MLP_Net_weights", pickle.dumps(model.get_weights(), protocol=pickle.HIGHEST_PROTOCOL))
# redis.set("sport_MLP_Net_acc", np.float(pred_acc))
# print("Redis模型已替换更新...")
# else:
# print("本次训练Redis模型未更新")
[[ 3.2 9.6 3.45 2.15 140. 2.8 11. 5. 2.24 2.24]
[ 3.2 10.3 3.75 2.2 120. 3.4 10.9 70. 2.33 2.33]
[ 3.2 10.3 3.65 2.2 150. 2.8 10.8 80. 2.32 2.32]
[ 3.2 10.1 3.5 2. 80. 1.5 11.3 50. 2.2 2.2 ]
[ 3.4 10. 3.4 2.15 130. 3.2 11.5 60. 2.27 2.27]
[ 3.2 9.6 3.55 2.1 130. 3.5 11.8 65. 2.2 2.2 ]
[ 3. 9. 3.5 2.1 100. 1.8 11.3 40. 2.26 2.26]
[ 3.2 9.6 3.55 2.1 130. 3.5 11.8 65. 2.2 2.2 ]
[ 3.2 9.2 3.5 2.1 140. 2.5 11. 50. 2.24 2.24]
[ 3.2 9.5 3.4 2.15 115. 2.8 11.9 50. 2.24 2.24]
[ 3.9 9. 3.1 2. 80. 2.2 13. 50. 2.2 2.2 ]
[ 3.1 9.5 3.6 2.1 90. 2.7 11.1 70. 2.2 2.2 ]
[ 3.2 9.7 3.45 2.15 130. 4.6 10.85 70. 2.35 2.35]
[ 3. 9.3 3.3 2.05 100. 2.8 11.2 50. nan nan]] #预测数据
Epoch 196/200
8/8 [==============================] - 0s - loss: 1.1310e-08 - val_loss: 0.5095
Epoch 197/200
8/8 [==============================] - 0s - loss: 1.2138e-08 - val_loss: 0.5095
Epoch 198/200
8/8 [==============================] - 0s - loss: 1.1878e-08 - val_loss: 0.5095
Epoch 199/200
8/8 [==============================] - 0s - loss: 1.0396e-08 - val_loss: 0.5095
Epoch 200/200
8/8 [==============================] - 0s - loss: 8.0939e-09 - val_loss: 0.5095
pred_acc -134.18569109681408