一、聚类的思想及原理

  聚类是一种无监督学习,它与分类的不同,聚类所要求划分的类是未知的。聚类算法的思想就是物以类聚的思想,相同性质的点在空间中表现的较为紧密和接近,主要用于数据探索与异常检测。
  聚类分析是一种探索性的分析,在分类的过程中,人们不必事先给出一个分类的标准,它能够从样本数据出发,自动进行分类。聚类分析也有很多方法,使用不同方法往往会得到不同的结论。从实际应用的角度看,聚类分析是数据挖掘的主要任务之一。而且聚类能够作为一个独立的工具获得数据的分布状况,观察每一簇数据的特征,集中对特定的聚簇集合作进一步地分析。聚类分析还可以作为其他算法(如分类和推荐等算法)的预处理步骤

二、构建聚类模型

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构建聚类模型相关推荐

  1. kmeans及模型评估指标_使用sklearn评估器构建聚类模型

    原标题:使用sklearn评估器构建聚类模型 作者:徐瑶佳 来源:人工智能学习圈 工作内容: 聚类算法是在没有给定划分类别的情况下,根据数据样本的相似度进行样本分组的一种算法.聚类算法过程是无监督的, ...

  2. 作业1:关于使用python中scikit-learn(sklearn)模块,实现鸢尾花(iris)相关数据操作(数据加载、标准化处理、构建聚类模型并训练、可视化、评价模型)

    操作题:利用鸢尾花数据实现数据加载.标准化处理.构建聚类模型并训练.聚类效果可视化展示及对模型进行评价 一.数据加载 from sklearn.datasets import load_iris fr ...

  3. spark机器学习笔记:(五)用Spark Python构建分类模型(下)

    声明:版权所有,转载请联系作者并注明出处  http://blog.csdn.net/u013719780?viewmode=contents 博主简介:风雪夜归子(英文名:Allen),机器学习算法 ...

  4. 手把手带你玩转Spark机器学习-使用Spark构建回归模型

    系列文章目录 手把手带你玩转Spark机器学习-专栏介绍 手把手带你玩转Spark机器学习-问题汇总 手把手带你玩转Spark机器学习-Spark的安装及使用 手把手带你玩转Spark机器学习-使用S ...

  5. 计算思维与数据科学 K-Means聚类模型信用卡用户风险评估 python连接数据库来处理数据

    实验目的 1.处理信用卡数据异常值 1)读取信用卡数据: 2)丢弃逾期.呆账.强制停卡.退票.拒往记录为1.瑕疵户为2的记录: 3)丢弃呆账.强制停卡.退票为1.拒往记录为2的记录: 4)丢弃频率为5 ...

  6. Python构建基于elkan优化算法的K-Means聚类模型

    Python构建基于elkan优化算法的K-Means聚类模型 目录 Python构建基于elkan优化算法的K-Means聚类模型 #elkan优化算法

  7. R构建层次聚类模型(Hierarchical Clustering)

    R构建层次聚类模型(Hierarchical Clustering) 目录 R构建层次聚类模型(Hierarchical Clustering) 聚类 什么是层次聚类?

  8. R构建Kmeans聚类模型

    R构建Kmeans聚类模型 目录 R构建Kmeans聚类模型 加载和准备数据 最优聚类簇数 用最优K进行K-Means聚类

  9. ML:教你聚类并构建学习模型处理数据(附数据集)

    翻译: 王雨桐 校对: 顾佳妮 本文约1500字,建议阅读6分钟. 本文以Ames住房数据集为例,对数据进行聚类,并构建回归模型. 摘要 本文将根据41个描述性分类特征的维度,运用无监督主成分分析(P ...

最新文章

  1. 阿里云开源业内首个应用多活项目 AppActive,与社区共建云原生容灾标准
  2. sql server 替换有反斜杠的字符串_SQL注入思维导图
  3. AndroidStudio3.4+Unity2018.3,导出JAR包给UNITY使用
  4. JAVAWEB技术之七过滤器
  5. hashset默认长度是多少?_看看,这些细节上的坑,你犯了多少?
  6. [转]C++类成员修饰const和mutable
  7. 【考研数学】视频,你喜欢看哪位老师?
  8. 惠普暗影精灵2更新bios系统,防止电池鼓包
  9. 科研论文中,图片组合方法和导出高分辨率的方法
  10. 自制力才是你努力的第一步
  11. CAD-Cass小结(5)————WIN10安装并运行CAD2006及Cass7.0
  12. 前端开发是什么以及我们要学习什么
  13. 孙子兵法 三十六计(猫鼠版)
  14. C++性能优化笔记-11-使用向量操作
  15. Java异常处理——日志打印
  16. IE 和 标准盒模型 floa浮动 清除浮动 定位
  17. IPD百科 | IPD产品管理体系中产品经理能力模型
  18. 日语中「よう」的用法整理
  19. System.InvalidOperationException HResult=0x80131509 Message=ExecuteNonQuery 要求已打开且可用的 Connection
  20. 关于IndexedDB的操作文档

热门文章

  1. erwin Data Modeler 如何连接 Oracle
  2. 支持脉冲国产PLC源码三菱FX1N FX3U底层源码 最新FX1N国产PLC源码,支持4路脉冲输出
  3. 服务器ldf文件,数据库清除日志文件(LDF文件过大)
  4. 玩英雄联盟说服务器不稳定,英雄联盟9.4版本更新之后,服务器开始逐渐不稳定...
  5. 26 《基因组:人类自传》 -豆瓣评分9.1
  6. 一个手机android音乐播放器,酷我听听 Android最好用的手机音乐播放器
  7. Educational Codeforces Round 103 (Rated for Div. 2)前四题
  8. 什么是计算机时间?程序员必看的时间知识!
  9. 机器视觉的9大快速开发库
  10. Linux中光标消失解决办法