目录
在个性化推荐中,新用户冷启动问题一直是难题。一般做法是tagCtr、地域、时间轴等(用户画像单一维度)推荐,效果也挺不错的。其实,除了以上比较明显维度考量,用户app列表也隐藏着用户丰富个性化特征。不同用户群体对app偏爱也不尽相同,例如游戏宅可能更多选择各种类型游戏app,漫画控喜欢二次元和动漫app,购物迷倾向电商购物。本文通过用户加载app列表,进一步挖掘用户群体标签,从而为冷启动提供更加丰富的基础特征。
K-均值聚类属于无监督学习聚类,采用距离作为相似性指标,通过迭代优化使得类内之间的数据最为相似,各类之间的数据相似度差别尽可能大。可以解决上述用户聚类问题。
一、工程实现
很多框架(sklearn、mllib、tf等)都有自带的K-均值聚类算法,如何选择合适的?
考虑到处理样本的数据量(7天,30多G),这里选择spark ml自带的K-均值算法。
1. 提取稀疏向量
app列表是由文本构成的字符串数组,参考NLP处理文档分词、提取词频向量将其转化为稀疏向量做法,这里采用ml提供的文档计数API CountVectorizer,如下
val cvm = new CountVectorizer().setInputCol("app_list").setOutputCol("app_list_cv").setMinDF(1)
setMinDF设置最小出现次数,这里选择1,保证出现app名称都能够被处理。
2. K-均值聚类
kmeans的计算方法如下:
- 随机选取K个中心点
- 遍历所有数据,将每个数据划分到最近的中心点中
- 计算每个聚类的平均值,并作为新的中心点
- 重复2-3,直到这K个中线点不再变化(收敛了),或执行了足够多的迭代
K-均值算法比较依赖K类中心确定,为了选择比较合适的K,在一定区间[minSeq,maxSeq]迭代寻优,通过手肘法确定最佳K。
ks.foreach(cluster => {
val kmeans = new KMeans()
.setK(cluster)
.setMaxIter(maxIter)
.setFeaturesCol("app_list_cv")
.setPredictionCol("prediction")
val kmm = kmeans.fit(result)
val ssd = kmm.computeCost(result)
map.put(cluster, ssd)
if(minSsd > 0){
minSsd = if(minSsd > ssd) {
kmm.write.overwrite().save("hdfs://lee:8020/ljz/cluster")
ssd
} else minSsd
}else{
minSsd = ssd
}
3. 踩过的坑
K-均值迭代寻优过程中,会重复加载处理的rdd(上文中reuslt),这里宜采用result.cache(),会极大提高运算速度。
在模型训练好后,保存CountVectorizer模型和最优K所在模型,在线预测直接加载即可,如下
val cvm = CountVectorizerModel.load("hdfs://lee:8020/user/ljz/countVector")
val result = cvm.transform(df)
val kmm = KMeansModel
.load("hdfs://lee:8020/user/ljz/cluster")
.setFeaturesCol("app_list_cv")
.setPredictionCol("prediction")
val kc = kmm.transform(result).select("uid","prediction")
二、评估
一般会看下,聚类结果是否存在一定的主观关联,如下:
cluster | 11 | 31 | ||||
uid | 01 | 02 | 03 | 04 | 05 | 06 |
app_list | 备份与恢复;TelemetryJService;OPPO日志转储器;SampleExtAuthService;Perfdump;ofo共享单车;号码归属地;OppoPowerMonitor;无线设置;GPS;FreeFallingMonitor;com.qti.service.colorservice;爱奇艺;WifiRxSensTest;MBN 测试;com.qualcomm.shutdownlistner;com.quicinc.cne.CNEService.CNEServiceApp;美团;游戏加速;优酷;com.qualcomm.qti.smcinvokepkgmgr;SmartcardService;便签;com.nearme.sync.App;双卡与移动网络;搜狗输入法OPPO版;SVI Settings;HealthAuthService;语音设置;超级淘;天气服务;随手记;SampleAuthenticatorService;下载管理;美图秀秀;联系人黑名单 | 备份与恢复;TelemetryJService;OPPO日志转储器;SampleExtAuthService;Perfdump;号码归属地;OppoPowerMonitor;无线设置;GPS;百度新闻;FreeFallingMonitor;com.qti.service.colorservice;爱奇艺;WifiRxSensTest;MBN 测试;com.qualcomm.shutdownlistner;com.quicinc.cne.CNEService.CNEServiceApp;美团;语爱交友;游戏加速;优酷;com.qualcomm.qti.smcinvokepkgmgr;SmartcardService;便签;com.nearme.sync.App;双卡与移动网络;搜狗输入法OPPO版;SVI Settings;HealthAuthService;语音设置;天气服务;SampleAuthenticatorService;下载管理;美图秀秀; | 备份与恢复;TelemetryJService;OPPO日志转储器;SampleExtAuthService;Perfdump;CTAutoRegist;号码归属地;OppoPowerMonitor;无线设置;GPS;FreeFallingMonitor;com.qti.service.colorservice;爱奇艺;com.oppo.helper;WifiRxSensTest;MBN 测试;com.qualcomm.shutdownlistner;com.quicinc.cne.CNEService.CNEServiceApp;美团;优酷;com.qualcomm.qti.smcinvokepkgmgr;SmartcardService;便签;com.nearme.sync.App;双卡与移动网络;搜狗输入法OPPO版;SVI Settings;HealthAuthService;语音设置;天气服务;SampleAuthenticatorService;下载管理;美图秀秀; | 相机;玩机技巧;计步器;华为桌面;EuiReceive;智能线控;UEInfoCheck;运动健康;文件管理;com.huawei.iaware;通过蓝牙导入;纪念碑谷2;主题;HwChrService;华为服务框架;爱奇艺;FwkPlugin;高铁管家12306火车票;Nearby2.0;悬浮按钮;美团;优酷;学习通;情景智能;手势服务;SmartcardService;华为应用市场; | 相机;华为桌面;EuiReceive;智能线控;UEInfoCheck;文件管理;com.huawei.iaware;通过蓝牙导入;主题;HwChrService;华为服务框架;爱奇艺;搜狗输入法;悬浮按钮;美团;情景智能;手势服务;SmartcardService;华为应用市场;手机营业厅;学生模式;Huawei Secure IME;收音机;静心池;RegService;讯飞语音引擎;华为钱包;天气;华为 Swype 输入法;位置共享;com.huawei.cryptosms.service;查找我的手机;招商银行;华为会员服务;屏幕录制;视频编辑;com.huawei.securitymgr;iConnect;AutoRegSms;视频•优酷版;com.hisi.mapcon;androidhwext;微信;百度输入法华为版;com.huawei.logupload;Android 系统;应用宝;imonitor;华为移动服务;中国工商银行;Huawei Share;HwIndexSearchObserverService;智能解锁;支付保护中心;HwIndexSearchService;Huawei Share;FIDO UAF ASM;华为生活服务; | 樊登读书会;相机;ofo共享单车;华为桌面;EuiReceive;智能线控;UEInfoCheck;运动健康;文件管理;com.huawei.iaware;通过蓝牙导入;主题;HwChrService;华为服务框架;中国国航;悬浮按钮;优酷;情景智能;工银现金快线;手势服务;SmartcardService;华为应用市场;QQ音乐;学生模式;Huawei Secure IME;搜狗阅读;驾驶模式;讯飞语音引擎;华为钱包;天气;大众点评;华为 Swype 输入法;Tedesco;美图秀秀;位置共享;com.huawei.cryptosms.service;赛导游;查找我的手机;华为连接服务; |