การเรียนรู้ของเครื่อง - การถดถอยพหุนาม
การถดถอยพหุนาม
หากจุดข้อมูลของคุณชัดเจนว่าไม่เข้ากับการถดถอยเชิงเส้น (เส้นตรงผ่านจุดข้อมูลทั้งหมด) ก็อาจเหมาะสำหรับการถดถอยพหุนาม
การถดถอยพหุนาม เช่นเดียวกับการถดถอยเชิงเส้น ใช้ความสัมพันธ์ระหว่างตัวแปร x และ y เพื่อค้นหาวิธีที่ดีที่สุดในการวาดเส้นผ่านจุดข้อมูล
มันทำงานอย่างไร?
Python มีวิธีการค้นหาความสัมพันธ์ระหว่างจุดข้อมูลและวาดเส้นของการถดถอยพหุนาม เราจะแสดงวิธีใช้วิธีการเหล่านี้แทนการใช้สูตรทางคณิตศาสตร์
ในตัวอย่างด้านล่าง เราได้จดทะเบียนรถ 18 คันขณะที่พวกเขาผ่านด่านเก็บค่าผ่านทาง
เราได้ลงทะเบียนความเร็วของรถแล้ว และช่วงเวลาของวัน (ชั่วโมง) ที่ผ่านไปก็เกิดขึ้น
แกน x แทนชั่วโมงของวัน และแกน y แทนความเร็ว:
ตัวอย่าง
เริ่มต้นด้วยการวาดแผนภาพกระจาย:
import matplotlib.pyplot as plt
x = [1,2,3,5,6,7,8,9,10,12,13,14,15,16,18,19,21,22]
y = [100,90,80,60,60,55,60,65,70,70,75,76,78,79,90,99,99,100]
plt.scatter(x, y)
plt.show()
ผลลัพธ์:
ตัวอย่าง
นำเข้าnumpy
แล้ว
matplotlib
ลากเส้นของการถดถอยพหุนาม:
import numpy
import matplotlib.pyplot as plt
x = [1,2,3,5,6,7,8,9,10,12,13,14,15,16,18,19,21,22]
y =
[100,90,80,60,60,55,60,65,70,70,75,76,78,79,90,99,99,100]
mymodel =
numpy.poly1d(numpy.polyfit(x, y, 3))
myline = numpy.linspace(1, 22, 100)
plt.scatter(x, y)
plt.plot(myline, mymodel(myline))
plt.show()
ผลลัพธ์:
ตัวอย่างที่อธิบาย
นำเข้าโมดูลที่คุณต้องการ
คุณสามารถเรียนรู้เกี่ยวกับโมดูล NumPy ได้ในNumPy Tutorialของ เรา
คุณสามารถเรียนรู้เกี่ยวกับโมดูล SciPy ได้ใน บทช่วย สอน SciPyของ เรา
import numpy
import matplotlib.pyplot as plt
สร้างอาร์เรย์ที่แสดงค่าของแกน x และ y:
x = [1,2,3,5,6,7,8,9,10,12,13,14,15,16,18,19,21,22]
y =
[100,90,80,60,60,55,60,65,70,70,75,76,78,79,90,99,99,100]
NumPy มีวิธีการที่ทำให้เราสร้างแบบจำลองพหุนามได้:
mymodel =
numpy.poly1d(numpy.polyfit(x, y, 3))
จากนั้นระบุวิธีแสดงบรรทัด เริ่มที่ตำแหน่ง 1 และสิ้นสุดที่ตำแหน่ง 22:
myline = numpy.linspace(1, 22, 100)
วาดพล็อตกระจายดั้งเดิม:
plt.scatter(x, y)
ลากเส้นของการถดถอยพหุนาม:
plt.plot(myline, mymodel(myline))
แสดงไดอะแกรม:
plt.show()
R-Squared
สิ่งสำคัญคือต้องรู้ว่าความสัมพันธ์ระหว่างค่าของแกน x และ y เป็นอย่างไร หากไม่มีความสัมพันธ์ การถดถอยพหุนามก็ไม่สามารถใช้ทำนายสิ่งใดได้
ความสัมพันธ์ถูกวัดด้วยค่าที่เรียกว่า r-squared
ค่า r-squared มีตั้งแต่ 0 ถึง 1 โดยที่ 0 หมายถึงไม่มีความสัมพันธ์ และ 1 หมายถึงเกี่ยวข้องกัน 100%
Python และโมดูล Sklearn จะคำนวณค่านี้ให้คุณ สิ่งที่คุณต้องทำคือป้อนด้วยอาร์เรย์ x และ y:
ตัวอย่าง
ข้อมูลของฉันเหมาะสมกับการถดถอยพหุนามดีแค่ไหน?
import numpy
from sklearn.metrics import r2_score
x =
[1,2,3,5,6,7,8,9,10,12,13,14,15,16,18,19,21,22]
y =
[100,90,80,60,60,55,60,65,70,70,75,76,78,79,90,99,99,100]
mymodel =
numpy.poly1d(numpy.polyfit(x, y, 3))
print(r2_score(y, mymodel(x)))
หมายเหตุ: ผลลัพธ์ 0.94 แสดงให้เห็นว่ามีความสัมพันธ์ที่ดีมาก และเราสามารถใช้การถดถอยพหุนามในการคาดคะเนในอนาคตได้
ทำนายค่าในอนาคต
ตอนนี้เราสามารถใช้ข้อมูลที่รวบรวมมาเพื่อทำนายค่าในอนาคตได้
ตัวอย่าง ให้เราลองทำนายความเร็วของรถที่ผ่านด่านเก็บค่าผ่านทางตอนประมาณ 17.00 น.:
ในการทำเช่นนั้น เราต้องการmymodel
อาร์เรย์เดียวกันจากตัวอย่างด้านบน:
mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))
ตัวอย่าง
ทำนายความเร็วของรถที่วิ่งผ่านเวลา 17.00 น.:
import numpy
from sklearn.metrics import r2_score
x =
[1,2,3,5,6,7,8,9,10,12,13,14,15,16,18,19,21,22]
y =
[100,90,80,60,60,55,60,65,70,70,75,76,78,79,90,99,99,100]
mymodel =
numpy.poly1d(numpy.polyfit(x, y, 3))
speed = mymodel(17)
print(speed)
ตัวอย่างทำนายความเร็วเป็น 88.87 ซึ่งเราสามารถอ่านได้จากแผนภาพ:
หุ่นไม่ดี?
ให้เราสร้างตัวอย่างที่การถดถอยพหุนามไม่ใช่วิธีที่ดีที่สุดในการทำนายค่าในอนาคต
ตัวอย่าง
ค่าเหล่านี้สำหรับแกน x และ y ควรส่งผลให้ไม่เหมาะสมอย่างมากสำหรับการถดถอยพหุนาม:
import numpy
import matplotlib.pyplot as plt
x =
[89,43,36,36,95,10,66,34,38,20,26,29,48,64,6,5,36,66,72,40]
y =
[21,46,3,35,67,95,53,72,58,10,26,34,90,33,38,20,56,2,47,15]
mymodel =
numpy.poly1d(numpy.polyfit(x, y, 3))
myline = numpy.linspace(2, 95, 100)
plt.scatter(x, y)
plt.plot(myline, mymodel(myline))
plt.show()
ผลลัพธ์:
แล้วค่า r-squared?
ตัวอย่าง
คุณควรได้ค่า r-squared ที่ต่ำมาก
import numpy
from sklearn.metrics import r2_score
x =
[89,43,36,36,95,10,66,34,38,20,26,29,48,64,6,5,36,66,72,40]
y =
[21,46,3,35,67,95,53,72,58,10,26,34,90,33,38,20,56,2,47,15]
mymodel =
numpy.poly1d(numpy.polyfit(x, y, 3))
print(r2_score(y, mymodel(x)))
ผลลัพธ์: 0.00995 บ่งชี้ถึงความสัมพันธ์ที่แย่มาก และบอกเราว่าชุดข้อมูลนี้ไม่เหมาะสำหรับการถดถอยพหุนาม