tensorflow BP神经网络 波士顿房价预测

前言

啥也别说了,上代码

code

# 根据波士顿房价信息进行预测,多元线性回归 + 特征数据归一化 + 可视化 + TensorBoard可视化
#读取数据
from sklearn.metrics import mean_squared_error #均方误差
from sklearn.metrics import mean_absolute_error #平方绝对误差
from sklearn.metrics import r2_score#R square
import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd  # 能快速读取常规大小的文件。Pandas能提供高性能、易用的数据结构和数据分析工具
from sklearn.utils import shuffle  # 随机打乱工具,将原有序列打乱,返回一个全新的顺序错乱的值

# 迭代轮次
train_epochs = 50

# 学习率
learning_rate = 0.01

# 读取数据文件
def get_data():
    mydf = pd.read_excel('data.xlsx', encoding='utf-8')
    df = mydf.values

    # 把df转换成np的数组格式
    df = np.array(df)
    return df

def normal(df):
    # 特征数据归一化
    # 对特征数据{0到11}列 做(0-1)归一化
    for i in range(13):
        df[:, i] = (df[:, i] - df[:, i].min()) / (df[:, i].max() - df[:, i].min())

    # x_data为归一化后的前12列特征数据
    x_data = df[:, :13]

    # y_data为最后1列标签数据
    y_data = df[:, 13]
    return x_data, y_data

def model():
    # 模型定义
    # 定义特征数据和标签数据的占位符
    # shape中None表示行的数量未知,在实际训练时决定一次带入多少行样本,从一个样本的随机SDG到批量SDG都可以
    x = tf.placeholder(tf.float32, [None, 13], name="X")  # 12个特征数据(12列)
    y = tf.placeholder(tf.float32, [None, 1], name="Y")  # 1个标签数据(1列)

    # 定义模型函数
    # 定义了一个命名空间.
    # 命名空间name_scope,Tensoflow计算图模型中常有数以千计节点,在可视化过程中很难一下子全部展示出来/
    # 因此可用name_scope为变量划分范围,在可视化中,这表示在计算图中的一个层级
    with tf.name_scope("Model"):
        # w 初始化值为shape=(12,1)的随机数
        w = tf.Variable(tf.random_normal([13, 1], stddev=0.01), name="W")

        # b 初始化值为1.0
        b = tf.Variable(1.0, name="b")
        # w和x是矩阵相乘,用matmul,不能用mutiply或者*
        def model(x, w, b):
            return tf.matmul(x, w) + b
        # 预测计算操作,前向计算节点
        pred = model(x, w, b)

    # 定义均方差损失函数
    # 定义损失函数
    with tf.name_scope("LossFunction"):
        loss_function = tf.reduce_mean(tf.pow(y - pred, 2))  # 均方误差

    # 创建优化器
    optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss_function)
    return loss_function, optimizer, pred, x, y, b, w


def run_model(loss_function, optimizer, pred, x_data, y_data, x, y, b, w):
    # 声明会话
    sess = tf.Session()

    # 定义初始化变量的操作
    init = tf.global_variables_initializer()

    # 为TensorBoard可视化准备数据
    # 设置日志存储目录
    logdir = './test'
    # 创建一个操作,用于记录损失值loss,后面在TensorBoard中SCALARS栏可见
    sum_loss_op = tf.summary.scalar("loss", loss_function)

    # 把所有需要记录摘要日志文件的合并,方便一次性写入
    merged = tf.summary.merge_all()

    # 启动会话
    sess.run(init)

    # 创建摘要的文件写入器
    # 创建摘要writer,将计算图写入摘要文件,后面在Tensorflow中GRAPHS栏可见
    writer = tf.summary.FileWriter(logdir, sess.graph)
    # 迭代训练
    loss_list = []  # 用于保存loss值的列表
    Add_train_y = []
    Add_predict_y = []
    for epoch in range(train_epochs):
        loss_sum = 0.0
        for xs, ys in zip(x_data, y_data):
            xs = xs.reshape(1, 13)
            ys = ys.reshape(1, 1)

            # feed数据必须和Placeholder的shape一致
            _, summary_str, loss = sess.run([optimizer, sum_loss_op, loss_function], feed_dict={x: xs, y: ys})
            writer.add_summary(summary_str, epoch)

            loss_sum = loss_sum + loss

        #   loss_list.append(loss)     #每步添加一次
        # 打乱数据顺序,防止按原次序假性训练输出
        x_data, y_data = shuffle(x_data, y_data)

        b0temp = b.eval(session=sess)  # 训练中当前变量b值
        w0temp = w.eval(session=sess)  # 训练中当前权重w值
        loss_average = loss_sum / len(y_data)  # 当前训练中的平均损失

        loss_list.append(loss_average)  # 每轮添加一次
        print("epoch=", epoch + 1, "loss=", loss_average, "b=", b0temp, "w=", w0temp)

        Add_train_y.append(np.sqrt(mean_squared_error(y_data, sess.run(pred, feed_dict={x: x_data}))))
    return loss_list, pred, Add_train_y, sess


