1 数据准备
1.1下载数据
需要提前安装 TensorFlow,keras ,numpy,matplot
import tensorflow as tf
#从TensorFlow导入keras
from tensorflow import keras
import numpy as np
#加载数据集
train_data,train_label,test_data,test_label=\
keras.datasets.boston_housing.load_data()
执行后如图1
图1
1.2 数据预处理
数据打乱-->数据归一化
(1)数据打乱
使用 argsort(a, axis=-1, kind=None, order=None) 函数对数组进行排序的索引。
order=np.argsort(np.random.random(train_label.shape))
print(order)
train_data=train_data[order]
train_label=train_label[order]
(2)归一化
mean=train_data.mean(axis=0)
std=train_data.std(axis=0)
train_data=(train_data-mean)/std
test_data=(test_data-mean)/std
print("train_data.shape:{},train_label.shape:{}."\
.format(train_data.shape,train_label.shape))
print("test_data.shape:{},test_label.shape:{}."\
.format(test_data.shape,test_label.shape))
2.创建神经网路模型
定义模型
#创建模型
def buildmodel():
model=keras.Sequential()
model.add(keras.layers.Dense(64,activation=tf.nn.relu,
input_shape=(train_data.shape[1],)))
model.add(keras.layers.Dense(64,activation=tf.nn.relu))
model.add(keras.layers.Dense(1))
#print(tf.train.RMSPropOptimizer.__doc__)
optimizer=tf.train.RMSPropOptimizer(learning_rate=1e-3)
model.compile(optimizer,loss='mse',metrics=['mae'])
return model
model=buildmodel()
model.summary()
使用summery 输出模型结构
3.模型训练
#训练模型
#回调函数
class PrintDot(keras.callbacks.Callback):
def on_epoch_end(self,epoch,logs):
if (epoch+1)%100==0:
print("\nepoch:",epoch+1)
print('.',end="")
EPOCH=500
early_stop=keras.callbacks.EarlyStopping( monitor='val_loss',
min_delta=0,
patience=20,
verbose=0,
mode='auto',
baseline=None,
restore_best_weights=False)
history=model.fit(train_data,train_label,batch_size=50,epochs=EPOCH,
callbacks=[PrintDot(),early_stop],verbose=0,
validation_split=0.2)
#可视化结果
绘制history图形
#可视化结果
import matplotlib.pyplot as plt
def plot_history(history):
plt.figure()
plt.xlabel('Epoch')
plt.ylabel('MAE')
plt.plot(history.epoch,np.array(history.history['mean_absolute_error']),
label='Train loss')
plt.plot(history.epoch,np.array(history.history['val_mean_absolute_error']),
label='val loss')
plt.ylim([0,10])
plt.legend()
plt.show()
plot_history(history)
没有使用early——stop
使用早停
4.模型预测
4.1绘制散点图
#模型评估和预测
test_predict=model.predict(test_data).flatten()
print(list(zip(test_label,test_predict)))
#print(test_predict)
#预测散点图绘图
plt.scatter(test_label,test_predict)
plt.xlabel("True label")
plt.ylabel("Prediction")
plt.axis('equal')
plt.show()
4.2绘制预测误差直方图
#预测可视化绘图
error=test_predict-test_label
plt.hist(error,bins=50)
plt.xlabel("prediction error")
plt.ylabel('count')
plt.show()
plt.show()
4.3绘制实际房价和预测房价对比图
#对比图
def plotVersusFinguer(y_true,y_predict):
plt.figure(figsize=(10,7))
plt.plot(y_true,'o-',color='c')
plt.plot(y_predict,'o-',color='m')
#添加图例
plt.legend(loc='lower right',labels=["True price","predict Price"])
plt.show()
plotVersusFinguer(test_label,test_predict)