线上房源推荐在房地产行业的应用实践

采用协同过滤,进行客户线上房源的推荐,算法的核心是根据用户-物品矩阵,进行交叉推荐,其目的根据客户行为的数据,把客户最感兴趣但未访问过的房源推荐给客户。

1.1     ALS算法原理

注:参考文献:http://blog.csdn.net/legotime/article/details/51836030

通过用户对物品的打分行为构建评分矩阵,根据打分的结果进行协同推荐。

原理

下面从文献1中取材,来讲解这个交替最小二乘法在推荐系统中应用的问题。如下图,对于一个R(观众对电影的一个评价矩阵)可以分解为U(观众的特征矩阵)和V(电影的特征矩阵)


现在假如观众有5个人,电影有5部,那么R就是一个5*5的矩阵。假设评分如下:

假设d是三个属性(性格,文化程度,兴趣爱好)那么U的矩阵如下:

V的矩阵如下:

仔细的人或许发现是R约等于U*V,为什么是约等于呢?因为对于一个U矩阵来说,我们并不可能说(性格,文化程度,兴趣爱好)这三个属性就代表着一个人对一部电影评价全部的属性,比如还有地域等因素。但是我们可以用“主成分分析的思想”来近似(我没有从纯数学角度来谈,是为了大家更好理解)。这也是ALS和核心:一个评分矩阵可以用两个小矩阵来近似(ALS是NNMF问题下在丢失数据情况下的一个重要手段)。

那么如何评价这两个矩阵的好坏?

理想的情况下:

但是实际中我们求使用数值计算的方法来求,那么计算得到的就会存在误差,如何评价的好坏。采用如下表达

其中RMSE的意思是均方根误差(root mean square error),是u对v评分的预测值,是u对v评分的观察值。

   的表达如下:

那么就是转化的要求和和,

现在出现了一共有个参数需要求解,而且碰到以下问题:

(1)、我们所知道的K矩阵是稀疏矩阵(K就是R在U对V没有全部评价的矩阵)

(2)、K的大小远小于远小于R的密集对应的大小

在解决这样的一个问题是采用拟合数据的形式来进行解决数据是稀疏的问题,公式如下:

note:其实后面的是为了解决过拟合问题而增加的。

对于ALS来求解這样這个问题的思想是:先固定或者,然后就转化为最小二乘法的问题了。他這样做就可以把一个非凸函数的问题转为二次函数的问题了。下面就求解步骤[1]:
步骤1:初始化矩阵V(可以取平均值也可以随机取值)

步骤2:固定V,然后通过最小化误差函数(RMSE)解决求解U

步骤3:固定步骤2中的U,然后通过最小化误差函数(RMSE)解决求解V

步骤4:反复步骤2,3;直到U和V收敛。

梳理:为什么是交替,从处理步骤来看就是确定V,来优化U,再来优化V,再来优化U,。直到收敛。

因为采用梯度下降和最小二乘都可以解决這个问题,在此不写代码来讲如何决定参数,可以看前面的最小二乘或者梯度下降算法。下面结合matlab来展示一下,利用主成分分析,借助ALS来完善丢失数据来预测电影评分的效果:

%目的

% 通过主成分分析,用ALS来优化,同时来得到潜在的评分,数据就是上面观众看电影数据

load Data.txt

R = Data;

[coeff1,score1,latent,tsquared,explained,mu1] = pca(R,'algorithm','als');

%% 参数

%coeff1  主成分系数

%  .2851   -0.5043   0.8124   -0.0266

%  0.9230   -0.0764  -0.3655    0.0830

%  -0.1822   -0.4338  -0.1826    0.8602

%  -0.0890   -0.2844  -0.0782   -0.0986

%   0.1602    0.6861   0.4085    0.4927

%score1  主成分得分

% 3.1434   -2.0913   -0.1917  -0.0505

%  -3.1122    0.5615  -0.1839   -0.2997

%  -4.9612   -0.4934  -0.0388    0.2334

%  3.3091    1.5365  -0.4941    0.1154

