অ্যাডাপ্টিভ বুস্টিং

বুস্টিং হচ্ছে বিশেষ ধরনের এনসেম্বেল লার্নিং অ্যালগোরিদম, যার মাধ্যমে উয়িক লার্নার থেকে স্ট্রং লার্নার তৈরি করা হয়। নিচের ছবিটির দিকে লক্ষ্য করুন, কয়েকটি বিড়াল এবং কুকুরের ছবি দেয়া আছে। মনে করুন আপনি একটি বুস্টিং মডেল তৈরি করবেন যার কাজ হচ্ছে বিড়াল এবং কুকুরকে আলাদা ভাবে সনাক্ত করা। আপনার মডেলে অনেকগুলো ছোট ছোট বৈশিষ্ট্য থাকতে পারে, যেমন ধরুন বিড়ালে কান ছোট বা কুকুরের মুখ লম্বা ইত্যাদি। এগুলোর যেকোনো একটি ব্যবহার করেও আপনি বিড়াল এবং কুকুরকে সনাক্ত করতে পারবেন, কিন্তু সমস্যা হোল এই বৈশিষ্ট্য গুলো আলাদা আলাদা ভাবে খুব বেশী নির্ভুল মডেল তৈরি করতে পারবে না। বাস্তবে দেখা যাবে কোন কোন প্রজাতির কুকুরের সাথে বিড়ালের কিছু বৈশিষ্ট্যের সাদৃশ্যটা রয়েছে আবার বিড়ালের কিছু বৈশিষ্ট্যের সাথেও কুকুরের সাদৃশ্যটা রয়েছে। এরকম ছোট ছোট বৈশিষ্ট্যকে আমরা বলছি উয়িক লার্নার । আলাদা আলাদা ভাবে এই উয়িক লার্নার গুলো খুব বেশী পারফরম্যান্স করতে পারেনা।
আমরা যদি সবগুলো উয়িক লার্নারকে একসাথে ব্যবহার করে সেটার মাধ্যমে শক্তিশালী লার্নার তৈরি করতে পারি সেক্ষেত্রে এই লার্নারটি দুর্দান্ত অ্যাকুরেসি দিতে সক্ষম হবে। সবগুলো উয়িক লার্নার ব্যবহার করে যে লার্নারটি তৈরি করা হয় স্ট্রং লার্নার
ছবি - উয়িক লার্নার এবং স্ট্রং লার্নার
এনসেম্বল লার্নিং- এনসেম্বল লার্নিং নিয়ে পূর্বে কিছুটা আলোচনা হয়েছে। এনসেম্বল লার্নিং-এর মাধ্যমে একাধিক উয়িক লার্নার ব্যবহার করে মডেলের পারফরম্যান্স বাড়ানো হয়। বুস্টিংও একধরনের এনসেম্বল লার্নিং। ( বিস্তারিত র‍্যান্ডম ফরেস্ট অধ্যায়ে দেখুন )
অ্যাডাপ্টিভ বুস্টিং যেভাবে কাজ করে
ছবি- অ্যাডাপ্টিভ বুস্টিং ( সূত্র- ইন্টারনেট )
  • অ্যাডাপ্টিভ বুস্টিং অ্যালগরিদম একাধিক উয়িক লার্নারের মাধ্যমে একটি স্ট্রং লার্নার তৈরি করে। এক্ষেত্রে প্রতিটি উয়িক লার্নার একই ইনপুট বা ট্রেইনিং সেট ব্যবহার করে থাকে। প্রাথমিক সকল ইনপুট বা ট্রেইনিং ডেটার জন্যই সমান ওয়েট দেয়া থাকে।
  • প্রথম উয়িক লার্নার তার প্রেডিকশনে যেসকল ভুল প্রিডিকশন করে থাকে সেগুলোর উপর অধিক গুরুত্ব ( বেশী ওয়েট ) দিয়ে পরবর্তী উয়িক লার্নারের কাছে হস্তান্তর করা হয় যাতে ভুল প্রিডিকশন গুলো ঠিক করা যায়।
  • এভাবে ২য় উয়িক লার্নার তার প্রিডিকশনে যে ভুল করে সেগুলোকে একই ভাবে অধিক গুরুত্ব ( বেশী ওয়েট ) দিয়ে পরবর্তী উয়িক লার্নারের কাছে হস্তান্তর করা হয়। যতক্ষণ না পর্যন্ত মিস-প্রিডিকশন গুলো মিনিমাইজ না হয় ততক্ষন পর্যন্ত একই পদ্ধতির পুনরাবৃত্তি চলতে থাকে।
  • পরিশেষে সবগুলো উয়িক লার্নারের মাধ্যমে একটি স্ট্রং লার্নার তৈরি হয়। যার মাধ্যমে প্রিডিকশন এরর সর্বনিম্ন করা হয়।
