合肥工业大学人工智能原理课程实验-波士顿房价预测

news2024/10/7 16:24:46

目录

1.实验内容

2.实验环境

3.实验思路(算法分析)

4.实验过程、步骤

5.实验结果与评价

6.实验体会与收获

7.附录


1.实验内容

        波士顿房地产市场竞争激烈,而你想成为该地区最好的房地产经纪人。为了更好地与同行竞争,你决定运用机器学习的一些基本概念,帮助客户为自己的房产定下最佳售价。幸运的是,你找到了波士顿房价的数据集,里面聚合了波士顿郊区包含多个特征维度的房价数据。你的任务是用可用的工具进行统计分析,并基于分析建立优化模型。这个模型将用来为你的客户评估房产的最佳售价

具体要求:

任务输入:波士顿房子的各类属性数据。

  • 任务输出:设计模型,评估房子的最佳售价。

数据集地址:链接: https://pan.baidu.com/s/1xF8uwM-9kGqk1GGtufsKuw 提取码: vzws

方法不限,要求提交整个算法源代码,模型结果,算法分析等内容

2.实验环境

        1.硬件

        RedmiG 2022版 显存16GB  内存512GB cpu:3050

        2.软件(运行环境)

        显卡:NVIDIA显卡,CUDA 11.7。

      系统与环境:Windows11操作系统,Anaconda3的base虚拟环境。

        IDE:Pycharm Community集成开发环境

        深度学习框架:PyTorch深度学习框架,基于GPU版本。

3.实验思路(算法分析)

         波士顿房价数据集是20世纪70年代中期波士顿郊区房价的中位数,统计了当时城市的14个指标与房价的数据,试图能找到那些指标与房价的关系。

数据集中各特征的含义如下:

本实验采用线性回归的方法建立模

4.实验过程、步骤

1.导入所需的库:numpy、pandas和matplotlib.pyplot。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

2.定义线性回归类,包含两个方法:fitness和predicted。

        fitness方法用于训练线性回归模型。输入参数为特征矩阵Date_X_input、目标变量Date_Y、学习率learning_rate(默认值为0.5)和正则化系数lamda(默认值为0.03)。

        在fitness方法中,首先获取样本个数和属性个数。然后对特征矩阵进行扩展,添加一列全为1的常数项。接着初始化待调参数theta为全零向量。设置最大迭代次数Max_count为1e8,设置阈值value为1e-8,设置阈值计数count为10。

    def fitness(self, Date_X_input, Date_Y, learning_rate=0.5, lamda=0.03):
        sample_num, property_num = Date_X_input.shape# 获取样本个数、样本的属性个数
        Date_X = np.c_[Date_X_input, np.ones(sample_num)]
        self.theta = np.zeros([property_num + 1, 1])        # 初始化待调参数theta
        Max_count = int(1e8)  # 最多迭代次数
        last_better = 0  # 上一次得到较好学习误差的迭代学习次数
        last_Jerr = int(1e8)  # 上一次得到较好学习误差的误差函数值
        threshold_value = 1e-8  # 定义在得到较好学习误差之后截止学习的阈值
        threshold_count = 10  # 定义在得到较好学习误差之后截止学习之前的学习次数

        predicted方法用于预测新的数据。输入参数为特征矩阵X_input。首先获取样本个数,对特征矩阵进行扩展,添加一列全为1的常数项。然后计算预测值predict,返回预测结果。

    def predicted(self, X_input):
        sample_num = X_input.shape[0]
        X = np.c_[X_input, np.ones(sample_num, )]
        predict = X.dot(self.theta)
        return predict

3.迭代训练模型

        使用for循环进行迭代训练。在每次迭代中,计算预测值predict,计算损失函数J_theta。更新参数theta,根据损失函数的变化值判断是否提前结束迭代。如果满足条件,则更新last_Jerr和last_better。如果连续threshold_count次迭代后仍未满足条件,则跳出循环。每50次迭代打印一次损失函数的值。

  for step in range(0, Max_count):
            predict = Date_X.dot(self.theta)            # 预测值
            J_theta = sum((predict - Date_Y) ** 2) / (2 * sample_num)            # 损失函数
            self.theta -= learning_rate * (lamda * self.theta + (Date_X.T.dot(predict - Date_Y)) / sample_num)            # 更新参数theta
            if J_theta < last_Jerr - threshold_value:          # 检测损失函数的变化值,提前结束迭代
                last_Jerr = J_theta
                last_better = step
            elif step - last_better > threshold_count:
                break
            if step % 50 == 0:# 定期打印,方便用户观察变化
                print("step %s: %.6f" % (step, J_theta))

