คำแนะนำเมื่อต้องนำ Machine Learning ไปประยุกต์ใช้งานจริง

Krirk Arunoprayote
botnoi-classroom
Published in
10 min readJan 21, 2020

การประเมิน learning algorithm

สมมติว่าเราต้องการนำ machine learning algorithm ไปใช้ในการทำนายราคาบ้าน ซึ่งเป็น continuous value เราก็อาจเลือกใช้ linear regression โดยตั้งสมมติฐานแบบหนึ่ง แต่ปรากฎว่าเมื่อนำไปทำนายราคาบ้านแล้ว ได้ค่า error สูงมาก ขั้นตอนต่อไปควรจะทำอย่างไรดีเพื่อให้ performance ของ learning algorithm ของเราดีขึ้น?

ลองพิจารณาทางเลือกที่เป็นไปได้ พบว่ามีหลายแนวทาง

  • เก็บตัวอย่างข้อมูลมา train เพิ่ม
  • ลองลดจำนวน feature
  • ลองเพิ่มจำนวน feature
  • ลองเพิ่ม Polynomial feature
  • ลองลดค่า regularization parameter : λ
  • ลองเพิ่มค่า regularization parameter : λ

แล้วเราควรเลือกทางไหนก่อนดี ถ้าตัดสินใจเลือกไปแล้ว ก็จะต้องเสียเวลา implement และถ้าทำแล้วกลับไม่ได้ performance ที่ดีขึ้นก็เท่ากับเสียเวลาเปล่า แทนที่จะใช้สัญชาตญาณส่วนตัวเลือก เราควรใช้วิธีการที่เป็นระบบมาช่วยตัดสินใจ ซึ่งเรียกว่า Machine Learning Diagnostics

Machine Learning Diagnostics : การทดสอบเพื่อให้เราเห็นภาพว่าทางเลือกไหนน่าจะใช้ได้ผลหรือไม่ได้ผล และจะได้แนวทางว่าควรทำอย่างไรให้ได้ performance ดีขึ้น

การทำ Machine Learning Diagnostics ก็เปรียบได้กับการที่คุณหมอตรวจอาการคนไข้ ว่ากำลังเป็นโรคอะไร จะได้ให้ยาถูกขนาน ซึ่งการทำ diagnostics นี้แม้จะต้องใช้เวลาในการทำ แต่ก็คุ้มค่า เพราะจะทำให้เราแน่ใจได้ว่าจะไม่หลงไปเลือกแนวทางที่ไม่ช่วยเพิ่ม performance

ขั้นตอนในการทำ Machine Learning Diagnostics

  1. ประเมินสมมติฐาน (หา cost function)
  2. เลือก model ที่ดีที่สุด (โดยการทำ cross validation เพื่อนำไปช่วยเลือก degree of polynomial , regularization parameter ที่ดีที่สุด)
  3. plot Learning Curve เพื่อดูว่า algorithm ที่เลือกมีปัญหา bias หรือ variance เพื่อช่วยตัดสินใจว่าควรเก็บข้อมูลมา train เพิ่มหรือไม่

1. ประเมินสมมติฐาน

ถ้าเป็นกรณี simple linear regression มี feature x ตัวเดียว ก็อาจ plot graph ดูแล้วประเมินสมมติฐานได้เลยว่ามีปัญหา overfit หรือไม่ แต่งาน machine learning ส่วนใหญ่จะต้องใช้จำนวน feature เยอะๆ ทำให้ไม่สามารถ plot graph ดูได้ จึงต้องอาศัยการเปรียบเทียบ cost ที่ได้จาก cost function โดยมีขั้นตอนดังนี้

  1. แบ่ง Dataset ออกเป็น {training set 70% : test set 30%} (แบบสุ่ม)
    (x(i)ₜᵣₐᵢₙ , y(i)ₜᵣₐᵢₙ) จำนวน mₜᵣₐᵢₙ examples
    (x(i)ₜₑₛₜ , y(i)ₜₑₛₜ) จำนวน mₜₑₛₜ examples
  2. นำ training set ไป train algorithm จนได้ parameter θ ที่ทำให้ training set error : Jₜᵣₐᵢₙ(θ) ต่ำสุด
  3. นำ θ ที่ได้ไปคำนวณหา test set error : Jₜₑₛₜ(θ)

กรณี Linear Regression :
training set error
Jₜᵣₐᵢₙ(θ) = 1/2mₜᵣₐᵢₙ ∑ᵢᵐ[ hθ(x(i)ₜᵣₐᵢₙ -y(i)ₜᵣₐᵢₙ)² ]
test set error
Jₜₑₛₜ(θ) = 1/2mₜₑₛₜ ∑ᵢᵐᵗᵉˢᵗ[ hθ(x(i)ₜₑₛₜ -y(i)ₜₑₛₜ)² ]

