【深度学习】DNN房价预测

前言

我们使用深度学习网络实现波士顿房价预测,深度学习的目的就是寻找一个合适的函数输出我们想要的结果。深度学习实际上是机器学习领域中一个研究方向,深度学习的目标是让机器能够像人一样具有分析学习的能力,能够识别文字、图像、声音等数据。我认为深度学习与机器学习最主要的区别就是神经元。

深度学习中重要内容

建立模型——神经元

  • 基本构造
    image

    • 一个神经元对应一组权重w,a代表输入,我们把输入与权重相乘再相加,再加上偏置b,最后通过激活函得到对应的输出。
    • 我们不看激活函数,只看前面的部分会发现其实就是一个线性函数f=kx+b(k表示斜率,b表示截距)
    • w和b就是我们需要在训练中需要寻找的,
    • 学习网络就是通过很多个这样的神经元组合而成。

建立模型——激活函数

  • 为什么引入激活函数

    • 激活函数是为了增强网络的表达能力,我们需要激活函数来将线性函数转变为非线性函数。
    • 非线性的激活函数需要有连续性,因为连续非线性激活函数可导的,所以可以用最优化的方法来求解
  • 激活函数的种类

image

建立模型——前馈神经网络

image

  • 我们输入1和-1分别和每一组的权重相乘相加得到4和-2的结果,然后经过激活函数(激活函数实际上也是一个简单函数,但是具有某些特性,可以用来解决问题的目的,例如激活函数是y=x-1,我们输入4,输出结果就是3。)得到0.98和0.12.依次往后计算就是前馈神经网络。

建立模型——深度神经网络

  • 神经网络解决的问题有很多,例如分类、预测、回归等。这里我们给出两个解决类型。

  • 分类

    • 输出层就是输入的数据维度,例如我们要分类图形是正方型还是长方形,那我们可以是3维的输入,一个内角,两条临边。就可以判断。也可以是五维的,一个内角,4条边)
    • 输出层y就是结果,就上面举例的图形分类,那结果可以有2个,长方形和正方形,例如y1代表长方形,y2代表正方形,输出的结果那个数值大就是那种类型,也可以增加一个都不是的结果)

image

  • 预测

    • 今天的波士顿房价预测就是预测模型,我们通过地段,房屋面积等等,预测房价的多少。

image

损失函数

  • 常用损失函数
    平方损失函数、交叉熵损失函数,不同的问题运用不同的损失函数
  • 用于衡量我们输入结果和真实结果的差异
  • 目的通过损失去修正我们的参数是我们的模型更完美

实践——波士顿房价预测

数据集

使用paddle飞桨波士顿数据集

https://www.paddlepaddle.org.cn/documentation/docs/zh/api/paddle/text/UCIHousing_cn.html

绘图

## 绘图

Batch = 0
Batchs = []
all_train_accs = []
def draw_train_acc(Batchs,train_accs):
    title = "training accs"
    plt.title(title)
    plt.xlabel("batch")
    plt.ylabel("acc")
    plt.plot(Batchs, train_accs, color = 'green', label = 'training accs')
    plt.legend()
    plt.grid()
    plt.show()


all_train_loss = []
def draw_train_loss(Batchs,train_loss):
    title = "training loss"
    plt.title(title)
    plt.xlabel("batch")
    plt.ylabel("loss")
    plt.plot(Batchs, train_loss, color = 'red', label = 'training loss')
    plt.legend()
    plt.grid()
    plt.show()

## 绘制真实值与预测值的对比图
def draw_infer_result(groud_truths, infer_results):
    title = 'Boston'
    plt.title(title)
    x = np.arange(1,20)
    y = x
    plt.plot(x,y);
    plt.xlabel("ground truth")
    plt.ylabel("infer result")
    plt.scatter(groud_truths,infer_results,color='green',label='training cost')
    plt.grid()
    plt.show()

网络搭建


'''
核心

网络搭建
'''

