Machine Learning 101 — สร้างโมเดลแรกของคุณง่ายๆด้วย Excel

Kasidis Satangmongkol
6 min readJun 12, 2017

--

อยากเริ่มทำ Data Scienceโดยไม่ต้องเขียนโปรแกรม?

เชื่อว่าหลายคนต้องมีความคิดแบบนี้ :P อยากลองทำ data science / machine learning แต่ยังไม่มีเวลาเรียนเขียนโปรแกรม … งั้นลองทำใน Excel แทนได้ไหม?

ตอบเลยว่า ได้ซี่ !! spreadsheet เอาจริงทำได้ (literally) เกือบจะทุกโมเดลเลยครับ อาจจะไม่เร็วเท่า R/ Python (และถึงแม้จะไม่สามารถจัดการข้อมูลขนาดใหญ่ได้ เปิดปุ๊ปค้างปั๊ป 555+) แต่การทำ modeling ใน Excel ถือเป็นจุดเริ่มต้นที่ดีสำหรับเพื่อนๆที่สนใจด้านนี้ แล้วไอ machine learning มันคืออะไรนะ?

ถ้า data science คือศาสตร์ที่สกัดความรู้ออกมาจากข้อมูลดิบ machine learning คือเครื่องมือที่ใช้ทำงานนี้โดยเฉพาะเลย (extract knowledge from raw data by building models & algorithms) ถ้าข้อมูลมันไม่เยอะมาก จริงๆมนุษย์ก็สามารถทำงานนี้ได้โดยไม่ต้องพึ่งคอมพิวเตอร์เท่าไร แต่ถ้าข้อมูลมันเยอะเกินสมองมนุษย์จะรับไหว การใช้คอมพิวเตอร์ (หรือว่า machine) มาช่วยแก้ปัญหาจึงเป็นสิ่งจำเป็นครับ ทำงานเสร็จเร็วขึ้น มีเวลาปาตี้มากขึ้น เย้! #เด๋วก่อน

และนี่คือที่มาของคำว่า machine learning เราสอนคอมพิวเตอร์ให้แก้ปัญหาให้เรา โฟกัสที่คำว่า “learning” เรียนรู้? ถ้ามนุษย์เรียนรู้และเก่งขึ้นได้จากประสบการณ์ คอมพิวเตอร์ก็เรียนรู้และเก่งขึ้นได้จากปริมาณข้อมูล <data> ที่เราป้อนให้มัน

มนุษย์ ประสบการณ์ยิ่งเยอะ = ดี
คอมพิวเตอร์ data ยิ่งเยอะ = ดี

ทั้งมนุษย์และคอมพิวเตอร์เหมือนกันเลยตรงจุดนี้ ยิ่ง experience / data เยอะขึ้นเท่าไร การตัดสินใจของเราจะทำได้ดีขึ้นเท่านั้น ไม่มีคำว่า “มากเกินไป” เวลาที่เรา feed data เข้าไปในโมเดลของเรา ถ้าวันนี้คุณอยากทำงานด้าน data science เริ่มเก็บข้อมูลตั้งแต่วันนี้ ยิ่งเยอะยิ่งได้เปรียบ “data is new oil” ดูอย่าง Google สิ!

print (“Hello World”)

โมเดลแรกที่เราจะสอนวันนี้คือ Linear Regression นะครัชทุกคน เพราะว่า [1] ง่ายมาก [2] เป็นโมเดลสำคัญที่เรานำไปต่อยอดได้ง่ายมากๆ และ [3] เป็น base model ของโมเดลอื่นๆอีกหลายตัวไม่ว่าจะเป็น principal component analysis, logistic regression, neural network เป็นต้น

Supervise (v.) = observe and direct execution of a task

ปัญหาที่เราจะแก้ด้วยกันวันนี้เป็นตัวอย่างจาก real estate เราอยากรู้ว่า house size (x) สามารถใช้ predict house price (y) ได้หรือเปล่า? ถ้าจะซื้อบ้านขนาด 100 ตร.ม. ราคาจะอยู่ที่ประมาณกี่ล้านบาทดี? Regression ถือว่าเป็นโมเดลแบบ supervised learning แปลว่าก่อนที่คอมพิวเตอร์จะ predict ราคาบ้านให้เราได้ เราต้องสอนมันก่อนครัช ด้วยการบอกมันว่า price(y) = ตัวแปรตาม size(x) = ตัวแปรต้น

