সাপোর্ট ভেক্টর মেশিন

সাপোর্ট ভেক্টর মেশিন অ্যালগরিদমটি ক্লাসিফিকেশন এবং রিগ্রেশন উভয় ধরনের সমস্যার ক্ষেত্রেই ব্যবহার করা যায়। তবে অপেক্ষাকৃত জটিল ধরনের ছোট বা মাঝারি ক্লাসিফিকেশন ডেটাসেটের জন্য এসভিএম বেশ জনপ্রিয়। এই অ্যালগরিদমে ডেটা পয়েন্টকে একটি হাইপারপ্লেইন এর মাধ্যমে আলাদা করা হয়, এক্ষেত্রে হাইপারপ্লেইনটি কেমন হবে সেটা কার্নেল এর মাধ্যমে নির্ধারণ করা হয়।
ছবি - সাপোর্ট ভেক্টর মেশিন ( সম্পাদিত )
সাপোর্ট ভেক্টর মেশিন এর বিভিন্ন উপাদান
  • সাপোর্ট ভেক্টরস- ডেটাসেটের বিভিন্ন ক্লাসের প্রান্ত দেশে থাকা ডেটা পয়েন্ট গুলো যা ক্লাসগুলোর মধ্যে পার্থক্য গড়ে দেয়, এমন ডেটাই হচ্ছে সাপোর্ট ভেক্টরস।
  • হাইপারপ্লেইন- হাইপারপ্লেইন হচ্ছে একটি সিদ্ধান্ত মূলক রেখা বা লাইন যা একাধিক শ্রেনির ডেটার ভেতরে পার্থক্য নির্ধারণ করে।
  • মার্জিন- মার্জিন হচ্ছে একাধিক শ্রেনির ডেটার ভেতরের দূরত্ব । মার্জিন নির্ধারণ করা হয় সাপোর্ট ভেক্টরের মধ্যকার দূরত্বের মাধ্যমে। দুইটি ক্লাসের ভেতরের মার্জিন যত বেশী হবে তাকে তত বেশী ভালো মার্জিন বলা হবে।
সাপোর্ট ভেক্টর মেশিন এর বিভিন্ন ধরনের কার্নেল
সাধারন স্কাটার প্লটে আমরা যদি একাধিক ভ্যারিয়েবলকে প্লট করি অনেক ক্ষেত্রেই সেই প্লটের মাধ্যমে দুই বা ততধিক ডেটা ক্লাসকে আলাদা করা যায় না। সাপোর্ট ভেক্টর মেশিন এর কার্নেল হচ্ছে একটি বিশেষ ধরনের কৌশল যা লোয়ার ডাইমেনশনাল ডেটা কে হাইয়ার ডাইমেনশনাল স্পেসে কনভার্ট করতে পারে এবং এর ফলে ক্লাসগুলোর মধ্যকার পার্থক্য স্পস্ট হয়।
  • লিনিয়ার কার্নেল- লিনিয়ার কার্নেল হচ্ছে একটি লিনিয়ার লাইন বা সরলরেখা যার মাধ্যমে ডেটাপয়েন্টকে আলাদা করা হয়।
  • পলিনমিয়াল কার্নেল - পলিনমিয়াল লাইন হচ্ছে নন-লিনিয়ার লাইন বা বক্ররেখা। অনেক ক্ষেত্রেই লিনিয়ার লাইনের মাধ্যমে ডেটাপয়েন্ট আলাদা করা যায় না এসব ক্ষেত্রে পলিনমিয়াল কার্নেল ব্যবহার করতে হয়।
  • রেডিয়াল বেসিস ফাংশন কার্নেল- রেডিয়াল বেসিস ফাংশনও একধরনের নন-লিনিয়ার ফাংশন। এই ফাংশনটিই সাপোর্ট ভেক্টর মেশিন এর সবথেকে জনপ্রিয় ফাংশন। এই কার্নেল কোন ইনপুটকে ইনফাইনাইট ডাইমেনশনাল স্পেসে ম্যাপ করতে পারে।