class MyDNN(paddle.nn.Layer):
    def __init__(self):
        super(MyDNN, self).__init__()

        #self.linear1 = paddle.nn.Linear(13,1,None) #全连接层,paddle.nn.Linear(in_features,out_features,weight)

        self.linear1 = paddle.nn.Linear(13, 32, None)

        self.linear2 = paddle.nn.Linear(32, 64, None)

        self.linear3 = paddle.nn.Linear(64, 32, None)

        self.linear4 = paddle.nn.Linear(32, 1, None)
    def forward(self, inputs): ## 传播函数
        x = self.linear1(inputs)
        x = self.linear2(x)
        x = self.linear3(x)
        x = self.linear4(x)
        return x

模型训练与测试


'''
网络训练与测试
'''


## 实例化
model = MyDNN()
model.train()
mse_loss = paddle.nn.MSELoss()
opt = paddle.optimizer.SGD(learning_rate=0.001, parameters=model.parameters())
epochs_num = 100


for epochs in range(epochs_num):
    for batch_id,data in enumerate(train_loader()):
        feature = data[0]
        label = data[1]
        predict = model(feature)
        loss = mse_loss(predict, label)
        loss.backward()
        opt.step()
        opt.clear_grad()
        if batch_id!=0 and batch_id%10 == 0:
            Batch = Batch+10
            Batchs.append(Batch)
            all_train_loss.append(loss.numpy()[0])
            print("epoch{},step:{},train_loss:{}".format(epochs,batch_id,loss.numpy()[0]))

paddle.save(model.state_dict(),"UCIHousingDNN")
draw_train_loss(Batchs,all_train_loss)



para_state = paddle.load("UCIHousingDNN")
model = MyDNN()
model.eval()
model.set_state_dict(para_state)
losses = []


for batch_id,data in enumerate(eval_loader()):
    feature = data[0]
    label = data[1]
    predict = model(feature)
    loss = mse_loss(predict,label)
    losses.append(loss.numpy()[0])
avg_loss = np.mean(losses)

print(avg_loss)


draw_infer_result(label,predict)

代码

## 深度学习框架
import paddle

import numpy as np
import os
import matplotlib.pyplot as plt



## 绘图

Batch = 0
Batchs = []
all_train_accs = []
def draw_train_acc(Batchs,train_accs):
    title = "training accs"
    plt.title(title)
    plt.xlabel("batch")
    plt.ylabel("acc")
    plt.plot(Batchs, train_accs, color = 'green', label = 'training accs')
    plt.legend()
    plt.grid()
    plt.show()


all_train_loss = []
def draw_train_loss(Batchs,train_loss):
    title = "training loss"
    plt.title(title)
    plt.xlabel("batch")
    plt.ylabel("loss")
    plt.plot(Batchs, train_loss, color = 'red', label = 'training loss')
    plt.legend()
    plt.grid()
    plt.show()

## 绘制真实值与预测值的对比图
def draw_infer_result(groud_truths, infer_results):
    title = 'Boston'
    plt.title(title)
    x = np.arange(1,20)
    y = x
    plt.plot(x,y);
    plt.xlabel("ground truth")
    plt.ylabel("infer result")
    plt.scatter(groud_truths,infer_results,color='green',label='training cost')
    plt.grid()
    plt.show()


'''
数据集加载
'''

train_dataset = paddle.text.datasets.UCIHousing(mode="train")
eval_dataset = paddle.text.datasets.UCIHousing(mode="test")

train_loader = paddle.io.DataLoader(train_dataset,batch_size=32, shuffle=True)
eval_loader = paddle.io.DataLoader(eval_dataset,batch_size=8,shuffle=False)

print(train_dataset[1])


'''
核心

网络搭建
'''

class MyDNN(paddle.nn.Layer):
    def __init__(self):
        super(MyDNN, self).__init__()

        #self.linear1 = paddle.nn.Linear(13,1,None) #全连接层,paddle.nn.Linear(in_features,out_features,weight)

        self.linear1 = paddle.nn.Linear(13, 32, None)

        self.linear2 = paddle.nn.Linear(32, 64, None)

        self.linear3 = paddle.nn.Linear(64, 32, None)

        self.linear4 = paddle.nn.Linear(32, 1, None)
    def forward(self, inputs): ## 传播函数
        x = self.linear1(inputs)
        x = self.linear2(x)
        x = self.linear3(x)
        x = self.linear4(x)
        return x


'''
网络训练与测试
'''


