1. 程式人生 > >Spark中基於神經網路的MLPC(多層感知器分類器)的使用

Spark中基於神經網路的MLPC(多層感知器分類器)的使用

本文首發於我的個人部落格QIMING.INFO,轉載請帶上鍊接及署名。

MLPC(Multilayer Perceptron Classifier),多層感知器分類器,是一種基於前饋人工神經網路(ANN)的分類器。Spark中目前僅支援此種與神經網路有關的演算法,在org.apache.spark.ml中(並非mllib)。本文通過程式碼來演示用Spark執行MLPC的一個小例子。

演算法簡介

多層感知器是一種多層的前饋神經網路模型。

所謂前饋型神經網路,指其從輸入層開始只接收前一層的輸入,並把計算結果輸出到後一層,並不會給前一層有所反饋,整個過程可以使用有向無環圖來表示。該型別的神經網路由三層組成,分別是輸入層(Input Layer)

,一個或多個隱層(Hidden Layer),輸出層(Output Layer),如圖所示:

MLPC採用了BP(反向傳播,Back Propagation) 演算法,BP演算法的學習目的是對網路的連線權值進行調整,使得調整後的網路對任一輸入都能得到所期望的輸出。BP 演算法名稱裡的反向傳播指的是該演算法在訓練網路的過程中逐層反向傳遞誤差,逐一修改神經元間的連線權值,以使網路對輸入資訊經過計算後所得到的輸出能達到期望的誤差。

Spark的多層感知器隱層神經元使用sigmoid函式作為啟用函式,輸出層使用的是softmax函式。

MLPC可調的幾個重要引數:

  • featuresCol:輸入資料 DataFrame 中指標特徵列的名稱。
  • labelCol:輸入資料 DataFrame 中標籤列的名稱。
  • layers:這個引數是一個整型陣列型別,第一個元素需要和特徵向量的維度相等,最後一個元素需要訓練資料的標籤數相等,如 2 分類問題就寫 2。中間的元素有多少個就代表神經網路有多少個隱層,元素的取值代表了該層的神經元的個數。例如val layers = (5,6,5,2)。
  • maxIter:優化演算法求解的最大迭代次數。預設值是 100。
  • predictionCol:預測結果的列名稱。

執行步驟

資料說明

MLPC對資料來源有嚴格要求,只能是以下兩種:

  • DataFrame
    使用DataFrame作為資料來源時必須指定DataFrame中的標籤列和特徵列;
  • LIBSVM格式文字檔案
    資料格式為:標籤 特徵ID:特徵值 特徵ID:特徵值……

本例中採用了LIBSVM格式文字檔案,資料如下:

[[email protected] ML_Data]$ cat input/sample_multiclass_classification_data.txt 
1 1:-0.222222 2:0.5 3:-0.762712 4:-0.833333 
1 1:-0.555556 2:0.25 3:-0.864407 4:-0.916667 
1 1:-0.722222 2:-0.166667 3:-0.864407 4:-0.833333 
1 1:-0.722222 2:0.166667 3:-0.694915 4:-0.916667 
0 1:0.166667 2:-0.416667 3:0.457627 4:0.5 
……
……
……
2 1:-0.388889 2:-0.166667 3:0.186441 4:0.166667 
0 1:-0.222222 2:-0.583333 3:0.355932 4:0.583333 
1 1:-0.611111 2:-0.166667 3:-0.79661 4:-0.916667 
1 1:-0.944444 2:-0.25 3:-0.864407 4:-0.916667 
1 1:-0.388889 2:0.166667 3:-0.830508 4:-0.75 

程式碼及說明


import org.apache.spark.ml.classification.MultilayerPerceptronClassifier
import org.apache.spark.ml.evaluation.MulticlassClassificationEvaluator

import org.apache.spark.sql.SparkSession

object MLPCTest {

  def main(args: Array[String]): Unit = {
    // 構建spark物件
    val spark = SparkSession.builder.appName("MLPCTest").getOrCreate()

    // 讀取以LIBSVM格式儲存的資料
    val data = spark.read.format("libsvm").load("file:///home/xuqm/ML_Data/input/sample_multiclass_classification_data.txt")

    // 拆分成訓練集和測試集
    val splits = data.randomSplit(Array(0.6, 0.4), seed = 1234L)
    val train = splits(0)
    val test = splits(1)

    // 指定神經網路的圖層:
    // 輸入層4個結點(即4個特徵);兩個隱藏層,隱藏結點數分別為5和4;輸出層3個結點(即分為3類)
    val layers = Array[Int](4, 5, 4, 3)

    // 建立MLPC訓練器並設定引數
    val trainer = new MultilayerPerceptronClassifier().
      setLayers(layers).
      setBlockSize(128).
      setSeed(1234L).
      setMaxIter(100)

    // 訓練模型
    val model = trainer.fit(train)

    // 用訓練好的模型預測測試集的結果
    val result = model.transform(test)
    val predictionAndLabels = result.select("prediction", "label")

    // 計算誤差並輸出
    val evaluator = new MulticlassClassificationEvaluator().setMetricName("accuracy")
    println("Test set accuracy = " + evaluator.evaluate(predictionAndLabels))

    // 輸出結果
    result.show(60,false)
  }
}