লিনিয়ার প্রবলেমের ক্ষেতে সাপোর্ট ভেক্টর মেশিন যেভাবে কাজ করে
প্রথমে একাধিক হাইপারপ্লেইন জেনারেট করা হয় , নিচের প্রথম ছবিতে ( বাম পাশে ) আমরা দেখতে পাচ্ছি ক্লাসিফিকেশনের জন্য তিনটি হাইপারপ্লেইন জেনারেট করা হয়েছে। এরপর প্রতিটি হাইপারপ্লেইনের ক্লাসিফিকেশন এরর ক্যালকুলেট করা হয়, দেখা হয় কোন হাইপারপ্লেইনের জন্য এরর সবথেকে কম এবং সেই হাইপারপ্লেইনটিকেই ক্লাসিফিকেশনের জন্য বাছাই করা হয়।
ছবি- সাপোর্ট ভেক্টর মেশিনের বিভিন্ন হাইপারপ্লেইন ( সম্পাদিত )
নন-লিনিয়ার প্রবলেমের ক্ষেতে সাপোর্ট ভেক্টর মেশিন যেভাবে কাজ করে
অনেক ডেটাসেটকেই ক্লাসিফিকেশনের জন্য লিনিয়ারলি সেপারেট করার মত অবস্থায় পাওয়া যাবে না , সেক্ষেত্রে নন-লিনিয়ার কার্নেল ডেটাকে হাইয়ার ডাইমেশনে ট্রান্সফরমেশন করে নেয় ফলে এটি ক্লাসিফিকেশনের উপযোগী হয়ে উঠে।
ছবি - নন লিনিয়ার সাপোর্ট ভেক্টর মেশিন ( সম্পাদিত )
সাপোর্ট ভেক্টর মেশিন এর কিছু বৈশিষ্ট্য
  • হাই ডাইমেনশনাল স্পেসের জন্য সাপোর্ট ভেক্টর মেশিন অত্যন্ত কার্যকরী।
  • এই অ্যালগরিদমটি তুলনামূলক কম মেমোরি ব্যবহার করে।
  • অনেক বড় ডেটাসেটের জন্য সাপোর্ট ভেক্টর মেশিন তেমন কার্যকরী নয়।
  • ডেটাসেটে ওভারল্যাপিং ক্লাস এবং নয়েজ থাকলে মডেল সহজেই প্রভাবিত হয়।
প্রথমেই লাইব্রেরী ইমপোর্ট এবং ডেটাসেট লোড করে নিচ্ছি,
import pandas as pd
import numpy as np
from sklearn import preprocessing
from sklearn.model_selection import train_test_split
%matplotlib inline
import matplotlib.pyplot as plt
from sklearn import svm
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-indian-liver-Patient.csv'
df = pd.read_csv(url)
df.head()
আমাদের জানামতে এই ডেটাসেটে কিছু নাল ভ্যালু রয়েছে, আসলেই সেটা আছে কিনা তা আমরা নিচের কোডের মাধ্যমে সহজেই জেনে নিতে পারি।
df.isnull().values.any()
True
এবার আমরা চাই নাল ভ্যালুগুলোকে দেখে নিতে,
null_columns=df.columns[df.isnull().any()]
print(df[df.isnull().any(axis=1)][null_columns].head())
আমরা এখন নাল ভ্যালু থাকা রো সমূহকে মুছে ফেলবো,
df.dropna(how='any', axis=0,inplace=True)
ডেটাসেটে জেন্ডার ভ্যারিয়েবলটি ক্যাটেগরিক্যাল , এটিকে ম্যাপ ফাংশন ব্যবহার করে প্রসেস করে নেব,
d = {'Female':1 , 'Male': 0}
df['Gender'] = df['Gender'].map(d)
এবার ফিচার এবং টার্গেট ভ্যারিয়েরবল সেট করে নিচ্ছি,
X = df[['Age', 'Gender', 'TB', 'DB', 'AAP', 'SGPT', 'SGOT', 'TP', 'ALB', 'AGR']]
y = df['Status']
এবার টেস্ট এর জন্য ২০% ডেটা রেখে বাকি ডেটা দিয়ে মডেল ট্রেইন করবো।
X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=4)
clf = svm.SVC(kernel='rbf')
clf.fit(X_train,y_train)
এবার অ্যাকুরেসি চেকের পালা,
pred=clf.predict(X_test)
print(classification_report(y_test, pred))
print('\nAccuracy: {0:.4f}'.format(accuracy_score(y_test, pred)))
print(confusion_matrix(y_test,pred))
অন্যান্য কার্নেলের ব্যবহার
  • লিনিয়ার কার্নেল - svm.SVC(kernel='linear')
  • পলিনমিয়াল কার্নেল - svm.SVC(C=2.0, kernel='poly', degree=3)