def plot_all(loss_list, x_data, y_data, pred, Add_train_y, sess, x, y):
    plt.plot(loss_list)

    # 模型应用
    n = np.random.randint(506)  # 随机确定一条来看看效果
    print(n)
    x_test = x_data[n]

    x_test = x_test.reshape(1, 13)
    predict = sess.run(pred, feed_dict={x: x_test})
    print("预测值:%f" % predict)

    target = y_data[n]
    print("标签值:%f" % target)
    plt.show()
    #######        曲线拟合效果,可以看出预测效果不错       #####
    test_predictions = sess.run(pred, feed_dict={x: x_data})

    plt.scatter(y_data, test_predictions)
    plt.xlabel('True Values [1000$]')
    plt.ylabel('Predictions [1000$]')
    plt.axis('equal')
    plt.xlim(plt.xlim())
    plt.ylim(plt.ylim())
    _ = plt.plot([-100, 100], [-100, 100])
    plt.show()
    ##########                 #########                                ##

    plt.figure()
    plt.xlabel('Epoch')
    plt.ylabel('Mean Abs Error [1000$]')

    plt.plot(np.arange(50), Add_train_y,
           label = 'MAE')
    plt.legend()
    plt.ylim([0, 10])
    plt.show()

    #######         ##############
    error = test_predictions - y_data
    plt.hist(error, bins = 50)
    plt.xlabel("Prediction Error [1000$]")
    _ = plt.ylabel("Count")
    plt.show()

def main():
    df = get_data()  # getdata
    x_data, y_data = normal(df)
    loss_function, optimizer, pred, x, y, b, w = model()
    loss_list, pred, Add_train_y, sess = run_model(loss_function, optimizer, pred, x_data, y_data, x, y, b, w)
    plot_all(loss_list, x_data, y_data, pred, Add_train_y, sess, x, y)


if __name__ == '__main__':
    main()

结语

写的有点乱,大家凑活看
运行结果如下:
①利用Tensorboard查看神经网络结构图,如图所示可以看出是单层神经元的BP神经网络:
在这里插入图片描述
②观察随着训练轮数的变化,loss值的变化,分别用matplotlib和tensorboard展示

在这里插入图片描述
在这里插入图片描述
③利用matplotlib作图,展示神经网络预测拟合效果,可以看出还是不错的。
在这里插入图片描述
④利用matplotlib作图,查看预测失误情况的直方图,可以看出大部分预测还是准确的:
在这里插入图片描述
⑤利用matplotlib作图,展示平均绝对误差:MAE(Mean Absolute Error)的变化趋势,可以看出在几轮训练之后,趋于减小,最后近乎平稳。
在这里插入图片描述

⑥仿真测试,随机选取数据进行预测,并查看预测效果,可以看出预测效果中等偏上。
索引:375
预测值:15.012003
标签值:19.100000

402
预测值:12.718363
标签值:13.400000

10
预测值:30.206409
标签值:34.700000

239
预测值:31.967896
标签值:26.700000

51
预测值:18.368908
标签值:13.000000

120
预测值:12.289744
标签值:13.400000

参考致谢

https://blog.csdn.net/u012735708/article/details/84337262
https://blog.csdn.net/qq_36712111/article/details/87742822
https://blog.csdn.net/weixin_43737376/article/details/86718103

  • 5
    点赞
  • 84
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
BP神经网络可以用于波士顿房价预测,具体实现步骤如下: 1.准备数据集,使用housing.csv数据集。 2.使用Python代码实现前向和后向传播,具体实现步骤如下: (1)导入必要的库和模块: ```python import numpy as np import pandas as pd import tensorflow as tf from sklearn.datasets import load_boston from sklearn.preprocessing import StandardScaler ``` (2)加载数据集并进行标准化处理: ```python boston = load_boston() X = boston.data y = boston.target.reshape(-1, 1) scaler = StandardScaler() X = scaler.fit_transform(X) y = scaler.fit_transform(y) ``` (3)定义神经网络的参数: ```python n_features = X.shape[1] n_hidden = 10 learning_rate = 0.01 n_epochs = 1000 ``` (4)定义输入和输出的占位符: ```python _placeholder = tf.placeholder(tf.float32, [None, n_features]) y_placeholder = tf.placeholder(tf.float32, [None, 1]) ``` (5)定义权重和偏置变量: ```python weights = { 'hidden': tf.Variable(tf.random_normal([n_features, n_hidden])), 'output': tf.Variable(tf.random_normal([n_hidden, 1])) } biases = { 'hidden': tf.Variable(tf.random_normal([n_hidden])), 'output': tf.Variable(tf.random_normal([1])) } ``` (6)定义前向传播过程: ```python hidden_layer = tf.add(tf.matmul(X_placeholder, weights['hidden']), biases['hidden']) hidden_layer = tf.nn.relu(hidden_layer) output_layer = tf.add(tf.matmul(hidden_layer, weights['output']), biases['output']) ``` (7)定义损失函数和优化器: ```python loss = tf.reduce_mean(tf.square(output_layer - y_placeholder)) optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss) ``` (8)定义TensorFlow会话并进行训练: ```python with tf.Session() as sess: sess.run(tf.global_variables_initializer()) for epoch in range(n_epochs): _, loss_value = sess.run([optimizer, loss], feed_dict={X_placeholder: X, y_placeholder: y}) if epoch % 100 == 0: print("Epoch:", epoch, " Loss:", loss_value) ``` 3.损失函数使用方差,可以使用Tensorboard查看神经网络结构图和loss值的变化,具体实现步骤如下: (1)定义Tensorboard的输出路径: ```python logdir = 'logs/' ``` (2)定义Tensorboard的输出节点: ```python tf.summary.scalar('loss', loss) merged_summary_op = tf.summary.merge_all() summary_writer = tf.summary.FileWriter(logdir, sess.graph) ``` (3)在训练过程中记录Tensorboard的输出: ```python _, loss_value, summary = sess.run([optimizer, loss, merged_summary_op], feed_dict={X_placeholder: X, y_placeholder: y}) summary_writer.add_summary(summary, epoch) ``` (4)在命令行中启动Tensorboard: ``` tensorboard --logdir=logs/ ``` (5)在浏览器中打开Tensorboard的网址: ``` http://localhost:6006/ ```
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值