সুবিধা অসুবিধা
  • অ্যাডা বুস্ট ইমপ্লিমেন্ট করা অপেক্ষাকৃত সহজ এবং এর মাধ্যমে সহজেই স্ট্রং লার্নার তৈরি করা যায়। অ্যাডা বুস্টে সাধারনত মডেলে ওভারফিটিং সমস্যা সৃষ্টি করে না।
  • নয়েজি ডেটার ক্ষেত্রে এই অ্যালগরিদম অনেক সংবেদনশীল এবং ডেটায় আউটলায়ার থাকলে ফলাফল প্রভাবিত হয়। এক্সট্রিম গ্রাডিয়্যান্ট বুস্টিং অ্যালগরিদমের তুলনায় এটি অনেকটা ধীর গতির।
পাইথনে অ্যাডা বুস্টিং
পাইথনে অ্যাডা বুস্টিং করার জন্য আমরা আইরিস ডেটাসেটটি ব্যবহার করবো।
ডেটাসেটির বিস্তারিত দেখার জন্য লজিস্টিক রিগ্রেশনঃ মাল্টিনোমিয়াল অধ্যায়টি দেখুন।
প্রথমেই লাইব্রেরী ইমপোর্ট এবং ডেটাসেট লোড করে নিচ্ছি,
import pandas as pd
from sklearn.ensemble import AdaBoostClassifier
from sklearn.model_selection import train_test_split
from sklearn import metrics
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix,accuracy_score
url='https://raw.githubusercontent.com/FazlyRabbiBD/Data-Science-Book/master/data-iris.csv'
df=pd.read_csv(url)
এবার ফিচার এবং টার্গেট ভ্যারিয়েবল সেট করে নেব,
features=['sepal_length','sepal_width','petal_length','petal_width']
X=df[features]
y=df.species
এখন টেস্ট এর জন্য ৩০% ডেটা রেখে বাকি ডেটা দিয়ে মডেল ট্রেইন করবো,
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
AdaModel = AdaBoostClassifier(n_estimators=150,learning_rate=1)
model = AdaModel.fit(X_train, y_train)
  • n_estimators: উয়িক লার্নার এর সংখ্যা
  • learning_rate: উয়িক লার্নারে অ্যাসাইন করা ওয়েট যার ডিফল্ট ভ্যালু সাধারনত ১
আমাদের মডেল এখন তৈরি। এবার অ্যাকুরেসি চেক করার পালা।
predictions = AdaModel.predict(X_test)
print('Classification Report:\n',classification_report(y_test, predictions))
print('Accuracy Score:',accuracy_score(y_test, predictions))
বুস্টিং এর আরেকটি গুরুত্বপূর্ণ ফাংশন হচ্ছে ' ফিচার ইম্পরট্যান্স ' , এই ফাংশনের মাধ্যমে মডেলের জন্য কোন ফিচার ভ্যারিয়েবল গুলো বেশী গুরুত্বপূর্ণ সেটা জানা যায়। এই পদ্ধতিতে কোন ফিচার ব্যবহারে ইমপিওরিটি কমে সেটা হিসাব করা হয় এবং সেই ফিচার গুলোকেই বেশী গুরুত্ব দেয়া হয়।
import matplotlib.pyplot as plt
%matplotlib inline
# Plot feature importance
feature_importance = AdaModel.feature_importances_
# make importances relative to max importance
feature_importance = 100.0 * (feature_importance / feature_importance.max())
sorted_idx = np.argsort(feature_importance)
pos = np.arange(sorted_idx.shape[0]) + .5
plt.barh(pos, feature_importance[sorted_idx], align='center')
plt.yticks(pos,X.columns[sorted_idx])
plt.xlabel('Relative Importance')
plt.title('Variable Importance')
plt.show()
অ্যাডা বুস্ট ডিসিশন ট্রি-কে বাই ডিফল্ট মডেল হিসাবে ব্যবহার করে, তবে আমরা চাইলে অন্য কোন মডেলকে ব্যবহার করেও বুস্টিং করতে পারি। নিচের কোডে দেখানো হয়েছে সাপোর্ট ভেক্টর মেশিন মডেলকে ব্যবহার করে কিভাবে বুস্টিং করা যায়।
from sklearn.svm import SVC
#Import scikit-learn metrics module for accuracy calculation
from sklearn import metrics
svc=SVC(probability=True, kernel='linear')
# Create adaboost classifer object
abcSV =AdaBoostClassifier(n_estimators=100, base_estimator=svc,learning_rate=1)
modelSVC = abcSV.fit(X_train, y_train)
predictionsSVM = modelSVC.predict(X_test)
print('Classification Report:\n',classification_report(y_test, predictionsSVM))
print('Accuracy Score:',accuracy_score(y_test, predictionsSVM))
আমরা আগেই বলেছি অ্যাডা বুস্টকে ক্লাসিফিকেশন এবং রিগ্রেশন উভয় ধরনের সমস্যার জন্যই প্রয়োগ করা যায়। রিগ্রেশন করতে হলে AdaBoostRegressor() ফাংশনটি ব্যবহার করতে হবে।