手把手带你玩转Spark机器学习-使用Spark进行数据降维
系列文章目录
- 手把手带你玩转Spark机器学习-专栏介绍
- 手把手带你玩转Spark机器学习-问题汇总
- 手把手带你玩转Spark机器学习-Spark的安装及使用
- 手把手带你玩转Spark机器学习-使用Spark进行数据处理和数据转换
- 手把手带你玩转Spark机器学习-使用Spark构建分类模型
- 手把手带你玩转Spark机器学习-使用Spark构建回归模型
- 手把手带你玩转Spark机器学习-使用Spark构建聚类模型
- 手把手带你玩转Spark机器学习-使用Spark进行数据降维
- 手把手带你玩转Spark机器学习-使用Spark进行文本处理
- 手把手带你玩转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进行数据降维相关推荐
- 手把手带你玩转Spark机器学习-使用Spark构建回归模型
系列文章目录 手把手带你玩转Spark机器学习-专栏介绍 手把手带你玩转Spark机器学习-问题汇总 手把手带你玩转Spark机器学习-Spark的安装及使用 手把手带你玩转Spark机器学习-使用S ...
- 手把手带你玩转Spark机器学习-使用Spark进行数据处理和数据转换
系列文章目录 手把手带你玩转Spark机器学习-专栏介绍 手把手带你玩转Spark机器学习-问题汇总 手把手带你玩转Spark机器学习-Spark的安装及使用 手把手带你玩转Spark机器学习-使用S ...
- 手把手带你玩转需求预测-需求预测方法介绍
系列文章目录 手把手带你玩转需求预测 文章目录 系列文章目录 前言 时序预测算法类型 第一代:统计时序预测算法 第二代:经典机器学习方法 第三代:深度学习预测算法 总结 前言 预测算法的本质是从历史数 ...
- 群晖nas介绍文档_手把手带你玩转NAS 篇八:NAS文档随身带——多终端文件同步介绍(群晖drive篇)...
手把手带你玩转NAS 篇八:NAS文档随身带--多终端文件同步介绍(群晖drive篇) 2020-01-08 15:23:44 24点赞 214收藏 31评论 你是AMD Yes党?还是intel和N ...
- ac2100 反弹shell无法粘贴_手把手带你玩转NAS 篇二十一:小米Redmi AC2100路由器刷机padavan保姆级教程...
手把手带你玩转NAS 篇二十一:小米Redmi AC2100路由器刷机padavan保姆级教程 2020-05-14 18:49:24 224点赞 1790收藏 241评论 你是AMD Yes党?还是 ...
- 【三万字保姆级教程】手把手带你玩转Midjourney AI绘画
文章目录 前言 课程介绍 1.1 课程目标和学员对象 课程目标 学员对象 1.2 课程内容概述 1.3 AI绘画的概念和发展 总结 前言 如上图所示,想要学习创作美丽.复杂的艺术作品吗? Midjou ...
- 威联通nas怎么更换大硬盘_手把手带你玩转NAS 篇一:无损转移硬盘数据(威联通篇)TS-453Bmini...
手把手带你玩转NAS 篇一:无损转移硬盘数据(威联通篇)TS-453Bmini 2019-12-15 11:00:00 51点赞 694收藏 72评论 你是AMD Yes党?还是intel和NVIDI ...
- 笔记:python spark机器学习与hadoop大数据
目录 1.1机器学习的介绍 机器学习架构 1.2Spark的介绍 1.3Spark数据处理RDD.DataFrame.Spark SQl 1.4使用python开发spark机器学习与大数据应用 1. ...
- NumPy入门攻略:手把手带你玩转这款强大的数据分析和计算工具
导读:NumPy(Numerical Python的简称)是高性能科学计算和数据分析的基础包,提供了矩阵运算的功能. 在处理自然语言过程中,需要将文字(中文或其他语言)转换为向量.即把对文本内容的处理 ...
最新文章
- ABP官方文档翻译 6.1.2 MVC视图
- 只要掌握这三组公式,便可以在AI学习中如鱼得水了
- Adobe FrameMaker 2019中文版
- html border阴影效果_HTML | 简易相册制作
- vue调用百度地图API
- 提的最多的数据库“索引”,先来简单了解一下
- java爬虫获取div内容_Java爬虫-简单解析网页内容
- linphone相关(转)
- 海康—SADP激活(设备网络搜索)
- 学生个人网页设计作品 学生个人网页模板 简单个人主页成品 个人网页制作 HTML学生个人网站作业设计
- Java对字母移动三位加密_4动手动脑,总结及凯撒加密
- Git常用命令(汇总)
- 根据IP获取城市-新浪ip接口
- GAMES101 作业0 环境配置 PC下简单配置i
- 五年,你敢说自己是高级开发么?
- 波罗的海国家同意支持分布式账本技术开发
- 二十一世纪大学英语读写教程学习笔记(原文)——6 - Nerds and Geeks(书呆子和极客)
- 大学生变身建筑工人:在家隔离的美国学生们,正在Minecraft中复现一座座大学校园...
- 经济萧条时代让我们温暖的10行业(做好准备)
- 如何查询域名是否备案,域名备案批量查询方法
热门文章
- js追加html内容换行符,javascript – 从HTML中提取文本,同时保留块级元素换行符
- 游戏原画师算计算机的一中,游戏原画设计师需要具备哪些基础和设计的能力呢?...
- int argc,char* argv[] 详解
- 面试必问的线程池,你懂了吗?
- 域名中做负载均衡 同一个域名随机访问多个服务器IP(阿里云云解析DNS权重配置)
- 如何捕获一个Activity页面上所有的点击行为?
- 量子计算: 第四次工业革命的引擎
- 上新了丨高性价比5G智能模组,美格智能SRM700正式发布
- php mid函数的用法,继续收藏一些PHP常用函数
- hanoi塔(汉诺塔)--C语言