結果展示

// 計算誤差並輸出
Test set accuracy = 0.9019607843137255

// 輸出結果
result.show(60,false)
+-----+---------------------------------------------------------+----------+
|label|features                                                 |prediction|
+-----+---------------------------------------------------------+----------+
|0.0  |(4,[0,1,2,3],[-0.666667,-0.583333,0.186441,0.333333])    |2.0       |
|0.0  |(4,[0,1,2,3],[-0.277778,-0.333333,0.322034,0.583333])    |0.0       |
|0.0  |(4,[0,1,2,3],[-0.222222,-0.583333,0.355932,0.583333])    |0.0       |
|0.0  |(4,[0,1,2,3],[-0.0555556,-0.833333,0.355932,0.166667])   |2.0       |
|0.0  |(4,[0,1,2,3],[-0.0555556,-0.166667,0.288136,0.416667])   |2.0       |
|0.0  |(4,[0,1,2,3],[-1.32455E-7,-0.166667,0.322034,0.416667])  |2.0       |
|0.0  |(4,[0,1,2,3],[0.111111,-0.583333,0.355932,0.5])          |0.0       |
|0.0  |(4,[0,1,2,3],[0.222222,-0.166667,0.627119,0.75])         |0.0       |
|0.0  |(4,[0,1,2,3],[0.333333,-0.583333,0.627119,0.416667])     |0.0       |
|0.0  |(4,[0,1,2,3],[0.333333,-0.166667,0.423729,0.833333])     |0.0       |
|0.0  |(4,[0,1,2,3],[0.388889,-0.166667,0.525424,0.666667])     |0.0       |
|0.0  |(4,[0,1,2,3],[0.444444,-0.0833334,0.38983,0.833333])     |0.0       |
|0.0  |(4,[0,1,2,3],[0.555555,-0.166667,0.661017,0.666667])     |0.0       |
|0.0  |(4,[0,1,2,3],[0.722222,-0.333333,0.728813,0.5])          |0.0       |
|0.0  |(4,[0,1,2,3],[0.888889,-0.333333,0.932203,0.583333])     |0.0       |
|0.0  |(4,[0,1,2,3],[1.0,0.5,0.830508,0.583333])                |0.0       |
|0.0  |(4,[0,2,3],[0.166667,0.457627,0.833333])                 |0.0       |
|0.0  |(4,[0,2,3],[0.388889,0.661017,0.833333])                 |0.0       |
|1.0  |(4,[0,1,2,3],[-0.944444,-0.166667,-0.898305,-0.916667])  |1.0       |
|1.0  |(4,[0,1,2,3],[-0.722222,-0.166667,-0.864407,-0.833333])  |1.0       |
|1.0  |(4,[0,1,2,3],[-0.666667,-0.166667,-0.864407,-0.916667])  |1.0       |
|1.0  |(4,[0,1,2,3],[-0.666667,-0.0833334,-0.830508,-1.0])      |1.0       |
|1.0  |(4,[0,1,2,3],[-0.611111,0.166667,-0.79661,-0.75])        |1.0       |
|1.0  |(4,[0,1,2,3],[-0.555556,0.166667,-0.830508,-0.916667])   |1.0       |
|1.0  |(4,[0,1,2,3],[-0.555556,0.5,-0.830508,-0.833333])        |1.0       |
|1.0  |(4,[0,1,2,3],[-0.555556,0.5,-0.79661,-0.916667])         |1.0       |
|1.0  |(4,[0,1,2,3],[-0.5,0.166667,-0.864407,-0.916667])        |1.0       |
|1.0  |(4,[0,1,2,3],[-0.5,0.75,-0.830508,-1.0])                 |1.0       |
|1.0  |(4,[0,1,2,3],[-0.388889,0.166667,-0.830508,-0.75])       |1.0       |
|1.0  |(4,[0,1,2,3],[-0.388889,0.166667,-0.762712,-0.916667])   |1.0       |
|1.0  |(4,[0,1,2,3],[-0.388889,0.583333,-0.898305,-0.75])       |1.0       |
|1.0  |(4,[0,1,2,3],[-0.388889,0.583333,-0.762712,-0.75])       |1.0       |
|1.0  |(4,[0,1,2,3],[-0.333333,0.25,-0.898305,-0.916667])       |1.0       |
|1.0  |(4,[0,1,2,3],[-0.166667,0.666667,-0.932203,-0.916667])   |1.0       |
|1.0  |(4,[0,2,3],[-0.833333,-0.864407,-0.916667])              |1.0       |
|1.0  |(4,[0,2,3],[-0.777778,-0.898305,-0.916667])              |1.0       |
|2.0  |(4,[0,1,2,3],[-0.611111,-1.0,-0.152542,-0.25])           |2.0       |
|2.0  |(4,[0,1,2,3],[-0.555556,-0.583333,-0.322034,-0.166667])  |2.0       |
|2.0  |(4,[0,1,2,3],[-0.388889,-0.166667,0.186441,0.166667])    |2.0       |
|2.0  |(4,[0,1,2,3],[-0.333333,-0.666667,-0.0847458,-0.25])     |2.0       |
|2.0  |(4,[0,1,2,3],[-0.333333,-0.666667,-0.0508475,-0.166667]) |2.0       |
|2.0  |(4,[0,1,2,3],[-0.277778,-0.166667,0.186441,0.166667])    |2.0       |
|2.0  |(4,[0,1,2,3],[-0.222222,-0.5,-0.152542,-0.25])           |2.0       |
|2.0  |(4,[0,1,2,3],[-0.222222,-0.333333,0.0508474,-4.03573E-8])|2.0       |
|2.0  |(4,[0,1,2,3],[-0.111111,-0.166667,0.0847457,0.166667])   |2.0       |
|2.0  |(4,[0,1,2,3],[-0.0555556,-0.25,0.186441,0.166667])       |2.0       |
|2.0  |(4,[0,1,2,3],[-1.32455E-7,-0.25,0.254237,0.0833333])     |2.0       |
|2.0  |(4,[0,1,2,3],[0.0555554,-0.833333,0.186441,0.166667])    |2.0       |
|2.0  |(4,[0,1,2,3],[0.0555554,-0.25,0.118644,-4.03573E-8])     |2.0       |
|2.0  |(4,[0,1,2,3],[0.111111,0.0833333,0.254237,0.25])         |2.0       |
|2.0  |(4,[0,1,2,3],[0.333333,-0.166667,0.355932,0.333333])     |0.0       |
+-----+---------------------------------------------------------+----------+