โดยตัวแปร y ในทางสถิติเรียกว่า “dependent variable” แต่โลกของ machine learning เรียกว่า “target” ส่วนตัวแปร x หรือ “independent variable” เราเรียกว่า “feature”

Download ไฟล ์Excel ตัวอย่างได้ที่ https://goo.gl/fnWcuN เสร็จแล้วเปิดไฟล์ขึ้นมาทำไปพร้อมๆกันเลยนะ :D

ราคาบ้าน (label) ขนาดบ้าน (predictor)

The greatest value of a picture is when it forces us to notice what we never expected to see.

เปิดไฟล์ขึ้นมาปุ๊ป data ดูก็เรียบร้อยดี งั้นสร้างโมเดลเลยมั้ย? ช้าก่อน! ใจเย็นๆ first step ที่สำคัญมากก่อนที่จะ fit model คือการทำ “data visualization” ถ้าเรามีตัวแปร numeric สองตัว (i.e. quantitative variable) กราฟที่เราใช้บ่อยที่สุดเลยคือ scatter plot ใน Excel ไปที่ insert > scatter plot ได้เลย

เสร็จแล้วคลิ๊กขวาที่ plot ของเราแล้วเลือก trend line > linear จะได้ plot ออกมาหน้าตาเหมือนรูปด้านล่าง เส้นตรงสีชมพูที่ทุกคนเห็นอยู่ตอนนี้คือ linear regression นั่นเอง

ประเด็นคือคอมพิวเตอร์มันรู้ได้ยังไงว่าเส้นตรงต้องเป็นเส้นชมพูนี่ จุดตัดแกนตั้ง (intercept) ควรจะอยู่ที่เท่าไร ทำไมองศา (slope) มันต้องเป็นเท่านี้ด้วย? จาก scatter plot เราพอจะบอกได้เบื้องต้นว่า slope ต้องเป็นบวกแน่ๆ แปลว่ายิ่งขนาดบ้านใหญ่ขึ้น ราคาบ้านควรจะสูงขึ้นเช่นกัน make sense?

Linear regression คือเส้นตรงที่ลากตัดผ่านข้อมูลของเราโดยมี objective คือ minimize error ให้ต่ำที่สุด

Introduction to Linear Regression

หลักการของ linear regression คือการลากเส้นตรงตัดผ่านข้อมูลของเรา โดยมีเป้าหมายคือ ลากยังไงให้เส้นตรงใกล้กับ data point ทั้งหมดให้มากที่สุด <หรือจะพูดว่า> ลากยังไงให้เกิด error น้อยที่สุดก็ได้ครัช โดยค่า error ของโมเดล linear regression มีชื่อเฉพาะของมันเองด้วย เรียกว่า mean squared error (MSE)

MSE = mean(error²)

โดยที่ error คือความแตกต่างของ predicted y และ actual y ถัดมาให้เรายกกำลังสองค่า error ด้วยเพราะว่า error มันสามารถเป็นได้ทั้งบวกและลบ การยกกำลังสองจะทำให้ค่า error เป็นบวกทั้งหมดแล้วค่อยมาหาค่าเฉลี่ย ปล. ถ้าเราไม่ยกกำลังสองค่า error ค่าที่เป็นบวกลบมันจะ cancel out กันเองอ่ะเนอะ

Linear regression is predictive model that aims to minimize MSE

เราทุกคนเคยผ่าน linear regression มาหมดแล้ว ตั้งแต่ใสๆวัยมัธยมเลย 555+ เพราะมันคือสมการเส้นตรงดีๆนี่เอง general form ของสมการเส้นตรงคือ y = mx + b โดยที่ m = slope และ b = intercept (หรือจุดตัดแกนตั้ง)

Linear regression คือการสอนคอมพิวเตอร์ให้หาค่า m, b โดยหน้าที่ของเราคือไปหาข้อมูลมา feed ให้มันแค่นั้นเอง พอเราได้ค่า m, b มาแล้วก็ลากเส้นตรงที่สามารถใช้ predict ราคาบ้านได้เลย ถ้า house size (x) = 2200 ดูจากเส้นสีชมพูในรูปก่อนหน้า ราคาบ้านน่าจะอยู่ที่ $330,000 โดยประมาณ

การจะสร้าง linear regression ใน Excel ทำได้ง่ายมากๆ ใช้แค่ 5 basic functions min() max() sum() intercept() slope() เท่านั้นเอง รวมกับเทคนิคที่เราจะสอนวันนี้คือการใช้ data table สร้าง Gradient Descent เพื่อหา intercept และ slope ที่ทำให้ MSE ของโมเดลเราต่ำที่สุด

