Lab by
Jupyter notebook

by ilog.ai

Linear regression in Jupyter notebook 1

ในที่สุดเราก็มาถึงขั้นตอนการลงมือทำ Lab จริงแล้ว โดยในบทความนี้เราจะพาเพื่อนๆไปทดลองใช้ Jupyter Notebook ในการที่จะประมาณการข้อมูลแบบ Linear regression (ในที่นี้คือจะดูความสัมพันธ์ที่ตัวแปร x หนึ่งตัวส่งผลต่อ y อย่างไร) เมื่อได้สมการประมาณการมาแล้ว เราจะตรวจสอบดูว่ามันแม่นยำกับข้อมูลหรือไม่ โดยการทำ Gradient Descent และนำผลที่ได้มาเปรียบเทียบกัน โดยเราจะเริ่มจาก 

  • Lab 1 : การทำ Linear Regression โดยใช้ Gradient descent 
  • Lab 2 : การทำ Linear Regression โดยใช้ Library scikit-learn (sklearn) 
  • เปรียบเทียบค่า theta ที่ได้จากการประมาณการทั้งสองแบบ

อัพเดทเรื่อง Machine Learning ได้ก่อนใครที่นี้ !!

Lab 1 : การทำ Linear Regression โดยใช้ Gradient Descent 

Gradient descent algorithm เป็นการหาค่า  ที่แม่นยำกับข้อมูลมากที่สุด โดยได้มีการ minimize cost function เรียบร้อยแล้ว 

ใน lab นี้ เราจะนำทฤษฎีที่เราได้สอนไปในบทความก่อนๆ มาเขียน code ด้วย ภาษา python เพื่อหาค่า  

หากเพื่อนๆยังไม่ค่อยเข้าใจเกี่ยวกับ Gradient descent algorithm สามารถเข้าไปอ่านบทความก่อนได้ 

 1. ขั้นแรกเราก็ต้องมีการเรียกใช้ library ที่จำเป็นในการทำ Grdient Descent ซึ่งจะประกอบไปด้วย

  • numpy – ที่จะเข้ามาจัดการข้อมูลที่เป็น array
  • pandas – จัดการข้อมูลในส่วนของการอ่านไฟล์ 
  • matplotlib – ที่ใช้ในการพล็อตกราฟ 
jupyter notebook

2. จากนั้นเราต้องมีการเรียกไฟล์ข้อมูลที่เราต้องการประมาณการ ซึ่งไฟล์ข้อมูลของเราเป็นประเภทไหนก็ได้ แต่ในบทความนี้เราเลือกใช้ไฟล์ .csv ที่เรามีอยู่ใเครื่องของเรา ซึ่งสามารถ Download ได้จาก Link นี้ได้เลย

โดยการเรียกอ่านไฟล์ เราก็ตั้งชื่อไฟล์ว่า df และใช้คำสั่งอ่านไฟล์คือ pd.read_csv() จากนั้นมันจะแสดงผลออกมาเป็นข้อมูล(ในที่นี้ข้อมูลของเรามีแค่ 5 rows, 2 column) ออกมาเป็น dataframe ดังภาพด้านล่าง

jupyter notebook

3.จากข้อมูลที่ได้ เราจะกำหนดตัวแปรที่เราต้องการประมาณโดยเราจะแบ่งข้อมูลออกเป็น 2 ชุดคือ x = sqft_living และ y = price และจัดรูปแบบข้อมูลทั้งสองให้อยู่ในรูป list ด้วยคำสั่ง .tolist() เพื่อให้ง่ายต่อการวน loop และกำหนดให้ m = len(x) เพื่อใช้เป็นค่าของจำนวน Sample

jupyter notebook

4. ต่อมาเราก็จะมาเริ่มเขียนสูตรการคำนวณ Gradient Descent โดยอ้างอิงจากทฤษฎที่เราได้พูดไว้ในเรื่อง Gradient Descent algorithm EP.3 และ Gradient Descent algorithm EP.4

เริ่มจาก :

4.1 สร้างสมการ linear regression โดยการประกาศ Function h ด้วยการเขียนแบบ lambda function => h = lambda theta_0,theta_1,x: theta_0 + theta_1*x >>> อ้างอิงจากสูตร