相關推薦

基於神經網路感知機)識別手寫數字

資料集是經典的MNIST,來自美國國家標準與技術研究所,是人工書寫的0~9數字圖片,圖片的畫素為28*28,圖片為灰度圖。MNIST分別為訓練集和測試集,訓練資料包含6萬個樣本,測試資料集包含1萬個樣本。使用Tensorflow框架載入資料集。 載入資料集的程式碼如下: import ten

Spark基於神經網路MLPC(感知分類)的使用

本文首發於我的個人部落格QIMING.INFO,轉載請帶上鍊接及署名。 MLPC(Multilayer Perceptron Classifier),多層感知器分類器,是一種基於前饋人工神經網路(ANN)的分類器。Spark中目前僅支援此種與神經網路有關的演算

【機器學習筆記21】神經網路感知機)

【參考資料】 【1】《深度學習》 花書 6.1 亦或問題 由於單層感知機相當於在一個空間增加了一個超平面進行分類,那麼對於像亦或問題這樣的情況則無法完成。 因此在多層感知機中增加了一個隱藏層,即一個啟用函式。現代神經網路最常用的啟用函式是整流線性單元,ReL

單層神經網路感知機、深度學習的總結

關於神經網路的幾點思考:單層——多層——深度 神經網路本質上是一個逼近器,一個重要的基本屬性就是通用逼近屬性。 通用逼近屬性: 1989年,George Cybenko發表文章“Approximation by Superpositions of a Sigmoidal

神經網路感知機MLP的實現(Python+TensorFlow)

用 MLP 實現簡單的MNIST資料集識別。 # -*- coding:utf-8 -*- # # MLP """ MNIST classifier, 多層感知機實現 """ # Import

基於R神經網路包(nnet)做分類(高階篇)

針對UCI的seeds資料集,基於R中的神經網路包(nnet)做分類,並計算分類的測試誤差。 分類是一種有監督的學習任務,我們需要一些帶有標籤屬性的資料和我們需要預測的新資料。 舉例說明,垃圾郵件識別問題,可以理解為一個二分類問題,即識別一封郵件是否是垃圾郵件並作出相應的處

深度學習基礎--不同網路種類--感知機MLP

多層感知機MLP   BP演算法的方面掀起了基於統計模型的機器學習熱潮,那時候人工神經網路被叫做“多層感知機”   可以擺脫早期離散傳輸函式的束縛,使用sigmoid或tanh等連續函式模擬神經元對激勵的響應,在訓練演算法上則使用Werbos發明的反向傳播B