ปล. Gradient Descent คือ popular algorithm ที่ machine learning ใช้ในการ optimize ค่า parameters ในโมเดลของเรา Gradient (n.) แปลว่าลาดชัน Descent (n.) แปลว่า ตกลงมา อ่านจนจบ blog นี้จะเข้าใจมากขึ้นว่ามันคืออะไร

Take Control of Your Data

ขั้นตอนการสร้าง linear regression from scratch ใน Excel มีแค่ 5 ขั้นตอน ใช้เวลาทำแค่ 2–3 นาทีก็เสร็จแล้ว เปิดไฟล์ Excel ขึ้นมา เราอยู่ที่ชี้ต Model1 learning rate = 0.05

ขั้นตอนที่ 1 — ทำ normalization ตัวแปรของเราก่อน

ขั้นตอนนี้สำคัญมากเลยทุกคน ก่อนที่เราจะทำสร้าง model เราควรจะทำ normalization ข้อมูลของเราก่อน machine learning ส่วนใหญ่จะทำงานได้ดีขึ้นมาก ถ้าเกิด variable ที่เราใช้ได้ทำการ normalized มาแล้ว

ประโยชน์ของการทำ normalization?

[1] ตัวแปรจะถูกปรับค่าให้อยู่บน scale เดียวกัน เช่นมีค่าอยู่ระหว่าง 0 ถึง 1 มีประโยชน์อย่างมากถ้าเกิดตัวแปรใน dataset เราเก็บมาจาก scale ที่แตกต่างกันมากๆดังตัวอย่างวันนี้ ราคาบ้านมีค่าวิ่งอยู่ระหว่าง [199000, 405000] แต่ขนาดบ้านมีค่าวิ่งอยู่ระหว่าง [1100, 2450] ควรจะ normalized ก่อนจะ fit model

[2] คอมพิวเตอร์รักข้อมูลที่ normalized แล้ว เพราะใช้ ram ในการประมวลผลน้อยลง (i.e. processing time เร็วขึ้นแบบผิดหูผิดตา) คิดเล่นๆก็ได้ ยกกำลังสองค่า 240000 หรือว่ายกกำลังสองค่า 0.20 แบบไหนคิดง่ายกว่ากัน?

การทำ normalization ทำได้หลายแบบ แต่แบบที่เราเห็นกันบ่อยมากเลย เรียกว่า feature scaling ปรับค่าให้อยู่ระหว่าง [0, 1] โดยใช้สูตร x — min(x) / max(x)-min(x)

Normalization ด้วยสูตร x — min(x) / max(x) — min(x)

คอลั่ม normalized y คิดจาก y-min(y) / max(y)-min(y) ส่วนคอลั่ม normalized x ก็คิดจากสูตรเดียวกันเลย จะเห็นว่าค่าต่ำสุดในคอลั่มนั้นๆจะมีค่า normalized = 0.00 ส่วนค่ามากสุดจะมีค่า normalized = 1.00 ก่อนทำ normalization อย่าลืมตรวจสอบพวก outliers ก่อนนะ ไม่งั้นค่าที่เราได้จะเพี้ยน :D

ขั้นตอนที่ 2 — สร้างคอลั่ม prediction

ตอนนี้เรายังไม่รู้ครับว่า intercept (b) และ slope (m) ของโมเดลเราจะเป็นเท่าไรดี งั้นลองใส่เป็น dummy ไปก่อน {intercept = 1, slope = 1}

ให้เราตั้งค่า intercept, slope เป็น dummy ขึ้นมาก่อน

พอเรามีตัวแปร dummy ปุ๊ป {intercept = 1, slope = 1} เราก็สามารถผูกสูตรเพื่อคำนวณ predicted y (column F) ของบ้านแต่ละหลังได้แล้ว

y = mx + b
where m = 1, b = 1
y1 = (1)*(0) + (1) = 1.00
y2 = (1)*(0.22) + (1) = 1.22
y3 = (1)*(0.24) + (1) = 1.24
...
y10 = (1)*(1.00) + (1) = 2.00

step ถัดไป เราต้องหาค่า error เพื่อดูว่า predicted y มันแตกต่างจาก actual y มากหรือน้อยเพียงใด

ขั้นตอนที่ 3 —สร้างคอลั่ม Error² และ คำนวณ MSE = mean(error²)

