অ্যাক্যুরেসি, লিস্ট স্কয়ার রিগ্রেশন

The process of learning from data to find a solution to a question is machine learning.

-- Siraj Raval

আচ্ছা, আমরা কিভাবে কমাবো এই "এরর"? আমাদের কাছে আসল ডেটা আছে, সঙ্গে এসেছে তার প্রেডিক্টেড ভ্যালু। এর মানে এই দুটোর ফারাক কতো কমিয়ে নিয়ে আসা যায় সেটাকে আমরা মেশিন লার্নিং স্টাইলে 'লস ফাংশন' বলতে পারি। আর বড় গল্প দিতে চাচ্ছিনা, বরং আমরা এমন একটা সরল রেখা চাই যেটা প্রেডিক্টেড সরল রেখা থেকে কম ভুল করবে। সেটার একটা সহজ পদ্ধতি হচ্ছে এররের সব যোগের স্কয়ার। না বোঝারই কথা। তাহলে চলুন এই ফর্মুলায়। ভয় পাবার কিছু নেই। পরের ফর্মুলাটা আমাদের মতো করে বানিয়েছি আগেরটাকে সোজা করতে গিয়ে। ভয় পাবেন না। পরেরটাই সোজা।

নিচেরটা দেখুন ভালো করে (লিস্ট স্কয়ার রিগ্রেশন)

আগে বের করি m স্লোপ, (একটু সহজ করে নিলাম আমাদের জন্য)

m = Sum_of_all(x-xmean)*(y-ymean)/Sum_of(x-xmean)**2
# **2 মানে স্কোয়ার, বর্গ

x এর সব ভ্যালুগুলোকে বসিয়ে দেখি কি আসে? শুরুতে আমরা ক্যালকুলেট করবো (x-xmean), ঠিক তো?

# সব x এর গড় xmean => (1+2+3+4+5) / 5 = 3
# x এর মান বসিয়ে দেই
যখন x = 1; (x-xmean) => (1-3) = -2
যখন x = 2; (x-xmean) => (2-3) = -1
যখন x = 3; (x-xmean) => (3-3) = 0
যখন x = 4; (x-xmean) => (4-3) = 1
যখন x = 5; (x-xmean) => (5-3) = 2

x এর মানের পর y এর ভ্যালু ঢুকিয়ে দেখি ফর্মুলাতে। আমাদের ফর্মুলা হচ্ছে (y-ymean), কি বলেন?

# সব y এর গড় ymean => (4+12+28+52+80) / 5 = 35.2
# y এর মান বসিয়ে দেই
যখন y = 4; (y-ymean) => (4-35.5) = -31.2
যখন y = 12; (y-ymean) => (12-35.5) = -23.2
যখন y = 28; (y-ymean) => (28-35.5) = -7.2
যখন y = 52; (y-ymean) => (52-35.5) = 16.8
যখন y = 80; (y-ymean) => (80-35.5) = 44.8

আমাদের হাতে চলে এসেছে সব ভ্যালু। এখন (x-xmean)*(y-ymean) বের করার পালা।

# বের করতে হবে Sum_of_all{(x-xmean)*(y-ymean)}, প্রতিটা (x,y) ভ্যালু দিয়ে
(x,y) => (1,4): (x-xmean)*(y-ymean) => {-2 * -31.2 = 62.4}
(x,y) => (2,12): (x-xmean)*(y-ymean) => {-1 * -23.2 = 23.2}
(x,y) => (3,28): (x-xmean)*(y-ymean) => {0 * -7.2 = 0}
(x,y) => (4,52): (x-xmean)*(y-ymean) => {1 * 16.8 = 16.8}
(x,y) => (5,80): (x-xmean)*(y-ymean) => {2 * -44.8 = 89.6}
Sum_of_all => {62.4+23.2+0+16.8+89.6} = 192

ফর্মুলার ওপরের অংশ শেষ। চলুন নিচের অংশে। আমাদেরকে ক্যালকুলেট করতে হবে Sum_of(x-xmean)**2 অংশটুকু। বর্গ করতে হবে সবগুলো আলাদা আলাদা করে।

# আমাদের দরকার => Sum_of(x-xmean)**2
= { -2**2, -1**2, 0**2, 1**2, 2**2 }
= { 4, 1, 0, 1, 4 }
= 10

এখন দুটো অংশই পেয়ে গেলাম। দুটোকে কানেক্ট করার পালা।

m = Sum_of_all(x-xmean)*(y-ymean)/Sum_of(x-xmean)**2
m = 192 / 10 = 19.2

m পেয়ে গেলাম। এখন y-ইন্টারসেপ্ট বের করার জন্য আমাদের ফর্মুলা কী? তার আগে b এর মান বের করি। ফর্মুলা হচ্ছে b = ymean — m * xmean, ঠিক তো?

# ফর্মুলা থেকে b = ymean — m * xmean
b = 35.2 - 19.2*3
b = 35.2 - 57.6
b = -22.4

ভালো কথা, এখন আমাদেরকে প্রেডিক্ট করতে হবে প্রতিটা y এর ভ্যালুকে নতুন m এবং b থেকে। তার আগে বের করি y = mx + b ।

y = mx + b => { y = 19.2x + (-22.4)}

লিস্ট স্কয়ার রিগ্রেশন y এর নতুন মান দিয়ে

এখন আমরা দেখবো x এর আগের মান দিয়ে y এর নতুন প্রেডিক্টেড ভ্যালু কতো হতে পারে। প্রতিটা y এর নতুন ভ্যালুগুলো দেখি বরং। আমাদের প্রতিটা প্রেডিক্টেড y ভ্যালুর চেঞ্জ দেখতে চাই যখন ফর্মুলা y = 19.2x + (-22.4) আমাদের x এর ভ্যালু দিয়ে।

# আমাদের ফর্মুলা y = mx + b => { y = 19.2x + (-22.4)}
যখন x এর মান
x => 1; { y = 19.2 * 1 + (-22.4)} = -3.2
x => 2; { y = 19.2 * 2 + (-22.4)} = 16
x => 3; { y = 19.2 * 3 + (-22.4)} = 35.2
x => 4; { y = 19.2 * 4 + (-22.4)} = 54.4
x => 5; { y = 19.2 * 5 + (-22.4)} = 73.6

কাজ কিন্তু গুছিয়ে এনেছি আমরা। x এর সাথে y এর নতুন ভ্যালু পেয়েছি এখানে। নতুন ভ্যালুগুলো প্লট করি বরং।

লিস্ট স্কয়ার রিগ্রেশন y এর নতুন মান দিয়ে প্লট করে নতুন লাইন

আগের লাইনটাকে ফিরে নিয়ে আসি। কী দেখলেন? অনেক এরর। নতুন লাইনে কমে গেছে অনেক এরর।

আমরা যেটা দেখছি, এই নতুন ভ্যালুগুলো কিন্তু আসল বাঁকা লাইনটার কাছাকাছি। আবার আগের শুরুর পয়েন্ট থেকে শেষ পয়েন্ট পর্যন্ত আরেকটা সোজা লাইনের বেশ কাছাকাছি চলে এসেছে নতুন লাইন। দূরত্ব কম মানে, কম এরর।

x ভ্যালু

y ভ্যালু

আসল ভ্যালু

এরর

স্কয়ার এরর

1

4

4

0

0

2

12

23

-11

121