Spark进阶(八)
来源:互联网 发布:js 上传图片预览 编辑:程序博客网 时间:2024/05/05 12:44
分类+回归+聚类+协同过滤
1 分类算法
分类算法属于监督式学习,使用类标签已知的样本建立一个分类函数或分类模型,应用分类模型,能把数据库中的类标签未知的数据进行归类。分类在数据挖掘中是一项重要的任务,目前在商业上应用最多,常见的典型应用场景有流失预测、精确营销、客户获取、个性偏好等。 MLlib 目前支持分类算法有:逻辑回归、支持向量机、朴素贝叶斯和决策树。
案例:导入训练数据集,然后在训练集上执行训练算法,最后在所得模型上进行预测并计算训练误差。
import org.apache.spark.SparkContextimport org.apache.spark.mllib.classification.SVMWithSGDimport org.apache.spark.mllib.regression.LabeledPoint// 加载和解析数据文件val data = sc.textFile("mllib/data/sample_svm_data.txt")val parsedData = data.map { line =>val parts = line.split(' ')LabeledPoint(parts(0).toDouble, parts.tail.map(x => x.toDouble).toArray)}// 设置迭代次数并进行进行训练val numIterations = 20val model = SVMWithSGD.train(parsedData, numIterations)// 统计分类错误的样本比例val labelAndPreds = parsedData.map { point =>val prediction = model.predict(point.features)(point.label, prediction)}val trainErr = labelAndPreds.filter(r => r._1 != r._2).count.toDouble / parsedData.countprintln("Training Error = " + trainErr)
2 回归算法
回归算法属于监督式学习,每个个体都有一个与之相关联的实数标签,并且我们希望在给出用于表示这些实体的数值特征后,所预测出的标签值可以尽可能接近实际值。 MLlib 目前支持回归算法有:线性回归、岭回归、 Lasso 和决策树。
案例:导入训练数据集,将其解析为带标签点的 RDD ,使用 LinearRegressionWithSGD 算法建立一个简单的线性模型来预测标签的值,最后计算均方差来评估预测值与实际值的吻合度。
import org.apache.spark.mllib.regression.LinearRegressionWithSGDimport org.apache.spark.mllib.regression.LabeledPoint// 加载和解析数据文件val data = sc.textFile("mllib/data/ridge-data/lpsa.data")val parsedData = data.map { line =>val parts = line.split(',')LabeledPoint(parts(0).toDouble, parts(1).split(' ').map(x => x.toDouble).toArray)}// 设置迭代次数并进行训练val numIterations = 20val model = LinearRegressionWithSGD.train(parsedData, numIterations)// 统计回归错误的样本比例val valuesAndPreds = parsedData.map { point =>val prediction = model.predict(point.features)(point.label, prediction)}val MSE = valuesAndPreds.map{ case(v, p) => math.pow((v - p), 2)}.reduce(_ + _)/valuesAndPreds.countprintln("training Mean Squared Error = " + MSE)
3 聚类算法
聚类算法属于非监督式学习,通常被用于探索性的分析,是根据“物以类聚”的原理,将本身没有类别的样本聚集成不同的组,这样的一组数据对象的集合叫做簇,并且对每一个这样的簇进行描述的过程。它的目的是使得属于同一簇的样本之间应该彼此相似,而不同簇的样本应该足够不相似,常见的典型应用场景有客户细分、客户研究、市场细分、价值评估。 MLlib 目前支持广泛使用的 KMmeans 聚类算法。
案例:导入训练数据集,使用 KMeans 对象来将数据聚类到两个类簇当中,所需的类簇个数会被传递到算法中,然后计算集内均方差总和 (WSSSE) ,可以通过增加类簇的个数 k 来减小误差。 实际上,最优的类簇数通常是 1 ,因为这一点通常是 WSSSE 图中的 “低谷点”。
import org.apache.spark.mllib.clustering.KMeans// 加载和解析数据文件val data = sc.textFile("kmeans_data.txt")val parsedData = data.map( _.split(' ').map(_.toDouble))// 设置迭代次数、类簇的个数val numIterations = 20val numClusters = 2// 进行训练val clusters = KMeans.train(parsedData, numClusters, numIterations)// 统计聚类错误的样本比例val WSSSE = clusters.computeCost(parsedData)println("Within Set Sum of Squared Errors = " + WSSSE)
4 协同过滤
协同过滤常被应用于推荐系统,这些技术旨在补充用户 - 商品关联矩阵中所缺失的部分。 MLlib 当前支持基于模型的协同过滤,其中用户和商品通过一小组隐语义因子进行表达,并且这些因子也用于预测缺失的元素。
案例:导入训练数据集,数据每一行由一个用户、一个商品和相应的评分组成。假设评分是显性的,使用默认的 ALS.train() 方法,通过计算预测出的评分的均方差来评估这个推荐模型。
import org.apache.spark.mllib.recommendation.ALSimport org.apache.spark.mllib.recommendation.Rating// 加载和解析数据文件val data = sc.textFile("mllib/data/als/test.data")val ratings = data.map(_.split(',') match {case Array(user, item, rate) => Rating(user.toInt, item.toInt, rate.toDouble)})// 设置迭代次数val numIterations = 20val model = ALS.train(ratings, 1, 20, 0.01)// 对推荐模型进行评分val usersProducts = ratings.map{ case Rating(user, product, rate) => (user, product)}val predictions = model.predict(usersProducts).map{case Rating(user, product, rate) => ((user, product), rate)}val ratesAndPreds = ratings.map{case Rating(user, product, rate) => ((user, product), rate)}.join(predictions)val MSE = ratesAndPreds.map{case ((user, product), (r1, r2)) => math.pow((r1- r2), 2)}.reduce(_ + _)/ratesAndPreds.countprintln("Mean Squared Error = " + MSE)
MLlib架构:
基础部分
– Local vector ● DenseVector ● SparseVector– Labeled point– Local matrix– Distributed matrix ● RowMatrix – Multivariate summary statistics ● IndexedRowMatrix ● CoordinateMatrix
dense和sparse区别
MLlib在Spark的内部实现
MLlib使用流程
K-Means
里面的实现有如下的参数:
– k 是所需的类簇的个数。
– maxIterations 是最大的迭代次数。
– initializationMode 这个参数决定了是用随机初始化还是通过 k-means|| 进行初始化。
– runs 是跑 k-means 算法的次数( k-mean 算法不能保证能找出最优解,如果在给定的数据
集上运行多次,算法将会返回最佳的结果)。
– initializiationSteps 决定了 k-means|| 算法的步数。
– epsilon 决定了判断 k-means 是否收敛的距离阀值。
协同过滤
MLLib 使用交替最小二乘法(ALS) 来学习这些隐性因子
在 MLlib 中的实现有如下的参数:
– numBlocks 是用于并行化计算的分块个数 ( 设置为-1 为自动配置) 。
– rank 是模型中隐性因子的个数。
– iterations 是迭代的次数。
– lambda 是ALS 的正则化参数。
– implicitPrefs 决定了是用显性反馈ALS 的版本还是用适用隐性反馈数据集的版本。
– alpha 是一个针对于隐性反馈 ALS 版本的参数,这个参数决定了偏好行为强度的基准
- Spark进阶(八)
- Spark算子(八)
- Spark进阶(一)
- Spark进阶(二)
- Spark进阶(三)
- Spark进阶(四)
- spark进阶(五)
- C#进阶教程(八)
- Glide进阶详解(八)
- Spark学习笔记(八)
- 侧滑删除进阶(七、八)
- Python进阶(八):in的详解
- Spark(八) -- 使用Intellij Idea搭建Spark开发环境
- Spark源码系列(八)Spark Streaming实例分析
- Spark(八) -- 使用Intellij Idea搭建Spark开发环境
- Spark源码系列(八)Spark Streaming实例分析
- Spark——数据分区(进阶)
- spark性能优化八
- WOS论文检索
- java 冒泡排序算法
- 记录文章
- AngularJs 监听单选按钮,禁止级联的下拉框编辑
- 使用hibernate中getHibernateTemplate查询部分字段
- Spark进阶(八)
- 手动安装Oracle Spatial
- 数据校验类
- uart中:起始位,停止位,就校验位,数据位,数据位的位数,波特率,数据通讯的接口定义
- 触媒
- Sticks nyoj
- 详述 Java 语言中的两种 for 循环
- yii2-rbac及yii2-admin可视化管理
- 虚拟机性能监控与实战