1.理解神經網絡
1)基本概念
- 人工神經網絡(ANN):對一組輸入信號和一組輸出信號之間的關系進行建模,模型來源於人類大腦對來自感覺輸入刺激反應的理解。使用人工神經元或節點的網絡來學習。
- 圖靈測試:如果一個人不能把機器行為和一種生物行為區分開來,那么將該機器划分為智能類。
- ANN應用方法:分類/數值預測/無監督模式識別
- ANN應用場景:輸入和輸出好理解,但其過程很復雜(即黑箱方法)
n個輸入神經元:
2)激活函數
- 單位跳躍激活函數:輸入信號總和大於0,神經元才擊破閾值
- S形激活函數(最常用的激活函數):輸出信號不是二元的,而是0-1之間的某個值(可微的,因此可對整個輸入范圍求導)
- 其他激活函數:差異就在於輸出信號的范圍不同,一般是(0-1),(-1,1),(-∞,+∞)中的一種。
對於很多激活函數,影響輸出信號的輸入值范圍是相對較窄的,比如上面S形激活函數影響輸出信號(0,1)的輸入信號范圍(-5,5),存在輸入信號壓縮(也稱為壓縮函數),所以神經網絡輸入一般要做標准化,使特征值落在0附近的小范圍內,這樣模型訓練也更快些。
3)網絡拓撲
神經網絡的學習能力來自它的拓撲結構:相互連接的神經元模式和結構。關鍵特征:
- 層的數目
- 信息傳播方向
前饋網絡:輸入信號從上至下節點傳送,直至輸出層。應用廣泛。
反饋網絡(遞歸網絡):允許信號使用循環在兩個方向上傳播。更貼近生物神經網絡工作原理,使復雜模式被學習。停留在理論層面。
多層前饋網絡(多層感知器,MLP):人工神經網絡拓撲結構的事實標准。
- 每一層內的節點數
輸入節點的個數由輸入數據特征的數量預先確定,輸出節點的個數由需要進行建模的結果或結果中分類水平數預先確定。隱藏節點的個數留給使用者在訓練模型之前確定(無可信規則)。
較多數量的神經元訓練更嚴格的模型,但易過擬合,且訓練慢。最好是基於驗證數據集,使用較少的節點產生適用的性能。
4)訓練算法
通過調整連接權重訓練神經網絡模型的計算量非常大,因此一種后向傳播誤差的訓練策略被發現。
目前,后向傳播算法的多層前饋網絡在數據挖掘領域很常見:
該算法通過兩個過程的多次循環進行迭代。
兩個過程:
- 前向階段:輸入層到輸出層,沿途應用每個神經元的權重和激活函數,一旦到最后一層就產生一個輸出信號。
- 后向階段:前向階段產生的輸出信號與訓練集中的真是目標值比較,兩者的誤差向后傳播來修正神經元之間的連接權重,並減少將來的誤差。
梯度下降法:利用每個神經元的激活函數的導數來確定每個輸入權重方向上的梯度(因此一個可微的激活函數很重要,梯度因為權重的改變表明誤差的急劇變化,后向傳播算法通過學習率的量來改變權重來使得誤差最大化減少)。
2.神經網絡應用示例
使用人工神經網絡對混凝土的強度進行建模。
1)收集數據
包含1030個混凝土案例,8個描述混合物成分的特征(與抗壓強度相關)。
數據下載:
鏈接: https://pan.baidu.com/s/1Js-Asm479XYBjuCEXVF7Ng 提取碼: 45fv
2)探索和准備數據
輸入數據的標准化。注意如果數據服從一個鍾形曲線(如正態分布),使用base::scale()
函數才是有意義的。如果是均勻分布或嚴重非正態,則標准化到0-1水平會更合適。
## Example: Modeling the Strength of Concrete ----
## Step 2: Exploring and preparing the data ----
# read in data and examine structure
concrete <- read.csv("concrete.csv")
str(concrete)
# custom normalization function
normalize <- function(x) {
return((x - min(x)) / (max(x) - min(x)))
}
# apply normalization to entire data frame
concrete_norm <- as.data.frame(lapply(concrete, normalize))
# confirm that the range is now between zero and one
summary(concrete_norm$strength)
# compared to the original minimum and maximum
summary(concrete$strength)
# create training and test data
concrete_train <- concrete_norm[1:773, ] #75%
concrete_test <- concrete_norm[774:1030, ] #25%
訓練模型前應用於數據的任何變換,之后需要應用反變換,以便將數據轉換回原始的測量單位。
3)訓練數據
可做神經網絡的R包:neuralnet,nnet,RSNNS
等。這里使用neuralnet
包的同名函數來做,hidden參數即隱藏層默認為1。
## Step 3: Training a model on the data ----
# train the neuralnet model
library(neuralnet)
# simple ANN with only a single hidden neuron
set.seed(12345) # to guarantee repeatable results
concrete_model <- neuralnet(formula = strength ~ cement + slag +
ash + water + superplastic +
coarseagg + fineagg + age,
data = concrete_train)
# visualize the network topology
plot(concrete_model)
訓練模型的網絡拓撲結構可視化:
4)評估模型
評估模型是compute函數(而非predict),評估中包含網絡中每一層的神經元和預測值這2個結果。
因為是數值預測而不是分類問題,所以不能用混淆矩陣來評估,可以用預測的強度和真實值的相關性來評估。
## Step 4: Evaluating model performance ----
# obtain model results
model_results <- compute(concrete_model, concrete_test[1:8])
# obtain predicted strength values
predicted_strength <- model_results$net.result
# examine the correlation between predicted and actual values
cor(predicted_strength, concrete_test$strength)
5)提高性能
考慮使用更復雜拓撲結構的網絡學習,將隱藏節點個數增加到5來提高性能。
## Step 5: Improving model performance ----
# a more complex neural network topology with 5 hidden neurons
set.seed(12345) # to guarantee repeatable results
concrete_model2 <- neuralnet(strength ~ cement + slag +
ash + water + superplastic +
coarseagg + fineagg + age,
data = concrete_train, hidden = 5)
# plot the network
plot(concrete_model2)
# evaluate the results as we did before
model_results2 <- compute(concrete_model2, concrete_test[1:8])
predicted_strength2 <- model_results2$net.result
cor(predicted_strength2, concrete_test$strength)
機器學習與R語言系列推文匯總:
【機器學習與R語言】1-機器學習簡介
【機器學習與R語言】2-K近鄰(kNN)
【機器學習與R語言】3-朴素貝葉斯(NB)
【機器學習與R語言】4-決策樹
【機器學習與R語言】5-規則學習
【機器學習與R語言】6-線性回歸
【機器學習與R語言】7-回歸樹和模型樹
【機器學習與R語言】8-神經網絡
【機器學習與R語言】9-支持向量機
【機器學習與R語言】10-關聯規則
【機器學習與R語言】11-Kmeans聚類
【機器學習與R語言】12-如何評估模型的性能?
【機器學習與R語言】13-如何提高模型的性能?