活用西瓜书——sklearn包中的神经网络分类器MLPClassifier的使用
引言
最近在讀西瓜書,查閱了多方資料,惡補了數值代數、統計概率和線代,總算是勉強看懂了西瓜書中的公式推導。但是知道了公式以后還是要學會應用的,幾經摸索發現python下的sklearn包把機器學習中經典的算法都封裝好了,因此,打算寫幾篇博客記錄一下sklearn包下的常用學習算法的使用,防止自己以后忘了,嘿嘿。
1.神經網絡
神經網絡其實是一個寬泛的概念,西瓜書中也只不過是對神經網絡進行了簡單的介紹,詳細的神經網絡是一門和深度學習緊密關聯的完整的學科。概括一下,神經網絡就是一種對于多輸入和多輸出的任務進行處理的算法,使用多層多個計算節點進行交互運算,不同層次之間相互影響,下層的數據或運算結果作為上一層的輸入,上層節點接收到多個下層節點的輸入后對輸入進行權值運算,通過激活函數來產生本層的輸出值。如此層層運算,經過復雜的迭代后得到多個輸出值。由此描述我們可以知道,每個節點都需要有自己的計算標準(參數值),比如如何對上一層的輸入進行加權,如何計算出下一層的輸出,激活函數和閾值如何選擇,等等。因此,神經網咯的問題最終還是歸結為參數的優化問題,只不過在神經網絡中,需要優化的參數是大量的。
2.BP算法
BP算法是用于求解神經網絡中各項參數的算法,核心思想就是最小化均方誤差,給定一個訓練樣本(xk,ykx_k,y_kxk?,yk?),假設模型輸出為yk=(y1.k,y2.k...yl.k)y_k=(y_1.^k,y_2.^k...y_l.^k)yk?=(y1?.k,y2?.k...yl?.k)則均方誤差為:Ek=12∑j=1l(yj.k?yjk)E_k=\cfrac {1} {2}\sum_{j=1}^{l} (y_j.^k-y_j^k)Ek?=21?∑j=1l?(yj?.k?yjk?),我們再根據梯度下降法,對均方誤差求偏導,進而優化參數。在神經網絡中需要優化的參數有:ωhj\omega_hjωh?j(隱層連接權值)、θj\theta_jθj?(函數內閾值,輸入求和后減去這個值作為sigmoid函數的參數)、vihv_ihvi?h(輸入層權值)和γh\gamma_hγh?(隱層的閾值),優化參數時由于參數存在著嵌套,因此應該使用鏈式函數求導法則。具體的推導過程不作詳述(實際上是公式太難打了,哈哈)。
3.sklearn中的神經網絡分類器MLPClassifier
sklearn下封裝好了神經網絡分類器MLPClassifier以及神經網絡回歸器,用法和參數類似,本文使用MLPClassifier來編寫案例。其實很多任務比如數字識別,文字識別,甚至自然語言識別都可以歸結于分類任務(比如數字識別就是10-分類任務),由于完整的數據集不好整,另外神經網絡其實沒辦法一篇文章寫個通透,本人也只是入門,因此就還拿iris數據及寫一個分類案例。
重要參數
solver:優化方法,取值集合為{‘lbfgs’, ‘sgd’, ‘adam’},lbfgs是一種牛頓法 ,sgd是隨機梯度下降,adam是另一種梯度下降,叫做機遇梯度下降。數據集很大的時候后建議使用adam,一般數據及使用lbfgs即可。
hidden_layer_sizes:隱層節點個數,是個可變參,tuple元組類型,可以規定任意長度,里面的第i個數代表第i個隱層的節點個數,元組長度即為隱層數,默認為(100,)即單隱層,隱層中100個節點。
alpha:正則化系數,防止過擬合的,正則化系數越大則正則化力度越大。
代碼
from sklearn.neural_network import MLPClassifier from sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_split import numpy as np import pandas as pd from sklearn import datasets from pandas import DataFrame iris=datasets.load_iris() df=DataFrame(iris.data,columns=iris.feature_names) df['target']=list(iris.target) # print(df) X=df.iloc[:,0:4] Y=df.iloc[:,4] X_train,X_test,Y_train,Y_test=train_test_split(X,Y,test_size=0.3,random_state=0) sc=StandardScaler() sc.fit(X) standard_train=sc.transform(X_train) standard_test=sc.transform(X_test) # solver{‘lbfgs’, ‘sgd’, ‘adam’} ‘adam’在相對較大的數據集上效果比較好(幾千個樣本或者更多),對小數據集來說,lbfgs收斂更快效果也更好。 mlp=MLPClassifier(solver='lbfgs',alpha=1e-5,hidden_layer_sizes=(10,5)) mlp.fit(standard_train,Y_train) result=mlp.predict(standard_test) print("測試集合的y值:",list(Y_test)) print("神經網絡預測的的y值:",list(result)) print("預測的正確率為:",mlp.score(standard_test,Y_test))運行結果
預測正確率達到百分之九十八。
4.補充
對于不同的數據集應該怎么選擇隱層的數量和隱層節點個數?我么還可以從分類所需感知機的個數觸發來確定隱層的相關參數,找到一篇其他博主的講解,我覺得說得很到位。鏈接在這-在神經網絡中應使用多少隱藏層/神經元?(附實例)
總結
以上是生活随笔為你收集整理的活用西瓜书——sklearn包中的神经网络分类器MLPClassifier的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 清除浮动(解决高度坍塌的问题)的方法5种
- 下一篇: 服务器网口修改为百兆,服务器千兆网口能否