提到人工智能(Artificial Intelligence,AI),大家都不會陌生,在現今行業領起風潮,各行各業無不趨之若鶩,作為技術使用者,到底什么是AI,我們要有自己的理解.
目前,在人工智能中,無可爭議的是深度學習占據了統治地位,,其在圖像識別,語音識別,自然語言處理,無人駕駛領域應用廣泛.
如此,我們要如何使用這門技術呢?下面我們來一起了解"多層感知器",即MLP算法,泛稱為神經網絡.
神經網絡顧名思義,就像我們人腦中的神經元一樣,為了讓機器來模擬人腦,我們在算法中設置一個個節點,在訓練模型時,輸入的特征與預測的結果用節點來表示,系數w(又稱為"權重")用來連接節點,神經網絡模型的學習就是一個調整權重的過程,訓練模型一步步達到我們想要的效果.
理解了原理,下面來上代碼直觀看一下:
1.神經網絡中的非線性矯正
每個輸入數據與輸出數據之間都有一個或多個隱藏層,每個隱藏層包含多個隱藏單元.
在輸入數據和隱藏單元之間或隱藏單元和輸出數據之間都有一個系數(權重).
計算一系列的加權求和和計算單一的加權求和和普通的線性模型差不多.
線性模型的一般公式:
y = w[0]▪x[0]+w[1]▪x[1] + ▪▪▪ + w[p]▪x[p] + b
為了使得模型比普通線性模型更強大,所以我們要進行一些處理,即非線性矯正(rectifying nonlinearity),簡稱為(rectified linear unit,relu).或是進行雙曲正切處理(tangens hyperbolicus,tanh)
############################# 神經網絡中的非線性矯正 ####################################### #導入numpy import numpy as np #導入畫圖工具 import matplotlib.pyplot as plt #導入numpy import numpy as py #導入畫圖工具 import matplotlib.pyplot as plt #生成一個等差數列 line = np.linspace(-5,5,200) #畫出非線性矯正的圖形表示 plt.plot(line,np.tanh(line),label='tanh') plt.plot(line,np.maximum(line,0),label='relu') #設置圖注位置 plt.legend(loc='best') #設置橫縱軸標題 plt.xlabel('x') plt.ylabel('relu(x) and tanh(x)') #顯示圖形 plt.show()
- tanh函數吧特征X的值壓縮進-1到1的區間內,-1代表的是X中較小的數值,而1代表X中較大的數值.
- relu函數把小於0的X值全部去掉,用0來代替
2.神經網絡的參數設置
#導入MLP神經網絡 from sklearn.neural_network import MLPClassifier #導入紅酒數據集 from sklearn.datasets import load_wine #導入數據集拆分工具 from sklearn.model_selection import train_test_split wine = load_wine() X = wine.data[:,:2] y = wine.target #下面我們拆分數據集 X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=0) #接下來定義分類器 mlp = MLPClassifier(solver='lbfgs') mlp.fit(X_train,y_train)
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=(100,), learning_rate='constant', learning_rate_init=0.001, max_iter=200, momentum=0.9, n_iter_no_change=10, nesterovs_momentum=True, power_t=0.5, random_state=None, shuffle=True, solver='lbfgs', tol=0.0001, validation_fraction=0.1, verbose=False, warm_start=False)
- identity對樣本特征不做處理,返回值是f(x) = x
- logistic返回的結果會是f(x)=1/[1 + exp(-x)],其和tanh類似,但是經過處理后的特征值會在0和1之間
#導入畫圖工具 import matplotlib.pyplot as plt from matplotlib.colors import ListedColormap #定義圖像中分區的顏色和散點的顏色 cmap_light = ListedColormap(['#FFAAAA','#AAFFAA','#AAAAFF']) cmap_bold = ListedColormap(['#FF0000','#00FF00','#0000FF']) #分別用樣本的兩個特征值創建圖像和橫軸和縱軸 x_min,x_max = X_train[:, 0].min() - 1,X_train[:, 0].max() + 1 y_min,y_max = X_train[:, 1].min() - 1,X_train[:, 1].max() + 1 xx,yy = np.meshgrid(np.arange(x_min,x_max, .02),np.arange(y_min,y_max, .02)) Z = mlp.predict(np.c_[xx.ravel(),yy.ravel()]) #給每個分類中的樣本分配不同的顏色 Z = Z.reshape(xx.shape) plt.figure() plt.pcolormesh(xx, yy, Z, cmap=cmap_light) #用散點圖把樣本表示出來 plt.scatter(X[:, 0],X[:, 1],c=y,edgecolor='k',s=60) plt.xlim(xx.min(),xx.max()) plt.ylim(yy.min(),yy.max()) plt.title("MLPClassifier:solver=lbfgs") plt.show()
(1)設置隱藏層中節點數為10
#設置隱藏層中節點數為10 mlp_20 = MLPClassifier(solver='lbfgs',hidden_layer_sizes=[10]) mlp_20.fit(X_train,y_train) Z1 = mlp_20.predict(np.c_[xx.ravel(),yy.ravel()]) #給每個分類中的樣本分配不同的顏色 Z1 = Z1.reshape(xx.shape) plt.figure() plt.pcolormesh(xx, yy, Z1, cmap=cmap_light) #用散點圖把樣本表示出來 plt.scatter(X[:, 0],X[:, 1],c=y,edgecolor='k',s=60) plt.xlim(xx.min(),xx.max()) plt.ylim(yy.min(),yy.max()) plt.title("MLPClassifier:nodes=10") plt.show()
(2)設置神經網絡有兩個節點數為10的隱藏層
#設置神經網絡2個節點數為10的隱藏層 mlp_2L = MLPClassifier(solver='lbfgs',hidden_layer_sizes=[10,10]) mlp_2L.fit(X_train,y_train) ZL = mlp_2L.predict(np.c_[xx.ravel(),yy.ravel()]) #給每個分類中的樣本分配不同的顏色 ZL = ZL.reshape(xx.shape) plt.figure() plt.pcolormesh(xx, yy, ZL, cmap=cmap_light) #用散點圖把樣本表示出來 plt.scatter(X[:, 0],X[:, 1],c=y,edgecolor='k',s=60) plt.xlim(xx.min(),xx.max()) plt.ylim(yy.min(),yy.max()) plt.title("MLPClassifier:2layers") plt.show()
(3)設置激活函數為tanh
#設置激活函數為tanh mlp_tanh = MLPClassifier(solver='lbfgs',hidden_layer_sizes=[10,10],activation='tanh') mlp_tanh.fit(X_train,y_train) Z2 = mlp_tanh.predict(np.c_[xx.ravel(),yy.ravel()]) #給每個分類中的樣本分配不同的顏色 Z2 = Z2.reshape(xx.shape) plt.figure() plt.pcolormesh(xx, yy, Z2, cmap=cmap_light) #用散點圖把樣本表示出來 plt.scatter(X[:, 0],X[:, 1],c=y,edgecolor='k',s=60) plt.xlim(xx.min(),xx.max()) plt.ylim(yy.min(),yy.max()) plt.title("MLPClassifier:2layers with tanh") plt.show()
(4)修改模型的alpha參數
#修改模型的alpha參數 mlp_alpha = MLPClassifier(solver='lbfgs',hidden_layer_sizes=[10,10],activation='tanh',alpha=1) mlp_alpha.fit(X_train,y_train) Z3 = mlp_alpha.predict(np.c_[xx.ravel(),yy.ravel()]) #給每個分類中的樣本分配不同的顏色 Z3 = Z3.reshape(xx.shape) plt.figure() plt.pcolormesh(xx, yy, Z3, cmap=cmap_light) #用散點圖把樣本表示出來 plt.scatter(X[:, 0],X[:, 1],c=y,edgecolor='k',s=60) plt.xlim(xx.min(),xx.max()) plt.ylim(yy.min(),yy.max()) plt.title("MLPClassifier:alpha=1") plt.show()
總結:
如此,我們有4種方法可以調節模型的復雜程度:
第一種,調整神經網絡每一個隱藏層上的節點數
第二種,調節神經網絡隱藏層的層數
第三種,調節activation的方式
第四種,通過調整alpha值來改變模型正則化的過程
對於特征類型比較單一的數據集來說,神經網絡的表現還是不錯的,但是如果數據集中的特征類型差異比較大的話,隨機森林或梯度上升隨機決策樹等基於決策樹的算法的表現會更好一點.
神經網絡模型中的參數調節至關重要,尤其是隱藏層的數量和隱藏層中的節點數.
這里給出一個參考原則:神經網絡中的隱藏層的節點數約等於訓練數據集的特征數量,但一般不超過500.
如果想對龐大復雜高維的數據集做處理與分析,建議往深度學習發展,這里介紹兩個流行的python深度學習庫:keras,tensor-flow
文章引自 : 《深入淺出python機器學習》