4.数据可视化

        读取波士顿房价数据集,调用property_label函数将数据集中的样本属性进行分割,制作X和Y矩阵。然后调用standardization函数对X进行归一化处理。接着创建线性回归模型对象,调用fitness方法训练模型。最后调用predicted方法预测新的数据,计算预测误差,并绘制实际值和预测值的图像。

if __name__ == "__main__":
    data = pd.read_csv("波士顿房价/housing-data.csv", header=None)
    Date_X, Date_Y = property_label(data)    # 对训练集进行X,Y分离
    Standard_DateX, Maxx, Minx =  standardization (Date_X)    # 对X进行归一化处理,方便后续操作
    model = linear_regression()
    model.fitness(Standard_DateX, Date_Y)
    Date_predict = model.predicted(Standard_DateX)
    Date_predict_error = sum((Date_predict - Date_Y) ** 2) / (2 * Standard_DateX.shape[0])
    print("Test error is %d" % (Date_predict_error))
    print(model.theta)
    t = np.arange(len(Date_predict))
    plt.figure(facecolor='w')
    plt.plot(t, Date_Y, 'c-', lw=1.6, label=u'actual value')
    plt.plot(t, Date_predict, 'm-', lw=1.6, label=u'estimated value')
    plt.legend(loc='best')
    plt.title(u'Boston house price', fontsize=18)
    plt.xlabel(u'case id', fontsize=15)
    plt.ylabel(u'house price', fontsize=15)
    plt.grid()
    plt.show()

5.实验结果与评价

通过观察可以知道紫色部分为预测价值,青色部分为实际价格,显然,该模型具有较好的拟合度,预测价格与实际价格比较好。

1.模型训练效果:从代码中可以看出,该线性回归模型在训练集上的表现较好。通过观察损失函数的变化情况,可以发现模型在迭代过程中逐渐减小了损失函数的值,说明模型的参数更新是有效的。同时,当损失函数变化值小于阈值时,提前结束迭代,这有助于提高模型的训练效率。

2.预测准确性:在测试集上,模型的预测误差为0.53,这个误差值相对较小,说明模型对波士顿房价数据的拟合程度较高。然而,由于数据集较小,可能无法完全反映模型在实际问题中的泛化能力。

3.模型复杂度:线性回归模型的复杂度较低,只有一个参数需要调整。这意味着模型在处理高维数据时可能存在过拟合的风险。为了提高模型的泛化能力,可以尝试使用更复杂的模型,如岭回归、Lasso回归等。

4.特征选择:在实验中,我们使用了标准化后的特征数据进行训练。这有助于消除不同特征之间的量纲影响,提高模型的性能。然而,如果特征之间存在较强的相关性,可能会导致模型过拟合。因此,在实际应用中,可以考虑使用特征选择方法来减少特征维度,提高模型的泛化能力。

5.可视化结果:通过绘制实际值和预测值的折线图,可以直观地观察模型的预测效果。从图中可以看出,模型的预测结果与实际值有一定的差距,但整体趋势较为一致。这提示我们在实际应用中,可能需要对模型进行进一步优化,以提高预测的准确性。

6.实验体会与收获

啊啊啊啊啊啊啊啊终于搞出来了太不容易了哈哈哈哈!!!!!!!!

在本次实验中,我深入探讨了线性回归模型的建立和优化过程,这让我更加熟悉了机器学习的基本概念和方法。通过使用numpy、pandas和matplotlib等库,我学会了如何处理可视化数据,这对于分析和解释实验结果至关重要。

在实验过程中,我遇到了一些,(不对应该是好多好多)挑战,如特征选择和模型复杂度控制。这些问题让我意识到在实际问题中,我们需要根据具体情况选择合适的模型和参数。例如,通过对波士顿房价数据集的分析,我发现特征之间的相关性较强,因此可以考虑使用主成分分析(PCA)等方法进行降维处理。此外,我还学会了如何对数据进行预处理,如标准化等,以提高模型的性能。

