构建价格模型

KNN(k-nearest neighbors)价格预测模型:

{

attr1:value,attr2:value2,...,attrn:valuen,price:num

}

算法思路:

1.先求训练集数据和给定的测试数据的欧几里得距离;

2.然后进行排序,选取前k项,利用距离计算权重(使得距离最近的点,对结果影响越大);

a.反函数

b.减法函数

c.高斯函数

3.对前k项的价格求加权平均值

4.用交叉验证(95%作为训练集、剩下的作为测试集)和成本函数的方法,来得到最优的权重计算方法和最合适的k值,进而得到最优的预测方法

5.对于不对称分布:当价格有折扣时,预测价格落入某一给定区间的概率,比直接预测价格更优意义:

找出最邻近的k个点,判断k个点在给定区间的概率

数据的预处理:

对于不在同一值域内的数值:

1.对于知道哪些变量重要后,按比例缩放:除以/N,进行归一化处理

2.利用成本函数,结合交叉验证,找出最优的权重向量

1.商业目的:

对数值型的数据进行预测,贝叶斯分类器、决策树、支持向量机都是不合适的

预测数值并显示预测的概率分布情况

2.数据准备:

考查价格并非简单的按照商品尺寸或者特征数量的增长而成比例增加的数据值

这里考查葡萄酒价格:

酒的价格根据酒的等级及其储藏的年代共同来决定的,该模型假设葡萄酒有“峰值年”现象:即较峰值年而言,年份早的酒的品质稍好些,过了峰值年品质稍差些;一瓶高等级的葡萄酒将从高价位开始,价格逐渐走高至峰值年,而低等级的酒从一个低价位开始,尔后一路走低:

    

    

3.构建模型:

i.算法选择:

通过寻找与当前关注商品情况相似的一组商品,对此组商品的价格求均值,进而预测价格,此方法称为k-最近邻算法(k-nearest neighbors, kNN)

ii.模型构建:

a.近邻数:

k是为了求得最终结果而参与求平均运算的商品数,理想情况下是1,但是训练的数据里有嗓音,因此一般多选择几个近邻来取平均数,而近邻太多,也会降低准确性,所以需要根据不同的数据集加以手工选择,或者采取一些优化措施

b.定义相似度:

使用欧几里得距离来衡量商品间的距离,但是这是在假设所有的属性对价格的影响一致的前提下,所以需要考虑每个属性的权重问题:

c.算法实现:

先求训练集数据和给定的测试数据的距离;

然后进行排序;对前k项的价格求平均值

尝试不同的k值,找出对此组商品最合适的k值

      

4.模型迭代:

i.问题:

上述方法可能会导致选择距离太远的近邻,一种补偿的方法是根据距离为其赋以相应的权重,将距离转化为权重

ii.解决方案:

a.反函数:

定义:直接对距离求倒数,得到权重,

缺点:为近邻赋予很大的权重,而稍远的项,其权重衰退的太快

          

b.减法函数:

定义:用常量减去距离,结果大于0,则为权重;否则权重为0

缺点:避免了为近邻项分配过大的权重,但是权重最终都会跌到0,可能找不到距离足够近的项,更无法进行预测

c.高斯函数:

定义:距离为0,权重为1,权重随距离增加而减少,但是不会减少到0

iii.加权knn:

根据求得的距离,得到加权数,然后对前k个元素的权重*价格求平均

5.模型评估:

i.交叉验证:

把数据分为训练集(95%)和测试集,然后用训练集对测试集进行模型计算,根据预测值和真实值间的差值的平方和(凸显较大的差值),来评估算法的效果:包括加权函数、k值的验证

     

     

6.数据的调整:

i.同类的变量:

用来预测价格的所有变量大致上都是可比较的,且对最终结果都很重要。同时这些变量位于同一值域范围内,所以用这些变量算出距离值是有意义的

ii.不同类型(值域范围)、无关变量的过滤

a.调整数据集:

b.对不在同一值域里的值最归一化处理:

按比例缩放,比如对大值域的值除以/n,来弱化

c.将不相关的变量缩小为0,通过传入一个向量(代表每列的缩放比),来准备数据

          

iii.使用成本函数最优化缩放向量

a.可以方便的利用交叉评价的结果作为成本函数(满足一组输入,效果越差,输出越大即可)

b.用模拟退火或者更慢精度更高的遗传算法来进行优化,得到缩放向量

7.数据的进一步挖掘:

i.问题:

我们假设的价格没有带上折扣价格,所以并不能反应某人最终的购买情况,我们需要从另一方面对数据进行考查

ii.概率密度:

知道某瓶酒落入指定区间的概率也是一件非常值得关注的事情

iii.思想:

先求最邻近的k个点,然后计算k个点中统计价格落入给定区间的点的距离,占到k个点总体距离的概率

8.算法总结:

不足:计算每个点的距离,因此计算量很大,同时在一个包含有许多变量的数据集中,很难确定合理的权重值,虽然优化可能有助于解决这一问题,但是耗时会很多