4.2 จากนั้นในการที่จะให้ได้สมการประมาณที่แม่นยำกับข้อมูลของเราที่สุด เราต้อง minimize cost function ดังนั้นเราก็จะสร้าง

    • Function สำหรับคำนวณ Cost Function ชื่อ grad_J โดย Function grad_J จะ return ผลลัพธ์ออกมาเป็นผลของสมการ Cost Function โดยรับ Input ทั้งหมด 4 ตัวคือ Sample x , Sample y ,theta_0 และ thata_1
    • และบอกมันว่าให้แสดงค่าคำตอบเมื่อคำนวณเสร็จแล้วในรูปของ array 2 มิติ (คู่อันดับ)
    • for i in range(m) คือในแต่ละตัวที่อยู่ใน list : 
      • ทั้งสองสมการคือ cost function ที่ได้จากการ partial derivertive แล้วเราจะนำค่าที่ได้เมื่อเราแทน x ครบทุกค่าแล้ว ไปเข้าสูตร gradient descent ในขั้นต่อไป (หมายเหตุ : เราตัด 1/m ออก เนื่องจาก 1/m เป็นการหาค่าเฉลี่ยของ theta_0,theta_1 เราจะทำ Gradient descent ไม่จำเป็นต้องใส่ก็ได้ เพราะมันจะค่อยๆไต่ไปที่จุด local minimum อยู่แล้ว  )  
jupyter notebook

5. เมื่อเราเขียนสูตร cost function เรียบร้อยแล้ว ต่อไปเราก็จะมากำหนดเงื่อนไขอื่นๆที่ใช้ในการทำ Gradient descent และเขียนสูตร gradient descent (ซึ่งนำผลที่ได้จากการผ่านสมการด้านบนมาเข้าสูตรนี้อีกรอบ) โดยสูตรนี้จะเป็นการที่เราค่อยๆ minimize cost function ไปทีละ step จนกว่าจะเดินทางไปถึงจุด Local minimum

  • กำหนด theta_0 = เราให้เริ่มต้นที่ [0,0] 
  • กำหนด theta_new = เราให้เริ่มต้นที่ [0,0] ก่อน
  • learning rate = 0.05
  • tolerance = 0.01
  • num_step = 0
  • magnitude = infinity 

