লিনিয়ার রিগ্রেশন

রিগ্রেশন কি ?

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

  • ইউনিভ্যারিয়েট রিগ্রেশন - রিগ্রেশন মডেলে ফিচার ভ্যারিয়েবলের সংখ্যা যদি একটি হয় সেটি হচ্ছে ইউনিভ্যারিয়েট রিগ্রেশন। এধরনের রিগ্রেশনকে সিম্পল রিগ্রেশনও বলা হয়।

  • মাল্টিভ্যারিয়েট রিগ্রেশন - মাল্টিভ্যারিয়েট রিগ্রেশনে ফিচার ভ্যারিয়েবলের সংখ্যা একাধিক হয়ে থাকে। আমারা একটু আগে যে উদাহরণটি দিয়েছি সেখানে ফিচার ভ্যারিয়েবলের সংখ্যা একাধিক ছিল, তাই সেটি একটি মাল্টিভ্যারিয়েট রিগ্রেশন প্রবলেম।

ধরুন আপনার কাছে কিছু মানুষের ওজন-উচ্চতার ডেটা রয়েছে । এই ডেটাসেট ব্যবহার করে আপনি একটি মডেল তৈরি করতে চান সেখানে ফিচার ভ্যারিয়েবল ওজন এবং টার্গেট ভ্যারিয়েবল হোল উচ্চতা। অর্থাৎ আপনি অজানা কোন ব্যক্তির ওজন ইনপুট দিয়ে তার উচ্চতা কত সেটা প্রিডিক্ট করতে চান। এই ডেটাগুলো নিয়ে সিম্পল লিনিয়ার রিগ্রেশন করলে নিচের ছবির মত একটি প্লট পাওয়া যাবে। এই প্লটে আমরা দেখছি ওজন বাড়ার সাথে সাথে উচ্চতাও বাড়ছে। অর্থাৎ এখান থেকে আমরা যে সহজ বিষয়টি বুঝতে পেড়েছি সেটি হচ্ছে যাদের ওজন বেশী তাদের উচ্চতাও সাধারনত বেশী, আবার যাদের ওজন কম তাদের উচ্চতাও সাধারনত কম।

রিগ্রেশন প্লটে যে ডট চিহ্ন দেয়া রয়েছে সেগুলো হচ্ছে আমাদের ডেটাগুলোর অবস্থান। এখন আমরা এমন একটি লাইন টানি যে লাইনটি মোটামুটি সব ডটকেই স্পর্শ করার চেষ্টা করবে বা ডটগুলোর আশপাশ দিয়ে যাবার চেষ্টা করবে , তাহলে সেই লাইনটিকে আমরা বলবো 'রিগ্রেশন লাইন' । এই রিগ্রেশন লাইন Y অক্ষকে যেই স্থানে ছেদ করে তাকে বলা হয় ইন্টারসেপ্ট। এই ইন্টারসেপ্ট মানে হচ্ছে নূন্যতম মান, মনে করুন একজন মানুষ যত খাটো হোক না কেন তার একটি মিনিমাম উচ্চতা থাকবে, ধরে নিন একজন মানুষের নূন্যতম উচ্চতা ২.৫ ফুট। অর্থাৎ আমাদের মডেলের অন্যান্য ভ্যারিয়েবলের মান শূন্য হলেও আউটপুট অন্তত ২.৫ ফুট হবে। আপনি মডেলে যদি ইনপুট হিসাবে ওজনের মান শূন্যও দেন সেক্ষেত্রেও আউটপুট হিসাবে এই ইন্টারসেপ্টের মান এর থেকে কম হবে না।

আমাদের রিগ্রেশন লাইন কিন্তু সবগুলো ডটকে স্পর্শ করতে পারেনি। রিগ্রেশন লাইন যত বেশী পয়েন্টকে স্পর্শ করতে পারবে মডেল ততো বেশী ভালো হবে। রিগ্রেশন লাইনের সাথে ডটগুলোর দূরত্বকে বলা হয় মডেলের এরর বা ভুল।

