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

Posted 辉常努腻

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spark Mllib分类模型——各分类模型使用相关的知识,希望对你有一定的参考价值。

一. 数据集

这个数据集源自 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

  1. 逻辑回归
    训练模型
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)
  1. 线性支持向量机
    训练模型
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分类模型——各分类模型使用的主要内容,如果未能解决你的问题,请参考以下文章

spark.mllib源码阅读-分类算法2-NaiveBayes

Spark,MLlib:调整分类器识别阈值

spark.mllib源码阅读-分类算法1-LogisticRegression

Spark学习笔记——构建分类模型

spark.mllib源码阅读-分类算法5-GradientBoostedTrees

spark.mllib源码阅读-分类算法5-GradientBoostedTrees