สร้างคอลั่ม Error² คิดมาจาก (predicted Y — normalized Y)² เสร็จแล้วในช่อง G12 ให้เราพิมพ์สูตร =average(G2:G11) เพื่อหา mean squared error (MSE) ได้เลย ตอนนี้ที่เราใช้ {intercept = 1, slope =1} เราได้ MSE = 1.0219 ซึ่งมันยังไม่ใช่ MSE ที่ต่ำที่สุดแน่ๆ ขั้นตอนถัดไปเราจะใช้ Gradient Descent ในการ optimize {intercept, slope}

ขั้นตอนที่ 4 — สร้าง Gradient Descent ด้วย data table

ความสนุกอยู่ที่ขั้นตอนนี้ เราจะใช้ data table สร้างตาราง MSE ขึ้นมา ในไฟล์ Excel ให้เพื่อนๆเลื่อนไปดูที่ O2:AJ23 แล้ว set up แบบนี้

4.1 cell O2 ให้เราพิมพ์ =G12 ให้เรา refer กลับไปยัง MSE ที่เราคำนวณใน step 3

4.2 cell O3:O23 และ P2:AJ2 ให้เราพิมพ์ค่าลงไปตั้งแต่ [0.00–1.00] โดยมีการเปลี่ยนแปลงทีละ 0.05 ปล. การกำหนดค่าการเปลี่ยนแปลง =0.05 เรียกว่า “learning rate” เราจะกลับมาที่ concept นี้ในตอนท้ายของ blog วันนี้

4.3 ลากคลุม cell O2:AJ23 แล้วไปที่แท๊บ data >what-if analysis > data table แล้วพิมพ์ J8 ลงไปที่ช่อง Row input cell และ J9 ลงไปที่ช่อง Column input cell

Data > What-If analysis > Data Table

เสร็จแล้วกด OK เป็นอันเสร็จเรียบร้อย เพื่อนๆสามารถใช้ conditional formatting ไฮไลท์สี cells ที่มีค่าต่ำสุด 10% bottom ก็ได้เพื่อดูว่า {intercept, slope} คู่ไหนบ้างที่ทำให้ MSE มีค่าต่ำที่สุด

อธิบายเชิงลึก — data table คือการที่เราบอก Excel ให้คำนวณค่า MSE (cell O2) ให้เราด้วยการเปลี่ยนค่า {intercept #J8, slope #J9} ทีละ 0.05 วิ่งจากค่า 0.00–1.00 นั่นเอง

ขั้นตอนที่ 5 — เลือกใช้ intercept และ slope ที่ทำให้ MSE ต่ำที่สุด

พอเราไฮไลท์สีแล้ว อะไรๆก็ง่ายขึ้น (ในรูปด้านล่างเราใช้ bottom 10% ส่วนค่า minimum เรา fill สีแดงเลย) จะเห็นว่า {intercept = 0.15, slope = 0.70} เป็นค่าที่ทำให้ MSE ลดลงมาเหลือเพียง 0.0264 เท่านั้นเอง ถ้าเทียบกับสมการ dummy ในตอนแรก สมการใหม่ y = 0.70x + 0.15 ดีกว่าเยอะเลยครัช

Data table ที่เราสร้างขึ้นมาใน step 4 แสดงค่า MSE ที่เกิดจากการเปลี่ยนค่า intercept & slope ทีละ 0.05

คราวนี้ อยากให้ทุกคนลองทำซ้ำ step 4–5 อีกครั้ง แต่ว่ารอบนี้เปลี่ยน learning rate จาก 0.05 เป็น 0.01 แปลว่าตอนเราสร้าง data table ใหม่ทั้ง column และ row ของเราจะวิ่งจาก [0.00–1.00] เปลี่ยนแปลงทีละ 0.01 หน่วย

พูดง่ายๆคือ Gradient Descent ของเราจะละเอียดมากขึ้น ยิ่งเราปรับ learning rate ให้มีค่าต่ำลงเท่าไร (เช่น 0.00001) ค่า {intercept, slope} ของเราก็จะยิ่ง accurate มากขึ้นเท่านั้น ปล. แต่ model ก็จะใช้เวลานานขึ้นในการรันผลเหมือนกัน

Conclusion

data table ที่เราสร้างขึ้นมาตะกี้ ให้เราไปที่ insert > 3D-surface เพื่อ visualize Gradient Descent ของเราแบบเมพๆได้เลย plot นี้จะเป็นแบบ 3D คือมีสามแกน {intercept, slope, MSE}

เริ่มแรกที่เราใช้ dummy {intercept = 1, slope = 1} ค่า MSE จะสูงที่สุดเลยที่ 1.0219 หลังจากเราใช้ Gradient Descent: learning rate = 0.01 เราสามารถเลือกค่า {intercept = 0.14, slope = 0.70} และได้ MSE ต่ำลงมาที่ 0.0264 แปลว่า linear regression ของเราฟิตกับข้อมูลได้แม่นยำขึ้นนั้นเอง

ถ้าอยากได้ค่า intercept และ slope แบบเป๊ะๆเลย the best fitted line ที่ทำให้ค่า MSE ต่ำที่สุดเท่าที่จะเป็นไปได้ เราสามารถพิมพ์สองฟังชั่นนี้ใน spreadsheet ได้เลย intercept(y,x) และ slope(y,x)

final model ของเราคือ house.price = 0.7015(size) + 0.1421 จัดว่าเด็ด!!

Gradient Descent หาค่า intercept และ slope ที่เหมาะสมของโมเดลของเรา

Cost function ทุกธุรกิจอยากดำเนินงานด้วยต้นทุนที่ต่ำที่สุด

MSE ของ linear regression model ถูกเรียกว่า “cost function” (เพราะ error ต้องถูก minimize เหมือนกับต้นทุนทางธุรกิจ) และ Gradient Descent ช่วยเราแก้ปัญหานี้ได้อย่างมีประสิทธิภาพมากๆ เพราะเราเห็นทั้งการเปลี่ยนแปลงของ MSE, intercept, slope ในกราฟเดียวเลย (3D plot)

จบแล้น ไม่ยากเลยใช่ป่าว? :) ตัวอย่างวันนี้เรามี x แค่ตัวเดียว สมการเลยง่ายๆ i.e. simple linear regression y = b0 + b1*x1 (b0 = intercept, b1 = slope) แต่ถ้าวันนี้เรามี predictors หลายๆตัว y = b0 + b1*x1 + b2*x2 + … Gradient Descent ยังเอามาใช้หาคำตอบได้อยู่หรือเปล่า?