กรณี Logistic Regression :
training set error
Jₜᵣₐᵢₙ(θ) = -1/mₜᵣₐᵢₙ ∑ᵢᵐ[ y(i)ₜᵣₐᵢₙ log hθ(x(i)ₜᵣₐᵢₙ) + (1-y(i)ₜᵣₐᵢₙ) log hθ(x(i)ₜᵣₐᵢₙ) ]
test set error
Jₜₑₛₜ(θ) = -1/mₜₑₛₜ ∑ᵢᵐ[ y(i)ₜₑₛₜ log hθ(x(i)ₜₑₛₜ) + (1-y(i)ₜₑₛₜ) log hθ(x(i)ₜₑₛₜ) ]

2. เลือก model ที่ดีที่สุด

model ที่ดีที่สุดในที่นี้ หมายถึง model ที่ทำให้ทั้ง error ของ training set และ generalization error มีค่าต่ำที่สุดเท่าที่เป็นไปได้ โดยเราจะต้องหาค่า degree of polynomial และ regularization parameter ที่ดีที่สุด (optimal) จึงจะได้ error และ generalization ต่ำสุด

2.1 การหา optimal degree of polynomial (d)

  1. ให้เลือก range ของค่า d ที่ต้องการพิจารณา เช่น ค่า d =1:10
    d=1 : hθ(x) = θ₀ + θ₁x → θ(1)
    d=2 : h
    θ(x) = θ₀ + θ₁x + θ₂x²→ θ(2)
    ….
    d=10 : h
    θ(x) = θ₀ + θ₁x +…+ θ₁₀x¹⁰→ θ(10)
    min
    Jₜₑₛₜ(θ)
  2. train algorithm กับ สมมติฐานที่ d=1 ; min Jₜᵣₐᵢₙ(θ) จนได้ค่า θ(1)
  3. นำค่า θ(1) ที่ได้ไปคำนวณหา Jₜₑₛₜ(θ(1))
  4. ทำกับทุกๆ ค่าของ d จะได้ Jₜₑₛₜ(θ(1)), Jₜₑₛₜ(θ(2)), …, Jₜₑₛₜ(θ(10))
  5. เลือก Jₜₑₛₜ(θ) ที่มีค่าน้อยที่สุด สมมติ Jₜₑₛₜ(θ(5)) มีค่าน้อยสุด ก็เลือกใช้ d=5

แต่ในการทำเช่นนี้ จะยังคงมีปัญหาเพราะ Jₜₑₛₜ(θ(5)) มักจะเป็นการประมาณค่า generalization error ในแง่ดีเกินไป เนื่องจากเราได้ fit parameter d เข้ากับ test set เท่ากับว่า ค่า d ที่ได้ อาจจะเหมาะกับ test data โดยเฉพาะเจาะจงมากเกินไป (overfit testset) ถ้านำข้อมูลใหม่เข้ามาทำนาย อาจจะมี generalization error สูง

เราจึงแก้ปัญหานี้โดยวิธีการที่เรียกว่า cross validation ซึ่งมีขั้นตอนดังนี้

  1. แบ่ง Dataset ออกเป็น 3 ส่วน {training set 60% : cross validation set 20% : test set 20%} (แบบสุ่ม)
    (x(i)ₜᵣₐᵢₙ , y(i)ₜᵣₐᵢₙ) จำนวน mₜᵣₐᵢₙ examples (60%)
    (x(i)ᵥ, y(i)ᵥ) จำนวน mᵥ examples (20%)
    (x(i)ₜₑₛₜ , y(i)ₜₑₛₜ) จำนวน mₜₑₛₜ examples (20%)
  2. คำนวณ error ตามแต่ละส่วน
    training set error
    Jₜᵣₐᵢₙ(θ) = 1/2mₜᵣₐᵢₙ ∑ᵢᵐ[ hθ(x(i)ₜᵣₐᵢₙ -y(i)ₜᵣₐᵢₙ)² ]
    cross validation set error
    Jᵥ(θ) = 1/2mᵥ ∑ᵢᵐᵛ[ hθ(x(i)ᵥ -y(i)ᵥ)² ]
    test set error
    Jₜₑₛₜ(θ) = 1/2mₜₑₛₜ ∑ᵢᵐᵗᵉˢᵗ[ hθ(x(i)ₜₑₛₜ -y(i)ₜₑₛₜ)² ]
  3. นำไปใช้เลือก model โดยใช้กระบวนการเดิมข้างต้น แต่เปลี่ยนมาเลือกค่า d ที่ทำให้ Jᵥ(θ(d)) มีค่าน้อยที่สุด แล้วประมาณค่า generalization error ด้วย Jₜₑₛₜ(θ(d))

ปัญหา Bias vs Variance

ต่อไปลองมาดูผลกระทบที่ค่า d มีต่อ algorithm เพื่อทำความเข้าใจปัญหา Bias vs Variance โดยการพิจารณา linear regression ณ ค่า d ต่างๆ