在编程实现方面,我掌握了线性回归模型的基本算法原理,如梯度下降法等。在编写代码实现线性回归模型的训练和预测功能过程中,我提高了自己的编程能力和解决问题的能力。同时,我也认识到了在实际应用中,需要考虑更多的因素,如过过拟合欠拟合等问题,以确保模型具有良好的泛化能力。

Last but not least,通过本次实验,我对机器学习有了更深入的理解,也积累了一点点宝贵的实践经验。我相信这些经验和技能将对我今后的学习和工作产生积极的影响。在未来的专业研究中,我将继续努力提高自己的专业素养,提高自己的动手编程和解决问题的能力.

征途漫漫惟有奋斗,继续加油吧!

7.附录

完整代码:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 线性回归模型建立
class linear_regression():
    def fitness(self, Date_X_input, Date_Y, learning_rate=0.5, lamda=0.03):
        sample_num, property_num = Date_X_input.shape# 获取样本个数、样本的属性个数
        Date_X = np.c_[Date_X_input, np.ones(sample_num)]
        self.theta = np.zeros([property_num + 1, 1])        # 初始化待调参数theta
        Max_count = int(1e8)  # 最多迭代次数
        last_better = 0  # 上一次得到较好学习误差的迭代学习次数
        last_Jerr = int(1e8)  # 上一次得到较好学习误差的误差函数值
        threshold_value = 1e-8  # 定义在得到较好学习误差之后截止学习的阈值
        threshold_count = 10  # 定义在得到较好学习误差之后截止学习之前的学习次数
        for step in range(0, Max_count):
            predict = Date_X.dot(self.theta)            # 预测值
            J_theta = sum((predict - Date_Y) ** 2) / (2 * sample_num)            # 损失函数
            self.theta -= learning_rate * (lamda * self.theta + (Date_X.T.dot(predict - Date_Y)) / sample_num)            # 更新参数theta
            if J_theta < last_Jerr - threshold_value:          # 检测损失函数的变化值,提前结束迭代
                last_Jerr = J_theta
                last_better = step
            elif step - last_better > threshold_count:
                break
            if step % 50 == 0:# 定期打印,方便用户观察变化
                print("step %s: %.6f" % (step, J_theta))
    def predicted(self, X_input):
        sample_num = X_input.shape[0]
        X = np.c_[X_input, np.ones(sample_num, )]
        predict = X.dot(self.theta)
        return predict
def property_label(pd_data):# 对数据集中的样本属性进行分割,制作X和Y矩阵
    row_num = pd_data.shape[0]
    column_num = len(pd_data.iloc[0, 0].split())# 行数、列数
    X = np.empty([row_num, column_num - 1])
    Y = np.empty([row_num, 1])
    for i in range(0, row_num):
        row_array = pd_data.iloc[i, 0].split()
        X[i] = np.array(row_array[0:-1])
        Y[i] = np.array(row_array[-1])
    return X, Y
def  standardization (X_input):# 把特征数据进行标准化为均匀分布
    Maxx = X_input.max(axis=0)
    Minx = X_input.min(axis=0)
    X = (X_input - Minx) / (Maxx - Minx)
    return X, Maxx, Minx
if __name__ == "__main__":
    data = pd.read_csv("波士顿房价/housing-data.csv", header=None)
    Date_X, Date_Y = property_label(data)    # 对训练集进行X,Y分离
    Standard_DateX, Maxx, Minx =  standardization (Date_X)    # 对X进行归一化处理,方便后续操作
    model = linear_regression()
    model.fitness(Standard_DateX, Date_Y)
    Date_predict = model.predicted(Standard_DateX)
    Date_predict_error = sum((Date_predict - Date_Y) ** 2) / (2 * Standard_DateX.shape[0])
    print("Test error is %d" % (Date_predict_error))
    print(model.theta)
    t = np.arange(len(Date_predict))
    plt.figure(facecolor='w')
    plt.plot(t, Date_Y, 'c-', lw=1.6, label=u'actual value')
    plt.plot(t, Date_predict, 'm-', lw=1.6, label=u'estimated value')
    plt.legend(loc='best')
    plt.title(u'Boston house price', fontsize=18)
    plt.xlabel(u'case id', fontsize=15)
    plt.ylabel(u'house price', fontsize=15)
    plt.grid()
    plt.show()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1835463.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

