如何在 Spark 机器学习中应用 scikit-learn

spark mllib(2)
了解机器学习数据流水线有关内容。
怎么用Apache Spark机器学习包来实现机器学习数据流水线。
数据价值链处理的步骤。
Spark机器学习流水线模块和API。
文字分类和广告检测用例。
在之前的“用Apache Spark做大数据处理”文章中,我们学习了Apache Spark框架,介绍了Spark和它用作大数据处理的不同库(),Spark
SQL库(),Spark流()和Spark
MLlib机器学习库()。
在这篇文章中,我们Spark的其它机器学习API,名为,如果要用数据流水线来开发大数据应用程序的话,这个是推荐的解决方案。
相关厂商内容
相关赞助商
QCon北京-18日,北京·国家会议中心,
Spark ML()包提供了构建在之上的机器学习API,它已经成了Spark
SQL库的核心部分。这个包可以用于开发和管理机器学习流水线。它也可以提供特征抽取器、转换器、选择器,并支持分类、汇聚和分簇等机器学习技术。这些全都对开发机器学习解决方案至关重要。
在这里我们看看如何使用Apache Spark来做探索式数据分析(Exploratory Data Analysis)、开发机器学习流水线,并使用Spark ML包中提供的API和算法。
因为支持构建机器学习数据流水线,Apache Spark框架现在已经成了一个非常不错的选择,可以用于构建一个全面的用例,包括ETL、指量分析、实时流分析、机器学习、图处理和可视化等。
机器学习数据流水线
机器学习流水线可以用于创建、调节和检验机器学习工作流程序等。机器学习流水线可以帮助我们更加专注于项目中的大数据需求和机器学习任务等,而不是把时间和精力花在基础设施和分布式计算领域上。它也可以在处理机器学习问题时帮助我们,在探索阶段我们要开发迭代式功能和组合模型。
机器学习工作流通常需要包括一系列的处理和学习阶段。机器学习数据流水线常被描述为一种阶段的序列,每个阶段或者是一个转换器模块,或者是个估计器模块。这些阶段会按顺序执行,输入数据在流水线中流经每个阶段时会被处理和转换。
机器学习开发框架要支持分布式计算,并作为组装流水线模块的工具。还有一些其它的构建数据流水线的需求,包括容错、资源管理、可扩展性和可维护性等。
在真实项目中,机器学习工作流解决方案也包括模型导入导出工具、交叉验证来选择参数、为多个数据源积累数据等。它们也提供了一些像功能抽取、选择和统计等的数据工具。这些框架支持机器学习流水线持久化来保存和导入机器学习模型和流水线,以备将来使用。
机器学习工作流的概念和工作流处理器的组合已经在多种不同系统中越来越受欢迎。象和等大数据处理框架也使用流水线的概念来构建系统。
一个典型的流程包括如下步骤:
机器学习数据流水线所用的方法都是类似的。下图展示了在机器学习流水线处理中涉及到的不同步骤。
从不同的数据源中导入数据。
对数据进行预处理,为接下来的机器学习数据分析做好准备。
也叫特征工程,这一步是从数据集中抽取功能。
在接下来的几个步骤里用训练数据集来训练机器学习模型。
接下来要基于不同的预测参数来评估机器学习模型的效率。我们也会在验证步骤调节模型,这一步用于挑选出最佳模型。
这一步是在做模型部署之前进行测试。
最后一步是把选出来的模型部署到生产环境中运行。
表一:机器学习流水线处理步骤
这些步骤也可以用下面的图一表示。
图一:机器学习数据流水线处理流图
接下来让我们一起看看每个步骤的细节。
数据注入:我们收集起来供给机器学习流水线应用程序的数据可以来自于多种数据源,数据规模也是从几百GB到几TB都可以。而且,大数据应用程序还有一个特征,就是注入不同格式的数据。
数据清洗:数据清洗这一步在整个数据分析流水线中是第一步,也是至关重要的一步,也可以叫做数据清理或,这一步主要是要把输入数据变成结构化的,以方便后续的数据处理和预测性分析。依进入到系统中的数据质量不同,,把数据转成合适的格式,这样才能把机器学习模型应用到数据上。
数据总会有各种各样的质量问题,比如数据不完整,或者数据项不正确或不合法等。数据清洗过程通常会使用各种不同的方法,等,用流水线中的定制的转换器去执行数据清洗动作。
稀疏或粗粒数据是数据分析中的另一个挑战。在这方面总会发生许多极端案例,所以我们要用上面讲到的数据清洗技术来保证输入到数据流水线中的数据必须是高质量的。
伴随着我们对问题的深入理解,每一次的连续尝试和不断地更新模型,数据清洗也通常是个迭代的过程。象、或等数据转换工具都可以用来完成数据清洗任务。
特征抽取:在特征抽取(有时候也叫特征工程)这一步,我们会用(Hashing
Term Frequency)和等技术来从原始数据中抽取具体的功能。这一步的输出结果常常也包括一个汇编模块,会一起传入下一个步骤进行处理。
模型训练:机器学习包括提供一个算法,并提供一些训练数据让模型可以学习。学习算法会从训练数据中发现模式,并生成输出模型。
模型验证:这一步包评估和调整机器学习模型,以衡量用它来做预测的有效性。如这篇所说,对于二进制分类模型评估指标可以用接收者操作特征(Receiver
Operating Characteristic,)曲线。ROC曲线可以表现一个二进制分类器系统的性能。创建它的方法是在不同的阈值设置下描绘真阳性率(True
Positive Rate,)和假阳性率(False Positive Rate,)之间的对应关系。
模型选择:模型选择指让转换器和估计器用数据去选择参数。这在机器学习流水线处理过程中也是关键的一步。ParamGridBuilder和CrossValidator等类都提供了API来选择机器学习模型。
模型部署:一旦选好了正确的模型,我们就可以开始部署,输入新数据并得到预测性的分析结果。我们也可以把机器学习模型部署成。
Spark机器学习
机器学习流水线API是在Apache Spark框架1.2版中引入的。它给开发者们提供了API来创建并执行复杂的机器学习工作流。流水线API的目标是通过为不同机器学习概念提供标准化的API,来让用户可以快速并轻松地组建并配置可行的分布式机器学习流水线。流水线API包含在org.apache.spark.ml包中。
Spark ML也有助于把多种机器学习算法组合到一条流水线中。
Spark机器学习API被分成了两个包,分别是spark.mllib和spark.ml。其中spark.ml包包括了基于RDD构建的原始API。而spark.ml包则提供了构建于DataFrame之上的高级API,用于构建机器学习流水线。
基于RDD的MLlib库API现在处于。
如下面图二所示,Spark ML是Apache Spark生态系统中的一个非常重要的大数据分析库。
图二:包括了Spark ML的Spark生态系统
机器学习流水线模块
机器学习数据流水线包括了完成数据分析任务所需要的多个模块。数据流水线的关键模块被列在了下面:
流水线的阶段
参数(和参数地图)
接下来我们简单看看这些模块可以怎么对应到整体的步骤中。
数据集:在机器学习流水线中是使用DataFrame来表现数据集的。它也允许按有名字的字段保存结构化数据。这些字段可以用于保存文字、功能向量、真实标签和预测。
流水线:机器学习工作流被建模为流水线,这包括了一系列的阶段。每个阶段都对输入数据进行处理,为下一个阶段产生输出数据。一个流水线把多个转换器和估计器串连起来,描述一个机器学习工作流。
流水线的阶段:我们定义两种阶段,转换器和估计器。
转换器:算法可以把一个DataFrame转换成另一个DataFrame。比如,机器学习模型就是一个转换器,用于把一个有特征的DataFrame转换成一个有预测信息的DataFrame。
转换器会把一个DataFrame转成另一个DataFrame,同时为它加入新的特征。比如在Spark ML包中,就会把一个有标签索引的字段转换成一个有向量特征的字段。每个转换器都有一个transform()函数,被调用时就会把一个DataFrame转换成另一个。
估计器:估计器就是一种机器学习算法,会从你提供的数据中进行学习。估计器的输入是一个DataFrame,输出就是一个转换器。估计器用于训练模型,它生成转换器。比如,逻辑回归估计器就会产生逻辑回归转换器。另一个例子是把K-Means做为估计器,它接受训练数据,生成K-Means模型,就是一个转换器。
参数:机器学习模块会使用通用的API来描述参数。参数的例子之一就是模型要使用的最大迭代次数。
下图展示的是一个用作文字分类的数据流水线的各个模块。
图三:使用Spark ML的数据流水线
机器学习流水线的用例之一就是文字分类。这种用例通常包括如下步骤:
清洗文字数据
将数据转化成特征向量,并且
训练分类模型
在文字分类中,在进行分类模型(类似)的训练之前,会进行n-gram抽象和TF-IDF特征权重等数据预处理。
另一个机器学习流水线用例就是在这篇中描述的图像分类。
还有很多种其它机器学习用例,包括欺诈检测(使用分类模型,这也是监督式学习的一部分),用户分区(聚簇模型,这也是非监督式学习的一部分)。
词频-逆向文档频率(Term Frequency - Inverse Document Frequency,)是一种在给定样本集合内评估一个词的重要程度的静态评估方法。这是一种信息获取算法,用于在一个文档集合内给一个词的重要性打分。
TF:如果一个词在一份文档中反复出现,那这个词就比较重要。具体计算方法为:
TF = (# of times word X appears in a document) / (Total # of
words in the document)
IDF:但如果一个词在多份文档中都频繁出现(比如the,and,of等),那就说明这个词没有什么实际意义,因此就要降低它的评分。
下面我们看个示例程序,了解一下Spark ML包可以怎样用在大数据处理系统中。我们会开发一个文档分类程序,用于区别程序输入数据中的广告内容。测试用的输入数据集包括文档、电子邮件或其它任何从外部系统中收到的可能包含广告的内容。
我们将使用在研讨会上讨论的“用Spark构建机器学习应用”的示例来构建我们的示例程序。
这个用例会对发送到我们的系统中的各种不同消息进行分析。有些消息里面是含有广告信息的,但有些消息里面没有。我们的目标就是要用Spark ML API找出那些包含了广告的消息。
我们将使用机器学习中的算法。逻辑回归是一种回归分析模型,可以基于一个或多个独立变量来预测得到是或非的可能结果。
详细的解决方案
接下来咱们看看这个Spark ML示例程序的细节,以及运行步骤。
数据注入:我们会把包含广告的数据(文本文件)和不包含广告的数据都导入。
数据清洗:在示例程序中,我们不做任何特别的数据清洗操作。我们只是把所有的数据都汇聚到一个DataFrame对象中。
我们随机地从训练数据和测试数据中选择一些数据,创建一个数组对象。在这个例子中我们的选择是70%的训练数据,和30%的测试数据。
在后续的流水线操作中我们分别用这两个数据对象来训练模型和做预测。
我们的机器学习数据流水线包括四步:
创建一个流水线对象,并且在流水线中设置上面的各个阶段。然后我们就可以按照例子,基于训练数据来创建一个逻辑回归模型。
现在,我们再使用测试数据(新数据集)来用模型做预测。
下面图四中展示了例子程序的架构图。
图4:数据分类程序架构图
在实现机器学习流水线解决方案时我们用到了下面的技术。
Apache Spark
表二:在机器学习例子中用到的技术和工具
Spark ML程序
根据研讨会上的例子而写成的机器学习是用Scala编程语言写的,我们可以直接使用Spark
Shell控制台来运行这个程序。
广告检测Scala代码片段:
第一步:创建一个定制的类,用来存储广告内容的细节。
case class SpamDocument(file: String, text: String, label:
第二步:初始化SQLContext,并通过来把Scala对象转换成DataFrame。然后从存放着输入文件的指定目录导入数据集,结果会返回RDD对象。然后由这两个数据集的RDD对象创建DataFrame对象。
val sqlContext = new SQLContext(sc)
import sqlContext.implicits._
// Load the data files with spam
val rddSData = sc.wholeTextFiles(&SPAM_DATA_FILE_DIR&, 1)
val dfSData = rddSData.map(d =& SpamDocument(d._1, d._2,1)).toDF()
dfSData.show()
// Load the data files with no spam
val rddNSData = sc.wholeTextFiles(&NO_SPAM_DATA_FILE_DIR&,
val dfNSData = rddNSData.map(d =& SpamDocument(d._1,d._2, 0)).toDF()
dfNSData.show()
第三步:现在,把数据集汇聚起来,然后根据70%和30%的比例来把整份数据拆分成训练数据和测试数据。
// Aggregate both data frames
val dfAllData = dfSData.unionAll(dfNSData)
dfAllData.show()
// Split the data into 70% training data and 30% test data
val Array(trainingData, testData) =
dfAllData.randomSplit(Array(0.7, 0.3))
第四步:现在可以配置机器学习数据流水线了,要创建我们在文章前面部分讨论到的几个部分:Tokenizer、HashingTF和IDF。然后再用训练数据创建回归模型,在这个例子中是逻辑回归。
// Configure the ML data pipeline
// Create the Tokenizer step
val tokenizer = new Tokenizer()
.setInputCol(&text&)
.setOutputCol(&words&)
// Create the TF and IDF steps
val hashingTF = new HashingTF()
.setInputCol(tokenizer.getOutputCol)
.setOutputCol(&rawFeatures&)
val idf = new
IDF().setInputCol(&rawFeatures&).setOutputCol(&features&)
// Create the Logistic Regression step
val lr = new LogisticRegression()
.setMaxIter(5)
lr.setLabelCol(&label&)
lr.setFeaturesCol(&features&)
// Create the pipeline
val pipeline = new Pipeline()
.setStages(Array(tokenizer, hashingTF, idf, lr))
val lrModel = pipeline.fit(trainingData)
println(lrModel.toString())
第五步:最后,我们调用逻辑回归模型中的转换方法来用测试数据做预测。
// Make predictions.
val predictions = lrModel.transform(testData)
// Display prediction results
predictions.select(&file&, &text&, &label&, &features&, &prediction&).show(300)
Spark机器学习库是Apache Spark框架中最重要的库之一。它用于实现数据流水线。在这篇文章中,我们了解了如何使用包的API以及用它来实现一个文本分类用例。
接下来的内容
图数据模型是关于在数据模型中不同的实体之间的连接和关系的。图数据处理技术最近受到了很多关注,因为可以用它来解决许多问题,包括欺诈检测和开发推荐引擎等。
Spark框架提供了一个库,专门用于图数据分析。我们在这个系列的文章中,接下来会了解这个名为的库。我们会用Spark GraphX来开发一个示例程序,用于图数据处理和分析。
用Apache Spark做大数据分析——第一部分:
用Apache Spark做大数据分析——第二部分:
用Apache Spark做大数据分析——第三部分:
用Apache Spark做大数据分析——第四部分:
Apache Spark项目
Spark机器学习
Spark研讨会关于的练习
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:269558次
积分:4161
积分:4161
排名:第7241名
原创:125篇
转载:174篇
评论:13条
(17)(30)(2)(21)(6)(5)(2)(3)(2)(4)(6)(1)(3)(7)(3)(1)(6)(2)(1)(2)(1)(3)(7)(13)(6)(3)(10)(10)(17)(8)(6)(28)(4)(42)(4)(5)(7)(1)966,690 七月 独立访问用户
语言 & 开发
架构 & 设计
文化 & 方法
您目前处于:
利用Scikit-Learn和Spark预测Airbnb的listing价格
利用Scikit-Learn和Spark预测Airbnb的listing价格
日. 估计阅读时间:
智能化运维、Serverless、DevOps......2017年有哪些最新运维技术趋势?!
相关厂商内容
相关赞助商
CNUTCon全球运维技术大会,9月10日-9月11日,上海&光大会展中心大酒店,
本列子提供了详细的使用Python编程的scikit-learn应用以及如何使用Spark进行交叉验证和调超参数。我们使用scikit-learn的线性回归方法,然后借助Spark来提高穷举搜素的结果和速度,这里面用到 和方法。
扫描数据和清洗数据
首先,从MapR-FS文件系统加载listing.csv数据集,创建一个Pandas dataframe(备注:Pandas是Python下一个开源数据分析的库,它提供的数据结构DataFrame)。数据集大概包含7000条listing,每个listing 有90个不同的列,但不是每个列都有用,这里只挑选对最终的预测listing价格有用的几列。
代码如下:
%matplotlib inline
import pandas as pd
import numpy as np
from sklearn import ensemble
from sklearn import linear_model
from sklearn.grid_search import GridSearchCV
from sklearn import preprocessing
from sklearn.cross_validation import train_test_split
import sklearn.metrics as metrics
import matplotlib.pyplot as plt
from collections import Counter
LISTINGSFILE = '/mapr/tmclust1/user/mapr/pyspark-learn/airbnb/listings.csv'
cols = ['price',
'accommodates',
'bedrooms',
'beds',
'neighbourhood_cleansed',
'room_type',
'cancellation_policy',
'instant_bookable',
'reviews_per_month',
'number_of_reviews',
'availability_30',
'review_scores_rating'
# read the file into a dataframe
df = pd.read_csv(LISTINGSFILE, usecols=cols)
neighborhood_cleansed列是房主的邻居信息。你会看到这些信息分布不均衡,通过如下的图看出分布是个曲线,末尾的数量高,而靠左边非常少。总体来说,房主的邻居信息分布合理。
nb_counts = Counter(df.neighbourhood_cleansed)
tdf = pd.DataFrame.from_dict(nb_counts, orient='index').sort_values(by=0)
tdf.plot(kind='bar')
下面对数据进行按序清洗。
number_reviews'和 reviews_per_month两列看起来要去掉大量的NaN值(Python中NaN值就是NULL)。我们把reviews_per_month为NaN值的地方设置为0,因为在某些数据分析中这些数据是有意义的。
我们去掉那些明显异常的数据,比如,卧室数目、床或者价格为0的listing记录,并且删除那些NaN值的行。最后的结果集有5246条,原始数据集为7029条。
# first fixup 'reviews_per_month' where there are no reviews
df['reviews_per_month'].fillna(0, inplace=True)
# just drop rows with bad/weird values
# (we could do more here)
df = df[df.bedrooms != 0]
df = df[df.beds != 0]
df = df[df.price != 0]
df = df.dropna(axis=0)
清洗的最后一步,我们把price列的值转换成float型数据,只保留卧室的数目等于1的数据。拥有一个卧室的数据大概有70%(在大城市,旧金山,这个数字还算正常),这里对这类数据进行分析。回归分析只对单个类型的数据进行分析,回归模型很少会和其他特征进行复杂的交互。为了对多个类型的数据进行预测,可以选择对不同的类型数据(比如,分为拥有2、3、4个卧室)单独进行建模,或者通过聚类对那些很容易区分开来的数据进行分析。
df = df[df.bedrooms == 1]
# remove the $ from the price and convert to float
df['price'] = df['price'].replace('[\$,)]','',
regex=True).replace('[(]','-', regex=True).astype(float)
类别变量处理
数据集中有几列包含分类变量。根据可能存在的值有几种处理方法。
neighborhood_cleansed列是邻居的名字,string类型。scikit-learn中的回归分析只接受数值类型的列。对于这类变量,使用Pandas的get_dummies转换成虚拟变量,这个处理过程也叫&one hot&编码,每个listing行都包含一个&1&对应她/他的邻居。我们用类似的方法处理cancellation_policy和room_type列。
instant_bookable列是个boolean类型的值。
# get feature encoding for categorical variables
n_dummies = pd.get_dummies(df.neighbourhood_cleansed)
rt_dummies = pd.get_dummies(df.room_type)
xcl_dummies = pd.get_dummies(df.cancellation_policy)
# convert boolean column to a single boolean value indicating whether this listing has instant booking available
ib_dummies = pd.get_dummies(df.instant_bookable, prefix=&instant&)
ib_dummies = ib_dummies.drop('instant_f', axis=1)
# replace the old columns with our new one-hot encoded ones
alldata = pd.concat((df.drop(['neighbourhood_cleansed', \
'room_type', 'cancellation_policy', 'instant_bookable'], axis=1), \
n_dummies.astype(int), rt_dummies.astype(int), \
xcl_dummies.astype(int), ib_dummies.astype(int)), \
allcols = alldata.columns
接下来用Pandas的scatter_matrix函数快速的显示各个特征的矩阵,并检查特征间的共线性。本列子中共线性不明显,因为我们仅仅挑选列一小部分特征集,而且互相明显不相关。
scattercols = ['price','accommodates', 'number_of_reviews', 'reviews_per_month', 'beds', 'availability_30', 'review_scores_rating']
axs = pd.scatter_matrix(alldata[scattercols],
figsize=(12, 12), c='red')
(点击放大图像)
scatter_matrix的输出结果发现并没有什么明显的问题。最相近的特征应该是beds和accommodates。
scikit-learn最大的优势是我们可以在相同的数据集上做不同的线性模型,这可以给我们一些调参的提示。我们开始使用其中的六种:vanilla linear regression, ridge and lasso regressions, ElasticNet, bayesian ridge和 Orthogonal Matching Pursuit。
为了评估这些模型哪个更好,我们需要一种对其进行打分,这里采用绝对中位误差。说到这里,很可能会出现异常值,因为我们没有对数据集进行过滤或者聚合。
ests = [ linear_model.LinearRegression(), linear_model.Ridge(),
linear_model.Lasso(), linear_model.ElasticNet(),
linear_model.BayesianRidge(), linear_model.OrthogonalMatchingPursuit() ]
ests_labels = np.array(['Linear', 'Ridge', 'Lasso', 'ElasticNet', 'BayesRidge', 'OMP'])
errvals = np.array([])
X_train, X_test, y_train, y_test = train_test_split(alldata.drop(['price'], axis=1),
alldata.price, test_size=0.2, random_state=20)
for e in ests:
e.fit(X_train, y_train)
this_err = metrics.median_absolute_error(y_test, e.predict(X_test))
#print &got error %0.2f& % this_err
errvals = np.append(errvals, this_err)
pos = np.arange(errvals.shape[0])
srt = np.argsort(errvals)
plt.figure(figsize=(7,5))
plt.bar(pos, errvals[srt], align='center')
plt.xticks(pos, ests_labels[srt])
plt.xlabel('Estimator')
plt.ylabel('Median Absolute Error')
看下六种评估器得出的结果大体的相同,通过中位误差预测的结果是30到35美元。最终的结果惊人的相似,主要原因是我们未做任何调参。
接下来我们继续集成方法来获取更好的结果。集成方法的优势在于可以获得更好的结果,副作用便是超参数的&飘忽不定&,所以得调参。每个参数都会影响我们的模型,必须要求实验得出正确结构。最常用的方法是网格搜索法(grid search)暴力尝试所有的超参数,用交叉验证去找到最好的一个模型。Scikit-learn提供GridSearchCV函数正是为了这个目的。
使用GridSearchCV需要权衡穷举搜索和交叉验证所耗费的CPU和时间。这地方就是为什么我们使用Spark进行分布式搜索,让我们更快的去组合特征。
我们第一个尝试将限制参数的数目为了更快的得到结果,最后看下是不是超参数会比单个方法要好。
n_est = 300
tuned_parameters = {
&n_estimators&: [ n_est ],
&max_depth& : [ 4 ],
&learning_rate&: [ 0.01 ],
&min_samples_split& : [ 1 ],
&loss& : [ 'ls', 'lad' ]
gbr = ensemble.GradientBoostingRegressor()
clf = GridSearchCV(gbr, cv=3, param_grid=tuned_parameters,
scoring='median_absolute_error')
preds = clf.fit(X_train, y_train)
best = clf.best_estimator_
这次尝试的中位误差是23.64美元。已经可以看出用GradientBoostingRegressor比前面那次任何一种方法的结果都要好,没有做任何调优,中位误差已经比前面那组里最好的中位误差(使用BayesRidge()方法)还要少20%。
让我们看下每步boosting的误差,这样可以帮助我们找到迭代过程遇到的问题。
# plot error for each round of boosting
test_score = np.zeros(n_est, dtype=np.float64)
train_score = best.train_score_
for i, y_pred in enumerate(best.staged_predict(X_test)):
test_score[i] = best.loss_(y_test, y_pred)
plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
plt.plot(np.arange(n_est), train_score, 'darkblue', label='Training Set Error')
plt.plot(np.arange(n_est), test_score, 'red', label='Test Set Error')
plt.legend(loc='upper right')
plt.xlabel('Boosting Iterations')
plt.ylabel('Least Absolute Deviation')
从曲线可以看出,曲线右边到200-250次迭代到位置仍然可以通过迭代获得好的结果,所以我们增加迭代次数到500。
接下来使用GridSearchCV进行各种超参数组合,这需要CPU和数小时。使用可以减少错误和时间。
from pyspark import SparkContext, SparkConf
from spark_sklearn import GridSearchCV
conf = SparkConf()
sc = SparkContext(conf=conf)
clf = GridSearchCV(sc, gbr, cv=3, param_grid=tuned_parameters, scoring='median_absolute_error')
至此,我们看下这种spark-sklearn 集成架构的优势。spark-sklearn 集成提供了跨Spark executor对每个模型进行分布式交叉验证;而Spark MLlib只是在集群间实际的机器学习算法间进行分布式计算。spark-sklearn 集成主要的优势是结合了scikit-learn 机器学习丰富的模型集合,这些算法虽然可以在单个机器上并行运算但是不能在集群间进行运行。
采用这种方法最后优化的中位差结果是21.43美元,并且还缩短了运行时间,如下图所示。集群为4个节点,以Spark YARN client模式提交,每个节点配置如下:
Machine: HP DL380 G6
Memory: 128G
CPU: (2x) Intel X5560
Disk: (6x) 1TB 7200RPM disks
最后让我们看下特征的重要性,下面显示特征的相对重要性。
feature_importance = clf.best_estimator_.feature_importances_
feature_importance = 100.0 * (feature_importance / feature_importance.max())
sorted_idx = np.argsort(feature_importance)
pos = np.arange(sorted_idx.shape[0]) + .5
pvals = feature_importance[sorted_idx]
pcols = X_train.columns[sorted_idx]
plt.figure(figsize=(8,12))
plt.barh(pos, pvals, align='center')
plt.yticks(pos, pcols)
plt.xlabel('Relative Importance')
plt.title('Variable Importance')
(点击放大图像)
很明显的是有一些变量比其他变量更重要,最重要的特征是Entire home/apt。
这个列子展示了如何使用spark-sklearn进行多变量来预测listing价格,然后进行分布式交叉验证和超参数搜索,并给出以下几点参考:
GradientBoostingRegressor等集成方法比单个方法得出的结果要好;
使用GridSearchCV函数可以测试更多的超参数组合来得到更优的结果;
使用 spark-sklearn能更好节约CPU和时间,减少评估错误。
侠天,专注于大数据、机器学习和数学相关的内容,并有个人公众号:bigdata_ny分享相关技术文章。
查看英文原文:
Author Contacted
告诉我们您的想法
允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p
当有人回复此评论时请E-mail通知我
Re: 不注明英文原文真的好吗?
允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p
当有人回复此评论时请E-mail通知我
允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p
当有人回复此评论时请E-mail通知我
赞助商链接
InfoQ每周精要
订阅InfoQ每周精要,加入拥有25万多名资深开发者的庞大技术社区。
架构 & 设计
文化 & 方法
<及所有内容,版权所有 &#169;
C4Media Inc.
服务器由 提供, 我们最信赖的ISP伙伴。
北京创新网媒广告有限公司
京ICP备号-7
找回密码....
InfoQ账号使用的E-mail
关注你最喜爱的话题和作者
快速浏览网站内你所感兴趣话题的精选内容。
内容自由定制
选择想要阅读的主题和喜爱的作者定制自己的新闻源。
设置通知机制以获取内容更新对您而言是否重要
注意:如果要修改您的邮箱,我们将会发送确认邮件到您原来的邮箱。
使用现有的公司名称
修改公司名称为:
公司性质:
使用现有的公司性质
修改公司性质为:
使用现有的公司规模
修改公司规模为:
使用现在的国家
使用现在的省份
Subscribe to our newsletter?
Subscribe to our industry email notices?
我们发现您在使用ad blocker。
我们理解您使用ad blocker的初衷,但为了保证InfoQ能够继续以免费方式为您服务,我们需要您的支持。InfoQ绝不会在未经您许可的情况下将您的数据提供给第三方。我们仅将其用于向读者发送相关广告内容。请您将InfoQ添加至白名单,感谢您的理解与支持。

我要回帖

 

随机推荐