একটি মেশিন লার্নিং মডেলকে প্রশিক্ষণ দেওয়ার সময়, এমন সম্ভাবনা থাকতে পারে যে আমাদের মডেল প্রশিক্ষণ সেটে সঠিকভাবে কাজ করে কিন্তু পরীক্ষার ডেটাতে খারাপভাবে কাজ করে।
এই ক্ষেত্রে, আমাদের ওভারফিটিং নিয়ে সমস্যা হয়; আসলে, ওভারফিটিং তখন ঘটে যখন আমাদের মেশিন লার্নিং মডেল প্রদত্ত ডেটাসেটে উপস্থিত প্রয়োজনীয় ডেটা পয়েন্টের চেয়ে সমস্ত ডেটা পয়েন্ট (বা তার বেশি) কভার করার চেষ্টা করে। এর কারণে, মডেলটি ডেটাসেটে উপস্থিত শব্দ এবং ভুল মানগুলি ক্যাশ করতে শুরু করে এবং এই সমস্ত কারণগুলি মডেলের দক্ষতা এবং নির্ভুলতা হ্রাস করে। নিচের বিষয়গুলো শুরুর দিকের শিক্ষার্থীদের জন্য সহজভাবে উদাহরণসহ আলোচনা করা হলো:
রেগুলারাইজেশন (Regularization): মডেলের ওভারফিটিং কমানোর কৌশল (Reduce Overfitting in Models)
মেশিন লার্নিংয়ে, আমরা এমন মডেল তৈরি করি যা ডেটা থেকে শিখে এবং নতুন ডেটা অনুমান (predict) করতে পারে। কিন্তু কখনও কখনও মডেল ট্রেনিং ডেটার সাথে এতটাই “মুখস্থ” করে ফেলে যে নতুন, unseen ডেটার ক্ষেত্রে ভালো পারফর্ম করতে পারে না। এই সমস্যাকে ওভারফিটিং (Overfitting) বলে। রেগুলারাইজেশন হলো ওভারফিটিং কমানোর এবং মডেলকে আরও সাধারণ (generalize) করার একটি শক্তিশালী কৌশল।
সাধারণ লিনিয়ার রিগ্রেশন মডেলে, আমরা একটি সরলরেখা ফিট করি যা ট্রেনিং ডেটা পয়েন্টগুলোর সবচেয়ে কাছাকাছি থাকে। সমীকরণটি হলো:
এখানে, গুলো হলো মডেলের কোয়েফিশিয়েন্ট (coefficients) বা ওজন (weights)। ওভারফিটিং ঘটে যখন এই কোয়েফিশিয়েন্টগুলোর মান খুব বড় হয়ে যায়, যার ফলে মডেল ট্রেনিং ডেটার নয়েজও শিখে ফেলে। রেগুলারাইজেশন এই কোয়েফিশিয়েন্টগুলোর মানকে ছোট করে বা কিছু কোয়েফিশিয়েন্টকে শূন্য করে মডেলকে সরল করে।
রেগুলারাইজেশনের পরিচিতি (Introduction to Regularization)
রেগুলারাইজেশন ডেটা সায়েন্স এবং মেশিন লার্নিং-এ ব্যবহৃত একটি কৌশল যা মডেলকে ওভারফিটিং থেকে রক্ষা করে। এটি মডেলের জটিলতা (complexity) হ্রাস করে, বিশেষ করে যখন ডেটাসেটে প্রচুর ফিচার (features) থাকে অথবা ফিচারগুলোর মধ্যে খুব বেশি পারস্পরিক সম্পর্ক থাকে।
কেন রেগুলারাইজেশন প্রয়োজন? যখন একটি মডেল ট্রেনিং ডেটার উপর খুব ভালো পারফর্ম করে কিন্তু টেস্ট ডেটার উপর খারাপ পারফর্ম করে, তখন আমরা বলি মডেলটি ওভারফিট করেছে। ওভারফিটিং মানে মডেল ডেটার ভেতরের “নয়েজ” বা বিশৃঙ্খলাকেও শিখে ফেলেছে, যা নতুন ডেটার ক্ষেত্রে অপ্রাসঙ্গিক। রেগুলারাইজেশন মডেলের কোয়েফিশিয়েন্টগুলোকে “শাস্তি” (penalize) দিয়ে এই সমস্যা সমাধান করে, যার ফলে মডেলের জটিলতা কমে এবং এটি নতুন ডেটার উপর আরও ভালো পারফর্ম করে।
রিজ রিগ্রেশন এবং L2 পেনাল্টি (Ridge Regression and L2 Penalty)
রিজ রিগ্রেশন (Ridge Regression) হলো লিনিয়ার রিগ্রেশনের একটি রূপ যেখানে L2 পেনাল্টি যোগ করা হয়। এটি মডেলের কোয়েফিশিয়েন্টগুলোর বর্গের সমষ্টিকে (sum of squared coefficients) মোট লস ফাংশনের সাথে যোগ করে।
লিনিয়ার রিগ্রেশনের লস ফাংশন (সাধারণত মিন স্কোয়ারড এরর – MSE) হলো:
রিজ রিগ্রেশনে, এই MSE এর সাথে একটি পেনাল্টি টার্ম যোগ করা হয়:
এখানে:
- (ল্যাম্বডা) একটি রেগুলারাইজেশন প্যারামিটার (hyperparameter) যা পেনাল্টির শক্তি নিয়ন্ত্রণ করে। এর মান যত বেশি হবে, কোয়েফিশিয়েন্টগুলো তত বেশি ছোট হবে।
- হলো সকল কোয়েফিশিয়েন্টের বর্গের সমষ্টি (intercept বাদে)।
L2 পেনাল্টির প্রভাব: L2 পেনাল্টি কোয়েফিশিয়েন্টগুলোকে শূন্যের কাছাকাছি নিয়ে আসে, কিন্তু সম্পূর্ণরূপে শূন্য করে না। এর অর্থ হলো, এটি সমস্ত ফিচারকে মডেলে রাখে কিন্তু তাদের প্রভাব কমিয়ে দেয়। এটি মাল্টিকোলিনিয়ারিটি (multicollinearity) অর্থাৎ যখন স্বাধীন ভেরিয়েবলগুলোর মধ্যে উচ্চ সম্পর্ক থাকে, তখন খুব কার্যকর।
উদাহরণ (পাইথন কোড):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
from sklearn.linear_model import Ridge from sklearn.model_selection import train_test_split from sklearn.metrics import mean_squared_error import numpy as np import matplotlib.pyplot as plt # ডেটা তৈরি (উদাহরণস্বরূপ) np.random.seed(0) X = np.random.rand(100, 10) # 100 টি নমুনা, 10 টি ফিচার true_coefs = np.array([1.5, -2.0, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]) # কিছু কোয়েফিশিয়েন্ট শূন্য y = X @ true_coefs + np.random.normal(0, 0.5, 100) # y = X*beta + noise # ট্রেনিং এবং টেস্ট ডেটা ভাগ করা X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) # রিজ মডেল তৈরি ও প্রশিক্ষণ (lambda বা alpha = 1.0) ridge_model = Ridge(alpha=1.0) ridge_model.fit(X_train, y_train) # কোয়েফিশিয়েন্টগুলো দেখা print("রিজ রিগ্রেশনের কোয়েফিশিয়েন্ট (alpha=1.0):") print(np.round(ridge_model.coef_, 2)) print(f"ট্রেনিং MSE: {mean_squared_error(y_train, ridge_model.predict(X_train)):.2f}") print(f"টেস্ট MSE: {mean_squared_error(y_test, ridge_model.predict(X_test)):.2f}") # বিভিন্ন আলফা মানের জন্য কোয়েফিশিয়েন্ট কিভাবে পরিবর্তিত হয় তা দেখানো alphas = np.logspace(-4, 2, 100) # আলফা মানের একটি রেঞ্জ coefs = [] for a in alphas: ridge = Ridge(alpha=a, max_iter=10000) ridge.fit(X_train, y_train) coefs.append(ridge.coef_) plt.figure(figsize=(10, 6)) plt.plot(alphas, coefs) plt.xscale('log') plt.xlabel('আলফা মান (লগ স্কেল)') plt.ylabel('কোয়েফিশিয়েন্ট মান') plt.title('বিভিন্ন আলফা মানের জন্য রিজ কোয়েফিশিয়েন্ট') plt.legend([f'Feature {i+1}' for i in range(X.shape[1])]) plt.grid(True) plt.show() |
প্লটটি দেখাবে যে (ল্যাম্বডা) এর মান বাড়ার সাথে সাথে কোয়েফিশিয়েন্টগুলো কীভাবে শূন্যের কাছাকাছি আসে কিন্তু সম্পূর্ণরূপে শূন্য হয় না।
ল্যাসো রিগ্রেশন এবং L1 পেনাল্টি (Lasso Regression and L1 Penalty)
ল্যাসো রিগ্রেশন (Lasso Regression – Least Absolute Shrinkage and Selection Operator) হলো লিনিয়ার রিগ্রেশনের আরেকটি রূপ যেখানে L1 পেনাল্টি যোগ করা হয়। এটি মডেলের কোয়েফিশিয়েন্টগুলোর পরম মানের সমষ্টিকে (sum of absolute values of coefficients) মোট লস ফাংশনের সাথে যোগ করে।
এখানে:
- (ল্যাম্বডা) রিজ রিগ্রেশনের মতোই রেগুলারাইজেশন প্যারামিটার।
- হলো সকল কোয়েফিশিয়েন্টের পরম মানের সমষ্টি।
L1 পেনাল্টির প্রভাব: L1 পেনাল্টি কোয়েফিশিয়েন্টগুলোকে সম্পূর্ণরূপে শূন্য করতে পারে, যা ফিচার নির্বাচন (feature selection) করতে সাহায্য করে। যেসব ফিচারের মডেলে খুব কম বা কোনো প্রভাব নেই, ল্যাসো তাদের কোয়েফিশিয়েন্ট শূন্য করে দেয়, যার ফলে মডেলটি আরও সরল হয় এবং কম গুরুত্বপূর্ণ ফিচার বাদ পড়ে যায়।
উদাহরণ (পাইথন কোড):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
from sklearn.linear_model import Lasso # ল্যাসো মডেল তৈরি ও প্রশিক্ষণ (lambda বা alpha = 0.1) lasso_model = Lasso(alpha=0.1, max_iter=10000) # max_iter সেট করা হয়েছে কনভার্জেন্স নিশ্চিত করতে lasso_model.fit(X_train, y_train) # কোয়েফিশিয়েন্টগুলো দেখা print("\nল্যাসো রিগ্রেশনের কোয়েফিশিয়েন্ট (alpha=0.1):") print(np.round(lasso_model.coef_, 2)) print(f"ট্রেনিং MSE: {mean_squared_error(y_train, lasso_model.predict(X_train)):.2f}") print(f"টেস্ট MSE: {mean_squared_error(y_test, lasso_model.predict(X_test)):.2f}") # বিভিন্ন আলফা মানের জন্য কোয়েফিশিয়েন্ট কিভাবে পরিবর্তিত হয় তা দেখানো alphas_lasso = np.logspace(-4, 2, 100) coefs_lasso = [] for a in alphas_lasso: lasso = Lasso(alpha=a, max_iter=10000) lasso.fit(X_train, y_train) coefs_lasso.append(lasso.coef_) plt.figure(figsize=(10, 6)) plt.plot(alphas_lasso, coefs_lasso) plt.xscale('log') plt.xlabel('আলফা মান (লগ স্কেল)') plt.ylabel('কোয়েফিশিয়েন্ট মান') plt.title('বিভিন্ন আলফা মানের জন্য ল্যাসো কোয়েফিশিয়েন্ট') plt.legend([f'Feature {i+1}' for i in range(X.shape[1])]) plt.grid(True) plt.show() |
আমি ইতিমধ্যেই লিনিয়ার রিগ্রেশন নিয়ে একটি বিস্তারিত পোস্ট তৈরি করেছি। আপনার বর্তমান অনুরোধটি একটি নতুন বিষয় নিয়ে, “regularization”। আমি এই বিষয়ে একটি বিস্তারিত পোস্ট তৈরি করছি, যা শুরুর দিকের শিক্ষার্থীদের জন্য সহজ হবে এবং এতে পাইথন উদাহরণও থাকবে।
Leave a Comment