【Python机器学习】回归——示例:预测乐高玩具套装的价格

用回归法预测乐高套装价格的基本步骤:

1、收集数据:用Google Shopping的API收集到的数据

2、准备数据:从返回的JSON数据中抽取价格

3、分析算法:可视化并观察数据

4、训练算法:构建不同的模型,采用逐步线性回归和直接的线性回归模型

5、测试算法:使用交叉验证来测试不同的模型,分析哪个效果更好

6、使用算法:目标就是生成数据模型

收集数据

Google为用户提供了一套购物的API来抓取价格,API将以JSON格式返回所需的产品信息。Python提供了JSON解析模块,我们可以从返回的JSON格式里整理出所需数据。

具体代码:

import json
from numpy import *
from time import sleep
import urllib.requestdef searchForSet(retX,retY,setNum,yr,numPce,origPrc):sleep(5)myAPIstr='AIzaSyD2cR2KFyx12hXu6PFU-wrWot3NXvko8vY'searchURL='https://www.googleapis.com/shopping/search/v1/public/products?key=%s&country=US&q=lego+%d&alt=json'%(myAPIstr,setNum)pg=urllib.request.urlopen(searchURL)retDict=json.loads(pg.read())for i in range(len(retDict['items'])):try:currItem=retDict['item'][i]if currItem['product']['condition']=='new':newFlag=1else:newFlag=0listOfInv=currItem['product']['inventories']for item in listOfInv:sellingPrice=item['price']if sellingPrice>origPrc*0.5:print(yr,numPce,newFlag,origPrc,sellingPrice)retX.append([yr,numPce,newFlag,origPrc])retY.append(sellingPrice)except:print('problem with item %d' % i)def setDataCollect(retX,retY):searchForSet(retX,retY,8288,2006,800,49.99)searchForSet(retX,retY,10030,2002,3096,269.99)searchForSet(retX,retY,10179,2007,5195,499.99)searchForSet(retX,retY,10181,2007,3428,199.99)searchForSet(retX,retY,10189,2008,5922,299.99)searchForSet(retX,retY,10196,2009,3263,249.99)

上述代码中,第一个函数是searchForSet(),它调用Google购物API并保证数据抽取的正确性。这里需要导入的模块是time.sleep()、json、urllib3。接下来,拼接查询的URL字符串,添加API的key和待查询的套装信息,打开和解析操作通过json.loads()方法实现。完成后将得到一部字典,下面需要做的就是从中找出价格和其他信息。

部分返回结果的是一个产品的数组,我们将在这些产品上循环迭代,判断该产品是否是新产品并抽取它的价格。解析成功后的套装将在屏幕上显示出来并保存在list对象setX和retY中。

最后一个函数是setDataCollect(),它负责多次调用searchForSet()。函数searchForSet()的其他参数是从某网站收集来的,它们也一并输出到文件中。

执行结果:

lgX=[]
lgY=[]
setDataCollect(lgX,lgY)

训练算法:建立模型

上面收集了一些真实数据,下面依据这些数据构建模型。构建出的模型可以对售价做出预测,并帮助我们理解现有数据。

首先需要添加对应常数项的特征X0(X0=1),为此创建一个全1的矩阵,然后将原数据矩阵lgX复制到新数据矩阵lgX1的第一列到第5列:

lgX1=mat(ones((58,5)))
lgX1[:,1:5]=mat(lgX)

最后,在这个新数据集上进行回归处理:

ws=standRegres(lgX1,lgY)

下面使用缩减法的一种,即岭回归在进行一次试验:

def crossValidation(xArr,yArr,numVal=10):m=len(yArr)indexList=range(m)errorMat=zeros((numVal,30))for i in range(numVal):trainX=[]trainY=[]testX=[]testY=[]random.shuffle(indexList)for j in range(m):if j<m*0.9:trainX.append(xArr[indexList[j]])trainY.append(yArr[indexList[j]])else:testX.append(xArr[indexList[j]])testY.append(yArr[indexList[j]])wMat=ridgeTest(trainX,trainY)for k in range(30):#用训练时的参数将测试数据标准化matTestX=mat(testX)matTrainX=mat(trainX)meanTrain=mean(matTrainX,0)varTrain=var(matTrainX,0)matTestX=(matTestX-meanTrain)/varTrainyEst=matTestX*mat(wMat[k,:]+mean(trainY))errorMat[i,k]=rssError(yEst.T.A,array(testY))meanErrors=mean(errorMat,0)minMean=float(min(meanErrors))bestWeights=wMat[nonzero(meanErrors==minMean)]xMat=mat(xArr)yMat=mat(yArr).TmeanX=mean(xMat,0)varX=var(xMat,0)unReg=bestWeights/varXprint('岭回归下最好的模型是:',unReg)print(-1*sum(multiply(meanX,unReg))+mean(yMat))