宝塔面板使用技巧(pure-FTP)上传文件和文件夹默认权限644的修改

前言 科技在进步各种各样的开源软件和库让我们应接不暇&#xff0c;我估计现在所有做php开发的人员都知道宝塔面板&#xff0c;我就经常用&#xff0c;但是不知道大家出现过一个问题不就是在我们开发过程中需要实时的给服务器上传我们开发的文件那么就涉及到了宝塔自带的pure-F…

Spring Security——结合JWT实现令牌的验证与授权

目录 JWT&#xff08;JSON Web Token&#xff09; 项目总结 新建一个SpringBoot项目 pom.xml PayloadDto JwtUtil工具类 MyAuthenticationSuccessHandler&#xff08;验证成功处理器&#xff09; JwtAuthenticationFilter&#xff08;自定义token过滤器&#xff09; W…

idea Alt+/ 自动补全变量名开头是大写 改 选择小写开头变量名

idea 中自动补全变量名是非常常见的操作&#xff0c;变量名一般都需要小写开头&#xff0c;但是idea中 Alt / 自动补全变量名时 补全的变量名是大写的&#xff0c;这就很难受了。如下图所示&#xff1a; AutowiredLogService LogService;Ctrl 空格 快捷键 虽然不像 Alt / 一…

python进阶:多线程原理python(四)

1.并发的概念python基础 举个例子&#xff1a; 1.1并发与并行 并发&#xff1a;逻辑上具备同时处理多个任务的能力 并行&#xff1a; 物理上在同一时刻执行多个并发任务 1.2什么是线程&#xff0c;什么是进程 开个QQ&#xff0c;开了一个进程;开了迅雷&#xff0c;开了一…

【Seata】分布式事务解决方案——理论

目录 回顾什么是事务数据库事务的四大特性&#xff1a;ACID 分布式事务解释面临挑战分布式事务产生场景1. 单体架构中多数据源场景2. 分布式架构场景 分布式事务解决方案jta AtomikosLCN模式问题 Alibaba的Seata解决分布式事务问题 使用MQ解决分布式事务问题问题1&#xff1a;…

2025年计算机毕业设计题目参考

今年最新计算机毕业设计题目参考 以下可以参考 springboot洗衣店订单管理系统 springboot美发门店管理系统 springboot课程答疑系统 springboot师生共评的作业管理系统 springboot平台的医疗病历交互系统 springboot购物推荐网站的设计与实现 springboot知识管理系统 springbo…

管道塞满钢珠,推动一端的钢珠另一端钢珠瞬间掉落,超光速了吗?

管道塞满钢珠&#xff0c;推动一端的钢珠另一端钢珠瞬间掉落&#xff0c;超光速了吗&#xff1f; 现实中我们感觉钢珠瞬间掉落&#xff0c;好像是超光速了&#xff0c;其实不然&#xff0c;那只是我们的错觉。我们日常生活中感受到的速度与光速相比实在太慢了&#xff0c;以至…

MoonBit 亮相港科大「 INNOTECH 创科嘉年华」,技术创新实力备受瞩目

INNOTECH创科嘉年华 6月16日&#xff0c; MoonBit 作为 IDEA 研究院重点项目成果受邀参与一年一度由香港科技大学&#xff08;广州&#xff09;主办的「INNOTECH 创科嘉年华」&#xff0c;作为港科大&#xff08;广州&#xff09;每年最重要的科创实力展示机会&#xff0c;本次…

qmt量化交易策略小白学习笔记第37期【qmt编程之指数数据--如何获取迅投商品市场指数行情数据】

qmt编程之获取商品市场指数数据 qmt更加详细的教程方法&#xff0c;会持续慢慢梳理。 也可找寻博主的历史文章&#xff0c;搜索关键词查看解决方案 &#xff01; 感谢关注&#xff0c;咨询免费开通量化回测与获取实盘权限&#xff0c;欢迎和博主联系&#xff01; 获取迅投商…

“AUTOSAR Nvm_WriteAll()掉电无法正常更新Nvm数据” 问题分析