สมมติต้องการใช้ linear regression ทำนายราคาบ้าน โดยใช้ size ของบ้าน เป็น feature : hθ(x) = θ₀ + θ₁x
ถ้าค่า d ต่ำ ก็จะทำให้เวลา algorithm ทำนายแล้วได้ผลลัพธ์ที่มีค่า error สูง จึงเป็นปัญหา High Bias (underfit)

High bias (underfit)

แต่ถ้าเลือกค่า d สูงเกินไป ทำนายแล้วมีค่า error ต่ำก็จริง แต่ตัว model ไปจับ noise ของ data มากเกินไป อาจจะมี generalization error สูง เป็นปัญหา High Variance(overfit)

High variance (overfit)

โดยทั่วไปเราจะเลือก model ที่พอดี (Just right) เพื่อให้ทั้งค่า error และ generalization error มีค่าต่ำที่สุดเท่าที่เป็นไปได้ โดย ณ ค่า d optimal จะทำให้ได้ model ที่อยู่ระหว่าง model ที่มีปัญหา High bias กับ model ที่มีปัญหา High variance จึงเป็น model ที่ดีที่สุด

Just right

เราสามารถ plot Jₜᵣₐᵢₙ(θ), Jᵥ(θ) ตาม degree of polynomial ได้ดังนี้

J(θ) ณ degree of polynomial ค่าต่างๆ

ใน range ช่วงที่ค่า d ต่ำ Jₜᵣₐᵢₙ(θ) จะมีค่าสูง และ Jᵥ(θ) จะมีค่าใกล้เคียงกับ Jₜᵣₐᵢₙ(θ)
ค่า d ในช่วงนี้มีปัญหา High bias (underfit)

ใน range ช่วงที่ค่า d สูง Jₜᵣₐᵢₙ(θ) จะมีค่าต่ำ แต่ Jᵥ(θ) จะมีค่ามากกว่า Jₜᵣₐᵢₙ(θ) ค่อนข้างมาก ค่า d ในช่วงนี้มีปัญหา High bias (underfit)

ค่า d ณ optimal value จะทำให้ Jᵥ(θ) มีค่าต่ำที่สุด และค่า Jₜᵣₐᵢₙ(θ) ก็มีค่าต่ำ จึงเป็นค่า d ที่เหมาะสม (Just right)

2.2 หา optimal regularization parameter (λ)

หลังจากได้ ค่า d optimal แล้ว ขั้นตอนต่อไปคือการหา regularization parameter (λ) ที่ดีที่สุด

Linear regression with regularization
สมมติ Model : hθ(x) = θ₀ + θ₁x + θ₂x² + θ₃x³ + θ₄x⁴
J(θ) = 1/2m ∑ᵢᵐ[ hθ(x(i) -y(i))² ] + λ/2m ∑ⱼᵐθ²

ก่อนอื่นลองมาดูผลกระทบที่ λ มีต่อ algorithm โดยพิจารณา λ ที่ค่าต่างๆ

ถ้าค่า λ สูง ค่า parameter θ จะถูก regularized เยอะจนมีค่าต่ำมาก เช่น λ = 10000 , θ₁ ≃ 0 , θ₂ ≃ 0, θ₃ ≃ 0, θ₄ ≃ 0 ; hθ(x) θ₀ เวลา algorithm ทำนายแล้วจึงได้ผลลัพธ์ที่มีค่า error สูง จึงเป็นปัญหา High Bias (underfit)

Large λ ; High bias (underfit)

ถ้าค่า λ ต่ำ ค่า parameter θ แทบจะไม่ถูก regularized เลย เช่น λ = 0 เมื่อนำไปทำนายแล้วมีค่า error ต่ำก็จริง แต่ตัว model ไปจับ noise ของ data มากเกินไป อาจจะมี generalization error สูง เป็นปัญหา High Variance(overfit)

Small λ ; High variance (overfit)

ณ ค่า λ optimal จะทำให้ได้ model ที่ดีที่สุด ซึ่งอยู่ระหว่าง model ที่มีปัญหา High bias กับ model ที่มีปัญหา High variance

Just right

กระบวนการเลือก optimal regularization parameter (λ)

Linear regression with regularization
สมมติ Model : hθ(x) = θ₀ + θ₁x + θ₂x² + θ₃x³ + θ₄x⁴
J(θ) = 1/2m ∑ᵢᵐ[ hθ(x(i) -y(i))² ] + λ/2m ∑ⱼᵐθ²

ให้คำนวณ error โดยไม่รวม regularization term

