নেইভ বেইজ ক্লাসিফায়ার

নেইভ বেইজ ক্লাসিফায়ার একটি ক্লাসিফিকেশন টাইপ মেশিন লার্নিং অ্যালগরিদম। এই অ্যালগরিদমটি মূলত বেইজ থিওরাম এর উপর ভিত্তি করে তৈরি হয়েছে যা ইতোপূর্বে এই বইয়ের প্রবাবিলিটি অংশে আলোচনা করা হয়েছে।
সহজ কথায় বেইজ থিওরাম হচ্ছে একটি ঘটনা (X) ঘটলে আরেকটি ঘটনা (Y) ঘটার প্রবাবিলিটি বের করার পদ্ধতি । যেমন আকাশে মেঘ দেখা গেলে বৃষ্টি হবার সম্ভাবনা। বেইজ থিওরামকে গানিতিক ভাবে এভাবে লেখা যায়,
উপরের সমীকরণটি একটি সরল বেইজ সমীকরন যা কেবল মাত্র একটি কন্ডিশনাল ইভেন্টের ক্ষেত্রে প্রবাবিলিটি নির্ণয়ে ব্যাবহার হয়। বাস্তব ক্ষেত্রে বেশিরভাগ ডেটাসেটই মাল্টিভেরিয়েট হয়ে থাকে , সেক্ষেত্রে সমীকরণটাও একটু জটিল হয়ে যায়। তখন আমরা সমীকরণটি এভাবে লিখতে পারি,
নেইভ বেইজ ক্লাসিফায়ার এর কিছু বৈশিষ্ট্য
  • এটি খুব সহজেই ইমপ্লিমেন্ট করা যায় এবং তুলনামূলক ভাবে দ্রুত কাজ করে।
  • ছোট ডেটাসেটের ক্ষেত্রেও ভালো কাজ করে।
  • অন্যান্য অ্যালগরিদমের তুলনায় অ্যাকুরেসি কিছুটা কম দেয়।
  • নেইভ বেইজে সকল এট্রিবিউটসকে মিউচুয়ালি ইন্ডিপেনডেন্ট ধরা হয় কিন্তু বাস্তব জগতে অনেক ঘটনার ক্ষেত্রেই এমনটি হয় না।
পাইথনে নেইভ বেইজ এর প্রয়োগ
পাইথনে নেইভ বেইজ এর প্রয়োগ দেখার জন্য আমরা ব্লাড গ্লুকোজ, ব্লাড প্রেশার এবং ডায়বেটিস আছে কি নেই এসকল ডেটা সংবলিত একটি ডেটাসেট ব্যাবহার করবো। এই ডেটা থেকে আমরা মেশিনকে ব্লাড গ্লুকোজ এবং ব্লাড প্রেশার এর মাধ্যমে ডায়বেটিস আছে কি নেই সেটা সনাক্ত করা শিখাব । এরপর আমরা আমাদের মডেলকে প্রেডিক্ট করতে দেব এবং এর অ্যাকুরেসি চেক করবো।
এজন্য প্রথমেই আমরা প্রয়োজনীয় লাইব্রেরী ইমপোর্ট করে নেব এবং ডেটাসেট লোড করে নেব।
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB
from sklearn import metrics
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix,accuracy_score
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt
import seaborn as sns
url='https://raw.githubusercontent.com/FazlyRabbiBD/Data-Science-Book/master/data-diabetes.csv'
df = pd.read_csv(url)
df.head()
আমাদের ডেটাসেটটি দেখতে অনেকটা এরকম,
ফিচার এবং টার্গেট ভ্যারিয়েবল আলাদা করে নেই,
features=['glucose','bloodpressure']
x=df[features]
y=df.diabetes
এবার টেস্ট এর জন্য ২৫% ডেটা রেখে বাকি ডেটা দিয়ে মডেল ট্রেইন করবো,
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25, random_state=5)
এবার গাউসিয়ান নেইভ বেইজ অ্যালগরিদম দ্বারা মডেল তৈরি করবো এবং ট্রেনিং ডেটা দ্বারা আমাদের মডেলকে ট্রেইন করবো,
model=GaussianNB()
model.fit(x_train,y_train)
এবার টেস্ট ডেটার ফিচার (x_test) ইনপুট দিয়ে ডায়বেটিস আছে কিনা সেটা প্রিডিক্ট কোরবো।
predictions = model.predict(x_test)
শুধুমাত্র predictions রান করলে আমরা এর ফলাফল অ্যারে আকারে দেখতে পাবো।
অ্যাকুরেসি নির্ণয়
সকল ধরনের ক্লাসিফিকেশন অ্যালগরিদম এর অ্যাকুরেসি নির্ণয় করা হয় কনফিউশন ম্যাট্রিক্স এর মাধ্যমে। কনফিউশন ম্যাট্রিক্স চার ধরনের ভ্যালুর সমন্বয়ে গঠিত হয়, এগুলো হোল,
  • ট্রু পজিটিভ- মডেল পজিটিভ হিসাবে প্রিডিক্ট করেছে এবং তা সঠিক, যেমন প্রেগন্যান্ট মহিলাকে প্রেগন্যান্ট হিসাবে প্রেডিক্ট করা।
  • ফলস পজিটিভ- মডেল পজিটিভ হিসাবে প্রিডিক্ট করেছে কিন্তু সেটা ভুল, যেমন একজন পুরুষকে প্রেগন্যান্ট হিসাবে প্রিডিক্ট করা।
  • ট্রু নেগেটিভ- মডেল নেগেটিভ হিসাবে প্রেডিক্ট করেছে এবং সেটা সঠিক , যেমন একজন পুরুষকে প্রেগন্যান্ট নয় হিসাবে প্রিডিক্ট করা।
  • ফলস নেগেটিভ - মডেল নেগেটিভ হিসাবে প্রিডিক্ট করেছে কিন্তু সেটা ভুল, যেমন একজন প্রেগন্যান্ট মহিলাকে , প্রেগন্যান্ট নয় এমন প্রিডিক্ট করা।
