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

ops/2024/10/18 14:21:42/

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

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

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

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

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

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

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

收集数据

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

具体代码:

python">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()的其他参数是从某网站收集来的,它们也一并输出到文件中。

执行结果:

python">lgX=[]
lgY=[]
setDataCollect(lgX,lgY)

训练算法:建立模型

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

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

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

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

python">ws=standRegres(lgX1,lgY)

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

python">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.ppmy.cn/ops/94358.html

相关文章

书生.浦江大模型实战训练营——(三)Git基本操作与分支管理

最近在学习书生.浦江大模型实战训练营&#xff0c;所有课程都免费&#xff0c;以关卡的形式学习&#xff0c;也比较有意思&#xff0c;提供免费的算力实战&#xff0c;真的很不错&#xff08;无广&#xff09;&#xff01;欢迎大家一起学习&#xff0c;打开LLM探索大门&#xf…

Cannot connect to the Docker daemon at unix:///var/run/docker.sock. 问题解决

问题描述 原来我的服务器docker服务运行正常&#xff0c;但在某次尝试用时, 根据系统的错误提示执行了snap install docker指令之后&#xff0c; 再执行docker ps命令则提示Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running…

C语言strpbrk函数

目录 开头1.什么是strpbrk函数?2.strpbrk函数的内部程序流程图 3.strpbrk函数的实际应用定位字符串中的字符求元音字母(a e i o u A E I O U)的个数NB158 牛牛的名字游戏 结尾 开头 大家好&#xff0c;我叫这是我58。今天&#xff0c;我们要学一下关于C语言里的能定位字符串中…

Mysql绕过小技巧

上源码。 <?php $mysqli new mysqli("localhost", "root", "root", "security");/* check connection */ if ($mysqli->connect_errno) {printf("Connect failed: %s\n", $mysqli->connect_error);exit(); }$my…

Android全面解析之context机制(二): 从源码角度分析context创建流程(上)

前言 这篇文章从源码角度分析context创建流程。 在上一篇Android全面解析之Context机制(一) :初识context一文中讲解了context的相关实现类。经过前面的讨论&#xff0c;读者对于context在心中有了一定的理解。但始终觉得少点什么&#xff1a;activity是什么时候被创建的&…

消费类电子产品日用品外观全案设计学习的思考

1. 如下脑图稍微对于消费类电子产品&日用品外观的全案设计需要学习的内容进行了整理&#xff1b; 2. 除了日常的积累&#xff0c;观察和理论的学习外&#xff0c;实践部分也需要重视起来&#xff0c;首先是手绘&#xff0c;无论后续工作中是用手绘还是板绘&#xff0c;手绘…

JavaScript 基础(四)

五、DOM编程 1.常用事件 onload 页面加载后触发事件 onscroll 滚动时触发 onresize 尺寸变化时 onclick 鼠标点击 onmouseover 鼠标悬停 onmouseout 鼠标移出 onmousemove 鼠标移动&#xff0c;会触发多次 onfocus 对象获得光标&#xff08;焦点&#xff09;时&#x…

超详细!!!electron-vite-vue开发桌面应用之引入UI组件库element-plus(四)

云风网 云风笔记 云风知识库 一、安装element-plus以及图标库依赖 npm install element-plus --save npm install element-plus/icons-vue npm i -D unplugin-icons二、vite按需引入插件 npm install -D unplugin-vue-components unplugin-auto-importunplugin-vue-componen…