對于 Python 來說,最受歡迎的機器學習圖書館是 SciKit Learn。 前幾天最新版本(0.18)剛剛發布,現在已內置支持神經網絡模型。 對 Python 的基本理解對于弄明白這篇文章是必要的,有一些關于Sci-Kit Learn 的使用經驗也是十分有幫助的(但不是必要)。
另外,作為一個快速附注,我寫了一篇詳解版的姐妹文章,不過是以 R 語言編寫的(可點擊此處查看)。
| 神經網絡
神經網絡是一個試圖模仿自然生物神經網絡的學習模式的機器學習框架。 生物神經網絡具有相互連接的神經元,神經元帶有接受輸入信號的樹突,然后基于這些輸入,它們通過軸突向另一個神經元產生輸出信號。 我們將嘗試通過使用人工神經網絡(ANN)來模擬這個過程,我們現在將其稱為神經網絡。 創建神經網絡的過程從最基本的形式單個感知器開始。
| 感知器
讓我們通過探討感知器開始我們的討論吧。 感知器具有一個或多個輸入、偏置、激活函數和單個輸出。 感知器接收輸入,將它們乘以一些權重,然后將它們傳遞到激活函數以產生輸出。 有許多激活函數可供選擇,例如邏輯函數,三角函數,階躍函數等。我們還確保向感知器添加偏差,這避免了所有輸入可能等于零的問題(意味著沒有乘權重會有影響)。 檢查下面的圖表感知器的可視化:
一旦我們有輸出,我們可以將其與已知標簽進行比較,并相應地調整權重(權重通常以隨機初始化值開始)。 我們繼續重復此過程,直到我們達到允許迭代的最大數量或可接受的錯誤率。
為了創建神經網絡,從疊加感知器層開始即可創建神經網絡的多層感知器模型。 將產生直接接收要素輸入的一個輸入層,一個將創建結果輸出的輸出層。 之間的任何圖層都稱為隱藏圖層,因為它們不直接“查看”要素輸入或輸出。 對于可視化可查看下面的圖表(來源:維基百科)。
下面,讓我們開始實操,用 python 創建神經網絡吧!
| SciKit-Learn
為了跟得上這個教程的節奏,您需要安裝最新版本的 SciKit Learn。雖然通過 pip 或 conda 很容易安裝,但你可以參考官方的安裝文檔來了解完整的細節。
| 數據
我們將使用 SciKit Learn 內置的乳腺癌數據集,如果具有腫瘤特征的樣本均會被標記,并顯示腫瘤為惡性還是良性。 我們將嘗試創建一個神經網絡模型,它可以理解腫瘤的特點,并嘗試預測。讓我們繼續進行,從獲取數據開始吧!
這個對象就像字典一樣,包含著數據的描述信息,特點及目標:
| 訓練測試分裂
讓我們把數據分成訓練和測試集,通過來自模式選擇中的 SciKit Learn‘s 的訓練測試分裂函數,這點便可以輕松做到。
| 數據預處理
如果數據未被歸一化,則在最大迭代次數被準許之前,神經網絡可能難以聚集。 多層感知器對特征縮放非常敏感,因此強烈建議您縮放數據。 請注意,必須對測試集應用相同的縮放以獲得有意義的結果。 目前有很多不同的數據標準化方法,我們將使用內置的 StandardScaler 進行標準化。
| 訓練模型
現在該訓練我們的模型了。 通過估計對象, SciKit Learn 使這一切變得極其容易。 在這種情況下,我們將從 SciKit-Learn 的 neural_network 庫導入我們的估計器(多層感知器分類器模型)。
我們接下來將創建一個模型的實例,你可以定義很多參數和自定義,我們將只定義 hidden_layer_sizes。 對于此參數,您傳遞一個元組,其中在每一層包含你想要的神經元數量,其中元組中的第 n 個條目表示 MLP 模型的第 n 層中的神經元的數量。 有很多方法來選擇這些數字,但為了簡單起見,我們將選擇與我們的數據集中的特征相同數量的神經元的三層:
現在已經建立了模型,我們可以將訓練數據放入其中,記住這個數據已經被處理和縮放:
MLPClassifier(activation=’relu‘, alpha=0.0001, batch_size=’auto‘, beta_1=0.9,
beta_2=0.999, early_stopping=False, epsilon=1e-08,
hidden_layer_sizes=(30, 30, 30), learning_rate=’constant‘,
learning_rate_init=0.001, max_iter=200, momentum=0.9,
nesterovs_momentum=True, power_t=0.5, random_state=None,
shuffle=True, solver=’adam‘, tol=0.0001, validation_fraction=0.1,
verbose=False, warm_start=False)
我們可以在其中看到顯示模型中其他參數的默認值輸出。 嘗試用不同的數值多次操作,就能看到數據對模型的影響。
| 預測與評估
現在我們有一個模型,是時候使用它來獲得預測! 我們可以簡單地使用我們的擬合模型中的 predict()方法:
現在我們可以使用 SciKit-Learn 內置的指標,如分類報告和混淆矩陣來評估我們的模型執行得如何:
看上去只有三個案例被錯誤分類了,準確率達到 98 %(以及 98% 的精度和召回)??紤]到我們才寫了這么少的代碼,效果還是相當不錯的。 然而,使用多層感知器模型的缺點在于,解釋模型本身存在著很多困難,而特征的權重和偏差很難輕易解釋。
然而,如果希望在訓練模型后提取MLP權重和偏差,則需要使用其公共屬性 coefs_ 和 intercepts_。
coefs_ 是權重矩陣的列表,其中索引i 處的權重矩陣表示層 i 和層 i + 1 之間的權重。
intercepts_ 是偏差向量的列表,其中索引i 處的向量表示添加到層 i + 1 的偏差值。
| 結論
希望你喜歡這個關于神經網絡的簡短討論,我們可以在學習中嘗試玩轉隱藏層和神經元的數量,看看它們如何影響結果。
評論
查看更多