当前位置:   article > 正文

​用 PySpark ML 构建机器学习模型

pyspark机器学习

c20438eb252193d2871672623b853efc.gif

作者 | 云朵君

来源 | 数据STUDIO

本文中,将和大家一起学习如何使用 PySpark 构建机器学习模型,使用一个入门级案例,简单介绍机器学习模型构建的全流程。

Spark 是一种专门用于交互式查询、机器学习和实时工作负载的开源框架,而 PySpark 是 Python 使用 Spark 的库。

PySpark 是一种用于大规模执行探索性数据分析、构建机器学习管道以及为数据平台创建 ETL 的出色语言。如果你已经熟悉 Python 和 Pandas 等库,那么 PySpark 是一种很好的学习语言,可以创建更具可扩展性的分析和管道。

这篇文章的目的是展示如何使用 PySpark 构建机器学习模型。

8e87db734b304e3156c7f3c8734431c3.png

Conda 创建 python 虚拟环境

conda将几乎所有的工具、第三方包都当作package进行管理,甚至包括python 和conda自身。Anaconda是一个打包的集合,里面预装好了conda、某个版本的python、各种packages等。

 1.安装Anaconda

打开命令行输入conda -V检验是否安装及当前conda的版本。

通过Anaconda安装默认版本的Python,3.6的对应的是 Anaconda3-5.2,5.3以后的都是python 3.7。
(https://repo.anaconda.com/archive/)

 2.conda常用的命令

1) 查看安装了哪些包

conda list

2) 查看当前存在哪些虚拟环境

  1. conda env list 
  2. conda info -e

3) 检查更新当前conda

conda update conda

 3.Python创建虚拟环境

conda create -n your_env_name python=x.x

anaconda命令创建python版本为x.x,名字为your_env_name的虚拟环境。your_env_name文件可以在Anaconda安装目录envs文件下找到

 4.激活或者切换虚拟环境

打开命令行,输入python --version检查当前 python 版本。

  1. Linux: source activate your_env_nam
  2. Windows: activate your_env_name

 5.对虚拟环境中安装额外的包

conda install -n your_env_name [package]

 6.关闭虚拟环境

(即从当前环境退出返回使用PATH环境中的默认python版本)

  1. deactivate env_name
  2. # 或者`activate root`切回root环境
  3. Linux下:source deactivate

 7.删除虚拟环境

conda remove -n your_env_name --all

 8.删除环境钟的某个包

conda remove --name $your_env_name  $package_name

 9.设置国内镜像

http://Anaconda.org 的服务器在国外,安装多个packages时,conda下载的速度经常很慢。清华TUNA镜像源有Anaconda仓库的镜像,将其加入conda的配置即可:

  1. # 添加Anaconda的TUNA镜像
  2. conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
  3. # 设置搜索时显示通道地址
  4. conda config --set show_channel_urls yes

 10.恢复默认镜像

  1. conda config --remove-key channels
  2. 安装 PySpark

PySpark 的安装过程和其他 python 的包一样简单(例如 Pandas、Numpy、scikit-learn)。

一件重要的事情是,首先确保你的机器上已经安装了java。然后你可以在你的 jupyter notebook 上运行 PySpark。

3db6c94e69cdb36a9a9a11ad9067b764.png

ee9cb09572c8da602b5113a5a1e07cb3.png

探索数据

我们使用糖尿病数据集,它与美国国家糖尿病、消化和肾脏疾病研究所的糖尿病疾病有关。分类目标是预测患者是否患有糖尿病(是/否)。数据集可以从 Kaggle 下载:
https://www.kaggle.com/uciml/pima-indians-diabetes-database?ref=hackernoon.com

  1. from pyspark.sql import SparkSession
  2. spark = SparkSession.builder.appName('ml-diabetes').getOrCreate()
  3. df = spark.read.csv('diabetes.csv', header = True, inferSchema = True)
  4. df.printSchema()
2e6b680454744ec5eb79fadd4cfa76e9.png

数据集由几个医学预测变量和一个目标变量 Outcome 组成。预测变量包括患者的怀孕次数、BMI、胰岛素水平、年龄等。

Pregnancies:怀孕次数
Glucose:2小时内口服葡萄糖耐量试验的血糖浓度
BloodPressure:舒张压(mm Hg)
SkinThickness:三头肌皮肤褶皱厚度(mm)
Insulin:2小时血清胰岛素(mu U/ml)
BMI:身体质量指数(体重单位kg/(身高单位m)²)
diabespedigreefunction:糖尿病谱系功能
Age:年龄(年)
Outcome:类变量(0或1)