%   1.6210    0.4868   0.9086    0.0014

%latent  主成分方差

%14.4394

%  1.8826

%   0.2854

%   0.0400

%tsquared Hotelling的T平方统计,在X每个观测

%3.2000

%   3.2000

%   3.2000

%   3.2000

%   3.2000

%explained 向量包含每个主成分解释的总方差的百分比

% 86.7366

%  11.3084

%  1.7145

%  0.2405

%mu1 返回的平均值

% 5.2035    3.8730    4.6740   4.7043    5.0344

%% 重建矩阵(预测)

p = score1*coeff1' + repmat(mu1,5,1)

%7.0000    7.0000    5.0000   5.0393    4.0000

%3.8915    1.0000    4.7733   4.8655    4.6982

%4.0000   -0.6348    6.0000   5.2662    4.0000

% 4.9677    7.0000    3.5939   4.0000    6.4738

%6.1583    5.0000    4.0027   4.3503    6.0000

模型输入数据的核心是包含两类数据的采集,第一类即线上客户访问的房源行为数据,如客户浏览的每一套房源的频次,停留时长,是否与线上经纪人进行沟通,沟通后购买的意见等。第二类是房源属性的数据,如房屋总价,面积,朝向,户型,经纬度等。

再来分析一下Spark对ALS优化参数部分,这部分因为“观看者”和“电影”数据进行了block化(源码对其两个参数命名为:User和products,为了和源码一样,所以接下来的分析用User和products这两个名字),所以拉来重点说:

官方参考文献参考的是文献3,它的核心思想是,对User数据和products数据进行Block化,目的:减少数据通信。

为了让大家清楚block可以带减少数据通信的优势,我极端化分析一下,也就是把上面每个用户和每个电影都block,即根据推荐的电影,复制对应的用户。

从上图可以发现,在进行参数优化确定V,来优化U,再来优化V,再来优化U,。。。。直到收敛,这样的一个过程,对数据进行Block化确实可以减少通信消耗,即拿空间换时间。

1.1     客户评分算法

因为房产是一个高价位的产业,给客户进行转化同推荐的商品,也应该为同价位内,

行协同推荐,因此我们根据业务的经验,将房价的价位分为1-10个分段。

