คำทำนายในร
ด้วยแพ็คเกจ nnet สำหรับโครงข่ายประสาทเทียม
โครงข่ายประสาทเทียมมีความสำคัญมากและมีการใช้กันอย่างแพร่หลายในการเรียนรู้ของเครื่อง พวกเขามีความสามารถในการเรียนรู้คุณสมบัติ โดยอัตโนมัติ จากข้อมูลอินพุตที่พวกเขาทำงาน
โครงข่ายประสาทเทียมเรียกอีกอย่างว่าโครงข่ายประสาทเทียม
ฉันมีข้อมูลการจองบางอย่างที่ฉันต้องการวิเคราะห์โดยใช้โครงข่ายประสาทเทียม แต่ฉันคิดว่ามันเหมาะสมที่จะทำความเข้าใจวลีสองสามข้อที่มักใช้ก่อนที่จะเข้าสู่ด้าน R ของสิ่งต่างๆ
โครงข่ายประสาทเทียมทำงานอย่างไร:
เครือข่ายประสาททำงานโดยใช้เซลล์ประสาทที่เชื่อมต่อกันจำนวนมาก (เซลล์ประสาทเทียม) เพื่อประมวลผลและแปลงข้อมูลอินพุตโดยใช้ฟังก์ชันการเปิดใช้งานและน้ำหนักที่เรียนรู้ระหว่างกระบวนการฝึกโมเดล ความตั้งใจคือการสร้างผลลัพธ์ที่ลดการสูญเสีย/ต้นทุนให้เหลือน้อยที่สุด
ขั้นตอนประกอบด้วย:
- ชั้นอินพุต: ข้อมูลอินพุต
- เลเยอร์ที่ซ่อนอยู่: สามารถเปลี่ยนแปลงได้เพื่อควบคุมความซับซ้อนของเครือข่าย
- ฟังก์ชันการ เปิดใช้งาน: ฟังก์ชันซิกมอยด์ฟังก์ชันไฮเพอร์โบลิกแทนเจนต์และฟังก์ชันหน่วยเชิงเส้นตรง (ReLU)
- เงื่อนไขการให้น้ำหนักและอคติ
- การขยายพันธุ์: การขยายพันธุ์ไปข้างหน้า.
- การฝึกอบรม: เริ่มต้นแบบสุ่ม
- การประเมิน: ประเมินในชุดทดสอบ
ฉันได้เพิ่มคำจำกัดความด้านล่างก่อนที่เราจะเริ่มต้น
- Forward Propagation — กระบวนการส่งผ่านข้อมูลอินพุตผ่านโครงข่ายประสาทเทียมเพื่อผลิตเอาต์พุต
- Backpropagation — อัลกอริทึมที่ใช้ในการฝึกน้ำหนักและอคติของแบบจำลองเพื่อให้การคาดคะเนแม่นยำที่สุดเท่าที่จะเป็นไปได้ เป้าหมายคือเพื่อลดการสูญเสียฟังก์ชันซึ่งจะวัดความแตกต่างระหว่างผลลัพธ์ที่คาดการณ์ไว้และผลลัพธ์ที่แท้จริง
- การบรรจบกัน — กระบวนการที่พารามิเตอร์ของแบบจำลองเข้าใกล้ชุดของค่าที่เหมาะสมที่สุดที่ลดฟังก์ชันการสูญเสียให้เหลือน้อยที่สุด เป้าหมายคือการหาน้ำหนักและความเอนเอียงที่สร้างฟังก์ชันการสูญเสียที่ต่ำที่สุดเท่าที่จะเป็นไปได้
- โหนด — หน่วยทางคณิตศาสตร์ที่แสดงถึงเซลล์ประสาท
- ฟังก์ชันการเปิดใช้งาน — ฟังก์ชันทางคณิตศาสตร์ที่ใช้เพื่อแนะนำความไม่เป็นเชิงเส้นในแบบจำลอง โดยจะนำไปใช้กับผลรวม ถ่วงน้ำหนักของอินพุตที่แต่ละโหนดในเครือข่าย และเอาต์พุตของฟังก์ชันการเปิดใช้งานจะเป็นตัวกำหนดเอาต์พุตของโหนด
- น้ำหนัก — อ้างถึงค่าที่กำหนดให้กับการเชื่อมต่อระหว่างเซลล์ประสาท/โหนดที่แสดงถึงความแข็งแรงของการเชื่อมต่อ
- ฟังก์ชันการสูญเสีย — หรือที่เรียกว่าฟังก์ชันต้นทุน ซึ่งเป็นฟังก์ชันทางคณิตศาสตร์ที่ใช้ในการวัดความแตกต่างระหว่างผลลัพธ์ที่คาดการณ์ไว้และผลลัพธ์ที่แท้จริงของแบบจำลอง
library(knitr)
library(tidyverse)
opts_chunk$set(fig.width=9, fig.height=7)
opts_chunk$set(comment="", fig.align="center", tidy=TRUE, fig.retina=2, cache = TRUE)
library(broom)
library(yardstick)
library(parsnip)
library(nnet)
library(patchwork)
library(rsample)
library(recipes)
data <- read_csv("https://raw.githubusercontent.com/NicJC/Hotel-reservations/main/Hotel_Reservations.csv")
data %>% names()
booking <- data.frame(
No_Adults = data$no_of_adults,
arrival_day = data$arrival_date,
arrival_month = data$arrival_month ,
year = data$arrival_year,
Qty_weekNights = data$no_of_week_nights,
Qty_weekendNights = data$no_of_weekend_nights,
room_type = data$room_type_reserved,
AvgPricePerRoom = data$avg_price_per_room
)
booking %>% head(n=8)
skimr::skim(booking)
ฉันต้องการดูข้อมูลเล็กน้อย:
booking %>% ggplot() +
geom_point(mapping = aes(
y= Qty_weekendNights ,
x = No_Adults ,
col = as.factor(arrival_month),
size = as.factor(year))) +
labs(title = "Weekend Nights booked by quantity of adults per month",
color = "Arrival Month",
x = "Number of Adults",
y = "Weekens Nights booked",
size = "year"
)
ฉันจะสร้างแบบจำลอง 5 แบบเพื่อประเมินข้อมูลการจอง ฉันสนใจตัวแปร “Qty_weekendNights” ซึ่งฉันจะสร้างตัวแปรเป้าหมายหรือการตอบสนอง
ฉันต้องแบ่งข้อมูลออกเป็นชุดการฝึกและชุดทดสอบด้วย ฉันจะใช้การแบ่ง 25/75 %:
set.seed(1784)
split <- initial_split(booking, prop=3/4)
train <- training(split)
test <- testing(split)
ฉันตั้งเมล็ดเพื่อจุดประสงค์ในการทำซ้ำ ถ้าฉันต้องการทำการทดลองแบบเดียวกัน ฉันสามารถใช้เมล็ดพันธุ์เดียวกันได้
ตอนนี้รุ่นแรก:
set.seed(2982)
model1<- nnet(Qty_weekendNights ~ ., data = train, linout=TRUE, size=11)
ขนาดหมายถึงจำนวนหน่วยในเลเยอร์ที่ซ่อนอยู่ 11 มากเกินไป
set.seed(7365)
model2<- nnet(Qty_weekendNights ~ ., data = train,
linout=TRUE,
size=6,
decay=0.01,
maxit=1000
)
จำนวน (ขนาด) ที่เหมาะสมที่สุดของหน่วยในเลเยอร์ที่ซ่อนอยู่ควรเป็นจำนวนของตัวทำนายที่มีประสิทธิภาพ (7) หารด้วย 2 ปัดเศษขึ้น 4 น่าจะเป็นตัวเลขที่ดี
set.seed(8)
model3<- nnet(Qty_weekendNights ~ ., data = train, linout=FALSE, size=4)
set.seed(168)
model4<- nnet(Qty_weekendNights ~ ., data = train,
linout=TRUE,
size=4,
decay = 0.01 ,
maxit = 1000,
Hess = TRUE)
ค่าต่ำสุดในพื้นที่อาจเป็นปัญหาได้เนื่องจากแบบจำลองจะพบชุดของน้ำหนักที่สร้างข้อผิดพลาดต่ำในข้อมูลการฝึก แต่ข้อผิดพลาดนี้อาจไม่ใช่ค่าต่ำสุดที่เป็นไปได้ ตามหลักการแล้ว เราต้องการขั้นต่ำทั่วโลก
ถ้า Hess = TRUE เราหวังว่าจะคืนชุดน้ำหนักที่ดีที่สุด
อีกวิธีในการติดตั้งโครงข่ายประสาทเทียมและรับเมตริก วิธีการติดตั้งแบบจำลองนี้ต้องใช้บรรจุภัณฑ์พาร์สนิป
set.seed(814)
model5 <- mlp(mode="regression", engine="nnet", hidden_units=4, penalty=0.01,
epochs = 1000)
fit1 <- model5 %>% fit(Qty_weekendNights ~ ., data=train)
fit1 %>% extract_fit_engine() %>% pluck("convergence")
pred1 <- fit1 %>% augment(new_data=test)
pred1 %>% metrics(truth=Qty_weekendNights, estimate=.pred)
0 ด้านบนหมายถึง pluck (“คอนเวอร์เจนซ์”) ซึ่งจะให้ค่า 0 หากแบบจำลองลู่เข้าหรือ “1” หากถึงการวนซ้ำสูงสุด
ฉันจะตรวจสอบเมตริกโมเดลสำหรับโมเดล 1–4:
รุ่นที่ 4
pred <- test %>%
bind_cols(pred = predict(model4, newdata=test) %>% as.numeric())
pred %>%
metrics(truth=Qty_weekendNights, estimate=pred)
pred2 <- test %>%
bind_cols(pred = predict(model3, newdata=test) %>% as.numeric())
pred2 %>%
metrics(truth=Qty_weekendNights, estimate=pred)
pred3 <- test %>%
bind_cols(pred = predict(model2, newdata=test) %>% as.numeric())
pred3 %>%
metrics(truth=Qty_weekendNights, estimate=pred)
pred4 <- test %>%
bind_cols(pred = predict(model1, newdata=test) %>% as.numeric())
pred4 %>%
metrics(truth=Qty_weekendNights, estimate=pred)
pred1 <- fit1 %>% augment(new_data=test)
pred1
บทสรุป
ฉันได้ติดตั้งโครงข่ายประสาทเทียมบางส่วนแล้ว และใช้พารามิเตอร์หลายตัวเพื่อพยายามให้พอดียิ่งขึ้น
การสลายตัวมีความสำคัญมากเนื่องจากจะส่งผลต่อฟังก์ชันต้นทุน/การสูญเสียของคุณ การสลายตัวของน้ำหนักหมายถึงเทคนิคที่มีจุดมุ่งหมายเพื่อป้องกันไม่ให้เกินพอดีโดยการเพิ่มเงื่อนไขการลงโทษในฟังก์ชันต้นทุน การโอเวอร์ฟิตติ้งเกิดขึ้นเมื่อโมเดลซับซ้อนเกินไปและเหมาะสมกับข้อมูลการฝึกมากเกินไป 0.01 สำหรับพารามิเตอร์การสลายตัวโดยทั่วไปเป็นตัวเลขที่ดีที่จะใช้
การลองเล่นกับพารามิเตอร์และสร้างโมเดลหลายๆ โมเดลที่คุณเปรียบเทียบกันโดยใช้เมตริกของโมเดลนั้นคุ้มค่า
ฉันใช้ตัวดำเนินการไพพ์ %>% เป็นจำนวนมากในโค้ดของฉัน หากคุณต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับไพพ์ โปรดดูบทความของฉันด้านล่าง:
การเดินท่อด้วยอาร์หวังว่าคุณจะสนุกกับบทความนี้และพบว่ามีประโยชน์
ติดตามฉันสำหรับบทความเพิ่มเติมเกี่ยวกับ R, Julia, Python และสถิติประยุกต์!





































![รายการที่เชื่อมโยงคืออะไร? [ส่วนที่ 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)