## 实例化
model = MyDNN()
model.train()
mse_loss = paddle.nn.MSELoss()
opt = paddle.optimizer.SGD(learning_rate=0.001, parameters=model.parameters())
epochs_num = 100


for epochs in range(epochs_num):
    for batch_id,data in enumerate(train_loader()):
        feature = data[0]
        label = data[1]
        predict = model(feature)
        loss = mse_loss(predict, label)
        loss.backward()
        opt.step()
        opt.clear_grad()
        if batch_id!=0 and batch_id%10 == 0:
            Batch = Batch+10
            Batchs.append(Batch)
            all_train_loss.append(loss.numpy()[0])
            print("epoch{},step:{},train_loss:{}".format(epochs,batch_id,loss.numpy()[0]))

paddle.save(model.state_dict(),"UCIHousingDNN")
draw_train_loss(Batchs,all_train_loss)



para_state = paddle.load("UCIHousingDNN")
model = MyDNN()
model.eval()
model.set_state_dict(para_state)
losses = []


for batch_id,data in enumerate(eval_loader()):
    feature = data[0]
    label = data[1]
    predict = model(feature)
    loss = mse_loss(predict,label)
    losses.append(loss.numpy()[0])
avg_loss = np.mean(losses)

print(avg_loss)


draw_infer_result(label,predict)

结果展示

image

image

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:【深度学习】DNN房价预测 - Python技术站

(0)
上一篇 2023年4月2日 下午5:08
下一篇 2023年4月2日 下午5:08

相关文章

  • 【机器学习】支持向量机分类

    前言 支持向量机是一类按监督学习方式对数据进行二元分类的广义线性分类器,其决策边界是对学习样本求解的最大边距超平面。SVM尝试寻找一个最优决策边界,使距离两个类别最近的样本最远。SVM使用铰链损失函数计算经验风险并在求解系统中加入了正则化项以优化结构风险,是一个具有稀疏性和稳健性的分类器 。SVM可以通过核方法(kernel method)进行非线性分类,是…

    2023年4月2日
    00
  • 【机器学习】数据准备–python爬虫

    前言 我们在学习机器学习相关内容时,一般是不需要我们自己去爬取数据的,因为很多的算法学习很友好的帮助我们打包好了相关数据,但是这并不代表我们不需要进行学习和了解相关知识。在这里我们了解三种数据的爬取:鲜花/明星图像的爬取、中国艺人图像的爬取、股票数据的爬取。分别对着三种爬虫进行学习和使用。 体会 个人感觉爬虫的难点就是URL的获取,URL的获取与自身的经验有…

    2023年4月2日
    00
  • 【机器学习】K-means聚类分析

    前言 聚类问题是无监督学习的问题,算法思想就是物以类聚,人以群分,聚类算法感知样本间的相似度,进行类别归纳,对新输入进行输出预测,输出变量取有限个离散值。本次我们使用两种方法对鸢尾花数据进行聚类。 无监督就是没有标签的进行分类 K-means 聚类算法 K-means聚类算法(k-均值或k-平均)聚类算法。算法思想就是首先随机确定k个中心点作为聚类中心,然后…

    2023年4月2日
    00
  • 【机器学习】线性回归预测

    前言 回归分析就是用于预测输入变量(自变量)和输出变量(因变量)之间的关系,特别当输入的值发生变化时,输出变量值也发生改变!回归简单来说就是对数据进行拟合。线性回归就是通过线性的函数对数据进行拟合。机器学习并不能实现预言,只能实现简单的预测。我们这次对房价关于其他因素的关系。 波士顿房价预测 下载相关数据集 数据集是506行14列的波士顿房价数据集,数据集是…

    2023年4月2日
    00
  • 【机器学习】手写数字识别

    前言 logistic回归,是一个分类算法,可以处理二元分类,多元分类。我们使用sklearn中的logistic对手写数字识别进行实践。 数据集 MNIST数据集来自美国国家标准与技术研究所,训练集由250个不同人手写数字构成,50%高中学生,50%来自人口普查局。 数据集展示 数据集下载 百度云盘:链接:https://pan.baidu.com/s/1…

    2023年4月2日
    00
合作推广
合作推广
分享本页
返回顶部