np.linalg.norm () คำสั่งนี้การหา norm ของ magnitude (การหาค่าเฉลี่ย manitude เมื่อสูตร magnitude =

ดังนั้น while ค่า magnitude มากกว่าค่า tolerance :

  • num_step = ให้บวกเพิ่มทีละ 1 ในแต่ละรอบของการคำนวณ
  • theta_old = theta_new คือ จุดเริ่มต้นในรอบใหม่จะใช้ค่า theta ที่หาได้จากรอบที่แล้ว (theta_new)
  • magnitude = ค่า derivative ของทั้ง theta_0 และ theta_1 จากสมการ def grad_J (แล้วค่าที่ได้จะผ่านเข้าสูตร np.linalg.norm () อีกที)
  • theta_new = จุดเดิม + learning rate * magnitude 
jupyter notebook

6. สุดท้ายเมื่อทำการประมาณการข้อมูลออกมา จุด Local minimum สุดท้ายจะได้ค่า theta_0,theta_1 ที่ทำให้สมการประมาณการที่ได้แม่นยำกับข้อมูลที่สุดนั่นก็คือ 

  • theta_0 () = -0.9942
  • theta_1 () =  4.9979
  • และมีการทำซ๊ำทั้งหมด 78 ครั้งเพื่อที่จะไปที่จุด Local minimum

ซึ่งค่าที่ได้ก็ตรงกับที่เราคำนวณมือในบทความ  Gradient Descent algorithm EP.4 

jupyter notebook

7. ต่อมาเราจะพล็อตกราฟโดยการใช้ library matplotlib และ numpy โดยเริ่มจาก

  • กำหนดความยาวเส้นประมาณการด้วย np.linespace (start,end)
  • แสดงการกระจายตัวของข้อมูลด้วย plot.scatter
  • แสดงภาพการกระจายตัวของข้อมูลและสมการประมาณการที่ได้
jupyter notebook

สรุป จากการประมาณการ linear regression โดยใช้ Gradeint descent ได้สมการที่แม่นยำที่สุดกับชุดข้อมูลคือ

Lab 2 : การทำ Linear Regression โดยใช้ Library Sklearn

1. ขั้นตอนแรกเราต้องมีการ เรียก Library ที่จำเป็นที่เราจะใช้ในการประมาณการข้อมูลเรา ซึ่งในที่นี้เราใช้

  • Pandas – ในการจัดการข้อมูล
  • seaborn – ในการพล็อตกราฟความสัมพันธ์ระหว่างตัวแปรและเส้นสมการประมาณการที่ได้
  • Scikit-learn(sklearn) – เป็น library ที่มีฟังก์ชั่นเกี่ยวกับการคำนวณคณิตศาสตร์ และเราได้เลือกหมวด LinearRegression เพื่อมาประมาณการข้อมูลของเรา
jupyter notebook

2. จากนั้นเราต้องมีการเรียกไฟล์ข้อมูลที่เราต้องการประมาณการ (เราใช้ชุดข้อมูลเดิม)

jupyter notebook

3. การทำงานของ Sklearn ไม่ได้ซับซ้อนอะไรมาก หากเราต้องการที่จะประมาณการอะไร เราก็สร้าง object ขึ้นมา ในที่นี้เราให้ชื่อว่า model จากนั้นก็เรียกคำสั่ง LinearRegression เข้ามาใช้ได้เลย 

โดยที่เมื่อเรา print model ออกมา จะเห็นได้ว่าถ้าหากเราไม่ได้ใส่ค่าอะไรลงไป มันจะขึ้นค่า defult มาให้ (ค่ามาตรฐานในฟังก์ชั่นที่จะแสดงผลออกมา แต่เราสามารถเพิ่มคำสั่งอื่นได้ เพื่อนๆสามารถเข้าไปศึกษา parameter อื่นๆ ของ sklearnเพิ่มเติมได้ ที่นี่ )

jupyter notebook

4. กำหนดตัวแปร ในที่นี้เราต้องการดูความสัมพันธ์ว่า ขนาดของพื้นที่ห้องรับแขกส่งผลต่อราคาบ้านอย่างไร ( X = sqft_living ,y = price) โดยคำสั่งสามารถเขียนแบบด้านล่างได้เลย (ใน pandas หากต้องการประมาณการตัวแปร (X) แค่ 1 ตัว เราจำเป็นที่จะต้อง ใส่เครื่องหมาย [[]] ซ้อนกันเพื่อให้ X แสดงค่าออกมาเป็น dataframe ส่วนค่า y แสดงค่าเป็น series มันถึงจะประมาณการได้)

jupyter notebook

5. ทีนี้เราก็จะทำการประมาณการโดยการเรียกคำสั่ง model.fit () ซึ่งในวงเล็บเราจะใส่ข้อมูลที่เราต้องการประมาณการลงไป นั่นคือ Xและ y  

กระบวนการของ model.fit คือมันจะทำการประมาณการข้อมูล X และ y ออกมาเป็นสมการประมาณการ ซึ่งมันจะให้ค่า theta_0 และ Theta_1 ที่ minimize cost function แล้ว ออกมา

jupyter notebook

6. เมื่อประมาณการเสร็จ เราสามารถดูค่า intercept (theta_0 หรือ  ) ได้ โดยใช้คำสั่ง model.intercept_ มันส่งค่ากลับมาคือ -1 และคำสั่งดูค่า coefficient (theta_1 หรือ ) คือ model.coef_ มันส่งค่ากลับมาคือ 5 

jupyter notebook

7. สุดท้ายแล้ว หากเราต้องการที่จะพล็อตกราฟแสดงการประมาณการข้อมูล เราสามารถใช้คำสั่งจาก library seaborn ได้ ตามคำสั่งด้านล่าง โดยเราให้แกน x = ‘sqft_living’ แกน y = ‘price’ ข้อมูลที่จะใช้พล็อต (data = df) และ Confident interval (ci)  = None

jupyter notebook

สรุป จากชุดข้อมูลของเรา เมื่อนำทำการประมาณการแบบ Linear Regression โดยใช้ library sklearn ผลที่ได้คือ เราจะได้สมการประมาณการออกมา 1 เส้น นั่นคือ 

เปรียบเทียบค่า theta ที่ได้จากการประมาณการทั้งสองแบบ

  • Linear Regression :
    • theta_0 () = -1
    • theta_1 () =  5
  • Gradient Descent :
    • theta_0 () = -0.9942
    • theta_1 () =  4.9979
จะเห็นได้ว่าค่าที่ได้จากสมการประมาณการ linear regression ที่ได้จากการทำ Gradient Descent และ จากการใช้ library sklearn มีค่าใกล้เคียงกันมาก แต่หากเราใช้วิธีการแบบ Gradient descent นั้นมันมีความยากและถึกมากกว่าการใช้ library sklearn ที่ทำเพียงไม่กี่ขั้นตอนก็ได้คำตอบออกมาใกล้เคียงกัน นี่ถือเป็นข้อดีของการนำ library สำเร็จมาใช้ และ library พวกนี้เองที่ทำให้ python เป็นภาษาที่นิยมใช้ในการทำ machine learning 

ในบทความต่อไปเราจะเอาข้อมูลจริงมาแบ่งข้อมูลออกเป็น training set และ testing set จากนั้นก็ทำการประมาณการแบบ Linear Regression กับข้อมูล training set และนำสมการที่ได้ ไปประมาณการข้อมูลที่เป็น testing set ต่อไป (เรื่อง Linear regression in Jupyter notebook 2 (Scikit-learn))

อัพเดทเรื่อง Machine Learning ได้ก่อนใครที่นี้ !!