系列文章目录

  1. 手把手带你玩转Spark机器学习-专栏介绍
  2. 手把手带你玩转Spark机器学习-问题汇总
  3. 手把手带你玩转Spark机器学习-Spark的安装及使用
  4. 手把手带你玩转Spark机器学习-使用Spark进行数据处理和数据转换
  5. 手把手带你玩转Spark机器学习-使用Spark构建分类模型
  6. 手把手带你玩转Spark机器学习-使用Spark构建回归模型
  7. 手把手带你玩转Spark机器学习-使用Spark构建聚类模型
  8. 手把手带你玩转Spark机器学习-使用Spark进行数据降维
  9. 手把手带你玩转Spark机器学习-使用Spark进行文本处理
  10. 手把手带你玩转Spark机器学习-深度学习在Spark上的应用

文章目录

  • 系列文章目录
  • 前言
  • 一、获取数据集
  • 二、数据预处理
    • 1.选择感兴趣的特征列
    • 2.删除缺失数据
    • 3.分类变量编码
    • 4.缩放标准化
    • 5.PCA降维
  • 总结

前言

本章,我们将继续讲解无监督学习模型中降低数据维度的方法。

不同于我们之前分享的回归、分类和聚类,降维方法并不是用来做模型预测的。降维方法从一个D维的数据输入提取出k维表示,k一般远远小于D。因此,降维方法本身是一种预处理方法,或者说是一种特征转换的方法,而不是模型预测的方法。

降维方法中尤为重要的是,被抽取出的维度表示应该仍能捕捉大部分的原始数据的变化和结构。这源于一个基本想法:大部分数据源包含某种内部结构,这种结构一般来说是未知的(常被称为隐含特征或潜在特征),但如果能发现结构中的一些特征,我们的模型就可以学习这种结构并从中预测,而不用从大量无关的充满噪音特征的原始数据中去学习预测。简言之,缩减维度可以排除数据中的噪音并保留数据原有的隐含结构。

有时候,原始数据的维度远高于我们拥有的数据点数目。不降维,直接使用分类、回归等方法进行机器学习建模将非常困难。因为需要拟合的参数数目远大于训练样本的数目(从这个意义上讲,这种方法和我们在分类和回归中用的正则化方法相似)。

我们常常在一些场景中使用上述的降维技术,比如说探索性数据分析、提取体征去训练其他机器学习模型、降低大型模型在预测阶段的存储和计算需求、以及处理文本、声音、图像、视频等非常高维的数据。

本文以银行营销数据集为例,演示如何利用PCA进行数据降维,并将其可视化,方便大家的理解。

文章中涉及到的code可到本人github处下载:SparkML


一、获取数据集

银行营销数据集来自于UCL ML数据库,它包含有以下字段:

[‘age’, ‘job’, ‘marital’,‘education’, ‘default’, ‘balance’, ‘housing’, ‘loan’, ‘campaign’, ‘pdays’, ‘previous’, ‘poutcome’, ‘y’]

它们是“年龄”、“工作”、“婚姻”、“教育”、“默认”、“平衡”、“住房”、“贷款”、“活动”等特征。

二、数据预处理

1.选择感兴趣的特征列

cols = ['age', 'job', 'marital','education', 'default', 'balance', 'housing', 'loan', 'campaign', 'pdays', 'previous', 'poutcome', 'y']
df2 = df.select(cols)
df2.show(4)


如上图所示,我们可以根据经验,选择对我们模型建模有效的一些特征列。

2.删除缺失数据

同时由于数据中存在一些缺失值,因此我们也可以将一些含有缺失数据的行删除:

df2.createOrReplaceTempView("bank")
df2 = spark.sql("SELECT * FROM bank WHERE bank.poutcome='success' or bank.poutcome='failure'")
df2.createOrReplaceTempView("bank")
df2 =  df2.filter(~df.age.contains("unknown"))
df2 =  df2.filter(~df.job.contains("unknown"))
df2 =  df2.filter(~df.marital.contains("unknown"))
df2 =  df2.filter(~df.education.contains("unknown"))
df2 =  df2.filter(~df.default.contains("unknown"))
df2 =  df2.filter(~df.balance.contains("unknown"))
df2 =  df2.filter(~df.housing.contains("unknown"))
df2 =  df2.filter(~df.loan.contains("unknown"))
df2 =  df2.filter(~df.campaign.contains("unknown"))
df2 =  df2.filter(~df.pdays.contains("unknown"))
df2 =  df2.filter(~df.previous.contains("unknown"))
df2 =  df2.filter(~df.poutcome.contains("unknown"))
df2 =  df2.filter(~df.y.contains("unknown"))
df2.show(4)

3.分类变量编码

