Spark之訓練分類模型練習(2)

2021-07-29 17:11:44 字數 3901 閱讀 9064

上接博文。

使用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...