গানিতিক সমীকরন

নিচের সমীকরন দুটি যথাক্রমে ইউনিভ্যারিয়েট ও মাল্টিভ্যারিয়েট রিগ্রেশনের সমীকরন। সমীকরনে βo হচ্ছে ইন্টারসেপ্ট , ε হচ্ছে এরর এবং X1, X2....Xp হচ্ছে ফিচার ভ্যারিয়েবল(যেমন ইঞ্জিন সাইজ, সিলিন্ডারের সংখ্যা , ফুয়েল কনজাম্পশন ইত্যাদি ) । প্রত্যেকটি ফিচার ভ্যারিয়েবলের জন্য একটি করে কোএফিসিয়েন্ট বা সহগ থাকে, β1 ,β2 .....βp এগুলো হচ্ছে ফিচার ভ্যারিয়েবলগুলোর কোএফিসিয়েন্ট বা সহগ। Y হচ্ছে টার্গেট ভ্যারিয়েবল , আমাদের মডেলে Y হচ্ছে কার্বন-ডাই-অক্সাইড ইমিশন ।

কোএফিসিয়েন্ট নির্ণয়

কোএফিসিয়েন্ট নির্ণয়ের জন্য আমরা নিচের অংকটুক করবো। নিচের উদাহরণে আমরা দেখিয়েছি ইউনিভ্যারিয়েট বা সিম্পল লিনিয়ার রিগ্রেশনের জন্য কিভাবে কোএফিসিয়েন্ট নির্ণয় করতে হয়। নিচের গানিতিক সমীকরণ প্রয়োগের মাধ্যমে আমরা দেখতে পাই কিভাবে এটি নির্ণয় করতে হয়। বাস্তবে পাইথনের মাধ্যমেই আমরা সবটুকু করবো, এর পেছনের গানিতিক কাঠামোর ধারনা পাবার জন্যই এই অংশটুকুর অবতারনা।

এরর নির্ণয়

আমাদের মডেল টেস্ট ডেটার ফিচার ভ্যারিয়েবলকে ইনপুট হিসাবে নিয়ে যা প্রিডিক্ট করবে সেই ফলাফলের সাথে টেস্ট ডেটার অরিজিনাল ভ্যালুর যে পার্থক্য সেটাই এরর। নিচে আমরা মিন এবস্যুলেট এরর নির্ণয়ের একটি পদ্ধতি দেখবো। যে মডেলে এরর কম হবে সেই মডেলটি তত বেশী ভালো হবে।

এরর নির্ণয়ের আরও কিছু পদ্ধতি আছে, আমরা এসব ইকুয়েশনের সাথে শুধুই পরিচিত হবো, বাস্তবে সব কাজ পাইথনই করে দিবে, আমরা শুধু ব্যাকগ্রাউন্ডটা জানবো।

  • Mean Absolute Error (MAE) - এররের Absolute মানের গড়

  • Mean Squared Error ( MSE) - এররের বর্গের গড় মান

  • Root Mean Squared Error (RMSE) - MSE এর বর্গমূল

  • Relative Absolute Error (RAE) - এররের Absolute এর অনুপাত

  • Relative Squared Error (RSE)- এররের Absolute এর বর্গের অনুপাত

  • R Squared Error- 1-RSE

