গ্রাডিয়েন্ট বুস্টিং

গ্রাডিয়েন্ট বুস্টিং অ্যালগরিদমটিও সিকোয়েন্সিয়াল এনসেম্বল লার্নিং পদ্ধতি অনুসরন করে। এই পদ্ধতিতে লস অপটিমাইজেশনের মাধ্যমে ক্রমান্বয়ে উয়িক লার্নার গুলো তার আগের উয়িক লার্নারের তুলনায় ভালো হতে থাকে। উদাহরন হিসাবে বলা যেতে পারে ২য় উয়িক লার্নার ১ম টির চেয়ে ভালো হয়, আবার ৩য় উয়িক লার্নার ২য় টির চেয়ে ভালো হয়ে থাকে, এভাবে উয়িক লার্নারের পর্যায়ক্রম বৃদ্ধির সাথে সাথে মডেলে এররের পরিমান কমতে থাকে এবং মডেলটি শক্তিশালী লার্নারে পরিনত হয়। রিগ্রেশন ধরনের প্রবলেমের জন্য গ্রাডিয়েন্ট বুস্টিং অ্যালগরিদমটি অপেক্ষাকৃত ভালো কাজ করে থাকে।
ছবি- গ্রাডিয়েন্ট বুস্টিং ( সূত্র-ইন্টারনেট )
অ্যাডা বুস্টিং-এর সাথে গ্রাডিয়েন্ট বুস্টিং এর পার্থক্য হোল, অ্যাডা বুস্টে ভুল প্রিডিক্ট হাওয়া স্যাম্পলে অধিক ওয়েট আপডেট করে উয়িক লার্নারকে ক্রমান্বয়ে এরর কমিয়ে আনা হয়, অপরদিকে গ্রাডিয়েন্ট বুস্টিং-এ লস ফাংশনকে অপটিমাইজ করা হয়্‌ এর ফলে প্রতিটি উয়িক লার্নারে ক্রমান্বয়ে লস ফাংশন কমতে থাকে এবং এররের পরিমাণও কমতে থাকে। এই লস ফাংশন অপটিমাইজ করার জন্য প্রতিটি উয়িক লার্নার তার পরিবর্তী উয়িক লার্নারের মডেলে কিছুটা পরিবর্তন আনে যাতে পরবর্তী উয়িক লার্নারটি আগেরটির চেয়ে ভালো হয়।
গ্রাডিয়েন্ট বুস্টিং তাই ৩ টি উপাদানের সমন্বয়ে গঠিত,
  • উয়িক লার্নার
  • লস ফাংশন অপটিমাইজেশন
  • অ্যাডেটিভ মডেল
গ্রাডিয়েন্ট বুস্টিং এর কিছু বৈশিষ্ট্য
  • লস ফাংশন অপটিমাইজেশন এবং হাইপার প্যারামিটার টিউনিং এর কারনে অ্যালগরিদমটি তুলনামূলক ফ্লাক্সিবল।
  • ডেটা স্কেলিং এর প্রয়োজন হয় না এবং মিসিং ভ্যালু হ্যান্ডেল করতে পারে।
  • আউটলায়ার থাকলে মডেল ওভারফিট করতে পারে।
  • তুলনমূলক ভাবে বেশী সময় নেয় / ধীর গতির এবং অধিক মেমরির প্রয়োজন হয়।
পাইথনে গ্রাডিয়েন্ট বুস্টিং
প্রথমেই লাইব্রেরী ইমপোর্ট এবং ডেটাসেট লোড করে নিচ্ছি,
import pandas as pd
import numpy as np
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.model_selection import train_test_split
from sklearn import metrics
from sklearn.metrics import r2_score
from sklearn.metrics import mean_squared_error
from sklearn.metrics import mean_absolute_error
from sklearn.metrics import r2_score
import matplotlib.pyplot as plt
%matplotlib inline
url='https://raw.githubusercontent.com/FazlyRabbiBD/Data-Science-Book/master/data-fuel-consumption.csv'
df = pd.read_csv(url)
df.head()
আমরা গ্রাডিয়েন্ট বুস্টিং এর প্রয়োগ দেখার জন্য যে ডেটাসেটটি ব্যবহার করবো সেটি একটি অটোমোবাইল ডেটাসেট , এখানে বিভিন্ন গাড়ির বিভিন্ন উপাত্ত এবং তাদের কার্বন-ডাই-অক্সাইড নির্গমনের উপাত্ত দেয়া আছে। এই ডেটাসেটের ব্যবহার ইতোমধ্যে লিনিয়ার রিগ্রেশন অধ্যায়ে দেয়া হয়েছে। তাই এখানে ডেটাসেটের বর্ণনা পুনরায় করা হচ্ছে না।
এবার নিউম্যারিক্যাল ভ্যারিয়েবল সমূহকে আমরা ফিচার এবং টার্গেট ভ্যারিয়েবল হিসাবে সেট করে নেব,
X= df[[ 'ENGINESIZE', 'CYLINDERS', 'FUELCONSUMPTION_CITY','FUELCONSUMPTION_HWY', 'FUELCONSUMPTION_COMB', 'FUELCONSUMPTION_COMB_MPG']]
y = df['CO2EMISSIONS']
এখন টেস্ট এর জন্য ৩০% ডেটা রেখে বাকি ডেটা দিয়ে মডেল ট্রেইন করবো,
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.30)
আমরা আগেই আলোচনা করেছি, বিভিন্ন বুস্টিং অ্যালগোরিদম এর মাধ্যমে একই সাথে ক্লাসিফিকেশন এবং রিগ্রেশন উভয় ধরনের সমস্যার সমাধান করা যায়। এপর্যায়ে আমরা গ্রাডিয়েন্ট বুস্টিং এর মাধ্যমে রিগ্রেশন মডেল তৈরি করবো।
gradientregressor = GradientBoostingRegressor(n_estimators=100,learning_rate=1.0)
model = gradientregressor.fit(X_train, y_train)
predictions = model.predict(X_test)
মডেল কতখানি নির্ভুল প্রেডিকশন করলো সেটাই সবথেকে গুরুত্বপূর্ণ। এবার অ্যাকুরেসি চেক করার পালা।
print('MAE:', metrics.mean_absolute_error(y_test, predictions))
print('MSE:', metrics.mean_squared_error(y_test, predictions))
print('RMSE:', np.sqrt(metrics.mean_squared_error(y_test, predictions)))
accuracy = model.score(X_test,y_test)
print('AccuracyII:',accuracy*100,'%')
print('R2:', r2_score(y_test, predictions))
এই ডেটাসেটটি আমরা লিনিয়ার রিগ্রেশন অ্যালগরিদমে ব্যবহার করে প্রিডিকশনে ৮৮.৫৩% অ্যাকুরেসি পেয়েছিলাম। একই ডেটাসেটে আমরা গ্রাডিয়েন্ট বুস্টিং-এ অ্যাকুরেসি পেলাম ৯৩.৫০% অ্যাাকুরেসি। সুতরাং আমরা বুঝতে পাচ্ছি বুস্টিং অ্যালগোরিদম আসলেই পারফরম্যান্স বাড়ায় !
এবার ' ফিচার ইম্পরট্যান্স ' , এই ফাংশনের মাধ্যমে মডেলের জন্য কোন ফিচার ভ্যারিয়েবল গুলো বেশী গুরুত্বপূর্ণ সেটা জেনে নেয়া যাক ,
feature_importance = model.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()