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)

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