মেশিন লার্নিং অ্যালগরিদম: লিনিয়ার রিগ্রেশন (Linear Regression)
লিনিয়ার রিগ্রেশন মূলত পরিসংখ্যানের একটি
পদ্ধতি। বর্তমানে এটি মেশিন লার্নিং অ্যালগরিদমগুলোর মধ্যে জনপ্রিয় একটি পদ্ধতি।
এই লেখাতে লিনিয়ার রিগ্রেশন কিভাবে কাজ করে এবং পাইথনে ম্যানুয়ালি কোড করে এটি
সম্পর্কে হাতে কলমে জানবো।
লিনিয়ার রিগ্রেশন বোঝার জন্য প্রথমে একটি ডেটাসেট নিই।
লিনিয়ার রিগ্রেশন বোঝার জন্য প্রথমে একটি ডেটাসেট নিই।
Year Advertising (million euro) Sales (million euro)
1 23 651
2 26 762
3 30 856
4 34 1,063
5 43 1,190
এই ডেটাসেটে কোন একটি প্রতিষ্ঠানের বিভিন্ন
বছরের বিজ্ঞাপনের খরচের ভিত্তিতে মোট বিক্রির তথ্য দেওয়া আছে। আমরা দেখতে পাই
প্রথম বছরে Advertising অর্থাৎ
বিজ্ঞাপনে খরচ হয়েছিল 23
মিলিয়ন ইউরো এবং Sales অর্থাৎ বিক্রি হয়েছে 651 মিলিয়ন ইউরো। দ্বিতীয় বছরে 26 মিলিয়ন ইউরো এবং বিক্রি হয়েছে 762 মিলিয়ন ইউরো। এভাবে পঞ্চম বছরে খরচ করেছে 43 মিলিয়ন ইউরো এবং বিক্রি হয়েছে 1,190 মিলিয়ন ইউরো।
এই ডেটাসেট দেখে স্পষ্ট বোঝা যাচ্ছে যে Advertising এ খরচের পরিমাণ
বৃদ্ধির সাথে Salesও
বৃদ্ধি পাচ্ছে। এ ধরনের প্রক্রিয়া হল লিনিয়ার রিগ্রেশন।
এখন যদি বলা হয়, Advertising- এ 39 মিলিয়ন
ইউরো বিনিয়োগ করলে Sale হতে পারে কত মিলিয়ন ইউরো?
আপাত দৃষ্টিতে বলতে পারি, সেটি হবে 1,063 মিলিয়ন ইউরো থেকে বেশি এবং 1,190 মিলিয়ন ইউরো থেকে কম। এই প্রেডিকশনটি লিনিয়ার
রিগ্রেশন সাহায্যে সাহায্যে বের করবো। তার আগে লিনিয়ার রিগ্রেশন সম্পর্কে ভালভাবে জেনে নেওয়া যাক।
আমরা Advertising কে x ভেরিয়েবল
হিসেবে ধরি এবং Sales কে y ভেরিয়েবল হিসেবে ধরে নিই। সুতরাং বলতে পারি x বৃদ্ধির সাথে সাথে y ও বৃদ্ধি পাচ্ছে। যেহুতু x এর
উপর নির্ভর করে y এর
পরিবর্তন হচ্ছে। কাজেই আমরা বলতে পারি এখানে x হল ইন্ডিপেনডেন্ট ভেরিয়েবল এবং y হল ডিপেনডেন্ড ভেরিয়েবল। এখন এই ডেটা গুলোকে যদি
প্লটিং করি তবে নিচের মত দেখাবে।
এখন, এই বিন্দুগুলোর মাঝে সহজ-সরল সম্পর্ক কি
হতে পারে? সেটি হল সরল রেখা। অর্থাৎ আমাদের এমন একটি সরলরেখা
বের করতে হবে যেটি দিয়ে বিন্দুগুলো সিদ্ধ হয়। কিন্তু আপনি যদি লক্ষ্য করেন তাহলে
দেখবেন আমাদের বিন্দু গুলো কিন্ত সরল অবস্থায় নাই বরং কিছুটা আঁকাবাঁকা অবস্থায়
আছে। কাজেই আমরা এই অবস্থায় শত চেষ্টা করলেও সকল বিন্দুগামী সরলরেখা
বের করতে পারবনা। সুতরাং আমাদের এমন একটা লাইন বের করার চেষ্টা করতে হবে যেটি দিয়ে
বিন্দু গুলোকে সবচেয়ে কাছাকাছি অবস্থায় ফিট করা যাবে। এই কথাটুকু হয়তো বোঝতে একটু
সমস্যা হতে পারে। সমস্যা নাই আরেকটু পরেই সব বোঝা যাবে।
আমাদের টার্গেট থাকবে এমন একটি সমীকরণ খুঁজে বের করা যা থেকে আমাদের সবগুলো ডেটা পয়েন্টের দুরুত্ব সর্বনিম্ন হয়। আমরা সরলরেখা নির্নয়ের সমীকরণ y = mx + c নিলাম। এখানে x হচ্ছে স্বাধীন চলক, y হচ্ছে x-এর ফাংশন এবং সমীকরণটি লিনিয়ার, কেননা স্বাধীন চলকের সর্বোচ্চ ঘাত 1।
এখন আমরা এই ফাংশনটিকে যদি এভাবে চিন্তা করি, যেটি কিনা হবে এইরকম, f(x) = y বা f(x) = mx + c
অর্থাৎ ফাংশনটিকে x- এর মান Advertising এর খরচ দিব, আর ফাংশনটি আমাদের আউটপুট দিবে y, যেটি কিনা Sales এর পরিমাণ। কি দারুন! আমরা তো এই জাদুর
ফাংশনটিই খুঁজছি তাই না? এটাকে মেশিন লার্নিংয়ের ভাষায়
হাইপোথিসিস (hypothesis) বলা
হয়।
এই সমীকরণে m হল ঢাল বা স্লপ, যেটি সরলরেখার দিক
নির্ধারণ করে। মানে, সেটি x- অক্ষের ধনাত্মক দিকের সাথে কত
ডিগ্রি কোণ করে আছে তার Tangent এর মানকে বোঝায়। আর c হল y- অক্ষের কর্তিত অংশ বা ইন্টারসেপ্ট (Intercept)- এর
মান, অর্থাৎ সরলরেখাটি y- অক্ষকে কোন বিন্দুতে ছেদ করেছে তার মান।
y = mx + c এই সমীকরণে বিভিন্ন ধরণের গাণিতিক ক্যালকুলেশন করে এমন একটা অবস্থায়
নিয়ে আসতে হবে যা দিয়ে সবগুলো বিন্দুর দুরুত্ব অন্য যেকোন সরলরেখা থেকে সবচেয়ে কম
হয়। আমরা যদি m ও c- এর জন্য এমন একটি মান পেয়ে যায় তাহলেই তো
কেল্লাফতে!
নিউমেরিকাল অ্যানালাইসিস পদ্ধতিতে সরলরেখার
সমীকরণের এই m ও c- এর মান ডেটাসেট থেকে সরাসরি পাওয়ার জন্য দুটি সুত্র আছে। সুত্র দুটি
নিম্নরূপ-
এখন আমরা ডেটাসেট থেকে মানগুলো বের করবো। বোঝার সুবিধার্থে
ডেটাসেটটি নিচের মত সাজিয়ে নিলাম।সুতরাং,
এখন আমরা m ও c- এর মান বের করতে পারি।
আমাদের অতি আখাঙ্ক্ষিত সমীকরণ y = mx + c হবে-
y = 27.55x + 44.84
এটিই আমাদের রিগ্রেশন লাইন বা বেস্ট ফিট লাইন।
এখন যদি এই সমীকরণে ডেটাসেট থেকে x এর বিভিন্ন মান বসিয়ে প্লটিং করি তাহলে এই ডেটাসেটের বেস্ট ফিট লাইন হবে নিচের মত-
এখন যদি এই সমীকরণে ডেটাসেট থেকে x এর বিভিন্ন মান বসিয়ে প্লটিং করি তাহলে এই ডেটাসেটের বেস্ট ফিট লাইন হবে নিচের মত-
আমরা যদি জাদুর ফাংশন f(x) = mx + c তে Advertising এর মান 39 অর্থাৎ x = 39 বসাই, তাহলেই আমাদের Sale- এর পরিমাণ পেয়ে যাব।
এখানে একটি প্রশ্ন থাকতে পারে। সেটি হল, আমরা x এর
মান অর্থাৎ হাইপোথিসিসের যে মান পেলাম নির্ভূলতা তথা accuracy কত? লিনিয়ার রিগ্রেশনে এটি নির্ণয়য়ের একটি পদ্ধতি আছে সেটি
হল R-Squared Value এর মান। R-Squared Value এর মান নির্ণয়য়ের একটি সুত্র আছে সেটি
হল নিম্নরূপ-
আমাদের সরলরেখার সমীকরণটি ছিল-
y = 27.55x + 44.84
y = 27.55x + 44.84
এখন এই সমীকরণ ব্যবহার করে x- এর বিভিন্ন মানের জন্য আমাদের লিনিয়ার
মডেলের প্রেডিকশন বের করে ফেলি।
x = 23, y
= 678.49
x = 26, y = 761.14
x = 30, y = 871.34
x = 34, y = 981.55
x = 43, y = 1229.49
x = 26, y = 761.14
x = 30, y = 871.34
x = 34, y = 981.55
x = 43, y = 1229.49
মানগুলো R-Squared Value- এর
সুত্রে বসাই,
= 0.95
অর্থাৎ, 95 % সঠিক। R-Squared Value এর মান যত বেশি আমাদের মডেলের কার্যকারিতা তত ভাল হবে। সুতরাং
আমরা বলতে আমাদের প্রেডিকশনটি মোটামুটি সঠিক।
এখন
পাইথনে কোড লিখব। পাইথনের সাইকিট লার্ন লাইব্রেরী ব্যবহার করে কয়েক লাইনে কোডটি লিখে ফেলা সম্ভব। তবে আমরা এখানে ম্যানুয়ালি কোডটি লিখব। কেননা এর ফলে লিনিয়ার রিগ্রেশন
কিভাবে কাজ করে তা বুঝতে সুবিধা হবে।
কোড বোঝার সুবিধার্থে কোডে সুত্রের বিভিন্ন মান নিচের মত করে লিখব।
ডেটা সেটের মান Advertising ও Sales যথাক্রমে train X এবং train Y হিসেবে চিহ্নিত করা হয়েছে। কেননা মেশিন লার্নিং এর
ভাষায় আমরা ডেটা দিয়ে মডেলকে ট্রেইনিং দিচ্ছি। অর্থাৎ ডেটাসেট হল train part। আর x test দ্বারা Advertising এর নতুন মান যেটা আমাদের ট্রেইনিং অংশে নাই তা নিব, যেমন
আমরা 43 নিতে পারি। এটি হল test part। তাহলে কোডটি লিখে ফেলা যাক।
def linear_regression(X, Y):
#
train_part
ln = len(X)
x_bar = sum(X) / ln
y_bar = sum(Y) / ln
x_bar = sum(X) / ln
y_bar = sum(Y) / ln
# xy_bar
i = 0
add = 0
for j in X:
r = j * Y[i]
add += r
i += 1
xy_bar = add / ln
i = 0
add = 0
for j in X:
r = j * Y[i]
add += r
i += 1
xy_bar = add / ln
x_bar_sqr = pow(x_bar, 2)
#x_sqr_bar
add = 0
for i in X:
r = i * i
add = add + r
x_sqr_bar = add / ln
add = 0
for i in X:
r = i * i
add = add + r
x_sqr_bar = add / ln
m =
((x_bar*y_bar)-(xy_bar)) / ((x_bar_sqr)-(x_sqr_bar))
c = y_bar - m*x_bar
c = y_bar - m*x_bar
print("\nx_bar = ", x_bar)
print("y_bar = ", y_bar)
print("xy_bar = ", xy_bar)
print("x_bar_sqr = ", x_bar_sqr)
print("x_sqr_bar = ", x_sqr_bar)
print("m = ", m)
print("c = ", c, '\n')
print("y_bar = ", y_bar)
print("xy_bar = ", xy_bar)
print("x_bar_sqr = ", x_bar_sqr)
print("x_sqr_bar = ", x_sqr_bar)
print("m = ", m)
print("c = ", c, '\n')
#test_part(x):
x = [int(a) for a in input("test x =
").split()]
print('test y = ')
i = 0
for j in x:
y = m * x[i] + c
print(y)
i += 1
print('test y = ')
i = 0
for j in x:
y = m * x[i] + c
print(y)
i += 1
# accuracy(R-Squared Value):
i = 0
sum1 = 0
for j in X:
y = m * X[i] + c
k = pow(y-y_bar, 2)
sum1 = sum1+k
i += 1
sum1 = 0
for j in X:
y = m * X[i] + c
k = pow(y-y_bar, 2)
sum1 = sum1+k
i += 1
i = 0
sum2 = 0
for j in Y:
l = Y[i]
n = pow(l-y_bar, 2)
sum2 += n
i += 1
sum2 = 0
for j in Y:
l = Y[i]
n = pow(l-y_bar, 2)
sum2 += n
i += 1
r_squared
= sum1 / sum2
print("accuracy = ", r_squared)
print("accuracy = ", r_squared)
# main function
if __name__ == "__main__":
X = [int(a) for a in input("train X = ").split()]
Y = [int(a) for a in input("train Y = ").split()]
m = 0
linear_regression(X, Y)
X = [int(a) for a in input("train X = ").split()]
Y = [int(a) for a in input("train Y = ").split()]
m = 0
linear_regression(X, Y)
কোডটি পাইথন শেলে রান করিয়ে ডেটাসেট থেকে train X ও train Y এর মান প্রবেশ করিয়ে x test এর মান 43 দিলে আউটপুট দেখাবে নিচের মত।
Thanks
ReplyDelete