Spark學習筆記 構建分類模型

2021-09-07 10:59:29 字數 4695 閱讀 4178

spark中常見的三種分類模型:線性模型、決策樹和樸素貝葉斯模型。

線性模型,簡單而且相對容易擴充套件到非常大的資料集;線性模型又可以分成:1.邏輯回歸;2.線性支援向量機

決策樹是乙個強大的非線性技術,訓練過程計算量大並且較難擴充套件(幸運的是,mllib會替我們考慮擴充套件性的問題),但是在很多情況下效能很好;

樸素貝葉斯模型簡單、易訓練,並且具有高效和並行的優點(實際中,模型訓練只需要遍歷所有資料集一次)。當採用合適的特徵工程,這些模型在很多應用中都能達到不錯的效能。而且,樸素貝葉斯模型可以作為乙個很好的模型測試基準,用於比較其他模型的效能。

現在我們採用的資料集是stumbleupon,這個資料集是主要是一些網頁的分類資料

內容樣例:string = ""    "4042"    "

樸素貝葉斯特殊的資料處理)在對資料集做進一步處理之前,我們發現數值資料中包含負的特徵值。我們知道,樸素貝葉斯模型要求特徵值非負,否則碰到負的特徵值程式會丟擲錯誤。因此,需要為樸素貝葉斯模型構建乙份輸入特徵向量的資料,將負特徵值設為 0

val nbdata = records.map

分別訓練邏輯回歸、svm、樸素貝葉斯模型和決策樹

import org.apache.spark.mllib.classification.logisticregressionwithsgd

import 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.first

val prediction = lrmodel.predict(datapoint.features)

# 輸出 prediction: double = 1.0

val truelabel = datapoint.label

# 輸出 truelabel: double = 0.0

評估分類模型的效能

1.邏輯回歸模型

val lrtotalcorrect = data.map .sum

val lraccuracy = lrtotalcorrect / data.count

lraccuracy: double = 0.5146720757268425

2.svm模型

val svmtotalcorrect = data.map .sum

val svmaccuracy = svmtotalcorrect / data.count

svmaccuracy: double = 0.5146720757268425

3.貝葉斯模型

val nbtotalcorrect = nbdata.map .sum

val nbaccuracy = nbtotalcorrect / data.count

nbaccuracy: double = 0.5803921568627451

4.決策樹模型

val dttotalcorrect = data.map .sum

val dtaccuracy = dttotalcorrect / data.count

dtaccuracy: double = 0.6482758620689655

準確率和召回率

改進模型效能以及引數調優

1.特徵標準化

研究特徵是如何分布的,先將特徵向量用 rowmatrix 類表示成 mllib 中的分布矩陣。 rowmatrix 是乙個由向量組成的 rdd ,其中每個向量是分布矩陣的一行。

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()  

#computecolumnsummarystatistics 方法計算特徵矩陣每列的不同統計資料,包括均值和方差,所有統計值按每列一項的方式儲存在乙個 vector 中

println(matrixsummary.mean)  #輸出矩陣每列的均值

println(matrixsummary.min)  #輸出矩陣每列的最小值

println(matrixsummary.max) #輸出矩陣每列的最大值

println(matrixsummary.variance) #輸出矩陣每列的方差

println(matrixsummary.numnonzeros) #輸出矩陣每列中非 0 項的數目

對特徵矩陣進行歸一化

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)))

import org.apache.spark.mllib.evaluation.binaryclassificationmetrics

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%%")

可以看出,特徵標準化提公升了邏輯回歸模型的準確率和auc

logisticregressionmodel

accuracy: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 模型評估 分類問題

對模型的評估是指對模型泛化能力的評估,主要通過具體的效能度量指標來完成。在對比不同模型的能力時,使用不同的效能度量指標可能會導致不同的評判結果,因此也就意味著,模型的好壞只是相對的,什麼樣的模型是較好的,不僅取決於資料和演算法,還取決於任務需求。本文主要對分類模型的效能度量指標 方法 進行總結。本文...