• 【案例】从kaggle的房价预测模型案例中了解深度学习模型,即如何学习深度学习模型


    1、背景

        深度学习是什么,为了解决什么样的问题
        深度学习是一种机器学习的方法,它的主要目的是从数据中自动学习到有效的特征表示。深度学习通过多层的特征转换,把原始数据变成更高层次、更抽象的表示。这些学习到的表示可以替代人工设计的特征,从而避免“特征工程”。

        深度学习主要要解决的是如何让机器能够模仿人脑的思考方式。从而摆脱原来的固有数据库比较的限制。让机器能够通过深度学习理解这个不断变化的世界。

    结合本次分享,主要是预测芝加哥房价

    问题陈述
    房价预测是kaggle的一个经典Data Science项目,作为数据分析的新手,这是一个很好的入门练习项目。
    任务很明确,就是要根据给出的79个特征,预测对应的房价,这些特征包括房子的类型、临街宽度、各层的面积等等。
    数据可以在以下链接下载:
    Kaggle: House Price
    给出的数据包括四份文件:
    . ‘train.csv’:训练数据
    · ‘test.csv’:测试数据
    · ‘data_description.txt’:说明各个特征的文档
    · ‘sample_submission.csv’:预测结果提交的示例

        一个模型好不好,我们要给出评价模型,我们采用kaggle官方给出的模型评价函数RMSE

    2、深度学习的基础理论

        人工神经网络:人工神经网络(Artificial Neural Network,即ANN ),是20世纪80 年代以来人工智能领域兴起的研究热点。它从信息处理角度对人脑神经元网络进行抽象, 建立某种简单模型,按不同的连接方式组成不同的网络。在工程与学术界也常直接简称为神经网络或类神经 。人工神经网络是一种应用类似于大脑神经突触联接的结构进行信息处理的数学模型,简称为“神经网络”或类神经网络 。

        反向传播算法:反向传播算法(Backpropagation Algorithm),简称BP算法,是一种用于训练多层神经网络的监督学习算法。它建立在梯度下降法的基础上,适合于多层神经元网络的一种学习算法。反向传播算法网络的输入输出关系实质上是一种映射关系:一个n输入m输出的BP神经网络所完成的功能是从n维欧氏空间向m维欧氏空间中一有限域的连续映射,这一映射具有高度非线性。反向传播算法主要由两个环节(激励传播、权重更新)反复循环迭代,直到网络的对输入的响应达到预定的目标范围为止 。

        激活函数的作用:激活函数的作用是将神经元的输入信号转换为输出信号,从而引入非线性因素,使神经网络能够更好地拟合复杂的数据集。激活函数可以是一个非线性函数,如Sigmoid、Tanh、ReLU等,也可以是一个线性函数,如恒等映射。在神经网络中,激活函数的选择对网络的性能有很大的影响 。虽然上面有多种激活函数,但是每个激活函数都有各自的优劣,比如sigmoid会导致梯度消失等问题,所以目前常用的激活函数是ReLU函数。

    3、我们需要选择深度学习的框架和工具

        作为深度学习的框架,目前已知的特别多,比如国外的TensorFlow、PyTorch、Keras、Caffe、Theano等等,国内有百度的Paddle,这些都是很优秀的深度学习框架。在这其中我们选用PyTorch使用,因为它最简单上手快的特点。

    4、模型的训练

    1、读取数据

    import pandas as pd
    
    train = pd.read_csv('/kaggle/input/house-prices-advanced-regression-techniques/train.csv') 
    train_copy = train.copy()
    
    test = pd.read_csv('/kaggle/input/house-prices-advanced-regression-techniques/test.csv') 
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    2、查看前面5条数据

    train.head()
    
    • 1

    3、查看数据摘要,他会展示整个数据的情况

    train.info()
    
    • 1

    4、进行预测

    import matplotlib.pyplot as plt
    import random#sheng cheng shujuji
    import torch
    import numpy as npnum_inputs = 2
    num_examples = 1000
    true_w = [2,-3.4]
    true_b = 4.2
    features = torch.randn(num_examples,num_inputs,dtype = torch.float32)
    labels = true_w[0]*features[:,0]+true_w[1]*features[:,1]+true_blabels += torch.tensor(np.random.normal(0, 0.01, size=labels.size()), dtype=torch.float32)
    def data_iter(batch_size,features,labels):
    	num_examples = len(features)
    	indices = list(range(num_examples))
    	random.shuffle(indices)
    	for i in range(0,num_examples,batch_size):
    		j = torch.LongTensor(indices[i:min(i+batch_size,num_examples)])
    		yield features.index_select(0,j),labels.index_select(0,j)
     w = torch.tensor(np.random.normal(0, 0.01, (num_inputs, 1)), dtype=torch.float32)
     b = torch.zeros(1, dtype=torch.float32)
     w.requires_grad_(requires_grad=True)
     b.requires_grad_(requires_grad=True)
     def linreg(X, w, b):
     	return torch.mm(X, w) + b
     def squared_loss(y_hat, y):
     	return (y_hat - y.view(y_hat.size())) ** 2 / 2
     def sgd(params,lr,batch_size):
     	for param in params:
     		param.data -= lr*param.grad/batch_size
     		lr = 0.03
     		num_epochs = 5
     		net = linreg
     		loss = squared_loss
     	batch_size = 32
     	for epoch in range(num_epochs):
     		for X,y in data_iter(batch_size,features,labels):
     			l = loss(net(X,w,b),y).sum()
     			l.backward()
     
     sgd([w,b],lr,batch_size)
     w.grad.data.zero_()
     b.grad.data.zero_()
     train_l = loss(net(features,w,b),labels)
     print(‘epoch %d, loss %f’ % (epoch+1, train_l.mean().item()))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    5、深度学习的应用

    深度学习的应用领域非常广泛,包括但不限于以下领域 :
         无人驾驶汽车:深度学习在无人驾驶领域主要用于图像处理,可以用于感知周围环境、识别可行驶区域检测、以及识别行驶路径识别。
        图片识别及分类:识别出图片中的对象,并建立关键词,对图片进行分类。
        语音识别:深度学习的发展使语音识别有了很大幅度的效果提升,类似于在计算机视觉中处理图像数据一样,深度学习中将声音转化为特征向量,然后对这些数字信息进行处理输入到网络中进行训练,得到一个可以进行语音识别的模型。
        自然语言处理:深度学习由于其非线性的复杂结构,将低维稠密且连续的向量表示为不同粒度的语言单元,例如词、短语、句子和文章,让计算机可以理解通过网络模型参与编织的语言,进而使得人类和计算机进行沟通。

        将以上的应用场景,结合工农业生产生活中,我认为可以很好的解放生产力,提高生产力——所以未来可期(共产主义),因为工作都被机器做了,人们只需要按需分配即可

    6、结论

        我们结合房价预测模型,我们对深度学习进行了一个初步认识,深度学习训练出来的模型好坏,不仅仅是构造模型算法的好坏,而且在特征选择、超参设置、数据集预处理方式等方方面都非常重要,因为他们会深度的影响结果的好坏。

        本模型的优化方向1:构造更加复杂的特征,将其中的任意多个特征进行组合,然后生成一个新的特征(也许这个新特征与目标相关性更大(正相关/负相关/不相关),这样可以提升模型的预测能力),比如将地区和面积结合,我们通过回归函数,就可以发现这条新构造的特征其实与房价是正相关的。

        优化方向2:采用多模型进行对比,选出损失函数最小的模型进行结果的预测

        优化方向3:因为每个模型中都有很多超参的设置,而且这些超参的设置都会影响整个模型,让损失函数变化,我们就可以使用一个外部函数在一个连续区间,不断循环去训练模型,然后选出相对损失最小的函数,但是这回非常消耗算力和时间的。

    参考比较全面的视频事例 这个事例是我看到的较全面的,来自科大讯飞出品

  • 相关阅读:
    Python 操作 Excel,如何又快又好?
    使用 AIGC ,ChatGPT 快速合并Excel工作薄
    vue-计算属性:computed
    【Linux】拓展:运维面试题,进程管理常见的7大问题
    docker安装redis并搭建集群
    kotlin中使用Room数据库(包含升降级崩溃处理)
    Minio + Nginx 实现静态资源对外访问
    优化理论06-----非线性共轭梯度法: HS、FR-CG、PR-CG、PR+-CG
    Finate State Processes(FSP)语法规则
    华为云云耀云服务器L实例评测|利用服务器打造可视化运维管理中心
  • 原文地址:https://blog.csdn.net/Scalzdp/article/details/133577642