使用tensorflow进行房价预测

本文介绍了一种使用TensorFlow高级API构建的模型,用于预测波士顿郊区房价。通过对原始数据进行预处理,并采用三个全连接层的神经网络结构,模型能够有效地预测房价。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在回归问题中,我们的目标是预测一个连续值的输出,如价格或概率。将此与一个分类问题进行对比,我们的目标是预测一个离散的标签(例如,图片包含一个苹果或橙子)。

本示例建立了一个模型来预测波士顿郊区在20世纪70年代中期的中值价格。为了做到这一点,我们将提供模型与郊区的一些数据,如犯罪率和地方物业税税率。

使用tensorflow的高级API进行建模。

import tensorflow as tf
from tensorflow import keras
import numpy as np

boston_housing=keras.datasets.boston_housing
#提前下载好的数据
(train_data,train_label),(test_data,test_label)=boston_housing.load_data("F://data//machine_learning//回归数据//波士顿房价/boston_housing.npz")
print(train_data[0].shape,test_data[0])
#shuffle数据集
order=np.argsort(np.random.random(train_label.shape))
train_data=train_data[order] #特征
train_label=train_label[order] #标签

#使用pandas处理数据并显示
import pandas as pd
column_names = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD',
                'TAX', 'PTRATIO', 'B', 'LSTAT']
df=pd.DataFrame(train_data,columns=column_names)
df.head()

数据格式如下: 

 CRIMZNINDUSCHASNOXRMAGEDISRADTAXPTRATIOBLSTAT
00.0787545.03.440.00.4376.78241.13.78865.0398.015.2393.876.68
14.555870.018.100.00.7183.56187.91.613224.0666.020.2354.707.12
20.0960440.06.410.00.4476.85442.84.26734.0254.017.6396.902.98
30.0187085.04.150.00.4296.51627.78.53534.0351.017.9392.436.36
40.526930.06.200.00.5048.72583.02.89448.0307.017.4382.004.63

 这些输入数据特征中的每一个都使用不同的尺度存储。一些特征由0和1之间的比例表示,其他特征的范围在1和12之间,有些是0和100之间的范围,等等。因此需要对数据进行归一化处理。

mean = train_data.mean(axis=0)
std = train_data.std(axis=0)
train_data = (train_data - mean) / std
test_data = (test_data - mean) / std

接下来进行模型的构建,定义网络层次。

#模型构建,3个全连接层
def build_model():
    model=keras.Sequential([keras.layers.Dense(64,activation=tf.nn.relu,input_shape=(train_data.shape[1],)),
                            keras.layers.Dense(64,activation=tf.nn.relu),keras.layers.Dense(1)])
    optimizer=tf.train.RMSPropOptimizer(0.001)
    model.compile(loss="mse",optimizer=optimizer,metrics=['mae'])
    return model
_________
model=build_model()
model.summary()#打印模型网络结构
________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_16 (Dense)             (None, 64)                896       
_________________________________________________________________
dense_17 (Dense)             (None, 64)                4160      
_________________________________________________________________
dense_18 (Dense)             (None, 1)                 65        
=================================================================
Total params: 5,121
Trainable params: 5,121
Non-trainable params: 0
#自定义一个回调函数:回调函数是一组在训练的特定阶段被调用的函数集,
#你可以使用回调函数来观察训练过程中网络内部的状态和统计信息。
#通过传递回调函数列表到模型的.fit()中,即可在给定的训练阶段调用该函数集中的函数。
class PrintDot(keras.callbacks.Callback):
    def on_epoch_end(self,epoch,logs):
        if epoch%100==0:
            print('epoch')
        print('.',end='')

EPOCHS=500
history=model.fit(train_data,train_label,epochs=EPOCHS,validation_split=0.2,verbose=0,callbacks=[PrintDot()])
print(history.history.keys())

接下来展示训练情况:

import matplotlib.pyplot as plt
def plot_history(history):
    plt.figure()
    plt.xlabel('Epoch')
    plt.ylabel('Mean Abs ERROR [1000$]')
    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.legend()
    plt.ylim([0,5])
    plt.show()

plot_history(history)

 该图显示在大约200个epochs之后模型的改进不大。让我们更新model.fit方法,当验证分数没有提高时自动停止训练。我们将使用回调函数来测试每一个时期的训练条件。如果经过设定的epochs数量后没有显示出改善,则自动停止训练。

model=build_model()
early_stop=keras.callbacks.EarlyStopping(monitor='val_loss',patience=20)
history=model.fit(train_data,train_label,epochs=EPOCHS,validation_split=0.2,verbose=0,callbacks=[early_stop,PrintDot()])
plot_history(history)

[loss,mae]=model.evaluate(test_data,test_label,verbose=0)
print("Testing set Mean Abs Error:${:7.2f}".format(mae*1000))

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值