Jₜᵣₐᵢₙ(θ) = 1/2mₜᵣₐᵢₙ ∑ᵢᵐ[ hθ(x(i)ₜᵣₐᵢₙ -y(i)ₜᵣₐᵢₙ)² ]
Jᵥ(θ) = 1/2mᵥ ∑ᵢᵐᵛ[ hθ(x(i)ᵥ -y(i)ᵥ)² ]
Jₜₑₛₜ(θ) = 1/2mₜₑₛₜ ∑ᵢᵐᵗᵉˢᵗ[ hθ(x(i)ₜₑₛₜ -y(i)ₜₑₛₜ)² ]

  1. ให้เลือก range ของค่า λ ที่ต้องการพิจารณา
    โดยอาจเริ่มจาก 0 แล้วใช้ range ของ 0.01 คูณด้วย( 2 ยกกำลัง 0,1,2,…,12 )
    เช่น ค่า λ = {0, 0.01, 0.02 , 0.04, …, 10.24}
    λ =0.00 : hθ(x)→ θ(1)→Jᵥ(θ(1))
    λ =0.01 : h
    θ(x)→ θ(2)→Jᵥ(θ(2))
    ….
    λ = 10.24 : h
    θ(x) → θ(10)→Jᵥ(θ(10))
    min
    Jᵥ(θ)
  2. train algorithm กับ สมมติฐานที่ λ = 0 ; min Jₜᵣₐᵢₙ(θ) จนได้ค่า θ(1)
  3. นำค่า θ(1) ที่ได้ไปคำนวณหา Jᵥ(θ(1))
  4. ทำกับทุกๆ ค่าของ d จะได้ Jᵥ(θ(1)), Jᵥ(θ(2)), …, Jᵥ(θ(10))
  5. เลือก Jᵥ(θ) ที่มีค่าน้อยที่สุด สมมติ Jᵥ(θ(5)) มีค่าน้อยสุด
    นำค่า θ(5) และ λ = 0.08 ไปคำนวณ Jₜₑₛₜ(θ(5)) จะได้เป็น generalization error โดยประมาณ
J(θ) ณ λ ค่าต่างๆ

3. Learning curve

Learning curve ทำได้โดยการ plot Jₜᵣₐᵢₙ(θ), Jᵥ(θ) เทียบกับจำนวน training example เพื่อดูว่า model ของเรากำลังมีปัญหา bias หรือ variance

ถ้าสมมติฐานของเราคือ hθ(x) = θ₀ + θ₁x + θ₂x²
เมื่อจำนวน training example น้อยๆ เช่น 3 ตัว สมมติฐานของเราก็จะ fit ข้อมูลได้ง่าย error จึงต่ำในช่วงแรกๆ แต่เมื่อจำนวน training example เพิ่มขึ้นเรื่อยๆ สมมติฐานของเราก็จะ fit ข้อมูลได้แย่ลง error จึงค่อยๆ สูงขึ้น

กระบวนการ plot Learning curve

  1. ให้เลือก range ของจำนวน training example ที่ต้องการพิจารณา
    เช่น ค่า m = 0,1,…..n (n ⊂ m)
    m = 1 : hθ(x)→ θ(1)→Jᵥ(θ(1))
    m = 2 : h
    θ(x)→ θ(2)→Jᵥ(θ(2))
    ….
    m = n : h
    θ(x) → θ(n)→Jᵥ(θ(n))
    min
    Jᵥ(θ)
  2. train algorithm กับ สมมติฐานที่ λ = 0 ; min Jₜᵣₐᵢₙ(θ) จนได้ค่า θ(1)
  3. นำค่า θ(1) ที่ได้ไปคำนวณหา Jᵥ(θ(1))
  4. ทำกับทุกๆ ค่าของ d จะได้ Jᵥ(θ(1)), Jᵥ(θ(2)), …, Jᵥ(θ(n))
  5. นำค่า Jᵥ(θ) ที่ได้ ไป plot กราฟคู่กับ Jₜᵣₐᵢₙ(θ) ตามจำนวน training example

กราฟที่ได้จะมีลักษณะใกล้เคียงกราฟต่อไปนี้

Learning curve

แต่ถ้าเรามีปัญหา High bias (underfit) ทำให้ error ของทั้ง training set และ cross validation set สูงเกินกว่าที่ต้องการ กราฟจะเป็นลักษณะนี้

Learning curve : High bias

จะเห็นว่า การเพิ่มจำนวน training data ในกรณีที่ model มีปัญหา High bias จะไม่ช่วยให้มี performance ที่ดีขึ้นได้มากนัก

ถ้า model ของเรามีปัญหา High variance (overfit) กราฟจะมีลักษณะดังนี้

Learning curve : High variance

จะเห็นว่า Jᵥ(θ) หรือ error ของ cross validation set มีค่าสูงกว่า Jₜᵣₐᵢₙ(θ) หรือ error ของ training set มากๆ เป็น large gap การเพิ่มจำนวน training data จึงน่าจะช่วยให้ algorithm ของเรามี performance ที่ดีขึ้นได้

ปรับปรุง algorithm ตามอาการที่พบ

