【原】Spark之机器学习(Python版)(二)——分类
写这个系列是因为最近公司在搞技术分享,学习Spark,我的任务是讲PySpark的应用,因为我主要用Python,结合Spark,就讲PySpark了。然而我在学习的过程中发现,PySpark很鸡肋(至少现在我觉得我不会拿PySpark做开发)。为什么呢?原因如下:
1.PySpark支持的算法太少了。我们看一下PySpark支持的算法:(参考官方文档)
前面两个pyspark.sql和pyspark.streaming是对sql和streaming的支持。主要是读取数据,和streaming处理这种方式(当然这是spark的优势,要是这也不支持真是见鬼了)。pyspark.ml和pyspark.mllib分别是ml的api和mllib的api,ml的算法真心少啊,而且支持的功能很有限,譬如Lr(逻辑回归)和GBT目前只支持二分类,不支持多分类。mllib相对好点,支持的算法也多点,虽然昨天发的博文讲mlllib的时候说过有的算法不支持分布式,所以才会有限,但是我在想,如果我需要用到A算法,而Ml和Mllib的包里面都没有,这样是不是意味着要自己开发分布式算法呢?代价有点大诶,感觉写这个的时间不如多找找有用的特征,然后上LR,这样效果说不定更好。因为目前还没有在实际中用过,所以以上只是我的想法。下面把ml和mllib的所有api列出来,这样看的更清楚。

图一 pyspark.ml的api

