温馨提示:如果使用电脑查看图片不清晰,可以使用手机打开文章单击文中的图片放大查看高清原图。


Fayson的github:

​https://github.com/fayson/cdhproject​


提示:代码块部分可以左右滑动查看噢


1.文档编写目的




当我们在跑机器学习程序,尤其是调节网格参数时,通常待调节的参数有很多,参数之间的组合更是复杂。Python的sklearn包中GridSearch模块,能够在指定的范围内自动搜索具有不同超参数的不同模型组合,在数据量过于庞大时对于单节点的运算存在效率问题,本篇文章Fayson主要介绍如何将Python中的GridSearch搬到CDH集群中借助于Spark进行分布式运算。


  • 内容概述

1.环境准备

2.Python和PySpark代码示例

3.示例运行


  • 测试环境

1.CM和CDH版本为5.14.2

2.Redhat7.4

3.Spark2.2.0


2.环境准备




1.在CDH集群的所有节点执行如下命令安装OS依赖包


[root@ip-172-31-6-83 shell]# yum -y install gcc python-devel

(可左右滑动)


如何在CDH中使用PySpark分布式运行GridSearch算法_git


2.在集群所有节点安装Python的依赖包


[root@ip-172-31-6-83 pip-10.0.1]# pip install sklearn

(可左右滑动)


如何在CDH中使用PySpark分布式运行GridSearch算法_git_02


[root@ip-172-31-6-83 pyspark_code]# pip install numpy

(可左右滑动)


如何在CDH中使用PySpark分布式运行GridSearch算法_spark_03


[root@ip-172-31-6-83 pyspark_code]# pip install scipy

(可左右滑动)


如何在CDH中使用PySpark分布式运行GridSearch算法_spark_04


[root@ip-172-31-6-83 pyspark_code]# pip install spark-sklearn

(可左右滑动)


如何在CDH中使用PySpark分布式运行GridSearch算法_git_05


3.Python版GridSearch代码




如下是Python版本的GridSearch示例代码:


#sklearn_GridSearch常用方法:
#grid.fit():运行网格搜索
#grid_scores_:给出不同参数情况下的评价结果
#best_params_:描述了已取得最佳结果的参数的组合
#best_score_:成员提供优化过程期间观察到的最好的评分

from sklearn import datasets
from sklearn.cross_validation import train_test_split
from sklearn.grid_search import GridSearchCV
from sklearn.metrics import classification_report
from sklearn.svm import SVC

# Loading the Digits dataset
digits = datasets.load_digits()

# To apply an classifier on this data, we need to flatten the image, to
# turn the data in a (samples, feature) matrix:
n_samples = len(digits.images)
X = digits.images.reshape((n_samples, -1))
y = digits.target

# 将数据集分成训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.5, random_state=0)

# 设置gridsearch的参数
tuned_parameters = [{'kernel': ['rbf'], 'gamma': [1e-3, 1e-4],
'C': [1, 10, 100, 1000]},
{'kernel': ['linear'], 'C': [1, 10, 100, 1000]}]

#设置模型评估的方法.如果不清楚,可以参考上面的k-fold章节里面的超链接
score = 'precision'
#构造这个GridSearch的分类器,5-fold
clf = GridSearchCV(SVC(), tuned_parameters, cv=5,
scoring='%s_weighted'% score)
#只在训练集上面做k-fold,然后返回最优的模型参数
clf.fit(X_train, y_train)
print("Best parameters set found on development set:")
#输出最优的模型参数
print(clf.best_params_)
#在测试集上测试最优的模型的泛化能力.
y_true, y_pred = y_test, clf.predict(X_test)
print(classification_report(y_true, y_pred))

(可左右滑动)


4.Pyspark版GridSearch代码




如下是PySpark的示例代码:


# -*- coding: utf-8 -*-
from sklearn import svm, datasets
from sklearn.model_selection import train_test_split
from spark_sklearn.grid_search import GridSearchCV
from pyspark import SparkContext

sc = SparkContext(appName="PySpark_GridSearch")
sc.setLogLevel("INFO")

# Loading the Digits dataset
digits = datasets.load_digits()

# To apply an classifier on this data, we need to flatten the image, to
# turn the data in a (samples, feature) matrix:
n_samples = len(digits.images)
X = digits.images.reshape((n_samples, -1))
y = digits.target

# 将数据集分成训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5, random_state=0)

# 设置gridsearch的参数
tuned_parameters = [{'kernel': ['rbf'], 'gamma': [1e-3, 1e-4],
'C': [1, 10, 100, 1000]},
{'kernel': ['linear'], 'C': [1, 10, 100, 1000]}]

#设置模型评估的方法.如果不清楚,可以参考上面的k-fold章节里面的超链接
score = 'precision'
#构造这个GridSearch的分类器,5-fold
svr = svm.SVC()
clf = GridSearchCV(sc, svr, tuned_parameters, cv=5, scoring='%s_weighted'% score)

#只在训练集上面做k-fold,然后返回最优的模型参数
clf.fit(X_train, y_train)
sorted(clf.cv_results_.keys())
#输出模型参数
print(clf.cv_results_)

(可左右滑动)


5.示例运行




1.在Spark2的Gateway节点上使用spark2-submit命令提交运行


spark2-submit gridsearch.py \
--master yarn-client \
--num-executors 4 \
--driver-memory 2g \
--driver-cores 1 \
--executor-memory 2g \
--executor-cores 1

(可左右滑动)


如何在CDH中使用PySpark分布式运行GridSearch算法_python_06


命令行显示作业运行成功,日志如下:


如何在CDH中使用PySpark分布式运行GridSearch算法_python_07


查看Yarn的8080界面,作业显示执行成功


如何在CDH中使用PySpark分布式运行GridSearch算法_git_08


查看Spark2的History,可以看到作业是分布在CDH集群的多个节点上运行


如何在CDH中使用PySpark分布式运行GridSearch算法_python_09


6.总结




1.在CDH集群中分布式运行Gridsearch算法时,需要将集群所有节点安装Python的sklearn、numpy、scipy及spark-sklearn依赖包


2.代码上需要将引入spark-learn包下的grid_search


3.关于spark-learn包中更多API请参考如下文档:

​https://databricks.github.io/spark-sklearn-docs/#id5​



提示:代码块部分可以左右滑动查看噢


为天地立心,为生民立命,为往圣继绝学,为万世开太平。

温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。



推荐关注Hadoop实操,第一时间,分享更多Hadoop干货,欢迎转发和分享。

如何在CDH中使用PySpark分布式运行GridSearch算法_git_10

原创文章,欢迎转载,转载请注明:转载自微信公众号Hadoop实操