লিনিয়ার রিগ্রেশনের কিছু বৈশিষ্ট্য

  • লিনিয়ারলি সেপারেটেবল ডেটাসেটের জন্য রিগ্রেশন একটি চমৎকার অ্যালগরিদম । এটি ইমপ্লিমেন্ট করা এবং এর ফলাফল ইন্টারপ্রেট করাও সহজ।

  • ডাইমেনশনালিটি রিডাকশন , ক্রস ভ্যালেইডেশন ইত্যাদি পদ্ধতির মাধ্যমে মডেলের ওভারফিটিং সমস্যা সহজেই দূর করা যায়।

  • বাস্তব দুনিয়ার অনেক ডেটাসেটই নন-লিনিয়ার হয়ে থাকে, এসকল ক্ষেত্রে লিনিয়ার রিগ্রেশন প্রযোজ্য নয় , এক্ষেত্রে নন-লিনিয়ার রিগ্রেশন ব্যবহার করতে হবে।

  • ডেটাসেটে অবজারভেশনের সংখ্যা যদি ফিচারের তুলনায় কম হয়ে থাকে সেক্ষেত্রে লিনিয়ার রিগ্রেশন কার্যকরী নয় এবং এক্ষেত্রে মডেল ওভারফিট করতে পারে।

  • লিনিয়ার মডেল আউটলায়ার দ্বারা প্রভাবিত হয়।

  • ডেটাসেটে মাল্টিকলিনিয়ারেটি থাকলে , মডেলিং এর পূর্বেই তা দূর করে নিতে হয়।

গাড়ির কার্বন-ডাই-অক্সাইড ইমিশন প্রেডিকশন

ডেটাসেটের পরিচয়- আমরা রিগ্রেশনের প্রয়োগ দেখার জন্য যে ডেটাসেটটি ব্যবহার করবো সেটি একটি অটোমোবাইল ডেটাসেট , এখানে বিভিন্ন গাড়ির বিভিন্ন উপাত্ত এবং তাদের কার্বন-ডাই-অক্সাইড নির্গমনের উপাত্ত দেয়া আছে।

  • MODELYEAR - কোন বছরের মডেল

  • MAKE - প্রস্তুতকারি প্রতিষ্ঠান

  • MODEL - মডেল

  • VEHICLE CLASS - গাড়ির ধরন

  • ENGINE SIZE - ইঞ্জিন সাইজ

  • CYLINDERS - ইঞ্জিনে সিলিন্ডারের সংখ্যা

  • TRANSMISSION e.g. A6

  • FUEL CONSUMPTION in CITY(L/100 km)- শহরে চলাকালিন সময়ে ফুয়েল কনজাম্পশন বা প্রতি লিটারে কত কিমি চলেতে পারে

  • FUEL CONSUMPTION in HWY (L/100 km) - হাইওয়েতে চলাকালিন সময়ে ফুয়েল কনজাম্পশন বা প্রতি লিটারে কত কিমি চলতে পারে

  • FUEL CONSUMPTION COMB (L/100 km) - কম্বাইন্ড ফুয়েল কনজাম্পশন

  • CO2 EMISSIONS (g/km) - কার্বন-ডাই-অক্সাইড নির্গমন

প্রথমেই আমরা প্রয়োজনীয় লাইব্রেরী ইমপোর্ট এবং ডেটাসেট লোড করে নিচ্ছি,

import pandas as pd
import numpy as np
import sklearn as sk
import sklearn.metrics as skl
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn import metrics
from sklearn.metrics import classification_report
from sklearn.metrics import r2_score

import statsmodels.api as sm
import statsmodels.formula.api as smf

url='https://raw.githubusercontent.com/FazlyRabbiBD/Data-Science-Book/master/data-fuel-consumption.csv'
df = pd.read_csv(url)
df.head()

আমাদের ডেটাসেটটি দেখতে অনেকটা এরকম

আমাদের ডেটাসেটে কিছু ক্যাটেগরিক্যাল ভ্যারিয়েবল রয়েছে , এগুলো হচ্ছে MODELYEAR, MAKE, MODEL,VEHICLECLASS,TRANSMISSION এবং FUELTYPE। ফিচার ইঞ্জিনিয়ারিং বা ট্রান্সফমেশন না করে লিনিয়ার মডেলে ক্যাটেগরিক্যাল ভ্যারিয়েবল রাখা অর্থবহুল নয়। এজন্য আমরা ফিচার ভ্যারিয়েবলে এগুলো নেব না। তবে এই ভ্যারিয়েবল সমূহকে ট্রান্সফরমেশনের মাধ্যমে উপযোগী করে মডেলে নেয়া যেতে পারে। অধ্যায়ের কলেবর ছোট রাখার জন্য সেটি করা হয়নি। তবে আপনারা চাইলে ডেটা ট্রান্সফমেশন অধ্যায় অনুসরন করে সেটি করতে পারবেন।