ছবি - কনফিউশন ম্যাট্রিক্স (সূত্র- ইন্টারনেট)
কনফিউশন ম্যাট্রিক্স এর False Positive কে বলা হয় Type 1 Error এবং False Negative কে বলা হয় Type 2 Error । কনফিউশন ম্যাট্রিক্স এর মাধ্যমে মডেলের অ্যাকুরেসি নির্ণয়ের জন্য কিছু পদ্ধতি অবলম্বন করা হয়। TP, TN, FP, FN এগুলো থেকেই মূলত মডেলের পারফরম্যান্স নির্ণয় করা হয়।
ছবি - কনফিউশন ম্যাট্রিক্স থেকে মডেলের পারফরম্যান্স নির্ণয় ( সূত্র - ইন্টারনেট )
  • Accuracy ((TP+TN)/Total)- ওভারঅল মডেল কতখানি সঠিক ভাবে প্রিডিক্ট করতে পারে।
  • Sensitivity/Recall (TP/(TP + FN))- পজিটিভকে পজিটিভ হিসাবে প্রিডিক্ট করতে পারার অনুপাত।
  • Precision ( TP/(TP+FP))- মডেলর সঠিক পজিটিভ অনুমান এবং মোট (সঠিক এবং ভুল) পজিটিভ অনুমানের অনুপাত।
  • Specificity (TN/(TN + FP))- নেগেটিভকে নেগেটিভ হিসাবে প্রিডিক্ট করতে পারার অনুপাত।
পাইথনের মাধ্যমে মডেলের পারফরম্যান্স নির্ণয়,
print('Classification Report:\n',classification_report(y_test, predictions))
print('Confusion Matrix:\n',confusion_matrix(y_test, predictions))
print('Accuracy Score:',accuracy_score(y_test, predictions))
print("Precision:",metrics.precision_score(y_test, predictions))
print("Recall:",metrics.recall_score(y_test,predictions ))
আমরা দেখতে পেলাম নেইভ বেইজ অ্যালগরিদম ৯৪.৩৭ % সঠিক ভাবে ব্লাড গ্লুকোজ এবং ব্লাড প্রেশারের উপর ভিত্তি করে ডায়বেটিস আছে কিনা সেটা প্রিডিক্ট করতে পারছে।
ধরুন আপনার ব্লাড গ্লুকোজ 40 এবং রক্ত চাপ 65 , চলুন দেখি আপনার ডায়বেটিস হবে কিনা ?
new_observation = [[40,65]]
model.predict(new_observation)
array([1])
মডেল বলছে আপনার ডায়বেটিস আছে !
নেইভ বেইজ ক্লাসিফায়ার বেশ কিছু ধরনের হতে পারে। আমরা যে ধরনের প্রবলেম সল্ভ করবো তার উপর ভিত্তি করেই ক্লাসিফায়ার নির্ধারণ করবো।
  • Multinational Naive Bayes: প্রেডিকশন ক্লাস একাধিক হলে ব্যাবহার করা হয়। যেমন ডকুমেন্ট ক্লাসিফিকেশন।
  • Bernoulli Naive Bayes: বুলিয়ান ভ্যারিয়েবল এর ক্ষেত্রে ব্যাবহার করা হয়।
  • Gaussian Naive Bayes: কন্টিনিউয়াস ভেরিয়েবল ফিচার হিসাবে থাকলে ব্যাবহার করা হয় ।