预测房价(Python)

这篇具有很好参考价值的文章主要介绍了预测房价(Python)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

构建神经网络/深度学习模型的基本步骤

深度学习模型具有一定的通用性,使得深度学习的门槛降低,这是深度学习得以重新占据计算机领域一席之地的重要原因,深度学习均可以从下述五个步骤来完成模型的构建和训练。

def load_data():
    # 从文件导入数据
    datafile = './work/housing.data'
    data = np.fromfile(datafile, sep=' ')

    # 每条数据包括14项,其中前面13项是影响因素,第14项是相应的房屋价格中位数
    feature_names = [ 'CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', \
                      'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV' ]
    feature_num = len(feature_names)

    # 将原始数据进行Reshape,变成[N, 14]这样的形状
    data = data.reshape([data.shape[0] // feature_num, feature_num])

    # 将原数据集拆分成训练集和测试集
    # 这里使用80%的数据做训练,20%的数据做测试
    # 测试集和训练集必须是没有交集的
    ratio = 0.8
    offset = int(data.shape[0] * ratio)
    training_data = data[:offset]

    # 计算train数据集的最大值,最小值,平均值
    maximums, minimums, avgs = training_data.max(axis=0), training_data.min(axis=0), \
                                 training_data.sum(axis=0) / training_data.shape[0]

    # 对数据进行归一化处理
    for i in range(feature_num):
        #print(maximums[i], minimums[i], avgs[i])
        data[:, i] = (data[:, i] - avgs[i]) / (maximums[i] - minimums[i])

    # 训练集和测试集的划分比例
    training_data = data[:offset]
    test_data = data[offset:]
    return training_data, test_data

构建神经网络

基本概念

首先我们要清楚神经网络负责什么,我们起初假设了波士顿的房价和各个因素成线性关系,神经网络根据数据训练出一组最适合,最能拟合数据的一组参数,这就是神经网络需要做的事情,输入是数据,输出的一组最优参数。
首先,必须先了解以下几个概念:

一般过程

我们使用神经网络进行训练的过程可以用下面的伪代码进行表述:

iteration=N; # 迭代的次数
init(w,b);   # 为参数赋初值
while(i<iteration)
	z = forward(w,b,data); 			# 计算这一组参数对数据的预测值
	Loss = cul_loss(z,y);			# 计算预测值和真实值之间的损失
	gradient = cul_gradient();		# 房价预测模型很简单,我们用梯度下降法更新参数,计算梯度,梯度的计算过程如上。
	w,b = update(w, b, gradient);	# 根据梯度更新参数		

完整代码

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

def load_data():	
    # 从文件导入数据
    datafile = './data/housing.data'
    data = np.fromfile(datafile, sep=' ')

    # 每条数据包括14项,其中前面13项是影响因素,第14项是相应的房屋价格中位数
    feature_names = [ 'CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', \
                      'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV' ]
    feature_num = len(feature_names)

    # 将原始数据进行Reshape,变成[N, 14]这样的形状
    data = data.reshape([data.shape[0] // feature_num, feature_num])

    # 将原数据集拆分成训练集和测试集
    # 这里使用80%的数据做训练,20%的数据做测试
    # 测试集和训练集必须是没有交集的
    ratio = 0.8
    offset = int(data.shape[0] * ratio)
    training_data = data[:offset]

    # 计算train数据集的最大值,最小值,平均值
    maximums, minimums, avgs = training_data.max(axis=0), training_data.min(axis=0), \
                                 training_data.sum(axis=0) / training_data.shape[0]

    # 对数据进行归一化处理
    for i in range(feature_num):
        #print(maximums[i], minimums[i], avgs[i])
        data[:, i] = (data[:, i] - avgs[i]) / (maximums[i] - minimums[i])

    # 训练集和测试集的划分比例
    training_data = data[:offset]
    test_data = data[offset:]
    return training_data, test_data

class Network(object):
    def __init__(self, num_of_weights):
        # 随机产生w的初始值
        # 为了保持程序每次运行结果的一致性,此处设置固定的随机数种子
        #np.random.seed(0)
        self.w = np.random.randn(num_of_weights, 1)
        self.b = 0.
        
    def forward(self, x):
        z = np.dot(x, self.w) + self.b
        return z
    
    def loss(self, z, y):
        error = z - y
        num_samples = error.shape[0]
        cost = error * error
        cost = np.sum(cost) / num_samples
        return cost
    
    def gradient(self, x, y):
        z = self.forward(x)
        N = x.shape[0]
        gradient_w = 1. / N * np.sum((z-y) * x, axis=0)
        gradient_w = gradient_w[:, np.newaxis]
        gradient_b = 1. / N * np.sum(z-y)
        return gradient_w, gradient_b
    
    def update(self, gradient_w, gradient_b, eta = 0.01):
        self.w = self.w - eta * gradient_w
        self.b = self.b - eta * gradient_b
            
                
    def train(self, training_data, num_epoches, batch_size=10, eta=0.01):
        n = len(training_data)
        losses = []
        for epoch_id in range(num_epoches):
            # 在每轮迭代开始之前,将训练数据的顺序随机的打乱,
            # 然后再按每次取batch_size条数据的方式取出
            np.random.shuffle(training_data)
            # 将训练数据进行拆分,每个mini_batch包含batch_size条的数据
            mini_batches = [training_data[k:k+batch_size] for k in range(0, n, batch_size)]
            for iter_id, mini_batch in enumerate(mini_batches):
                #print(self.w.shape)
                #print(self.b)
                x = mini_batch[:, :-1]
                y = mini_batch[:, -1:]
                a = self.forward(x)
                loss = self.loss(a, y)
                gradient_w, gradient_b = self.gradient(x, y)
                self.update(gradient_w, gradient_b, eta)
                losses.append(loss)
                print('Epoch {:3d} / iter {:3d}, loss = {:.4f}'.
                                 format(epoch_id, iter_id, loss))
        
        return losses

# 获取数据
train_data, test_data = load_data()

# 创建网络
net = Network(13)
# 启动训练
losses = net.train(train_data, num_epoches=50, batch_size=100, eta=0.1)

# 画出损失函数的变化趋势
plot_x = np.arange(len(losses))
plot_y = np.array(losses)
plt.plot(plot_x, plot_y)
plt.show()

 

  • 数据处理:从本地文件或网络地址读取数据,并做预处理操作,如校验数据的正确性等。
  • 模型设计:完成网络结构的设计(模型要素1),相当于模型的假设空间,即模型能够表达的关系集合。
  • 训练配置:设定模型采用的寻解算法(模型要素2),即优化器,并指定计算资源。
  • 训练过程:循环调用训练过程,每轮均包括前向计算 、损失函数(优化目标,模型要素3)和后向传播这三个步骤。
  • 保存模型:将训练好的模型保存,以备预测时调用
  • 线性回归模型

    假设房价和各影响因素之间能够用线性关系来描述:y = ∑ i = 0 M x i w i + b y = \sum_{i=0}^M x_iw_i+by=∑i=0M​xi​wi​+b
    模型的求解即是通过数据拟合出每个w i w_iwi​和b bb,w i w_iwi​和b bb分别表示线性模型的权重和偏值,一维情况下代表直线的斜率和截距。

    数据处理

    下面代码中数据处理的部分可以简单概括为:文章来源地址https://www.toymoban.com/news/detail-468642.html

  • 从文件中读入的数据是一维的,数据存放的格式是【因素1_1,因素1_2,…,因素1_13,房价均价1,…,因素M_1,…,因素M_13,房价均价M】,首先应该将原始数据变成[N,14]的形状。
  • 将数据集找分成训练集和测试集。
  • 一般来说,有的数据中还有Null项,或者是0项,如果有必要的话,这些项也要处理,否则会影响后面的计算,下面的数据是相当标准的,没有Null和0,所以也就没有处理。
  • 将训练集的数据进行归一化处理,将各个因素的取值范围全部规范到(0,1)之间。这样做的话,每个特征值的范围相同,所以每个特征值对结果的影响程度只看w i w_iwi​就可以了。
  • 损失函数(Loss):损失函数是评价预测值好坏的一个参数,对于波士顿房价预测的案列来说,
    L o s s = ( z − y ) 2 , z : 预 测 值 , y : 真 实 值 Loss = (z-y)^2,z:预测值,y:真实值Loss=(z−y)2,z:预测值,y:真实值,
    L o s s s u m = 1 / M ∗ ∑ i = 0 M ( z i − y i ) 2 Loss_{sum} = 1/M*\sum_{i=0}^M (z^i-y^i)^2Losssum​=1/M∗∑i=0M​(zi−yi)2
    这里我们说一下为什么要取平方?简单来说,现在要求
    预 测 值 z = f ( w 1 , w 2 , . . . , w 3 ) , w i 是 参 数 预测值z=f(w_1,w_2,...,w_3),w_i是参数预测值z=f(w1​,w2​,...,w3​),wi​是参数
    这个方程的极小值,说白了就是多元函数求极值问题,我们后续可能涉及到求导数问题。而对于方程y = ∣ x ∣ , y = x 2 y=|x|,y=x^2y=∣x∣,y=x2,y = ∣ x ∣ y=|x|y=∣x∣在极值点不可导,所以为了避免出现这样的问题,我们对Loss取个平方。
  • 前向计算:前向计算是根据参数计算结果。
  • 后向计算:后向计算是根据结果更新参数。
  • 梯度下降法:梯度下降法是求函数极值的一个常用方法。我争取用一句话讲清楚什么是梯度下降法。假如你在一座山的半山腰,现在伸手不见五指,你需要下山,你只能伸出你的小脚丫去试探,看看哪里是向下走的一条路,然后如此往复,你一定能走到一个低谷。这就是梯度下降法。梯度下降法一定能找到一个局部最优值,他不能找到最小值,从刚才的例子也能清楚的感觉到。而这里还有一个重要的概念,你下山的时候每走的一步的步长称作学习率,学习率越大,函数收敛的也就也快,但是容易跳过极值点,学习率太小,那么函数收敛的也就越慢,最好的办法就是我们根据山的陡峭程度来决定我这一步迈的大还是小,也就是梯度越大学习率也就越大,梯度越小学习率也就小。
    另外,前面我们数据处理的时候提到了归一化,不难看出,如果我们不进行归一化,学习率的大小对每个参数的影响程度都不同,归一化后,学习率的大小对每个参数的影响程度都一样,这也是为什么要归一化的一个重要原因。
    对于本题,我们看看怎么用梯度下降法,我们下山的时候需要用脚去试探,才知道哪边是下坡的方向,而对于多元函数来说,有一个重要的概念叫做梯度,梯度的反方向就是下降最快的方向。那我们现在看看,线性回归模型的梯度是什么?
    预测房价(Python)

到了这里,关于预测房价(Python)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于python的Keras库构建的深度神经网络手写数字识别模型

    目录 模型训练过程 ①导入所需的库 ②加载手写体数据集,将数据集分为训练集和测试集 ③数据预处理 ④构建模型 ⑤编译模型 ⑥训练模型 ⑦使用测试集进行验证 ⑧输出模型准确率和时间消耗 完整代码如下: 模型训练过程 使用到的数据集为IMDB电影评论情感分类数据集,该

    2024年02月09日
    浏览(30)
  • 预测知识 | 神经网络、机器学习、深度学习

    神经网络 神经网络(neural network)是机器学习的一个重要分支,也是深度学习的核心算法。神经网络的名字和结构,源自人类的大脑构造,即神经网络是模拟生物学中神经元信号传输而形成的一种算法。 机器学习 在开展神经网络或深度学习研究前,需要理清人工智能(AI)、

    2024年02月13日
    浏览(30)
  • 【深度学习】——循环神经网络RNN及实例气温预测、单层lstm股票预测

           密集连接网络和卷积神经网络都有主要的特点,那就是它们没有记忆。它们单独处理每个输入,在输入和输入之间没有保存任何状态。举个例子:当你在阅读一个句子的时候,你需要记住之前的内容,我们才能动态的了解这个句子想表达的含义。生物智能已渐进的方

    2023年04月24日
    浏览(36)
  • 使用Keras构建分类问题的MLP神经网络——用于糖尿病预测

            大家好,我是带我去滑雪!          Keras 是一个用于构建和训练深度学习模型的高级 API,它基于 Python编写,并能够运行于 TensorFlow, CNTK, 或者 Theano 等深度学习框架之上。Keras简化了深度神经网络的构建流程,让用户能够更加简单、快速地搭建一个完整的深度学习模

    2024年02月05日
    浏览(32)
  • 基于深度信念神经网络+长短期神经网络的降雨量预测,基于dbn-lstm的降雨量预测,dbn原理,lstm原理

    背影 DBN神经网络的原理 DBN神经网络的定义 受限玻尔兹曼机(RBM) LSTM原理 DBN-LSTM的降雨量预测 基本结构 主要参数 数据 MATALB代码 结果图 展望 DBN是一种深度学习神经网络,拥有提取特征,非监督学习的能力,通过dbn进行无监督学习提取特征,然后长短期神经网络LSTM进行训练

    2024年02月13日
    浏览(26)
  • 用C语言构建一个数字识别深度神经网络

    接上一篇: 用C语言构建一个数字识别卷积神经网络 1. 深度神经网络 按照深度学习的理论,随着神经网络层数的增加,网络拟合复杂问题的能力也会增强,对事物特征的挖掘也会更加深入.这里尝试构建一个5层深度的神经网络,包括两个卷积层和两个池化层, 其中输出层为全

    2024年02月13日
    浏览(28)
  • 深度学习-循环神经网络-RNN实现股价预测-LSTM自动生成文本

    基于文本内容及其前后信息进行预测 基于目标不同时刻状态进行预测 基于数据历史信息进行预测 序列模型:输入或者输出中包含有序列数据的模型 突出数据的前后序列关系 两大特点: 输入(输出)元素之间是具有顺序关系。不同的顺序,得到的结果应该是不同的,比如“

    2024年01月24日
    浏览(35)
  • PyTorch深度学习实战(3)——使用PyTorch构建神经网络

    我们已经学习了如何从零开始构建神经网络,神经网络通常包括输入层、隐藏层、输出层、激活函数、损失函数和学习率等基本组件。在本节中,我们将学习如何在简单数据集上使用 PyTorch 构建神经网络,利用张量对象操作和梯度值计算更新网络权重。 1.1 使用 PyTorch 构建神

    2024年02月08日
    浏览(33)
  • 深度学习 GNN图神经网络(四)线性回归之ESOL数据集水溶性预测

    本文旨在使用化合物分子的SMILES字符串进行数据模型训练,对其水溶性的值进行预测。 之前的文章《深度学习 GNN图神经网络(三)模型思想及文献分类案例实战》引用的Cora数据集只有一张图,属于图神经网络的节点分类问题。本文介绍的是多图批量训练的线性回归问题,在

    2024年02月02日
    浏览(32)
  • 回归预测 | MATLAB实现WOA-DNN鲸鱼算法优化深度神经网络的数据多输入单输出回归预测

    效果一览 基本介绍 回归预测 | MATLAB实现WOA-DNN鲸鱼算法优化深度神经网络的数据多输入单输出回归预测 MATLAB实现WOA-DNN鲸鱼算法优化深度神经网络的数据多输入单输出回归预测(Matlab完整程序和数据) 输入7个特征,输出1个,即多输入单输出;优化参数为学习率,批大小,正

    2024年02月13日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包