Liz's Blog

就是要學R #19:機器學習之類神經網路(Neural Net)實作篇

| Comments

要認真上完一個完整的線上課程真的有點需要毅力,當然學習資料科學本來就需要花多點時間。我自己很喜歡這個老師的教學方法,從他提供的程式碼就可以看出,先從綜觀的角度來看資料,處理資料也有特定的模式,讓學生可以習慣特定程式碼。二來他的教學並不是逐步解釋所有R的東西,只做重點提示,接著鼓勵學生回去看原始文件檔。一開始我常常看的黑人問號,隨著閱讀量增加及爬文,就會慢慢了解原來是這樣。類神經網路(Neural Net)已經是這套課程最後一個小節,接著我會開始該講師另一個Python資料科學的課程,以及把過去幾小節機器學習的理論慢慢補回來啦~

Udemy
課程名稱:Data Science and Machine Learning Bootcamp with R
講師:Jose Portilla

類神經網路(Neural Net)建議參考Artificial neural network維基百科,至少神經元那段寫得比較好:P

1.使用MASS套件中的Boston資料集來做練習,共有506個樣本,14個變數。

library(MASS)
data <- Boston

2.安裝並載入neuralnet套件

install.packages('neuralnet')
library(neuralnet)

3.可用z-normalization或min-max scale來標準化資料(沒有標準化的資料可能會造成沒用的資料或非常難訓練資料),介於[0,1]或[-1,1]似乎會比較好。apply可參考這篇

maxs <- apply(data, 2, max) 
mins <- apply(data, 2, min)
scaled <- as.data.frame(scale(data, center = mins, scale = maxs - mins))
head(scaled)

4.將所有樣本分成訓練組及測試組

library(caTools)
set.seed(101)
split = sample.split(scaled$medv, SplitRatio = 0.70)
train = subset(scaled, split == TRUE)
test = subset(scaled, split == FALSE)

5.neuralnet()不像過去學過的幾個演算法函式使用y~. 的公式,得呼叫所有欄位再組合再一起

n <- names(train)
f <- as.formula(paste("medv ~", paste(n[!n %in% "medv"], collapse = " + ")))
nn <- neuralnet(f,data=train,hidden=c(5,3),linear.output=TRUE)
plot(nn)

6.使用模型來預測(預測的結果會輸出經過正常化的結果,所以需要還原才能比較)

predicted.nn.values <- compute(nn,test[1:13])

#會用list的模型輸出
str(predicted.nn.values)

#還原成未正常化的預測
true.predictions <- predicted.nn.values$net.result*(max(data$medv)-min(data$medv))+min(data$medv)
test.r <- (test$medv)*(max(data$medv)-min(data$medv))+min(data$medv)

#計算Mean Squared Error=(實際值-預估值)平方的總和/測試組樣本數
MSE.nn <- sum((test.r - true.predictions)^2)/nrow(test)
MSE.nn

7.誤差視覺化

error.df <- data.frame(test.r,true.predictions)
library(ggplot2)
ggplot(error.df,aes(x=test.r,y=true.predictions)) + geom_point() + stat_smooth()

1.使用UCI的Bank Authentication Data Set資料集練習,共1372個樣本,5個變數。

df <- read.csv('bank_note_data.csv')

2.將樣本分成訓練組及測試組

library(caTools)
set.seed(101)
split = sample.split(df$Class, SplitRatio = 0.70)
train = subset(df, split == TRUE)
test = subset(df, split == FALSE)

3.套入neuralnet套件

library(neuralnet)
nn <- neuralnet(Class ~ Image.Var + Image.Skew + Image.Curt + Entropy,data=train,hidden=10,linear.output=FALSE)

4.預測

predicted.nn.values <- compute(nn,test[,1:4])
predictions <- sapply(predicted.nn.values$net.result,round)
table(predictions,test$Class)

5.和隨機森林(randomForest)一較高下(randomForest需要Class是factor)

library(randomForest)
df$Class <- factor(df$Class)

library(caTools)
set.seed(101)
split = sample.split(df$Class, SplitRatio = 0.70)
train = subset(df, split == TRUE)
test = subset(df, split == FALSE)

model <- randomForest(Class ~ Image.Var + Image.Skew + Image.Curt + Entropy,data=train)
rf.pred <- predict(model,test)
table(rf.pred,test$Class)

就該資料集,似乎類神經網路(Neural Net)比隨機森林(randomForest)表現得還好,但還需要多練習幾個資料集才能更熟悉這兩個演算法囉!

【延伸閱讀】
1.就是要學R #1:Basic 基礎篇
2.就是要學R #2:Matrix 矩陣篇
3.就是要學R #3:Data Frame 資料框架篇
4.就是要學R #4:List 列表篇
5.就是要學R #5:Import & Export 匯入匯出篇(csv & excel)
6.就是要學R #6:Import & Export 匯入匯出篇(SQL & web scraping)
7.就是要學R #7:R programming 基礎篇
8.就是要學R #8:R Programming 進階篇
9.就是要學R #9:資料前處理篇(dplyr、tidyr)
10.就是要學R #10:ggplot2幫你搞定資料視覺化
11.就是要學R #11:資料視覺化應用篇(ggplot2、Plotly)
12.就是要學R #12:機器學習之線性迴歸實作篇
13.就是要學R #13:機器學習之邏輯迴歸實作篇
14.就是要學R #14:機器學習之K Nearest Neighbor(KNN)實作篇
15.就是要學R #15:機器學習之決策樹、隨機森林實作篇
16.就是要學R #16:機器學習之Support Vector Machine(SVM)實作篇
17.就是要學R #17:機器學習之K Means Clustering實作篇
18.就是要學R #18:機器學習之自然語言處理(NLP)實作篇
19.就是要學R #19:機器學習之類神經網路(Neural Net)實作篇

Comments

comments powered by Disqus