মেশিন লার্নিং এ যাবার আগেই স্ট্যাট মডেলের মাধ্যমে আমাদের মডেল সম্পর্কিত কিছু তথ্য আমরা জেনে নেবো। নিচের কোডের মাধ্যমে স্ট্যাট মডেল রান করলে আমরা OLS Regression Results পেয়ে যাবো, যার মাধ্যমে আমরা মডেল সম্পর্কে অনেক সিদ্ধান্ত নিতে পারবো।

statMDL=smf.ols('CO2EMISSIONS~ENGINESIZE+CYLINDERS+FUELCONSUMPTION_CITY+FUELCONSUMPTION_HWY+FUELCONSUMPTION_COMB+FUELCONSUMPTION_COMB_MPG', data= df).fit()
print(statMDL.summary())
  • R-squared- OLS Results এ R-squared মান 0.889 দেয়া আছে এর অর্থ আমাদের রিগ্রেশন লাইন প্রায় 88.9% ফিচার ভ্যারিয়বলকে টাচ করতে পারে অথবা 88.9% ফিট হয়। এটাকে অন্য ভাবেও বলা যায় টার্গেট ভ্যারিয়েবলের মানকে এই মডেলের মাধ্যমে 88.9 % ব্যখ্যা করা যায়।

  • Adj. R-squared- আমরা ইনপুট ভ্যারিয়েবলের সংখ্যা যত বাড়াতে থাকবো R-squared এর মান ততোই বাড়তে থাকবে। তবে সবসময় R-squared এর মান বাড়লেই যে মডেল আরও ভালো হতে থাকবে এমনটি নয়। আমরা যখন দেখবো নতুন কোন ফিচার ভ্যারিয়েবল যোগ করলে R-squared বাড়ে কিন্তু Adj. R-squared এর মান আগের মতই থেকে যায় অথবা Adj. R-squared এর মান R-squared চেয়ে ছোট হয় তখন বুঝতে হবে নতুন ভ্যারিয়েবল মডেলের পারফরম্যান্স প্রকৃতপক্ষে বাড়াবে না।

  • Prob (F-statistic)- Prob (F-statistic) এর মান যদি 0.05 এর থেকে বেশী হয় তবে আমাদের মডেলটি রিগ্রেশনের জন্য মটেই ভালো নয়। Prob (F-statistic) মান সবসময় 0.05 এর থেকে কম থাকা বাঞ্ছনীয়।

  • P>|t| - যেসকল কোএফিসিয়েন্টের P>|t| এর মান 0.05 এর থেকে বেশী , সেসকল কোএফিসিয়েন্ট সমূহ যেসকল ভ্যারিয়েবলের , ঐ সকল ভ্যারিয়েবল মডেলে তেমন কোন গুরুত্ব বহন করবে না। অর্থাৎ এদেরকে বাদ দেয়া যেতে পারে। আমাদের মডেলে FUELCONSUMPTION_CITY, FUELCONSUMPTION_HWY এবং FUELCONSUMPTION_COMB এর P>|t| এর মান 0.05 এর থেকে বড়, সুতরাং এরা আমাদের মডেলের জন্য গুরুত্বপূর্ণ নয়।

  • Df Model- মডেলে যে কয়টি ইন্ডিপেন্ডেন্ট / ফিচার ভ্যারিয়েবল ব্যবহার করা হয়েছে।

  • Dep. Variable- মডেলের ডিপেন্ডেন্ট / টার্গেট ভ্যারিয়েবল

আমরা OLS Regression Results অনুযায়ী গুরুত্বপূর্ণ ভ্যারিয়েবল সমূহের সমন্বয়ে ফিচার x এবং টার্গেট y সেট করে নেবো,