หลังจากตรวจอาการ algorithm ของเราเรียบร้อยแล้ว เราก็จะรู้ว่า algorithm ของเรากำลังประสบปัญหา high bias หรือ high variance ก็จะทำให้เราจ่ายยาได้ถูกขนาน ลองกลับไปพิจารณาทางเลือกในการปรับปรุง algorithm ของเราข้างต้นบทความ เราก็จะทราบว่า แต่ละทางเลือก เหมาะกับการแก้ปัญหาที่ต่างกัน กล่าวคือ

  • เก็บตัวอย่างข้อมูลมา train เพิ่ม → ช่วยแก้ปัญหา high variance (overfit)
  • ลองลดจำนวน feature → ช่วยแก้ปัญหา high variance (overfit)
  • ลองเพิ่มจำนวน feature → ช่วยแก้ปัญหา high bias (underfit)
  • ลองเพิ่ม Polynomial feature → ช่วยแก้ปัญหา high bias (underfit)
  • ลองลดค่า regularization parameter : λ → ช่วยแก้ปัญหา high bias (underfit)
  • ลองเพิ่มค่า regularization parameter : λ → ช่วยแก้ปัญหา high variance (overfit)

การทำ Machine Learning Diagnostics จึงเป็นการช่วยป้องกันไม่ให้เราจ่ายยาผิดขนาน และช่วยประหยัดเวลาที่อาจสูญเปล่าไปได้อย่างมาก

การทำ Diagnostics กรณีของ Neural Network

Neural network ที่มีจำนวน parameter น้อยๆ จะมีแนวโน้มที่จะ underfit แต่ก็จะใช้เวลาในการคำนวณน้อย

ในทางกลับกัน Neural network ที่มีจำนวน parameter เยอะ ก็มีแนวโน้มที่จะ overfit และใช้เวลาในการคำนวณเยอะมาก

โดยทั่วไปแล้ว การใช้ Neural network ที่มีจำนวน parameter เยอะ แล้วมา regularize จะให้ผลดีกว่าการเลือก Neural network ที่มีจำนวน parameter น้อยๆ (แต่ก็จะใช้เวลาในการคำนวณเยอะกว่า)

เราอาจพิจารณาเลือกจำนวน hidden layer โดยหลักการเดียวกันกับข้างต้น โดยแบ่ง data มาทำ cross validation แล้วดูว่า จำนวน layer เท่าไรให้ผลลัพธ์ที่ดีที่สุด

การออกแบบระบบ Machine Learning

ในการออกแบบระบบ Machine Learning ขึ้นมาใหม่นั้น เมื่อผ่านขั้นตอนการระดมไอเดีย ก็มักจะมีหลายไอเดียที่น่าลองทำ เช่น

  • เก็บข้อมูลมาให้เยอะๆ (เช่น Honeypot project เก็บข้อมูลคำที่มักจะอยู่ใน spam มาเยอะๆ)
  • พัฒนา feature ให้ซับซ้อนมากขึ้น เช่น ใช้ e-mail header มาเป็น feature ในการตรวจหา spam
  • เพิ่ม algorithm ในการประมวลข้อมูลในแนวทางใหม่ๆ เช่น ตรวจจับการพิมพ์ผิดอย่างตั้งใจ (i.e. d3al) เพราะคิดว่าพวก spam e-mail มักจะใช้คำเหล่านี้ เพื่อหลีกเลี่ยงตัวกรอง spam

แต่เราจะตัดสินใจได้อย่างไรว่าควรเลือกทำอะไรก่อน ถ้าเลือกทางผิดก็จะเสียเวลาพัฒนาไปเช่นกัน เราก็ไม่ควรตัดสินใจด้วยสัญชาตญาณส่วนตัว แต่ควรทำ Error Analysis

Error Analysis

  • ก่อนอื่น อยากแนะนำให้เริ่มต้นด้วย algorithm อย่างง่ายๆ ที่สามารถ implement ได้เร็วก่อน เช่น อาจใช้เวลาเพียง 1 วัน ทำ simple algorithm แล้วทำ cross validation เพื่อหา learning curve จะได้รู้ว่า ตอนนี้ algorithm ของเรากำลังมีปัญหา high bias หรือ high variance จะได้ตัดสินใจว่าขั้นตอนต่อไปควรเลือกทำอะไร เพิ่มจำนวน training example จะดีไหม เพิ่มจำนวน feature จะดีไหม

ควรเริ่มโดยทำ algorithm อย่างง่ายๆ ใช้เวลาน้อย เพราะคนส่วนมากมักจะใช้เวลาในขั้นตอนนี้มาก ทั้งที่ยังไม่รู้เลยว่า เรามาถูกทางหรือไม่ การเริ่มอย่างรวดเร็ว แล้วนำไปทดสอบ จะทำให้เห็นภาพคร่าวๆ และตัดสินใจได้ดีกว่า เสียเวลาน้อยกว่า

  • จากนั้นจึงมาทำ error analysis คือ การพิจารณาข้อมูลตัวอย่าง ใน cross validation set ที่ทำให้ algorithm ของเราทำนายแล้วเกิด error เพื่อดูว่า error ที่เกิดขึ้นในข้อมูลตัวอย่างเหล่านั้นมีแนวโน้มที่เกิดขึ้นอย่างเป็นระบบบ้างหรือไม่ ถ้ามี แนวโน้มนั้นเกิดขึ้นจากสาเหตุอะไร ซึ่งก็จะช่วยให้เราเกิดแรงบันดาลใจใหม่ๆ ว่าควรจะทำอย่างไรให้ algorithm ของเราดีขึ้น