1、问题现象 再掉电时调用Nvm_WriteAll()函数后&#xff0c;再重新上电&#xff0c;发现下电前更新得NvmBlock数据未被正确更新到Nvm中。掉电时直接调用Nvm_WriteBlock()函数&#xff0c;可以正常更新指定得NvmBlock块。 2、排查 NvM_InterWriteAll()函数有被正常执行。NvM_I…

Python期末复习题库(上)

1. (单选题) Python源程序的扩展名为&#xff08; A &#xff09; A. py B. c C. class D. ph 2. (单选题) 下列&#xff08; A &#xff09;符合可用于注释Python代码。 A. # B. */ C. // D. $ 3. (单选题)下列关于Python 语言的特点的说法中&#xff0c;错误的是&#xf…

【C++修行之道】C/C++内存管理

目录 一、C/C内存分布 1. 选择题&#xff1a; 2. 填空题&#xff1a; 3. sizeof 和 strlen 区别&#xff1f; 二、 C语言中动态内存管理方式&#xff1a;malloc/calloc/realloc/free 1.malloc/calloc/realloc的区别是什么&#xff1f; 2.这里需要free(p2)吗&#xff…

计算机图形学入门15:几何表示

1.几何概论 通过图形学建模表示现实生活中的各种物体&#xff0c;要解决的第一个问题就是如何定义物体形状&#xff0c;而这就涉及到了几何(Geometry)。如下图所示&#xff0c;各种各样的玻璃水杯、车子上的不同部件、水花四溅的模拟、病毒的微观结构等这些几何形状。 那么如何…

Pikachu靶场--文件包含

参考借鉴 Pikachu靶场之文件包含漏洞详解_pikachu文件包含-CSDN博客 文件包含&#xff08;CTF教程&#xff0c;Web安全渗透入门&#xff09;__bilibili File Inclusion(local) 查找废弃隐藏文件 随机选一个然后提交查询 URL中出现filenamefile2.php filename是file2.php&…

MCK主机加固在防漏扫中的关键作用

在当今这个信息化飞速发展的时代&#xff0c;网络安全成为了企业不可忽视的重要议题。漏洞扫描&#xff0c;简称漏扫&#xff0c;是一种旨在发现计算机系统、网络或应用程序中潜在安全漏洞的技术手段。通过自动化工具&#xff0c;漏扫能够识别出系统中存在的已知漏洞&#xff0…

C++项目实战:SPDK文件系统

目录 一、Blobstore设计框架二、Cache机制三、Blob FS I/O操作四、SPDK FUSE (Filesystem in Userspcae) 前言 Blob FS是spdk面向于用户态的轻量级的文件系统 SPDK通过绕过内核(kernel bypass)的方案&#xff0c;构筑了用户态驱动&#xff0c;并利用异步轮询、无锁机制等&a…

函数依赖-函数依赖、平凡函数依赖、完全与部分函数依赖、传递函数依赖

一、引言 函数依赖是关系模式中属性与属性之间存在的一种重要数据依赖 1、将关系模式R的模式结构改为 R&#xff08;SNO&#xff0c;CNO&#xff0c;SN&#xff0c;SD&#xff0c;DD&#xff0c;GRADE&#xff09; 并对属性列进行重命名 R&#xff08;学生学号&#xff0c…

msvcp100.dll已加载但找不到入口点的处理方法,分析比较靠谱的msvcp100.dll解决方法

用户在日常使用中有时会遇到一个错误提示&#xff1a;“已加载 msvcp100.dll&#xff0c;但找不到入口点”。这一信息不仅引发了使用上的不便&#xff0c;也对软件的稳定性产生了质疑。理解并解决该问题不仅对确保计算机正常运行至关重要&#xff0c;也对维护软件的长期稳定性和…

油猴 脚本如何添加包含哪个网址 执行脚本

油猴 脚本如何添加包含哪个网址 执行脚本 在这里面加上就可以 // include *://blog.csdn.net/*/article/details/* // include *.blog.csdn.net/article/details/*

【随手记】贴一段matplotlib绘图的多图拼接代码

二维&#xff1a; import numpy as np import matplotlib.pyplot as pltpic_names ["pic1", "pic2", "pic3", "pic4", "pic5", "pic6", "pic7", "pic8", "pic9", "pic10&qu…