输入变量: 葡萄糖、血压、BMI、年龄、怀孕、胰岛素、皮肤厚度、糖尿病谱系函数。
输出变量: 结果。

看看前五个观察结果。Pandas 数据框比 Spark DataFrame.show() 更漂亮。

  1. import pandas as pd
  2. pd.DataFrame(df.take(5), 
  3.              columns=df.columns).transpose()
49f2f69a91d99f7ff14a8eaa23200b71.png

在 PySpark 中,您可以使用 Pandas 的 DataFrame 显示数据 toPandas()

df.toPandas()
2fcf9e7ec8af41f9cb1f55330345bdca.png

检查类是完全平衡的!

df.groupby('Outcome').count().toPandas()
eb6720a5445818465dd46c41916f2b16.png

964e569857e580e9b6e48193bc96cbac.png

描述性统计

  1. numeric_features = [t[0for t in df.dtypes if t[1] == 'int']
  2. df.select(numeric_features)\
  3.       .describe()\
  4.       .toPandas()\
  5.       .transpose()
1feff964f291c605e2dd97e440f3790a.png

 自变量之间的相关性

  1. from pandas.plotting import scatter_matrix
  2. numeric_data = df.select(numeric_features).toPandas()
  3. axs = scatter_matrix(numeric_data, figsize=(88));
  4. # Rotate axis labels and remove axis ticks
  5. n = len(numeric_data.columns)
  6. for i in range(n):
  7.     v = axs[i, 0]
  8.     v.yaxis.label.set_rotation(0)
  9.     v.yaxis.label.set_ha('right')
  10.     v.set_yticks(())
  11.     h = axs[n-1, i]
  12.     h.xaxis.label.set_rotation(90)
  13.     h.set_xticks(())
843db8bf6bbc3a5dad2a554371107aa2.png

890546da45300b56e862719d8e131b81.png

数据准备和特征工程

在这一部分中,我们将删除不必要的列并填充缺失值。最后,为机器学习模型选择特征。这些功能将分为训练和测试两部分。

 缺失数据处理

  1. from pyspark.sql.functions import isnull, when, count, col
  2. df.select([count(when(isnull(c), c)).alias(c)
  3.            for c in df.columns]).show()

这个数据集很棒,没有任何缺失值。

195ab25917f82e98fa2ce3203fbb58c1.png

 不必要的列丢弃

  1. dataset = dataset.drop('SkinThickness')
  2. dataset = dataset.drop('Insulin')
  3. dataset = dataset.drop('DiabetesPedigreeFunction')
  4. dataset = dataset.drop('Pregnancies')
  5. dataset.show()
0ac6b3c8b9fdd6d6e0ca96168890ea03.png

 特征转换为向量

VectorAssembler —— 将多列合并为向量列的特征转换器。

  1. # 用VectorAssembler合并所有特性
  2. required_features = ['Glucose',
  3.                     'BloodPressure',
  4.                     'BMI',
  5.                     'Age']
  6. from pyspark.ml.feature import VectorAssembler
  7. assembler = VectorAssembler(
  8.         inputCols=required_features, 
  9.         outputCol='features')
  10. transformed_data = assembler.transform(dataset)
  11. transformed_data.show()

现在特征转换为向量已完成。

e8d3535d27836e0675a9ed0fc2d8cd78.png

训练和测试拆分

将数据随机分成训练集和测试集,并设置可重复性的种子。

  1. (training_data, test_data) = transformed_data.randomSplit([0.8,0.2], seed =2020)
  2. print("训练数据集总数: " + str(training_data.count()))
  3. print("测试数据集总数: " + str(test_data.count()))
  1. 训练数据集总数:620
  2. 测试数据集数量:148

22c51748f6db33197876b0f1de31697e.png

机器学习模型构建

 随机森林分类器

随机森林是一种监督学习算法,用于分类和回归。但是,它主要用于分类问题。众所周知,森林是由树木组成的,树木越多,森林越茂盛。类似地,随机森林算法在数据样本上创建决策树,然后从每个样本中获取预测,最后通过投票选择最佳解决方案。这是一种比单个决策树更好的集成方法,因为它通过对结果进行平均来减少过拟合。

  1. from pyspark.ml.classification import RandomForestClassifier
  2. rf = RandomForestClassifier(labelCol='Outcome'
  3.                             featuresCol='features',
  4.                             maxDepth=5)
  5. model = rf.fit(training_data)
  6. rf_predictions = model.transform(test_data)

 评估随机森林分类器模型

  1. from pyspark.ml.evaluation import MulticlassClassificationEvaluator
  2. multi_evaluator = MulticlassClassificationEvaluator(
  3.       labelCol = 'Outcome', metricName = 'accuracy')
  4. print('Random Forest classifier Accuracy:', multi_evaluator.evaluate(rf_predictions))
Random Forest classifier Accuracy:0.79452

 决策树分类器

决策树被广泛使用,因为它们易于解释、处理分类特征、扩展到多类分类设置、不需要特征缩放,并且能够捕获非线性和特征交互。

  1. from pyspark.ml.classification import DecisionTreeClassifier
  2. dt = DecisionTreeClassifier(featuresCol = 'features',
  3.                             labelCol = 'Outcome',
  4.                             maxDepth = 3)
  5. dtModel = dt.fit(training_data)
  6. dt_predictions = dtModel.transform(test_data)
  7. dt_predictions.select('Glucose''BloodPressure'
  8.                       'BMI''Age''Outcome').show(10)

评估决策树模型

  1. from pyspark.ml.evaluation import MulticlassClassificationEvaluator
  2. multi_evaluator = MulticlassClassificationEvaluator(
  3.       labelCol = 'Outcome'
  4.           metricName = 'accuracy')
  5. print('Decision Tree Accuracy:'
  6.       multi_evaluator.evaluate(dt_predictions))
Decision Tree Accuracy: 0.78767

 逻辑回归模型

逻辑回归是在因变量是二分(二元)时进行的适当回归分析。与所有回归分析一样,逻辑回归是一种预测分析。逻辑回归用于描述数据并解释一个因二元变量与一个或多个名义、序数、区间或比率水平自变量之间的关系。当因变量(目标)是分类时,使用逻辑回归。

  1. from pyspark.ml.classification import LogisticRegression
  2. lr = LogisticRegression(featuresCol = 'features'
  3.                         labelCol = 'Outcome'
  4.                         maxIter=10)
  5. lrModel = lr.fit(training_data)
  6. lr_predictions = lrModel.transform(test_data)

评估我们的逻辑回归模型。

  1. from pyspark.ml.evaluation import MulticlassClassificationEvaluator
  2. multi_evaluator = MulticlassClassificationEvaluator(
  3.       labelCol = 'Outcome',
  4.           metricName = 'accuracy')
  5. print('Logistic Regression Accuracy:'
  6.       multi_evaluator.evaluate(lr_predictions))
Logistic Regression Accuracy:0.78767

 梯度提升树分类器模型

梯度提升是一种用于回归和分类问题的机器学习技术,它以弱预测模型(通常是决策树)的集合形式生成预测模型。

  1. from pyspark.ml.classification import GBTClassifier
  2. gb = GBTClassifier(
  3.       labelCol = 'Outcome'
  4.       featuresCol = 'features')
  5. gbModel = gb.fit(training_data)
  6. gb_predictions = gbModel.transform(test_data)

评估我们的梯度提升树分类器。

  1. from pyspark.ml.evaluation import MulticlassClassificationEvaluator
  2. multi_evaluator = MulticlassClassificationEvaluator(
  3.         labelCol = 'Outcome',
  4.         metricName = 'accuracy')
  5. print('Gradient-boosted Trees Accuracy:',
  6.       multi_evaluator.evaluate(gb_predictions))
Gradient-boosted Trees Accuracy:0.80137

f82fa80af6d5e4e3c25fa4702c0ee2d7.png

结论

PySpark 是一种非常适合数据科学家学习的语言,因为它支持可扩展的分析和 ML 管道。如果您已经熟悉 Python 和 Pandas,那么您的大部分知识都可以应用于 Spark。

总而言之,我们已经学习了如何使用 PySpark 构建机器学习应用程序。我们尝试了三种算法,梯度提升在我们的数据集上表现最好。

 
 

8f5be3e42b0b90b06fe310e0c3ad150b.gif

往期回顾

花 39 美金请AI画家弄了个Logo

程序员最想干的3件事!

基于 Python 的 8 种常用抽样方法

7岁男童因下棋太快,被机器人夹断手指?

  1. 分享
  2. 点收藏
  3. 点点赞
  4. 点在看
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/955423
推荐阅读
相关标签
  

闽ICP备14008679号