Spark M构建聚类模型
一、聚类的思想及原理
二、构建聚类模型
2.1、加载数据
val rawdata = spark.read.format("csv").option("header", true).load("C:\\Users\\12285\\Desktop\\customers_sale.csv")val df = rawdata.select(rawdata("Channel").cast("Double"),rawdata("Region").cast("Double"),rawdata("Fresh").cast("Double"),rawdata("Milk").cast("Double"),rawdata("Grocery").cast("Double"),rawdata("Frozen").cast("Double"),rawdata("Detergents_Paper").cast("Double"),rawdata("Delicassen").cast("Double"))
2.2、分析特征间的相关性
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as pltdf = pd.read_csv('C:\\Users\\12285\\Desktop\\customers_sale.csv', header=0)
cols = ["Channel", "Region", "Fresh", "Milk","Grocery", "Frozen", "Detergents_Paper", "Delicassen"]cm = np.corrcoef(df[cols].values.T)sns.set(font_scale=0.8)hm = sns.heatmap(cm, cbar=True, annot=True, square=True, fmt='.2f',annot_kws={'size': 10.0}, yticklabels=cols, xticklabels=cols)plt.show()
从上图可以看出, 零食上的消费(Grocery)和在洗涤用品和纸上的消费(Detergents_paper)的相关性最大0.92, 零食上的消费(Grocery)和奶制品的消费(Milk)的关联也比较大0.73;另外渠道(Channel)和零食上的消费、洗涤用品、纸上的消费有一定关联。
2.3、数据的预处理
从统计信息可以看出Channel, Region为类别型, 其余6个字段为连续型。 在训练模型前,需要对类别型特征先转换为二元向量, 然后,对各个特征进行规范化。最后得到一个新的特征向量。
// 统计信息df.describe().show()
+-------+------------------+------------------+------------------+------------------+-----------------+-----------------+------------------+------------------+
|summary| Channel| Region| Fresh| Milk| Grocery| Frozen| Detergents_Paper| Delicassen|
+-------+------------------+------------------+------------------+------------------+-----------------+-----------------+------------------+------------------+
| count| 440| 440| 440| 440| 440| 440| 440| 440|
| mean|1.3227272727272728| 2.543181818181818|12000.297727272728| 5796.265909090909|7951.277272727273|3071.931818181818|2881.4931818181817|1524.8704545454545|
| stddev|0.4680515694791137|0.7742724492301002|12647.328865076885|7380.3771745708445|9503.162828994346|4854.673332592367| 4767.854447904201|2820.1059373693965|
| min| 1.0| 1.0| 3.0| 55.0| 3.0| 25.0| 3.0| 3.0|
| max| 2.0| 3.0| 112151.0| 73498.0| 92780.0| 60869.0| 40827.0| 47943.0|
+-------+------------------+------------------+------------------+------------------+-----------------+-----------------+------------------+------------------+
2.3.1、将类别特征转换为二元编码
// 对类别特征转换为二元向量val hotEstimator = new OneHotEncoderEstimator().setInputCols(Array("Channel", "Region")).setOutputCols(Array("ChannelVc", "RegionVc")).setDropLast(false)val df2 = hotEstimator.fit(df).transform(df)df2.show(10)
// df2.printSchema()
2.3.2、把新生成的两个特征及原来的6个特征组成一个特征向量
// 把新生成的两个特征及原来的6个特征组成一个特征向量val featuresArray = Array("ChannelVc", "RegionVc", "Fresh", "Milk","Grocery", "Frozen", "Detergents_Paper", "Delicassen")// 把源数据组合成特征向量featuresval vcAssembler = new VectorAssembler().setInputCols(featuresArray).setOutputCol("features")
2.3.3、对特征进行规范化
// 对特征进行规范化val scaledDF = new StandardScaler().setInputCol("features").setOutputCol("scaledFeatures").setWithStd(true).setWithMean(false)
三、组装
3.1、组装训练模型
//把转换二元向量、特征规范化转换等组装到流水线上,因pipeline中无聚类的评估函数,故,这里流水线中不纳入kmeans。具体实现如下:val pipeline1 = new Pipeline().setStages(Array(hotEstimator, vcAssembler, scaledDF))val data2 = pipeline1.fit(df).transform(df)// kmeans模型val kmeans = new KMeans().setFeaturesCol("scaledFeatures").setK(4).setSeed(123)//训练模型val model = kmeans.fit(data2)val results = model.transform(data2)
3.2、模型评估
但是发现两种方法的评估相差很大。
//评估模型val WSSSE = model.computeCost(results)println(s"Within Set Sum of Squared Errors = $WSSSE")// Within Set Sum of Squared Errors = 2595.7328287620885// 推荐使用ClusteringEvaluatorval evaluator = new ClusteringEvaluator()val silhouette = evaluator.evaluate(results)println(s"Silhouette with squared euclidean distance = $silhouette")// Silhouette with squared euclidean distance = 0.017629072465542267
3.3、显示聚类结果
//显示聚类结果。println("Cluster Centers: ")model.clusterCenters.foreach(println)results.collect().foreach(row => {println(row(10) + " is predicted as cluster " + row(11))})// 当k = 4 时results.select("scaledFeatures", "prediction").groupBy("prediction").count.show()+----------+-----+
|prediction|count|
+----------+-----+
| 1| 10|
| 3| 136|
| 2| 64|
| 0| 230|
+----------+-----+
四、模型优化
聚类模型中最重要的是参数k的选择,下面我们通过循环来获取哪个k值的性能最好。
// 模型的优化val KSSE = (2 to 20 by 1).toList.map { k =>val kmeans = new KMeans().setFeaturesCol("scaledFeatures").setK(k).setSeed(123)val model = kmeans.fit(data2)// 评估性能.val WSSSE = model.computeCost(data2)// K,实际迭代次数,SSE,聚类类别编号,每类的记录数,类中心点(k, model.getMaxIter, WSSSE, model.summary.cluster, model.summary.clusterSizes, model.clusterCenters)}//显示k、WSSSE评估指标,并按指标排序KSSE.map(x => (x._1, x._3)).sortBy(x => x._2).foreach(println)// 将结果存到文件中import spark.implicits._KSSE.map(x=>(x._1,x._3)).sortBy(x=>x._2).toDF.write.save("C:\\Users\\12285\\Desktop\\ksse")//显示结果
(20,635.6231456631109)
(19,674.1240263779249)
(18,696.2925462727684)
(17,747.697734807987)
(15,848.393503421027)
(16,878.8045714559038)
(14,932.4137349866897)
(13,988.2458378719449)
(12,1026.9426528633646)
(11,1165.7468060138433)
(10,1201.1295734061587)
(9,1242.388169008257)
(8,1399.0770764839624)
(7,1523.4613624094593)
(6,1965.6551642041663)
(5,2405.5349119889274)
(4,2595.7328287620885)
(3,3123.9948271417393)
(2,3480.224930619828)
以上数据可视化, k<12时,性能(computeCost)提升比较明显,>12后,逐渐变缓。所以K越大不一定越好,恰当才是重要的。
Spark M构建聚类模型相关推荐
- kmeans及模型评估指标_使用sklearn评估器构建聚类模型
原标题:使用sklearn评估器构建聚类模型 作者:徐瑶佳 来源:人工智能学习圈 工作内容: 聚类算法是在没有给定划分类别的情况下,根据数据样本的相似度进行样本分组的一种算法.聚类算法过程是无监督的, ...
- 作业1:关于使用python中scikit-learn(sklearn)模块,实现鸢尾花(iris)相关数据操作(数据加载、标准化处理、构建聚类模型并训练、可视化、评价模型)
操作题:利用鸢尾花数据实现数据加载.标准化处理.构建聚类模型并训练.聚类效果可视化展示及对模型进行评价 一.数据加载 from sklearn.datasets import load_iris fr ...
- spark机器学习笔记:(五)用Spark Python构建分类模型(下)
声明:版权所有,转载请联系作者并注明出处 http://blog.csdn.net/u013719780?viewmode=contents 博主简介:风雪夜归子(英文名:Allen),机器学习算法 ...
- 手把手带你玩转Spark机器学习-使用Spark构建回归模型
系列文章目录 手把手带你玩转Spark机器学习-专栏介绍 手把手带你玩转Spark机器学习-问题汇总 手把手带你玩转Spark机器学习-Spark的安装及使用 手把手带你玩转Spark机器学习-使用S ...
- 计算思维与数据科学 K-Means聚类模型信用卡用户风险评估 python连接数据库来处理数据
实验目的 1.处理信用卡数据异常值 1)读取信用卡数据: 2)丢弃逾期.呆账.强制停卡.退票.拒往记录为1.瑕疵户为2的记录: 3)丢弃呆账.强制停卡.退票为1.拒往记录为2的记录: 4)丢弃频率为5 ...
- Python构建基于elkan优化算法的K-Means聚类模型
Python构建基于elkan优化算法的K-Means聚类模型 目录 Python构建基于elkan优化算法的K-Means聚类模型 #elkan优化算法
- R构建层次聚类模型(Hierarchical Clustering)
R构建层次聚类模型(Hierarchical Clustering) 目录 R构建层次聚类模型(Hierarchical Clustering) 聚类 什么是层次聚类?
- R构建Kmeans聚类模型
R构建Kmeans聚类模型 目录 R构建Kmeans聚类模型 加载和准备数据 最优聚类簇数 用最优K进行K-Means聚类
- ML:教你聚类并构建学习模型处理数据(附数据集)
翻译: 王雨桐 校对: 顾佳妮 本文约1500字,建议阅读6分钟. 本文以Ames住房数据集为例,对数据进行聚类,并构建回归模型. 摘要 本文将根据41个描述性分类特征的维度,运用无监督主成分分析(P ...
最新文章
- 阿里云开源业内首个应用多活项目 AppActive,与社区共建云原生容灾标准
- sql server 替换有反斜杠的字符串_SQL注入思维导图
- AndroidStudio3.4+Unity2018.3,导出JAR包给UNITY使用
- JAVAWEB技术之七过滤器
- hashset默认长度是多少?_看看,这些细节上的坑,你犯了多少?
- [转]C++类成员修饰const和mutable
- 【考研数学】视频,你喜欢看哪位老师?
- 惠普暗影精灵2更新bios系统,防止电池鼓包
- 科研论文中,图片组合方法和导出高分辨率的方法
- 自制力才是你努力的第一步
- CAD-Cass小结(5)————WIN10安装并运行CAD2006及Cass7.0
- 前端开发是什么以及我们要学习什么
- 孙子兵法 三十六计(猫鼠版)
- C++性能优化笔记-11-使用向量操作
- Java异常处理——日志打印
- IE 和 标准盒模型 floa浮动 清除浮动 定位
- IPD百科 | IPD产品管理体系中产品经理能力模型
- 日语中「よう」的用法整理
- System.InvalidOperationException HResult=0x80131509 Message=ExecuteNonQuery 要求已打开且可用的 Connection
- 关于IndexedDB的操作文档
热门文章
- erwin Data Modeler 如何连接 Oracle
- 支持脉冲国产PLC源码三菱FX1N FX3U底层源码 最新FX1N国产PLC源码,支持4路脉冲输出
- 服务器ldf文件,数据库清除日志文件(LDF文件过大)
- 玩英雄联盟说服务器不稳定,英雄联盟9.4版本更新之后,服务器开始逐渐不稳定...
- 26 《基因组:人类自传》 -豆瓣评分9.1
- 一个手机android音乐播放器,酷我听听 Android最好用的手机音乐播放器
- Educational Codeforces Round 103 (Rated for Div. 2)前四题
- 什么是计算机时间?程序员必看的时间知识!
- 机器视觉的9大快速开发库
- Linux中光标消失解决办法