上述代码中,函数crossValidation()有三个参数,前两个参数lgX和lgY存有数据集中的X值和Y值的list对象,默认lgX和lgY具有相同的长度。第三个参数numVal是算法中交叉验证的次数,如果该值没有指定,就取默认值10。函数crossValidation()首先计算数据点的个数m。创建好了训练集和测试集容器,之后创建了一个list并使用NumPy提供的random.shuffle()函数对其中的元素进行混洗,因此可以实现训练集或测试集的随机选取。将数据集的90%分割成训练集,其余10%为测试集,并将二者分别放入对应容器中。

一旦对数据点进行混洗之后,就建立了一个新的矩阵wMat来保存岭回归中的所有回归系数。接下来我们在上述测试集上用30组回归系数来循环测试回归效果。岭回归需要使用标准化后的数据,因此测试数据也需要与测试集相同的参数来执行标准化。之后用rssError()计算误差,并将结果草存在errorMat中。在所有交叉验证完成后,errorMat保存了ridgeTest()里每个\lambda对应的多个误差值。为了将得出的回归系数与standRegres()作对比,需要计算这些误差估计值的均值。有一点需要注意的是:岭回归使用了数据标准化,而standRegres()则没有,因此为了将上述比较可视化,还需要将数据还原。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

操作ArkTS页面跳转及路由相关心得

本文为JS老狗原创。 当前端不得不关注的点&#xff1a;路由&#xff0c;今天聊一聊鸿蒙相关的一点心得。 总体上套路不意外&#xff0c;基本就是&#xff08;尤其是Web&#xff09;前端那些事&#xff1a;维护路由表、跳转带参数、历史堆栈操作&#xff0c;等等。 历史原因&…

设计模式20-备忘录模式

设计模式20-备忘录 动机定义与结构定义结构 C代码推导优缺点应用场景总结备忘录模式和序列化备忘录模式1. **动机**2. **实现方式**3. **应用场景**4. **优点**5. **缺点** 序列化1. **动机**2. **实现方式**3. **应用场景**4. **优点**5. **缺点** 对比总结 动机 在软件构建过…

云服务器和物理服务器的优缺点对比

云服务器优点在于灵活性强、成本效益高、易于扩展且支持全球化部署&#xff1b;缺点则包括安全性与可控性相对较弱&#xff0c;性能可能受限&#xff0c;以及存在服务中断风险。物理服务器则以其高性能、高稳定性、强安全性和完全可控性著称&#xff0c;但成本较高、扩展性受限…

鸿蒙OS ArkTS 省市县级联选择框,封装组件

背景&#xff1a; 公司现在要开发纯血鸿蒙版本APP&#xff0c;我被抽调过来做点功能。现在要做一个省市县级联选择框&#xff0c;并且要封装为组件&#xff0c;供其他页面模块使用。 效果图&#xff1a; 难点&#xff1a; 1. 现在官方文档上只是查到了TextPicker组件是可以做…

Vue3+setup使用vuemap/vue-amap实现地图相关操作

首先要下载依赖并且引入 npm安装 // 安装核心库 npm install vuemap/vue-amap --save// 安装loca库 npm install vuemap/vue-amap-loca --save// 安装扩展库 npm install vuemap/vue-amap-extra --save cdn <script src"https://cdn.jsdelivr.net/npm/vuemap/vue-a…

软件测试需要具备的基础知识【功能测试】---前端知识(三)

​ ​ 您好&#xff0c;我是程序员小羊&#xff01; 前言 为了更好的学习软件测试的相关技能&#xff0c;需要具备一定的基础知识。需要学习的基础知识包括&#xff1a; 1、计算机基础 2、前端知识 3、后端知识 4、软件测试理论 后期分四篇文章进行编写&#xff0c;这是第二篇 …

使用es-hadoop同步hive和es之间数据

&#x1f4bb;近期在华为云连接es时的时候发现不能输入账号密码&#xff0c;后面联系华为工程师了解到&#xff0c;华为云默认是非安全模式&#xff0c;即不需要输入账号密码。 如果对你有所帮助&#xff0c;欢迎点赞收藏关注不迷路哦&#x1f493; 目录 使用es-hadoop同步h…

AI时代,我们还可以做什么?

最近看了本书&#xff0c;书名叫做《拐点&#xff1a;站在 AI 颠覆世界的前夜》&#xff0c;作者是万维钢。 本想着看完后&#xff0c;就能掌握一整套 AI 技巧&#xff0c;结果——竟然学了很多道理。 这本书讨论了以下话题&#xff1a; 我们该怎么理解这个 AI 大时代的哲学&am…

国产数据库备份恢复实现