tensorflow 感知分類mnist

from tensorflow.examples.tutorials.mnist import input_data mnist = input_data.read_data_sets("/root/data/", one_hot=True) import tensorf

keras使用MLP(感知機)神經網路來實現MNIST手寫體識別

    Keras是一個基於python的的深度學習框架,比tensorflow更簡單易用,適合入門學習,本篇文章主要介紹使用keras實現手寫體識別任務。環境為python3+,Keras2.1,神經網路基礎知識在此不做過多介紹。    1.    載入MNIST資料。方式

用pytorch實現感知機(MLP)(全連線神經網路FC)分類MNIST手寫數字體的識別

1.匯入必備的包 1 import torch 2 import numpy as np 3 from torchvision.datasets import mnist 4 from torch import nn 5 from torch.autograd import Variable 6

Deeplearning4j 實戰(5):基於感知機的Mnist壓縮以及在Spark實現

在上一篇部落格中,我們用基於RBM的的Deep AutoEncoder對Mnist資料集進行壓縮,應該說取得了不錯的效果。這裡,我們將神經網路這塊替換成傳統的全連線的前饋神經網路對Mnist資料集進行壓縮,看看兩者的效果有什麼異同。整個程式碼依然是利用Deeplearning4j進行實現,並且為了方

MLP(感知神經網路

由前面介紹看到,單個感知器能夠完成線性可分資料的分類問題,是一種最簡單的可以“學習”的機器。但他無法解決非線性問題。比如下圖中的XOR問題:即(1,1)(-1,-1)屬於同一類,而(1,-1)(-1,1)屬於第二類的問題,不能由單個感知器正確分類。 即在Minsky和Papert的專著《感知器》所分

基於粒子群演算法的概率神經網路實現分類(PSO_PNN)

基於粒子群演算法的概率神經網路實現多分類:用粒子群演算法(PSO)實現概率神經網路中(PNN)的引數spread的最優化,並用PNN實現訓練並測試多類別資料,多分類效果很棒,有需要請聯絡[email protected],需要一定費用。

深度學習基礎(二)—— 從感知機(MLP)到卷積神經網路(CNN)

經典的多層感知機(Multi-Layer Perceptron)形式上是全連線(fully-connected)的鄰接網路(adjacent network)。 That is, every neuron in the network is connec

構建感知神經網路對數字圖片進行文字識別

在Keras環境下構建多層感知器模型,對數字影象進行精確識別。 模型不消耗大量計算資源,使用了cpu版本的keras,以Tensorflow 作為backended,在ipython互動環境jupyter notebook中進行編寫。 1.資料來源 此資料庫包含四部分:訓練資

深度學習Deeplearning4j 入門實戰(5):基於感知機的Mnist壓縮以及在Spark實現

在上一篇部落格中,我們用基於RBM的的Deep AutoEncoder對Mnist資料集進行壓縮,應該說取得了不錯的效果。這裡,我們將神經網路這塊替換成傳統的全連線的前饋神經網路對Mnist資料集進行壓縮,看看兩者的效果有什麼異同。整個程式碼依然是利用Deeplearnin

神經網路/感知(MLP)架構:選擇隱藏數量和大小的標準

隱藏層個數: 一個零隱藏層的模型可以解決線性可分資料。所以除非你早知道你的資料線性不可分,證明它也沒什麼壞處—為什麼使用比任務需求更困難的模型?如果它是線性可分的那麼一個更簡單的技術可以工作,感知器也可以。 假設您的資料確實需要通過非線性技術進行分離,則始終

MLP感知機(人工神經網路)原理及程式碼實現

一、多層感知機(MLP)原理簡介多層感知機(MLP,Multilayer Perceptron)也叫人工神經網路(ANN,Artificial Neural Network),除了輸入輸出層,它中間可以有多個隱層,最簡單的MLP只含一個隱層,即三層的結構,如下圖:從上圖可以看

【Python-ML】神經網路-感知增加梯度檢驗

# -*- coding: utf-8 -*- ''' Created on 2018年1月26日 @author: Jason.F @summary: 多層感知器實現,加梯度檢驗 訓練集:http://yann.lecun.com/exdb/mnist/ train-im

深度神經網路工學習概覽(An Overview of Multi-task Learning in Deep Neural Networks)

譯自:http://sebastianruder.com/multi-task/ 1. 前言 在機器學習中,我們通常關心優化某一特定指標,不管這個指標是一個標準值,還是企業KPI。為了達到這個目標,我們訓練單一模型或多個模型集合來完成指定得任務。然後,我們通過精細調參,來改進模型直至效能不再