好处:无须额外开销的情况下将观测数据加入数据集中,同时在确定权重后更好的掌握数据集的特性,最后在我们怀疑数据集中有其它无法度量的变量时,我们还可以建立概率密度

时间: 2024-11-06 22:42:47

构建价格模型的相关文章

从头认识java-13.5 利用泛型构建复杂模型

这一章节我们来展示一下如何利用泛型构建复杂模型? 1.元组列表 我们之前已经说过元组是一个复杂的模型,能够返回多对象. package com.ray.ch11; import java.util.ArrayList; public class Test { public ArrayList<Tuple<A, B, C>> test() { ArrayList<Tuple<A, B, C>> list = new ArrayList<Tuple<

ROS 实时构建八叉树模型

ROS 实时构建八叉树模型 ROS 毕业设计的主要内容是室内环境的建模,并转换成八叉树模型,以供后续使用之需.这里介绍离线八叉树模型建立和实时的八叉树环境模型构建. 1. 环境搭建 平台: ubuntu下ROS,用过hydro和indigo,其他版本有待确认(ros的安装请参考ros wiki): 开源室内建模项目,ROS下了解的RGBD开源项目有RGBD_SLAM和rtabmap,这里使用的是rtabmap,rtabmap的安装请参考ros rtabmap. ros下的octomap包,安装$

Java编程思想:构建复杂模型

import sun.nio.cs.Surrogate; import java.util.ArrayList; import java.util.Random; public class Test { public static void main(String[] args) { Store.test(); } } /* 15.6 构建复杂模型 需求: 这是一个很有趣的需求,它描述的是一个零售店,零售店里包括走廊.货架 和商品,零售店里有很多条走廊,走廊里又有很多个货架.货架中又有很多 的商

spark机器学习笔记:(五)用Spark Python构建分类模型(下)

声明:版权所有,转载请联系作者并注明出处  http://blog.csdn.net/u013719780?viewmode=contents 博主简介:风雪夜归子(英文名:Allen),机器学习算法攻城狮,喜爱钻研Meachine Learning的黑科技,对Deep Learning和Artificial Intelligence充满兴趣,经常关注Kaggle数据挖掘竞赛平台,对数据.Machine Learning和Artificial Intelligence有兴趣的童鞋可以一起探讨哦,

基于Spark和Tensorflow构建DCN模型进行CTR预测

实验介绍 数据采用Criteo Display Ads.这个数据一共11G,有13个integer features,26个categorical features. Spark 由于数据比较大,且只在一个txt文件,处理前用split -l 400000 train.txt对数据进行切分. 连续型数据利用log进行变换,因为从实时训练的角度上来判断,一般的标准化方式,如Z-Score和最大最小标准化中用到的值都跟某一批数据的整体统计结果有关,换一批数据后标准化就程度就不一样了. 而对于离散型分

Spark学习笔记——构建分类模型

Spark中常见的三种分类模型:线性模型.决策树和朴素贝叶斯模型. 线性模型,简单而且相对容易扩展到非常大的数据集:线性模型又可以分成:1.逻辑回归:2.线性支持向量机 决策树是一个强大的非线性技术,训练过程计算量大并且较难扩展(幸运的是,MLlib会替我们考虑扩展性的问题),但是在很多情况下性能很好: 朴素贝叶斯模型简单.易训练,并且具有高效和并行的优点(实际中,模型训练只需要遍历所有数据集一次).当采用合适的特征工程,这些模型在很多应用中都能达到不错的性能.而且,朴素贝叶斯模型可以作为一个很

面向小数据集构建图像分类模型Keras

文章信息 本文地址:http://blog.keras.io/building-powerful-image-classification-models-using-very-little-data.html 本文作者:Francois Chollet 概述 在本文中,我们将提供一些面向小数据集(几百张到几千张图片)构造高效.实用的图像分类器的方法. 本文将探讨如下几种方法: 从图片中直接训练一个小网络(作为基准方法) 利用预训练网络的bottleneck(瓶颈)特征 fine-tune预训练网

python构建模拟模型——网站独立访问用户数量

背景:发现一个有趣的现象,即一些用户在每一月都仅仅访问网站一次,我们想要了解这些人数量的变化趋势. 建立数学模型:简化问题,根据瓮模型推导出公式(具体推导见<数据之魅>,有时间再补充...):n(t)=N(1-e^((-k/N)*t)),其中,t代表一个月中的第t天,N代表潜在的总的访问人数,k为根据网站日志计算的每日平均访问量,n(t)代表第t天为止,访问此网站的用户总人数. python模拟,并和分析的模型作比较: import math import random as rnd impo

keras: 在构建LSTM模型时,使用变长序列的方法

众所周知,LSTM的一大优势就是其能够处理变长序列.而在使用keras搭建模型时,如果直接使用LSTM层作为网络输入的第一层,需要指定输入的大小.如果需要使用变长序列,那么,只需要在LSTM层前加一个Masking层,或者embedding层即可. from keras.layers import Masking, Embedding from keras.layers import LSTM model = Sequential() model.add(Masking(mask_value=