ตัวอย่างเช่น เราพัฒนา algorithm สำหรับคัดกรอง spam สมมติว่า algorithm เราทำนายผิดไป 100 จาก 500 ตัวอย่าง ก็มาดู 100 ตัวอย่างที่ error นั้นว่าเป็น spam ประเภทไหน สมมติเป็น replica 4 ตัวอย่าง, steal password 53 ตัวอย่าง ที่เหลือประเภทอื่นๆ 43 ตัวอย่าง ก็อาจจะเลือกแก้ไข algorithm ของเราให้รับมือกับ spam ที่พยายามจะขโมย password ของเราได้ดีขึ้น น่าจะช่วยให้มี performance ที่ดีได้

หรือถ้าหากว่าเรากำลังมีไอเดียว่า พวก spam น่าจะมี feature เพิ่มเติมจากสมมติฐานเดิมของเรา 3 ไอเดีย ก็มาดูว่าใน spam 100 ตัวอย่างนั้น มี feature ชนิดใดมากที่สุด สมมติได้ feature ตั้งใจสะกดคำผิดเยอะที่สุด เราก็เลือกพัฒนา algorithm ให้มี feature นี้เพิ่มขึ้น

Single numerical evaluation

ประเด็นสำคัญอีกอย่างหนึ่งสำหรับการทำ error analysis ก็คือ ควรจะประเมิน algorithm ได้ด้วยการพิจารณาค่าตัวเลขเพียงตัวเดียว (single numerical evaluation) เช่น ประเมินด้วย error หรือ accuracy (โดยพิจารณาจาก cross validation set ไม่ใช่ test set)

ถ้าเราสามารถใช้ตัวเลขเพียงตัวเดียวบ่งบอกได้ว่า algorithm ดีขึ้นหรือแย่ลง ก็จะช่วยให้การทำงานเป็นทีมรวดเร็วขึ้น เพราะจะลดการโต้แย้งว่าไอเดียของใครดีกว่า เนื่องจากสามารถตัดสินกันได้ด้วยตัวเลขเพียงตัวเดียว ช่วยลดเวลา implement ได้มาก

อย่างไรก็ตาม มีกรณีที่การใช้ตัวเลขเพียงตัวเดียว อาจไม่เพียงพอ นั่นคือ กรณีที่ข้อมูลของเราเป็น skewed class

Error metrics for skewed class

skewed class หมายถึง ข้อมูลของเราไม่ได้กระจายตัวแบบ normal แต่ค่อนข้างเทไปทางใดทางหนึ่งอย่างมาก อาจจะค่อนไปทางpositive หรือ ค่อนไปทาง negative ทางใดทางหนึ่ง ก็จะเกิดปัญหาในการประเมิน algorithm

ยกตัวอย่างเช่น ถ้าเราทำ algorithm สำหรับคัดกรองผู้ป่วยมะเร็ง แล้วได้ accuracy ที่ 99% ถ้าดูเผินๆ ก็ดูน่าประทับใจมาก แต่ถ้าเกิดว่าตัวข้อมูลผู้ป่วยนั้นเป็น skewed class คือ มีคนเป็นมะเร็งจริงน้อยมากๆ เช่น 0.5% ของตัวอย่างทั้งหมด แบบนี้ตัวเลข accuracy 99% ก็ดูไม่ดีนัก เพราะเราอาจคิดง่ายๆ แค่ เลือกทำนายให้ไม่เป็นมะเร็งทุกคน ก็จะได้ accuracy 99.5% แล้ว ดีกว่า algorithm ที่สู้อุตส่าห์พัฒนาขึ้นมาเสียอีก

นอกจากนี้ สมมติว่าเราพัฒนา algorithm เดิมของเราต่อ จนได้ accuracy มาเป็น 99.5% แล้ว แบบนี้เราจะมั่นใจได้ไหม ว่าสิ่งที่เราเพิ่มเติมลงไป เป็นการทำให้ algorithm ของเราดีขึ้นจริงๆ หรือเราแค่ไปเพิ่มโอกาสให้ algorithm ทำนายว่าไม่เป็นมะเร็งเพิ่มขึ้นแค่นั้นเอง ในกรณีแบบนี้ เราควรใช้ Evaluation metrics โดยการหา Precision / Recall

Precision/Recall