图二 pyspark.mllib的api
从上面两张图可以看到,mllib的功能比ml强大的不是一点半点啊,那ml这个包的存在还有什么意义呢?不懂(如果有了解的欢迎留言)。虽然有这么多疑问,但是我还是跟大家讲了,用的数据依然是iris(其实我真心想换个数据集啊 == ,下次换)。上代码:
from pyspark.sql import SQLContext
sqlContext = SQLContext(sc)
df = sqlContext.read.format('com.databricks.spark.csv').options(header='true', inferschema='true').load('iris.csv')
# Displays the content of the DataFrame to stdout
df.show() from pyspark.ml.feature import StringIndexer
indexer = StringIndexer(inputCol="Species", outputCol="labelindex")
indexed = indexer.fit(df).transform(df)
indexed.show() from pyspark.sql import Row
from pyspark.mllib.linalg import Vectors
from pyspark.ml.classification import NaiveBayes # Load and parse the data
def parseRow(row):
return Row(label=row["labelindex"],
features=Vectors.dense([row["Sepal.Length"],
row["Sepal.Width"],
row["Petal.Length"],
row["Petal.Width"]])) ## Must convert to dataframe after mapping
parsedData = indexed.map(parseRow).toDF()
labeled = StringIndexer(inputCol="label", outputCol="labelpoint")
data = labeled.fit(parsedData).transform(parsedData)
data.show() ## 训练模型
#Naive Bayes
nb = NaiveBayes(smoothing=1.0, modelType="multinomial")
model_NB = nb.fit(data)
predict_data= model_NB.transform(data)
traing_err = predict_data.filter(predict_data['label'] != predict_data['prediction']).count()
total = predict_data.count()
nb_scores = float(traing_err)/total
print traing_err, total, nb_scores
#7 150 0.0466666666667 #Logistic Regression###########################################################
# Logistic regression. Currently, this class only supports binary classification.
from pyspark.ml.classification import LogisticRegression
lr = LogisticRegression(maxIter=5, regParam=0.01)
model_lr = lr.fit(data)
predict_data= model_lr.transform(data)
traing_err = predict_data.filter(predict_data['label'] != predict_data['prediction']).count()
total = predict_data.count()
lr_scores = float(traing_err)/total
print traing_err, total, float(traing_err)/total #Decision Tree
from pyspark.ml.classification import DecisionTreeClassifier
dt = DecisionTreeClassifier(maxDepth=2,labelCol = 'labelpoint')
model_DT= dt.fit(data)
predict_data= model_DT.transform(data)
traing_err = predict_data.filter(predict_data['label'] != predict_data['prediction']).count()
total = predict_data.count()
dt_scores = float(traing_err)/total
print traing_err, total, float(traing_err)/total #GBT###########################################################
## GBT. Currently, this class only supports binary classification.
from pyspark.ml.classification import GBTClassifier
gbt = GBTClassifier(maxIter=5, maxDepth=2,labelCol="labelpoint")
model_gbt = gbt.fit(data)
predict_data= model_gbt.transform(data)
traing_err = predict_data.filter(predict_data['label'] != predict_data['prediction']).count()
total = predict_data.count()
dt_scores = float(traing_err)/total
print traing_err, total, float(traing_err)/total #Random Forest
from pyspark.ml.classification import RandomForestClassifier
rf = RandomForestClassifier(numTrees=3, maxDepth=2, labelCol="labelpoint", seed=42)
model_rf= rf.fit(data)
predict_data= model_rf.transform(data)
traing_err = predict_data.filter(predict_data['label'] != predict_data['prediction']).count()
total = predict_data.count()
dt_scores = float(traing_err)/total
print traing_err, total, float(traing_err)/total #MultilayerPerceptronClassifier###########################################################
# Classifier trainer based on the Multilayer Perceptron. Each layer has sigmoid activation function, output layer has softmax.
# Number of inputs has to be equal to the size of feature vectors. Number of outputs has to be equal to the total number of labels.
from pyspark.ml.classification import MultilayerPerceptronClassifier
mlp = MultilayerPerceptronClassifier(maxIter=100, layers=[150, 5, 150], blockSize=1, seed=11)
model_mlp= mlp.fit(parsedData)
predict_data= model_mlp.transform(parsedData)
traing_err = predict_data.filter(predict_data['label'] != predict_data['prediction']).count()
total = predict_data.count()
dt_scores = float(traing_err)/total
print traing_err, total, float(traing_err)/total
因为数据集和上次讲pyspark聚类应用的数据是一样的,就不一步步的展示了,但是我这个程序里只有NaiveBayes的效果还行,0.94的正确率,其他的像DecisionTree等,效果真心差,可能参数还需要调。先掌握怎么用再来调参,官方文档里关于参数的解释也非常详细,可以看看。下一次讲回归,我决定不只写pyspark.ml的应用了,因为实在是图样图naive,想弄清楚pyspark的机器学习算法是怎么运行的,跟普通的算法运行有什么区别,优势等,再写个pyspark.mllib,看相同的算法在ml和mllib的包里运行效果有什么差异,如果有,是为什么,去看源码怎么写的。此外,我真的想弄清楚这货在实际生产中到底有用吗,毕竟还是要落实生产的,我之前想,如果python的sklearn能够在spark上应用就好了,后来在databricks里面找到了一个包好像是准备把sklearn弄到spark上来,当然算法肯定要重新写,不过还没有发布,期待发布的时候。此外,我在知乎上也看到过有人提问说“spark上能用skearn吗?”(大概是这意思,应该很好搜),里面有个回答好像说可以,不过不是直接用(等我找到了把链接放出来)。其实换一种想法,不用spark也行,直接用mapreduce编程序,但是mapreduce慢啊(此处不严谨,因为并没有测试过两者的性能差异,待补充),在我使用spark的短暂时间内,我个人认为spark的优势在于数据处理快,它不需要像mapreduce一样把数据切分成这么多块计算然后再reduce合并,而是直接将数据导入的时候就指定分区,运行机制不同,尤其是spark streaming的功能,还是很快的,所以这是spark的优势(鄙人拙见,如有错误欢迎指出)。而spark的劣势也比较明显,因为它对设备的要求太高了(吃内存啊能不高吗!),这也是它快的原因,你把数据都放在内存里,取的时间比放在磁盘里当然要快,不过实际上在存储数据或者输出结果的时候还是会选择(memory+disk)的方式,保险嘛。前段时间看的alluxio也是占了内存的优势。恩,说了很多废话。下周争取研究的深一点,不然在公司里讲都没人听 = =。
【原】Spark之机器学习(Python版)(二)——分类的更多相关文章
- 【原】Spark之机器学习(Python版)(一)——聚类
kmeans聚类相信大家都已经很熟悉了.在Python里我们用kmeans通常调用Sklearn包(当然自己写也很简单).那么在Spark里能不能也直接使用sklean包呢?目前来说直接使用有点困 ...
- Spark之机器学习(Python版)(一)——聚类
https://www.cnblogs.com/charlotte77/p/5437611.html
- Spark 多项式逻辑回归__二分类
package Spark_MLlib import org.apache.spark.ml.Pipeline import org.apache.spark.ml.classification.{L ...
- Spark入门(Python版)
Hadoop是对大数据集进行分布式计算的标准工具,这也是为什么当你穿过机场时能看到”大数据(Big Data)”广告的原因.它已经成为大数据的操作系统,提供了包括工具和技巧在内的丰富生态系统,允许使用 ...
- (一)Spark简介-Java&Python版Spark
Spark简介 视频教程: 1.优酷 2.YouTube 简介: Spark是加州大学伯克利分校AMP实验室,开发的通用内存并行计算框架.Spark在2013年6月进入Apache成为孵化项目,8个月 ...
- Spark入门:Spark运行架构(Python版)
此文为个人学习笔记如需系统学习请访问http://dblab.xmu.edu.cn/blog/1709-2/ 基本概念 * RDD:是弹性分布式数据集(Resilient Distributed ...
- Alink漫谈(八) : 二分类评估 AUC、K-S、PRC、Precision、Recall、LiftChart 如何实现
Alink漫谈(八) : 二分类评估 AUC.K-S.PRC.Precision.Recall.LiftChart 如何实现 目录 Alink漫谈(八) : 二分类评估 AUC.K-S.PRC.Pre ...
- 【原】Learning Spark (Python版) 学习笔记(三)----工作原理、调优与Spark SQL
周末的任务是更新Learning Spark系列第三篇,以为自己写不完了,但为了改正拖延症,还是得完成给自己定的任务啊 = =.这三章主要讲Spark的运行过程(本地+集群),性能调优以及Spark ...
- 【Todo】【转载】Spark学习 & 机器学习(实战部分)-监督学习、分类与回归
理论原理部分可以看这一篇:http://www.cnblogs.com/charlesblc/p/6109551.html 这里是实战部分.参考了 http://www.cnblogs.com/shi ...
随机推荐
- jQuery2.x源码解析(回调篇)
jQuery2.x源码解析(构建篇) jQuery2.x源码解析(设计篇) jQuery2.x源码解析(回调篇) jQuery2.x源码解析(缓存篇) 通过艾伦的博客,我们能看出,jQuery的pro ...
- RFC4035笔记
章 节 标题 说明 补充说明 支持级别 1 介绍 1.定义DNSSEC协议修改点2.定义以下概念:已签名域(signed zone)和域签名的要求列表3.描述权威域名服务器为了处理签名域的行为变化4. ...
- jQuery.ajax 根据不同的Content-Type做出不同的响应
使用H5+ASP.NET General Handler开发项目,使用ajax进行前后端的通讯.有一个场景需求是根据服务器返回的不同数据类型,前端进行不同的响应,这里记录下如何使用$.ajax实现该需 ...
- js正则表达式整理
一.数字类 数字:^[0-9]*$ 正数.负数.和小数:^(\-|\+)?\d+(\.\d+)?$ 零和非零开头的数字:^(0|[1-9][0-9]*)$ 非零开头的最多带两位小数的数字:^([1-9 ...
- 关于i++引出的线程不安全性的分析以及解决措施
Q:i++是线程安全的吗? A:如果是局部变量,那么i++是线程安全. 如果是全局变量,那么i++不是线程安全的. 理由:如果是局部变量,那么i++是线程安全:局部变量其他线程访问不到,所以根本不存在 ...
- 网页mp3语音展示,点击图片放大,点击图片跳转链接,调表格
查看mp3语音 <td class="value"><embed src="${sounds.soundName}" type="a ...
- 以ZeroMQ谈消息中间件的设计【译文】
本文主要是探究学习比较流行的一款消息层是如何设计与实现的 ØMQ是一种消息传递系统,或者乐意的话可以称它为"面向消息的中间件".它在金融服务,游戏开发,嵌入式系统,学术研究和航空航 ...
- jQuery拖动剪裁图片作为头像
图片上传是许多网站的一个常用的功能,有时需要对上传的图片做初步的选择裁剪,比如上传头像.下面就是一个使用HTML5+jQuery实现的图片上传裁剪特效,可以对选择要上传的图片做缩小.放大.拖动和裁剪, ...
- react native初步常见问题
首先按照资料一步步搭建环境运行,然后成功了,很激动,可是,安卓就是没这么容易成功,还是太年轻了 could not get batchedbridge, make sure your bundle i ...
- iOS面试题 -总结 ,你的基础扎实吗?
1.#import和#include的区别,@class代表什么? (1)#import指令是Object-C针对#include的改进版本,#import确保引用的文件只会被引用一次,这样你就不会陷 ...