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.算法总结:
不足:计算每个点的距离,因此计算量很大,同时在一个包含有许多变量的数据集中,很难确定合理的权重值,虽然优化可能有助于解决这一问题,但是耗时会很多
好处:无须额外开销的情况下将观测数据加入数据集中,同时在确定权重后更好的掌握数据集的特性,最后在我们怀疑数据集中有其它无法度量的变量时,我们还可以建立概率密度