ให้ y = 1 แทน class ที่หายาก (rare class) ที่เราต้องการจะตรวจพบ
ในที่นี้คือ ผู้ป่วยเป็นมะเร็ง

  • กรณีที่ model ของเราทำนายว่า : 1 และ y มีค่า : 1 —เรียกว่า True positive
  • กรณีที่ model ของเราทำนายว่า : 0 และ y มีค่า : 0— เรียกว่า True negative
  • กรณีที่ model ของเราทำนายว่า : 0 และ y มีค่า : 1— เรียกว่า False negative
  • กรณีที่ model ของเราทำนายว่า : 1 และ yมีค่า : 0— เรียกว่า False positive

Precision หมายความว่า ในจำนวนผู้ป่วยทั้งหมดที่ model ของเราทำนายว่าเป็นมะเร็งนั้น มีสัดส่วนเท่าไหร่ที่ผู้ป่วยเหล่านั้นเป็นมะเร็งจริงๆ

Precision = True positives / Total number of predicted positives

Precision = True positives / True positives + False positives

Recall หมายความว่า ในจำนวนผู้ป่วยทั้งหมดที่เป็นมะเร็งจริงๆ นั้น มีสัดส่วนเท่าไหร่ที่ model ของเราทำนายว่าเป็นมะเร็ง

Recall = True positives / Total number of actual positives

Recall = True positives / True positives + False negatives

การได้อย่างเสียอย่างระหว่าง Precision กับ Recall

model ที่ดี ก็ควรจะมีทั้ง high precision และ high recall แต่ในความเป็นจริงส่วนใหญ่แล้วเราจะมักจะต้องเลือกอย่างใดอย่างนึง เนื่องจากความได้อย่างเสียอย่างระหว่าง precision กับ recall ดังตัวอย่างต่อไปนี้

สมมติว่า เราใช้ logistic regression : 0 ≤ hθ(x) ≤ 1
ทำนายว่าเป็น 1 ถ้า hθ(x) ≥ 0.5
ทำนายว่าเป็น 0 ถ้า hθ(x) < 0.5

สมมติว่าเราอยากมั่นใจมากขึ้นว่า model ของเราทำนายแล้วได้เฉพาะคนที่เป็นจริงๆ เพราะถ้าทำนายว่าผู้ป่วยคนไหนเป็นมะเร็งแล้ว ก็จะมีผลกระทบต่อเขามาก ต้องเสียค่ารักษา ต้องทำคีโม เสียสุขภาพจิต ดังนั้นเราจึงไม่อยากให้ model ของเราทำนายคนที่จริงๆ แล้วไม่ได้เป็นมะเร็ง ออกมาได้ผลว่าเป็นมะเร็ง ก็อาจทำได้โดยการปรับค่า threshold เช่น เดิม คัดกรองที่ hθ(x) ≥ 0.5 ก็อาจเพิ่ม threshold เป็น 0.7 การทำแบบนี้ model ของเราจะมี higher precision ก็จริง แต่ก็จะทำให้มี lower recall ด้วย เพราะว่าผู้ป่วยบางส่วนที่ model เดิมทำนายว่าเป็นมะเร็งจะหายไป กลายเป็นทำนายว่าไม่เป็นมะเร็ง

ในทางกลับกัน ถ้าเราอยาก play safe คือ ให้ model ของเราทำนายไว้ก่อนเลยว่าน่าจะเป็นมะเร็ง แม้จะไม่มั่นใจก็ตาม โดยเหตุผลคือ อยากให้มารับการรักษาแต่เนิ่นๆ เพื่อเพิ่มโอกาสในการรักษาให้หาย ก็อาจทำได้โดยการปรับลด threshold เช่น ปรับลดลงมาเป็น 0.3 การทำแบบนี้ model ของเราจะมี lower precision แต่ก็จะได้ higher recall มาแทน

F1 score

อย่างไรก็ตามตอนนี้เรามีตัวเลขวัดผล 2 ตัว นั่นก็คือ precision กับ recall ซึ่งจะทำให้ตัดสินได้ยากว่า algorithm ไหนดีกว่ากัน เช่น

สมมติว่า algorithm A มี precision 0.5 recall 0.4
algorithm B มี precision 0.7 recall 0.2
กรณีแบบนี้ จะตัดสินยากว่าแบบไหนดีกว่ากัน โดย B มี precision สูงกว่า แต่ A มี recall สูงกว่า

ถึงจะนำค่าทั้งสองมา average ก็ยังไม่เห็นภาพชัดเจน เช่นในกรณีนี้ ค่า average ของทั้งสองแบบ มีค่าเท่ากับ 0.45 เท่ากัน ตัดสินไม่ได้ อีกทั้งค่า average จะทำงานได้ไม่ดีในกรณี extreme case เช่น มีค่า precision สูงมาก แต่ recall ต่ำมาก เวลานำมา average แล้ว ได้ค่าที่ดูดี แต่พอเอาไปใช้จริง อาจจะไม่ได้ผลดีเพราะ recall ต่ำมาก