ตอบเลยว่าได้แน่นอน เย้! จะมี predictor กี่ตัว แต่ cost function ของเราไม่เปลี่ยนเลยคือการหาค่า b0, b1, b2, … ที่ทำให้ MSE ต่ำที่สุด

การเข้าใจ Gradient Descent เป็นพื้นฐานที่ดีในการเรียน machine learning เลย เพราะโมเดลที่มันซับซ้อนกว่านี้อย่าง neural network / deep learning ก็สามารถใช้ concept ของ Gradient Descent ในการหาคำตอบที่ดีที่สุดให้กับปัญหาของเรา สุดๆไปเลย!

พรีวิวตอนต่อไป เราจะมาทดสอบ model accuracy กันว่าโมเดลที่เราสร้างขึ้นมามัน predict ราคาบ้านได้แม่นยำขนาดไหน ทั้งหมดทำใน Excel เหมือนเดิม

Appendix

house.price = 0.7015(size) + 0.1421 สมการสุดท้ายสามารถนำไปใช้ predict ราคาบ้านได้แล้ว ถ้าเรารู้ว่าขนาดบ้านเป็นเท่าไร (x) เราก็จะคำนวณ (y) ได้เลย

slope (m) = +0.7015 เครื่องหมายบวกบอกทิศทางความสัมพันธ์เชิงบวก (positive relationship) ระหว่าง house price และ house size ยิ่งขนาดบ้านใหญ่ขึ้น ราคาบ้านควรจะสูงขึ้นเช่นกัน

ขั้นตอนที่ 4 ที่เราสร้าง data table ตัวอย่างวันนี้เราใช้ learning rate = 0.05 โดยวิ่งตั้งแต่ 0.00–1.00 หลายคนน่าจะสงสัยว่าทำไมต้องอยู่ระหว่าง [0.00–1.00] ด้วย? เพราะว่า step ที่หนึ่งเราทำการ normalized ข้อมูลเรียบร้อยแล้ว ยังไงค่า intercept และ slope ของโมเดลเราต้องอยู่ระหว่าง 0–1 แน่ๆ และไม่น่าจะติดลบด้วย เพราะจาก scatter plot เราเห็นว่า house price vs. house size มีความสัมพันธ์เชิงบวกต่อกัน

สำหรับเพื่อนๆที่สนใจอยากอ่านเรื่อง linear regression แบบเต็มๆ สามารถเข้าไปอ่านได้ที่ facebook page ของเรา

--

--

Kasidis Satangmongkol

I’m just somebody who’s truly passionate about data science.