spark中常見的三種分類模型:線性模型、決策樹和樸素貝葉斯模型。
線性模型,簡單而且相對容易擴充套件到非常大的資料集;線性模型又可以分成:1.邏輯回歸;2.線性支援向量機
決策樹是乙個強大的非線性技術,訓練過程計算量大並且較難擴充套件(幸運的是,mllib會替我們考慮擴充套件性的問題),但是在很多情況下效能很好;
樸素貝葉斯模型簡單、易訓練,並且具有高效和並行的優點(實際中,模型訓練只需要遍歷所有資料集一次)。當採用合適的特徵工程,這些模型在很多應用中都能達到不錯的效能。而且,樸素貝葉斯模型可以作為乙個很好的模型測試基準,用於比較其他模型的效能。
現在我們採用的資料集是stumbleupon,這個資料集是主要是一些網頁的分類資料。
內容樣例:string = "" "4042" "
(樸素貝葉斯特殊的資料處理)在對資料集做進一步處理之前,我們發現數值資料中包含負的特徵值。我們知道,樸素貝葉斯模型要求特徵值非負,否則碰到負的特徵值程式會丟擲錯誤。因此,需要為樸素貝葉斯模型構建乙份輸入特徵向量的資料,將負特徵值設為 0
val nbdata = records.map
分別訓練邏輯回歸、svm、樸素貝葉斯模型和決策樹
import org.apache.spark.mllib.classification.logisticregressionwithsgdimport org.apache.spark.mllib.classification.svmwithsgd
import org.apache.spark.mllib.classification.*****bayes
import org.apache.spark.mllib.tree.decisiontree
import org.apache.spark.mllib.tree.configuration.algo
import org.apache.spark.mllib.tree.impurity.entropy
val numiterations = 10
val maxtreedepth = 5
訓練邏輯回歸模型
val lrmodel = logisticregressionwithsgd.train(data, numiterations)
訓練svm模型
val svmmodel = svmwithsgd.train(data, numiterations)
訓練樸素貝葉斯模型
val nbmodel = *****bayes.train(nbdata)
訓練決策樹模型
val dtmodel = decisiontree.train(data, algo.classification, entropy, maxtreedepth)
驗證**結果的正確性,以邏輯回歸為例子,說明**的結果是錯誤的
val datapoint = data.firstval prediction = lrmodel.predict(datapoint.features)
# 輸出 prediction: double = 1.0
val truelabel = datapoint.label
# 輸出 truelabel: double = 0.0
評估分類模型的效能
1.邏輯回歸模型
val lrtotalcorrect = data.map .sumval lraccuracy = lrtotalcorrect / data.count
lraccuracy: double = 0.5146720757268425
2.svm模型
val svmtotalcorrect = data.map .sumval svmaccuracy = svmtotalcorrect / data.count
svmaccuracy: double = 0.5146720757268425
3.貝葉斯模型
val nbtotalcorrect = nbdata.map .sumval nbaccuracy = nbtotalcorrect / data.count
nbaccuracy: double = 0.5803921568627451
4.決策樹模型
val dttotalcorrect = data.map .sumval dtaccuracy = dttotalcorrect / data.count
dtaccuracy: double = 0.6482758620689655
準確率和召回率
改進模型效能以及引數調優
1.特徵標準化
研究特徵是如何分布的,先將特徵向量用 rowmatrix 類表示成 mllib 中的分布矩陣。 rowmatrix 是乙個由向量組成的 rdd ,其中每個向量是分布矩陣的一行。
rowmatrix 類中有一些方便操作矩陣的方法,其中乙個方法可以計算矩陣每列的統計特性:
import org.apache.spark.mllib.linalg.distributed.rowmatrixval vectors = data.map(lp => lp.features)
val matrix = new rowmatrix(vectors)
val matrixsummary = matrix.computecolumnsummarystatistics()
#computecolumnsummarystatistics 方法計算特徵矩陣每列的不同統計資料,包括均值和方差,所有統計值按每列一項的方式儲存在乙個 vector 中
println(matrixsummary.mean) #輸出矩陣每列的均值println(matrixsummary.min) #輸出矩陣每列的最小值
println(matrixsummary.max) #輸出矩陣每列的最大值
println(matrixsummary.variance) #輸出矩陣每列的方差
println(matrixsummary.numnonzeros) #輸出矩陣每列中非 0 項的數目
對特徵矩陣進行歸一化
import org.apache.spark.mllib.feature.standardscalerval scaler = new standardscaler(withmean = true, withstd = true).fit(vectors)
# 傳入兩個引數,乙個表示是否從資料中減去均值,另乙個表示是否應用標準差縮放
val scaleddata = data.map(lp => labeledpoint(lp.label,scaler.transform(lp.features)))
import org.apache.spark.mllib.evaluation.binaryclassificationmetricsval 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%%")
可以看出,特徵標準化提公升了邏輯回歸模型的準確率和auc
logisticregressionmodelaccuracy:62.0419%
area under pr: 72.7254%
area under roc: 61.9663%
如何構建分類模型
1.iv 資訊量 在用邏輯回歸模型方法構建分類模型時候,需要對自變數進行篩選 使用資訊量 iv 來衡量自變數的 能力。資訊量越大 能力越強,就越應該放入 模型中。2.woe值 是 iv值的基礎。即 證據權重 weight of evidence.woe 是對原始自變數的一種編碼形式。而要對乙個變數進...
sklearn構建svm分類模型及其模型評價
sklearn中常用的分類演算法 模組名 函式名 演算法名 1 linear model logisticregression 邏輯斯蒂回歸 2 svm svc 支援向量機 3 neighbors kneighborsclassifier k近鄰分類 4 bayes gaussiannb 高斯樸素貝...
模型構建 1 模型評估 分類問題
對模型的評估是指對模型泛化能力的評估,主要通過具體的效能度量指標來完成。在對比不同模型的能力時,使用不同的效能度量指標可能會導致不同的評判結果,因此也就意味著,模型的好壞只是相對的,什麼樣的模型是較好的,不僅取決於資料和演算法,還取決於任務需求。本文主要對分類模型的效能度量指標 方法 進行總結。本文...