概念
MLP,Multi-layer Perceptron多層感知機,也叫人工神經網絡(ANN,Artificial Neural Network),在輸入輸出層的中間可以有多個隱藏層,如果沒有隱藏層只能解決線性可划分的數據問題。最簡單的MLP模型只包含一個隱藏層,即三層的結構。

多層感知機的層與層之間是全連接的(全連接的意思就是:上一層的任何一個神經元與下一層的所有神經元都有連接)。多層感知機最底層是輸入層,中間是隱藏層,最后是輸出層。假設輸入層用向量X表示,則隱藏層的輸出就是f(W1X+b1),W1是權重(也叫連接系數),b1是偏置,函數f 可以是常用的sigmoid函數或者tanh函數。輸出層的輸出就是softmax(W2X1+b2),X1表示隱藏層的輸出f(W1X+b1)。
求解最佳的參數是一個最優化問題,可以使用梯度下降法(sgd)
使用實例
訓練
MLPClassifier的hidden_layer_sizes可以設置需要的神經網絡的隱藏層數及每一個隱藏層的神經元個數,比如(3,2)表示該神經網絡擁有兩個隱藏層,第一個隱藏層有3個神經元,第二個隱藏層有2個神經元。其他的參數具體見官方文檔
下例中還使用了KFold進行了交叉檢驗,並存下其結果,最后將幾次Fold中結果最好的分類器保存下來。
# two-layer neural network
# train part
import numpy as np
from sklearn.neural_network import MLPClassifier
from sklearn.model_selection import KFold
from joblib import dump
#get training data
X = train_data[:,1:]
y = train_data[:,0]
#neural network classifier of structure (3,2)
kf = KFold(n_splits=3) # 3-fold cross-validation
best_clf = None
best_score = 0
train_scores = []
test_scores = []
print("kfold-------")
for train_index, test_index in kf.split(X):
# create neural network using MLPClassifer
clf = MLPClassifier(solver = 'sgd', activation = 'logistic', max_iter = 1000, hidden_layer_sizes = (3,2),random_state = 1)
X_train, X_test = X[train_index], X[test_index]
y_train, y_test = y[train_index], y[test_index]
clf.fit(X_train, y_train)
train_score = clf.score(X_train, y_train)
train_scores.append(train_score)
test_score = clf.score(X_test, y_test)
test_scores.append(test_score)
#compare score of the tree models and get the best one
if test_score > best_score:
best_score = test_score
best_clf = clf
#print(clf.n_outputs_)
in_sample_error = [1 - score for score in train_scores]
test_set_error = [1 - score for score in test_scores]
print("in_sample_error: ")
print(in_sample_error)
print("test_set_error: ")
print(test_set_error)
#store the classifier
if best_clf != None:
dump(best_clf, "train_model.m")
測試
直接加載之前訓練好並保存下來的分類器,並測試
# test part
import numpy as np
from sklearn.neural_network import MLPClassifier
from joblib import load
X_test = test_data[:,1:]
y_test = test_data[:,0]
clf = load("train_model.m")
y_pred = clf.predict(X_test)
np.savetxt("label_pred.txt", np.array(y_pred)) #save predict result
#print(y_pred)
test_score = clf.score(X_test, y_test)
test_error = 1 - test_score
print('test_score:%s' % test_score)
print('test_error:%s' % test_error)
參考:
基於sklearn-MLP多層感知機實例
sklearn 神經網絡 MLPClassifier簡單應用與參數說明
sklearn.neural_network.MLPClassifier
Softmax函數
get test scores for each iteration of MLPClassifier