x = df[['ENGINESIZE','CYLINDERS','FUELCONSUMPTION_COMB_MPG']]
y = df['CO2EMISSIONS']

এবার টেস্ট এর জন্য ২৫% ডেটা রেখে বাকি ডেটা দিয়ে মডেল ট্রেইন করবো। আমরা এই মডেলের নাম দিয়েছি linreg ,

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25, random_state=5)
linreg = LinearRegression()
linreg.fit(x_train, y_train)

আমাদের মডেল এখন প্রিডিকশন করার জন্য প্রস্তুত। আমরা এখন টেস্ট ডেটাসেটের ফিচার অংশ ইনপুট হিসাবে দিয়ে মডেলকে প্রিডিকশন করতে দেব,

predictions = linreg.predict(x_test)

মডেল কতখানি নির্ভুল প্রিডিকশন করলো সেটাই সবথেকে গুরুত্বপূর্ণ। এবার অ্যাকুরেসি চেক করার পালা।

print('Coefficients:', linreg.coef_)
print('Intercept:', linreg.intercept_)
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 = linreg.score(x_test,y_test)
print('AccuracyII:',accuracy*100,'%')
print('R2:', r2_score(y_test, predictions))

আমরা দেখলাম আমাদের মডেল প্রায় ৮৮.৫৩% নির্ভুল ভাবে প্রিডিকশন করতে পেরেছে ! এছাড়াও এখানে দেয়া আছে আমাদের মডেলের ইন্টারসেপ্টের ভ্যালু এবং ভ্যারিয়েবল সমূহের কোএফিসিয়েন্টের মান কত।

আমরা চাইলে মডেল টেস্ট সেটের জন্য অ্যাাকুরেসি নির্ণয়ের পাশাপাশি ট্রেইনিং সেটের অ্যাকুরেসিও দেখতে পারি,

print("Train set Accuracy: ", r2_score(y_train, linreg.predict(x_train)))
print("Test set Accuracy: ", r2_score(y_test, predictions))

ওভারফিটিং - যখন কোন মডেল ট্রেইনিং সেটে দুর্দান্ত পারফরম্যান্স করে কিন্তু টেস্ট সেটে ডাব্বা মারে , এধরনের সমস্যা হোল ওভারফিটিং। মডেল ওভারফিট করলে ট্রেইনিং ডেটার প্যাটার্ন এর নাড়ী নক্ষত্র সব বুঝতে পারে, অনেকটা পরীক্ষার প্রশ্ন আগেই পেয়ে যাবার মত। এরপর যখন টেস্ট সেটের ডেটা পায় তখন যা আনকমন পরে সেগুলতেই গুলিয়ে ফেলে। ফলে পারফরম্যান্স হয় একেবারেই খারাপ।

এবার চলুন দেখে নেই, আমাদের মডেল টেস্ট ডেটায় যা প্রিডিকশন করলো তার রিগ্রেশন প্লট এঁকে ফেলি,

sns.regplot(x=y_test, y=predictions)

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

df2 = pd.DataFrame({'Actual': y_test, 'Predicted': predictions})

#actual vs predicted plot
df2.plot(kind='bar',figsize=(60,10))
plt.grid(which='major', linestyle='-', linewidth='0.5', color='green')
plt.grid(which='minor', linestyle=':', linewidth='0.5', color='black')
plt.show()

এবার প্রিডিকশনের পালা, মনেকরি একটি গাড়ির ENGINESIZE = 4, CYLINDERS= 4 এবং FUELCONSUMPTION_COMB_MPG=6 হলে CO2EMISSIONS কত হবে?

new_observation = [[4,4, 6]]
linreg.predict(new_observation)

array([348.55367627]) অর্থাৎ আমাদের মডেল প্রিডিক্ট করেছে এই গাড়িটির কার্বন-ডাই-অক্সাইড ইমিশন হবে 348.55367627 ইউনিট।

Last updated