前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Spark Mllib】分类模型——各分类模型使用

【Spark Mllib】分类模型——各分类模型使用

作者头像
小爷毛毛_卓寿杰
发布2019-02-13 12:25:33
1.1K0
发布2019-02-13 12:25:33
举报
文章被收录于专栏:Soul Joy HubSoul Joy Hub

一. 数据集

这个数据集源自 Kaggle 比赛,由 StumbleUpon 提供。比赛的问题涉及网页中推荐的页面是短暂(短暂存在,很快就不流行了)还是长久(长时间流行)。

可以查看上面的数据集页面中的简介得知可用的字段。开始四列分别包含 URL 、页面的 ID 、原始的文本内容和分配给页面的类别。接下来 22 列包含各种各样的数值或者类属特征。最后一列为目标值, 1 为长久, 0 为短暂。

除去数据集的第一行,然后进行解析:

// sed 1d train.tsv > train_noheader.tsv
// load raw data
val rawData = sc.textFile("/PATH/train_noheader.tsv")
val records = rawData.map(line => line.split("\t"))
records.first
// Array[String] = Array("http://www.bloomberg.com/news/2010-12-23/ibm-predicts-holographic-calls-air-breathing-batteries-by-2015.html", "4042", ...

二. 线性模型

1. 提取特征

由于数据格式的问题,我们做一些数据清理的工作,在处理过程中把额外的( " )去掉。数据集中还有一些用 "?" 代替的缺失数据,本例中,我们直接用 0 替换那些缺失数据。在清理和处理缺失数据后,我们提取最后一列的标记变量以及第 5 列到第 25 列的特征矩阵。我们也对数据进行缓存并且统计数据样本的数目。

import org.apache.spark.mllib.regression.LabeledPoint

import org.apache.spark.mllib.linalg.Vectors

val data = records.map { r => val trimmed = r.map(_.replaceAll("\"", "")) val label = trimmed(r.size - 1).toInt val features = trimmed.slice(4, r.size - 1).map(d => if (d == "?") 0.0 else d.toDouble) LabeledPoint(label, Vectors.dense(features)) } data.cache

val numData = data.count

// numData: Long = 7395

// note that some of our data contains negative feature vaues. For naive Bayes we convert these to zeros

2. 逻辑回归

训练模型

import org.apache.spark.mllib.classification.LogisticRegressionWithSGD

迭代次数设置:

val numIterations = 10

建立模型:

val lrModel = LogisticRegressionWithSGD.train(data, numIterations)

预测:

// make prediction on a single data point
val dataPoint = data.first
// dataPoint: org.apache.spark.mllib.regression.LabeledPoint = LabeledPoint(0.0, [0.789131,2.055555556,0.676470588, ...
val prediction = lrModel.predict(dataPoint.features)
// prediction: Double = 1.0
val trueLabel = dataPoint.label
// trueLabel: Double = 0.0
val predictions = lrModel.predict(data.map(lp => lp.features))
predictions.take(5)
// res1: Array[Double] = Array(1.0, 1.0, 1.0, 1.0, 1.0)

更多可参阅《【Spark Mllib】逻辑回归——垃圾邮件分类器与maven构建独立项目

3. 线性支持向量机

训练模型

import org.apache.spark.mllib.classification.SVMWithSGD

建立模型:

val svmModel = SVMWithSGD.train(data, numIterations)

三. 朴素贝叶斯模型

提取特征:

在对数据集做进一步处理之前,我们发现数值数据中包含负的特征值。我们知道,朴素贝叶斯模型要求特征值非负,否则碰到负的特征值程序会抛出错误。因此,需要为朴素贝叶斯模型构建一份输入特征向量的数据,将负特征值设为 0 :

val nbData = records.map { r =>
	val trimmed = r.map(_.replaceAll("\"", ""))
	val label = trimmed(r.size - 1).toInt
	val features = trimmed.slice(4, r.size - 1).map(d => if (d == "?") 0.0 else d.toDouble).map(d => if (d < 0) 0.0 else d)
	LabeledPoint(label, Vectors.dense(features))
}

训练模型:

import org.apache.spark.mllib.classification.NaiveBayes
// note we use nbData here for the NaiveBayes model training
val nbModel = NaiveBayes.train(nbData) 

四. 决策树

import org.apache.spark.mllib.tree.DecisionTree
import org.apache.spark.mllib.tree.configuration.Algo
import org.apache.spark.mllib.tree.impurity.Entropy

设置决策树深度:

val maxTreeDepth = 5
val dtModel = DecisionTree.train(data, Algo.Classification, Entropy, maxTreeDepth)

可参阅 :《【Spark Mllib】决策树,随机森林——预测森林植被类型

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016年06月16日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一. 数据集
  • 二. 线性模型
    • 1. 提取特征
      • 2. 逻辑回归
      • 3. 线性支持向量机
  • 三. 朴素贝叶斯模型
  • 四. 决策树
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档