数据包含工作、婚姻、教育、违约、住房、贷款等分类变量。我们首先使用 StringIndexer 将分类值转换为类别索引,然后由 OneHotEncoder 为每一列将其转换为二进制向量列,如下所示:

from pyspark.ml import Pipeline
from pyspark.ml.feature import StringIndexer, OneHotEncoderstringIndexer = StringIndexer(inputCol="job", outputCol="job_index")
model = stringIndexer.fit(df2)
indexed = model.transform(df2)
encoder = OneHotEncoder(dropLast=False, inputCol="job_index", outputCol="job_vec")
encoded = encoder.transform(indexed)
df2 = encodedstringIndexer = StringIndexer(inputCol="marital", outputCol="marital_index")
model = stringIndexer.fit(df2)
indexed = model.transform(df2)
encoder = OneHotEncoder(dropLast=False, inputCol="marital_index", outputCol="marital_vec")
encoded = encoder.transform(indexed)
df2 = encodedstringIndexer = StringIndexer(inputCol="education", outputCol="education_index")
model = stringIndexer.fit(df2)
indexed = model.transform(df2)
encoder = OneHotEncoder(dropLast=False, inputCol="education_index", outputCol="education_vec")
encoded = encoder.transform(indexed)
df2 = encodedstringIndexer = StringIndexer(inputCol="default", outputCol="default_index")
model = stringIndexer.fit(df2)
indexed = model.transform(df2)
encoder = OneHotEncoder(dropLast=False, inputCol="default_index", outputCol="default_vec")
encoded = encoder.transform(indexed)
df2 = encodedstringIndexer = StringIndexer(inputCol="housing", outputCol="housing_index")
model = stringIndexer.fit(df2)
indexed = model.transform(df2)
encoder = OneHotEncoder(dropLast=False, inputCol="housing_index", outputCol="housing_vec")
encoded = encoder.transform(indexed)
df2 = encodedstringIndexer = StringIndexer(inputCol="loan", outputCol="loan_index")
model = stringIndexer.fit(df2)
indexed = model.transform(df2)
encoder = OneHotEncoder(dropLast=False, inputCol="loan_index", outputCol="loan_vec")
encoded = encoder.transform(indexed)
df2 = encodedstringIndexer = StringIndexer(inputCol="poutcome", outputCol="poutcome_index")
model = stringIndexer.fit(df2)
indexed = model.transform(df2)
encoder = OneHotEncoder(dropLast=False, inputCol="poutcome_index", outputCol="poutcome_vec")
encoded = encoder.transform(indexed)
df2 = encodedstringIndexer = StringIndexer(inputCol="y", outputCol="y_index")
model = stringIndexer.fit(df2)
indexed = model.transform(df2)
encoder = OneHotEncoder(dropLast=False, inputCol="y_index", outputCol="y_vec")
encoded = encoder.transform(indexed)
df2 = encodeddf2.show(4)

4.缩放标准化

数据通过缩放标准化,如下所示,我们对连续类别的数据进行缩放标准化:

from pyspark.ml.feature import MinMaxScalercols = ['job', 'marital','education', 'default', 'housing', 'loan', 'poutcome', 'y']
for col in cols:scaler = MinMaxScaler(inputCol=col+"_vec", outputCol=col+"_vec_scaled")scalerModel = scaler.fit(df2)scaledData = scalerModel.transform(df2)df2 = scaledData
df2.show(4)

5.PCA降维

我们利用PCA对上述特征进行特征降维,为了方便可视化,我们k选择为2

from pyspark.ml.feature import PCA
import matplotlib.pyplot as pltpca = PCA(k=2, inputCol="features", outputCol="pcaFeatures")
model = pca.fit(df3)result = model.transform(df3).select("pcaFeatures")
pandasDf = result.toPandas()
dataX = []
dataY = []
for vec in pandasDf.values:dataX.extend([vec[0][0]])dataY.extend([vec[0][1]])
plt.scatter(dataX, dataY)
plt.show()


如上图,可以看出有明显三个簇,我们可以再利用无监督算法k-means,进行聚类,聚成三类,看看对应的id是不是能匹配上,如果能匹配上,说明PCA降维还是保留了原始数据的结构。


总结

本文以银行营销数据集为例,演示了数据获取、缺失值处理、特征选择及标准化操作,最后讲解了如何利用PCA进行数据降维。PCA作为一种数据降维方法,在遇到内存瓶颈及时间瓶颈下尤为有效,可以迅速在保证效果的前提下,降低数据维度,降低内存,提高模型训练速度。