【1-200万】(200-250万】(250-250万】(300-350万】(350-400万】(400-500万】(500-600万】(600-700万】(700-800万】(800-0-0万)。

(1)评分计算公式

客户得分=【1-4分】户型+【1-4分】面积+【0-1分】客户访问频次+【0-1分】客户访问时长,结合了两类算法,即四分位法与业务经验法,访问数据范围为客户最近30天的记录。

1)房型与面积四分位法

l  房型与面积四分位法

在每一个价位段内,采用四分位法,对居室数量,面积进行离散化,离散的数值从小到大[1,2,3,4]。这样所达到的效果是同价位的房产,面积和房型大的,越容易推荐给客户,客户也越容易接受。

2)访问时长与访问频次业务经验分段

l  访问时长得分范围为(0,1】,初步离散如下

访问一套房屋的停留时长:【1-5秒】=0分, 【5-30秒】=0.5分, 【30-60秒】=1分, 【60-90秒】=0.7分, 【90-150秒】=0.5分, 【150-00秒】=0.3分

l  访问频次得分范围为(0,1】,初步离散如下

访问一套房屋的频次:【0-2次】=0.5分, 【2-4次】=0.7分, 【4-6次】=1分, 【6次-00次】=0.5分

1.2     ALS模型计算推荐分数

按天每一次城市,每一个价位,所有的用户,所有的房产,使用ALS模型进行计算推荐分数。计算的结果如下所示:

为什么要用有的用户,所有的房产进行协同推荐呢?是因为这样可以尽可能多的把客户感兴趣的房产推荐出来,但是这样又带了一个比较大性能开销,特别是使用spark内存计算时,会产品大量的shuffle开销,如何减少spark shuffle所带来的时间成本呢?笔者的经验是让spark尽可能多的分区内计算,再合并结果。那么如何尽可能多的分区内计算呢?在这里,我们引入了uidp字段,即根据userid的hashcod,进行取10模后保存结果到uidp,这样在以客户uid为内存计算时,shuffle的开销将会大幅降低,具体以后进spark调优时细讲。

1.3     客户访问中心点聚类

找出每一个用户访问房产的中心位标,采用如下算法进行。

注:最大的类对应的中心点,即用户访问房产的中心点。

最短距离法是指对数据各特征维度标准化后,通过计算数据间的距离,将距离较近的数据认定为相似数据,划分为同一类别的算法。

       算法步骤为:

(一)数据标准化

       对数据的每一个特征维度进行标准化处理,标准化公式为:

 

(二)数据距离计算

       使用曼哈顿距离计算公式,对成对数据间的距离进行计算,公式形如:

 

       其中i、j分别为两条数据,X、Y为数据的不同特征。

(三)类别划分

       将数据间的距离按数据顺序排列为上三角矩阵,以0.1为最远距离,按行遍历,找出范围内所有数据点视为一类,如果某个档位没有对应的类成员,则不计入类数量。数据只能属于某一类,不存在类间有交集的情况。聚类目标为尽可能找到

(四)算法样例

       样例数据:

名称

时间

停留时长

时间点

停留时长标准化

时间点标准化

MAC1

9:00

60

540

0.97

0.00

MAC2

9:00

60

540

0.97

0.00

MAC3

9:05

61

545

1.00

0.01

MAC4

9:11

60

551

0.97

0.03

MAC5

9:12

60

580

0.97

0.10

MAC6

9:25

60

565

0.97

0.06

MAC7

15:00

60

960

0.97

1.00

MAC8

15:00

60

960

0.97

1.00

MAC9

10:00

30

600

0.00

0.14

      

       求得距离矩阵:

 

MAC1

MAC2

MAC3

MAC4

MAC5

MAC6

MAC7

MAC8

MAC9

MAC1

0

0.000

0.044

0.026

0.095

0.059524

1.000

1.000

1.111

MAC2

 

0

0.044

0.026

0.095

0.060

1.000

1.000

1.111

MAC3

 

 

0

0.047

0.116

0.080

1.020

1.020

1.131

MAC4

 

 

 

0

0.069

0.033

0.974

0.974

1.084

MAC5

 

 

 

 

0

0.036

0.905

0.905

1.015

MAC6

 

 

 

 

 

0

0.940

0.940

0.940

MAC7

 

 

 

 

 

 

0

0.000

1.825

MAC8

 

 

 

 

 

 

 

0

1.825

MAC9

 

 

 

 

 

 

 

 

0

 

如上例所示,距离矩阵第一行中,MAC1与MAC2-6距离符合要求,可归为同一类。同理可得MAC7、8为一类,MAC9为一类。


1.4     二次规划

(一)算法原理

最短距离法具有运算快速的特点,但聚类结果与数据顺序存在一定的相关性,导致聚类结果不一定是最优解,因此在最短距离法的基础上提出二次规划算法。

二次规划算法将距离矩阵由上三角矩阵变为完全矩阵,在划分类别前遍历整个矩阵,统计每行能划分出最大类的大小,最终以全局最大类所在行优先分类,得到最优解。

(二)算法样例

       样例数据:

名称

时间

停留时长

时间点

停留时长标准化

时间点标准化

MAC1

9:00

60

540

0.97

0.00

MAC2

9:15

60

555

0.97

0.04

MAC3

9:20

61

560

1.00

0.05

MAC4

9:30

60

570

0.97

0.07

MAC5

10:00

60

600

0.97

0.14

MAC6

10:07

60

607

0.97

0.16

MAC7

10:12

60

612

0.97

0.17

MAC8

10:16

60

616

0.97

0.18

MAC9

11:00

30

660

0.00

0.29

 

       求得距离矩阵:

 

MAC1

MAC2

MAC3

MAC4

MAC5

MAC6

MAC7

MAC8

MAC9

MAC1

0

0.036

0.080

0.071

0.143

0.159524

0.171

0.181

1.253

MAC2

0.036

0

0.044

0.036

0.107

0.124

0.136

0.145

1.218

MAC3

0.08

0.044

0

0.056

0.127

0.144

0.156

0.166

1.238

MAC4

0.071

0.036

0.056

0

0.071

0.088

0.100

0.110

1.182

MAC5

0.143

0.107

0.127

0.071

0

0.017

0.029

0.038

1.111

MAC6

 

 

 

 

 

0

0.012

0.021

0.012

MAC7

 

 

 

 

 

 

0

0.010

1.082

MAC8

 

 

 

 

 

 

 

0

1.073

MAC9

 

 

 

 

 

 

 

 

0

 

       上例可得,使用最短距离法时将按距离矩阵中第一行标注颜色所示进行分类,二次规划法则以第四行标注颜色所示进行分类。显然,该例中二次规划法所聚最大类中包含数据数量多于最短距离法所聚最大类。

       综上,二次规划法由于预先统计了矩阵情况,导致算法效率略逊于最短距离法,但找出最优解的能力强于最短距离法。

1.5     距离得分排序

根据距离中心的长度,进行距离分段为【0-1公里】(1-2公里】(2-3公里】(3-4公里】(4-5公里】(6-00公里】。

将每一个客户,每一个价位分段,每一个距离分段下,计算得分排序。如在1公里内的【0,200万】的房产,得分最高的排名第一位,依次类推。

注:采用的算法为分组排序法。

 

1.6     结果获取

Used+totaled+dislevel,即a用户在(0,200万】价位的房产下(totaled=1),在距离聚类的中心点1公里的范围内(dislevel=1),rank=1的房产,即是他最感兴趣的房产。

 

       上例可得,使用最短距离法时将按距离矩阵中第一行标注颜色所示进行分类,二次规划法则以第四行标注颜色所示进行分类。显然,该例中二次规划法所聚最大类中包含数据数量多于最短距离法所聚最大类。

       综上,二次规划法由于预先统计了矩阵情况,导致算法效率略逊于最短距离法,但找出最优解的能力强于最短距离法。

1.7     距离得分排序

根据距离中心的长度,进行距离分段为【0-1公里】(1-2公里】(2-3公里】(3-4公里】(4-5公里】(6-00公里】。

将每一个客户,每一个价位分段,每一个距离分段下,计算得分排序。如在1公里内的【0,200万】的房产,得分最高的排名第一位,依次类推。

注:采用的算法为分组排序法。

 

1.8    通过线上客户点击率分析模型效果

模型上线后,我们采用第三方点击效果比较后,发现无论是访问数还是浏览量,均比之前的算法,有比较明显的提升。



1.9  总结

本次探讨了使用ALS协同过滤算法,进行线上的客户房源推荐,充分考虑到房产的总价与位置对于客户选房时的核心影响,使用聚法的算法来定位客户最感兴趣的位置点,同时基于位置再寻找客户可能感兴趣的房源,最终帮助客户寻找到合适的房源。

另外在聚类算法的基本之上,我们进行二次规划的优化,目的是让聚出来的类中,让大类越大,小类越小,以期更好的找到客户最感兴趣的位置点。

需要的改进点:

(1)由于客户的感觉兴趣的房源位置经常在变动,这对于聚类算法是一个挑战,本文使用聚类算法虽然进行了二次规划的优化,但仅仅选择了一个最大类的中心点,来定位客户的目标位置,其精确性上面存在一定的误差,后期需要考虑多点目标位置的优化。

(2)协同过滤本身是运算大矩阵,数据计算量比较大,需要的时间成本,计算资源均比较高,如果今后要做准时间的线上推荐,需要在算法的优化方面,进一步深化。

如何精准的给客户推荐进行线上房源推荐,一直是比较热门的话题,笔者是刚刚开始涉足,欢迎志同道合的朋友一起多多交流,谢谢观看!

QQ:40166033

微信号:xiaofeng873621