数据库备份恢复是数据库高可用的基本能力&#xff0c;如何通过备份数据快速高效的恢复业务并且满足不同场景下的恢复需求&#xff0c;是各数据库厂商需要关注的要点。本文将介绍几种国产数据库的备份恢复功能&#xff0c;以加深了解。 1、数据库备份恢复方案 数据库备份是生产…

函数实例讲解(七)

文章目录 清洗数据的函数&#xff08;TRIM、CLEAN&#xff09;1、TRIM2、CLEAN3、CONCATENATE4、TEXTJOIN 函数综合练习COUNTIF Excel函数总结1、判断类2、求和类3、计数类4、求平均5、查找引用类6、求数据极值类7、四舍五入类8、提取类9、日期类10、文本处理类11、随机数12、排…

基于SpringBoot+Vue的校园失物招领系统(带1w+文档)

基于SpringBootVue的校园失物招领系统(带1w文档) 基于SpringBootVue的校园失物招领系统(带1w文档) 本课题研发的校园失物招领系统管理系统&#xff0c;就是提供校园失物招领系统信息处理的解决方案&#xff0c;它可以短时间处理完信息&#xff0c;并且这些信息都有专门的存储设…

MyBatis 基本操作 - 注解版

目录 一&#xff0c;查询 - select 1.1 全列查询 1.2 指定列查询 1.3 赋值问题 方法一&#xff1a;起别名 方法二&#xff1a;结果映射 方法三&#xff1a;添加配置 二&#xff0c;新增 - Insert 2.1 使用对象插入 2.2 获取主键 三&#xff0c;删除 - Delete 四&am…

nestjs 全栈进阶--文件上传

nest new upload -p pnpm pnpm i multer pnpm i -D types/multer 允许跨域 1. 单文件上传 我们去新增一个用于上传的handler Post(upload) UseInterceptors(FileInterceptor(file, {dest: uploads })) uploadFile(UploadedFile() file: Express.Multer.File, Body() body) {…

Git使用错误分析

一.fatal: Pathspec is in submodule 我做了这样的错误操作&#xff0c;在一个仓库下的一个子目录&#xff0c;执行了git init 创建了一个子仓库&#xff0c;然后想删掉这个子仓库&#xff0c;就只删除了该子目录下的.git文件夹&#xff0c;而没有删除缓存&#xff0c;执行如下…

Python | Leetcode Python题解之第328题奇偶链表

题目&#xff1a; 题解&#xff1a; class Solution:def oddEvenList(self, head: ListNode) -> ListNode:if not head:return headevenHead head.nextodd, even head, evenHeadwhile even and even.next:odd.next even.nextodd odd.nexteven.next odd.nexteven even…

UVM(3)TLM通信

基本定义 A的方框称之为PORT&#xff0c;B的圆圈称之为EXPORT 要注意&#xff1a;无论是get还是put操作&#xff0c; 其发起者拥有的都是PORT端口&#xff0c; 而不是EXPORT transport操作&#xff0c; 如 transport操作相当于一次put操作加一次get操作&#xff0c; 数据流先…

Spring统一功能处理:拦截器、响应与异常的统一管理

目录 一.拦截器 二.统一数据返回格式 三.统一异常处理 一.拦截器 拦截器是Spring框架提供的核⼼功能之⼀&#xff0c;主要⽤来拦截⽤⼾的请求&#xff0c;在指定⽅法前后&#xff0c;根据业务需要执⾏预先设定的代码。 也就是说&#xff0c;允许开发⼈员提前预定义⼀些逻辑…

c语言-文件

11 文件 目录 11 文件 一、文件系统 二、文件操作方式 1、基于缓冲区文件操作 2、基于非缓冲区文件操作 三、文件操作的常用函数 1、fopen 2、fclose 3、fputc 4、fgetc 5、rewind 6、fseek 7、fputs 8、fgets 9、fwrite 10、fread 11、fprintf 12、fscanf …

【Redis】数据结构篇

文章目录 键值对数据库是怎么实现的&#xff1f;动态字符串SDSC 语言字符串的缺陷SDS结构设计 整数集合整数集合结构设计整数集合的升级操作 哈希表哈希表结构设计哈希冲突链式哈希Rehash渐进式rehashrehash触发条件 压缩列表压缩列表结构设计连续更新压缩列表的缺陷 quicklist…

【Material-UI】Checkbox组件:Indeterminate状态详解

文章目录 一、什么是Indeterminate状态&#xff1f;二、Indeterminate状态的实现1. 基本用法示例2. 代码解析3. Indeterminate状态的应用场景 三、Indeterminate状态的UI与可访问性1. 无障碍设计2. 用户体验优化 四、Indeterminate状态的最佳实践1. 状态同步2. 优化性能3. 提供…