第一章 大数据分析
1.数据科学面临的挑战
1)数据分析绝大部分工作是数据预处理包括清洗,处理,融合,挖掘以及其他操作,即使模型调优阶段,特征提取和选择上花费的时间比选择和实现算法时间更多
2)迭代与数据科学紧密相关,比如模型优化时采用的随机梯度下降和最大似然估计,构建模型时需要选择正确特征,挑选合适算法,运行显著性测试,找到合适超参数
3)构建完表现卓越的模型不等于大功告成,模型需要定期甚至实时重建
第二章 用Scala和Spark进行数据分析
数据清洗是数据分析的第一步,数据分析工具语言Scala能完成所有事情
数据清洗一般包括身份解析,记录去重,合并-清除,列表清洗,统称为记录关联
记录关联问题描述:
需要从一个或者多个源系统的记录中,根据记录的属性判断记录是否是相同实体
由于RDD都是临时存在的,因此如果后面仍然需要用到此RDD,则需要在当前就缓存此RDD,这样再次使用此RDD时可直接从内存中获取,节约计算开销
2.1 聚合
mds为RDD[MatchData]
val grouped=mds.groupBy(md=>md.matched)//根据matched来聚合分为true,false两类
grouped.mapValues(x=>x.size) //grouped中每个元素Key=true or false,Values则为多行记录
2.2 概要统计
Parsed.map(md=>md.score(0)).filter(!isNaN(_)).stats() //可以获得score(0)列的统计信息包括总数,平均值,stdev,最大值,最小值
2.3 直方图
parsed.map(md=>md.matched).countByValue().toSeq.sortBy(_._1)
2.4zip
val nas1=Array(1.0,Double.NaN).map(d=>NAStatCounter(d)) //nas1=Array(NAStatCounter(1.0),NAStatCounter(NaN))
val nas2=Array(Double.NaN,2.0).map(d=>NAStatCounter(d)) //同理nas2
val nas3=nas1.zip(nas2)//Array((NAStatCounter(1.0),NAStatCounter(NaN)),(NAStatCounter(NaN),NAStatCounter(2.0)))
nas3.map(case(a,b)=>a.merge(b))//相当于Array((NAStatCounter(1.0).merge(NAStatCounter(NaN)),NAStatCounter(NaN).merge(NAStatCounter(2.0)))
第三章 音乐推荐和Audioscrobbler数据集
隐式反馈数据:Audioscrobbler数据集覆盖了大量用户和艺术家,同时包含了更多总体信息,而单条记录信息较少,这类数据称为隐式反馈数据
user_artist_data.txt 用户ID-艺术家ID-播放次数
artist_data.txt 艺术家ID-艺术家名
artist-alias.txt 将拼写错误的艺术家ID或者ID变体对应到该艺术家的规范ID 错误ID-规范ID
3.1 交替最小二乘法推荐
根据两个用户播放过许多相同的歌曲来判断他们可能都喜欢某首歌,称为协同过滤
利用user_artist_data.txt可构建一个稀疏矩阵,有m个用户,和n个艺术家,则此稀疏矩阵为m*n,(i,j)的值表示第i个用户播放第j个艺术家的作品次数,此稀疏矩阵A=X*YT
用户-特征矩阵和特征-艺术家矩阵的乘积结果约等于稠密用户-艺术家相互关系矩阵的完整估计,求解X,Y可采用交替最小二乘法
AiY(YTY)-1=XI(X的每一行可分别计算,因此并行化),目标是最小化|AiY(YTY)-1-XI|,或者最小化两个矩阵的平方误差,实际会借助QR分解
ALS算法特征是稀疏的输入数据、可以用简单的线性代数运算求最优解、数据本身可并行化这三点导致大数据计算非常快
Spark Mllib的ALS算法要求用户和产品的ID必须为整数型,而且是32位非负整数
1)数据清洗,过滤掉不合规范的数据
2)构建训练集和模型
mkString()常用作把集合元素表示成某种形式分隔的字符串
userFraction 用户特征矩阵
productFraction 商品特征矩阵
3)核查推荐结果
看实际用户点击过得艺术家和推荐的艺术家是否一致
4)评价推荐质量
AUC(BinaryClassificationMetrics):随机选择的好推荐高于坏推荐的概率,作为普遍和总和的测量整体模型质量的手段
AUC的输入为检验集CV(每个用户