ดังนั้นจึงมีวิธีการทำให้ precision กับ recall ออกมาเป็น single number value โดยรวมผลกระทบของทั้งสองค่าไว้แล้ว คือ การคำนวณค่า F1 score

P = Precision , R = Recall

F1 score = 2 P*R / (P + R)

F1 score เป็นการรวมผลกระทบของทั้ง precision และ recall มาไว้ในตัวเลขเพียงตัวเดียวแล้ว โดยจะมีค่าตั้งแต่ 0 ถึง 1 ค่ายิ่งมากยิ่งดี
โดยค่า F1 = 1 เป็น perfect score คือ model ของเราทำนายได้แม่นยำ 100% และไม่หลุดเลย นั่นคือ Precision = 1, Recall = 1
และค่า F1 = 0 เมื่อ Precision หรือ Recall เป็น 0 ซึ่งไม่เหมาะกับการนำมาใช้จริง

จำนวนข้อมูลสำหรับ Machine Learning

เราควรจะเลือกใช้จำนวนข้อมูลเท่าไรมา train จึงจะเพียงพอ?

ในบางกรณีนั้น algorithm ที่แย่กว่า ก็สามารถมี performance ที่ดีกว่า algorithm ที่เหนือกว่าได้ เพียงแค่ algorithm ที่แย่กว่านั้น มีจำนวน training data มากกว่า จนมีคำกล่าวว่า ในโลกของ machine learning นั้น การแพ้ชนะ ไม่ได้อยู่ที่ algorithm ของใครดีกว่า แต่อยู่ที่ใครมีข้อมูลมากกว่า’ แต่คำกล่าวนี้ก็ไม่ได้เป็นจริงเสมอไป จะเป็นจริงได้ก็ต่อเมื่อ 2 เงื่อนไขต่อไปนี้เป็นจริง

  1. features ต่างๆ ที่เราเลือกมาใช้ใน model ต้องเป็น features ที่ให้ข้อมูลเพียงพอที่จะทำนายค่าได้แม่นยำ
    แล้วจะรู้ได้อย่างไรว่าเพียงพอแล้วหรือไม่ วิธีทดสอบที่ดีก็คือ ลองคิดว่า ถ้าเราส่งข้อมูล features ต่างๆ ที่เราเลือกมา ให้กับมนุษย์ผู้เชี่ยวชาญทางด้านนั้นๆ เขาจะสามารถทำนายได้อย่างมั่นใจหรือไม่ ยกตัวอย่างเช่น ถ้าเราอยากทำนายราคาบ้านด้วยขนาดของบ้านเพียงอย่างเดียว ขนาดของบ้านก็ไม่น่าจะเป็นข้อมูลที่เพียงพอ เพราะถ้าให้นายหน้า หรือนักวิเคราะห์อสังหาริมทรัพย์มาทำนายราคาบ้านด้วยข้อมูลนี้อย่างเดียว เขาก็จะไม่สามารถทำนายราคาบ้านได้อย่างมั่นใจ
  2. เมื่อ learning algorithm ของเรามี parameters จำนวนมาก
    เช่น logistic/linear regression ที่มีจำนวน features เยอะๆ , neural network ที่มี hidden units เยอะๆ เพราะ algorithm เหล่านี้มักจะมี low bias และมีค่า Jₜᵣₐᵢₙ(θ)ต่ำ การที่เราใช้ข้อมูลจำนวนมากมา train ก็จะช่วยลดแนวโน้มที่จะ overfit (ทำให้มี low variance) ทำให้ Jₜᵣₐᵢₙ(θ) มีค่าใกล้เคียงกับ Jₜₑₛₜ(θ) ดังนั้นค่า Jₜₑₛₜ(θ) ก็จะมีค่ำต่ำไปด้วย

low bias algorithm ทำให้ Jₜᵣₐᵢₙ(θ) มีค่าต่ำ
ข้อมูล training set ขนาดใหญ่มาก ทำให้ Jₜᵣₐᵢₙ(θ) ≃ Jₜₑₛₜ(θ)
∴ Jₜₑₛₜ(θ) จะมีค่าต่ำด้วย

บทสรุป

เมื่อเราต้องการออกแบบ ระบบ machine learning

  1. ควรเริ่มจาก simple algorithm เพื่อลดเวลา implement
  2. ทำ diagnostics เพื่อดูว่ามีปัญหา bias / variance
  3. ทำ error analysis เมื่อต้องการเปรียบเทียบไอเดียต่างๆ โดยใช้ข้อมูลตัวเลขเพียงตัวเดียว
  4. ถ้า algorithm ของเรามีจำนวน parameter เยอะ และ feature ที่เราเลือกมาใช้นั้นให้ข้อมูลเพียงพอ การเลือกใช้จำนวน training set ขนาดใหญ่ ย่อมทำให้ performance ของเราดี

--

--

Krirk Arunoprayote
botnoi-classroom

AI enthusiast, currently working as Data Scientist at Botnoi Consulting Co., Ltd.