上接博文。
使用rowmatrix類計算列的統計量。每一行為某一樣本的特徵向量
import org.apache
.spark
.mllib
.linalg
.distributed
.rowmatrix
val vectors = data.map(lp => lp.features)
val matrix = new rowmatrix(vectors)
val matrixsummary = matrix.computecolumnsummarystatistics()
//每一列的常用統計量
println(matrixsummary.mean) //均值
println(matrixsummary.min) //最小值
println(matrixsummary.max) //最大值
println(matrixsummary.variance)//方差
println(matrixsummary.numnonzeros)//非零的個數
使用去均值歸一化方法:(x
−μ)/
sqrt
(var
ianc
e)
//對資料進行標準化預處理,選擇性的去均值操作,和標準方差操作
import org.apache.spark.mllib.feature.standardscaler
val scaler = new standardscaler(withmean = true, withstd = true).fit(vectors)
val scaleddata = data.map(lp => labeledpoint(lp.label,
scaler.transform(lp.features)))
// 驗證邏輯回歸演算法效能改善情況。nb和dt演算法不受資料歸一化的影響
val lrmodelscaled = logisticregressionwithsgd.train(scaleddata, numiterations)
val lrtotalcorrectscaled = scaleddata.map .sum
val lraccuracyscaled = lrtotalcorrectscaled / numdata
val lrpredictionsvstrue = scaleddata.map
val lrmetricsscaled = new binaryclassificationmetrics(lrpredictionsvstrue)
val lrpr = lrmetricsscaled.areaunderpr
val lrroc = lrmetricsscaled.areaunderroc
println(f"$\naccuracy:$%2.4f%%\narea under pr: $%2.4f%%\narea under roc: $%2.4f%%")
***logisticregressionmodel
accuracy:62.0419%
area under pr: 72.7254%
area under roc: 61.9663%*
//加入類別特徵
val categories = records.map(r => r(3)).distinct.collect.zipwithindex.tomap
val numcategories = categories.size
println(categories)
val datacategories = records.map
println(datacategories.first)
// 標準化輸出
val scalercats = new standardscaler(withmean = true, withstd = true).
fit(datacategories.map(lp => lp.features))
val scaleddatacats = datacategories.map(lp =>
labeledpoint(lp.label, scalercats.transform(lp.features)))
// 再次檢視lr演算法效能
val lrmodelscaledcats = logisticregressionwithsgd.train(scaleddatacats,
numiterations)
val lrtotalcorrectscaledcats = scaleddatacats.map .sum
val lraccuracyscaledcats = lrtotalcorrectscaledcats / numdata
val lrpredictionsvstruecats = scaleddatacats.map
val lrmetricsscaledcats = new binaryclassificationmetrics(lrpredictionsvstruecats)
val lrprcats = lrmetricsscaledcats.areaunderpr
val lrroccats = lrmetricsscaledcats.areaunderroc
println(f"$\naccuracy:$%2.4f%%\narea under pr: $%2.4f%%\narea under roc: $%2.4f%%")
logisticregressionmodel
accuracy:66.5720%
area under pr: 75.7964%
area under roc: 66.5483%
樸素貝葉斯更適用於類別特徵,僅僅使用類別特徵對樣本進行分類實驗:
// 生成僅有類別屬性的特徵向量
val datanb = records.map
//驗證nb演算法的效能
val nbmodelcats = *****bayes.train(datanb)
val nbtotalcorrectcats = datanb.map .sum
val nbaccuracycats = nbtotalcorrectcats / numdata
val nbpredictionsvstruecats = datanb.map
val nbmetricscats = new binaryclassificationmetrics(nbpredictionsvstruecats)
val nbprcats = nbmetricscats.areaunderpr
val nbroccats = nbmetricscats.areaunderroc
println(f"$\naccuracy:$%2.4f%%\narea under pr: $%2.4f%%\narea under roc: $%2.4f%%")
結果:
*****bayesmodel
accuracy: 60.9601%
area under pr: 74.0522%
area under roc: 60.5138%
從結果看,nb演算法有了很大提公升,說明資料特徵對模型的適應性。
已討論的對模型效能影響因素:特徵提取、特徵的選擇、資料格式和對資料分布的假設
接下來,討論模型引數對效能的影響。
1.4.1 線性模型
Spark下的word2vec模型訓練
前邊一節介紹了word2vec模型訓練同義詞,那麼在大資料量的情況下,我們自然想到了用spark來進行訓練。下面就介紹我們是如何實現spark上的模型訓練。模型訓練的輸入是分好詞的語料,那麼就得實現spark上的分詞。def split jieba list,iterator sentences f...
Spark學習筆記 構建分類模型
spark中常見的三種分類模型 線性模型 決策樹和樸素貝葉斯模型。線性模型,簡單而且相對容易擴充套件到非常大的資料集 線性模型又可以分成 1.邏輯回歸 2.線性支援向量機 決策樹是乙個強大的非線性技術,訓練過程計算量大並且較難擴充套件 幸運的是,mllib會替我們考慮擴充套件性的問題 但是在很多情況...
深度學習模型訓練 分類問題。
模型分類問題主要包含二分類和多分類兩種場景。1 二分類為什麼會採用sigmoid啟用函式 模型在實際輸出時值可能不在 0,1 區間,我們需要把模型的輸出對映到 0,1 區間。二分類問題需要採用邏輯回歸的思路解決問題。原因是邏輯回歸服從0 1分布,即 p y 1 x p x p y 0 x 1 p x...