手把手带你玩转Spark机器学习-使用Spark进行数据降维相关推荐

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

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

  2. 手把手带你玩转Spark机器学习-使用Spark进行数据处理和数据转换

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

  3. 手把手带你玩转需求预测-需求预测方法介绍

    系列文章目录 手把手带你玩转需求预测 文章目录 系列文章目录 前言 时序预测算法类型 第一代:统计时序预测算法 第二代:经典机器学习方法 第三代:深度学习预测算法 总结 前言 预测算法的本质是从历史数 ...

  4. 群晖nas介绍文档_手把手带你玩转NAS 篇八:NAS文档随身带——多终端文件同步介绍(群晖drive篇)...

    手把手带你玩转NAS 篇八:NAS文档随身带--多终端文件同步介绍(群晖drive篇) 2020-01-08 15:23:44 24点赞 214收藏 31评论 你是AMD Yes党?还是intel和N ...

  5. ac2100 反弹shell无法粘贴_手把手带你玩转NAS 篇二十一:小米Redmi AC2100路由器刷机padavan保姆级教程...

    手把手带你玩转NAS 篇二十一:小米Redmi AC2100路由器刷机padavan保姆级教程 2020-05-14 18:49:24 224点赞 1790收藏 241评论 你是AMD Yes党?还是 ...

  6. 【三万字保姆级教程】手把手带你玩转Midjourney AI绘画

    文章目录 前言 课程介绍 1.1 课程目标和学员对象 课程目标 学员对象 1.2 课程内容概述 1.3 AI绘画的概念和发展 总结 前言 如上图所示,想要学习创作美丽.复杂的艺术作品吗? Midjou ...

  7. 威联通nas怎么更换大硬盘_手把手带你玩转NAS 篇一:无损转移硬盘数据(威联通篇)TS-453Bmini...

    手把手带你玩转NAS 篇一:无损转移硬盘数据(威联通篇)TS-453Bmini 2019-12-15 11:00:00 51点赞 694收藏 72评论 你是AMD Yes党?还是intel和NVIDI ...

  8. 笔记:python spark机器学习与hadoop大数据

    目录 1.1机器学习的介绍 机器学习架构 1.2Spark的介绍 1.3Spark数据处理RDD.DataFrame.Spark SQl 1.4使用python开发spark机器学习与大数据应用 1. ...

  9. NumPy入门攻略:手把手带你玩转这款强大的数据分析和计算工具

    导读:NumPy(Numerical Python的简称)是高性能科学计算和数据分析的基础包,提供了矩阵运算的功能. 在处理自然语言过程中,需要将文字(中文或其他语言)转换为向量.即把对文本内容的处理 ...

最新文章

  1. ABP官方文档翻译 6.1.2 MVC视图
  2. 只要掌握这三组公式,便可以在AI学习中如鱼得水了
  3. Adobe FrameMaker 2019中文版
  4. html border阴影效果_HTML | 简易相册制作
  5. vue调用百度地图API
  6. 提的最多的数据库“索引”,先来简单了解一下
  7. java爬虫获取div内容_Java爬虫-简单解析网页内容
  8. linphone相关(转)
  9. 海康—SADP激活(设备网络搜索)
  10. 学生个人网页设计作品 学生个人网页模板 简单个人主页成品 个人网页制作 HTML学生个人网站作业设计
  11. Java对字母移动三位加密_4动手动脑,总结及凯撒加密
  12. Git常用命令(汇总)
  13. 根据IP获取城市-新浪ip接口
  14. GAMES101 作业0 环境配置 PC下简单配置i
  15. 五年,你敢说自己是高级开发么?
  16. 波罗的海国家同意支持分布式账本技术开发
  17. 二十一世纪大学英语读写教程学习笔记(原文)——6 - Nerds and Geeks(书呆子和极客)
  18. 大学生变身建筑工人:在家隔离的美国学生们,正在Minecraft中复现一座座大学校园...
  19. 经济萧条时代让我们温暖的10行业(做好准备)
  20. 如何查询域名是否备案,域名备案批量查询方法

热门文章

  1. js追加html内容换行符,javascript – 从HTML中提取文本,同时保留块级元素换行符
  2. 游戏原画师算计算机的一中,游戏原画设计师需要具备哪些基础和设计的能力呢?...
  3. int argc,char* argv[] 详解
  4. 面试必问的线程池,你懂了吗?
  5. 域名中做负载均衡 同一个域名随机访问多个服务器IP(阿里云云解析DNS权重配置)
  6. 如何捕获一个Activity页面上所有的点击行为?
  7. 量子计算: 第四次工业革命的引擎
  8. 上新了丨高性价比5G智能模组,美格智能SRM700正式发布
  9. php mid函数的用法,继续收藏一些PHP常用函数
  10. hanoi塔(汉诺塔)--C语言