কে ফোল্ড ক্রস ভ্যালেইডেশন

কে ফোল্ড ক্রস ভ্যালেইডেশন সম্পর্কে আলোচনায় যাবার আগে আমরা একটি ছোট্ট উদাহরণ সম্পর্কে আলোচনা করবো। নিচের উদাহরণটি লক্ষ্য করুন, ধরুন একটি ক্লাসে ১০ জন শিক্ষার্থী রয়েছে এবং আপনার কাছে তাদের ওজনের ডেটাসেট রয়েছে , এখান থেকে আপনি র‍্যান্ডমলি ৪ জনের স্যাম্পল বাছাই করতে চান। প্রথম বার আপনি ৪ জনকে র‍্যান্ডমলি সিলেক্ট করলেন এবং ১ম স্যাম্পলের জন্য তাদের গড় ওজন পাওয়া গেল ৫৩.২৫ কেজি। আপনি আবার চার জনকে র‍্যান্ডমলি সিলেক্ট করলেন এবং ২য় স্যাম্পলের জন্য তাদের গড় ওজন পাওয়া গেল ৬৯ কেজি। আপনি আবারও চার জনকে র‍্যান্ডমলি সিলেক্ট করলেন, ৩য় স্যাম্পলের জন্য তাদের গড় ওজন পাওয়া গেল ৫৫.৫ কেজি।
উপরের উদাহরনে আমরা দেখতে পেলাম তিনটি স্যাম্পলে গড় ওজন তিন ধরনের পাওয়া যাচ্ছে, অর্থাৎ ডেটাসেট একই থাকলেও ভিন্ন ভিন্ন র‍্যান্ডম স্যাম্পলের জন্য ফলাফলে পার্থক্য আসতে পারে।
কে ফোল্ড ক্রস ভ্যালেইডেশন হচ্ছে একটি বিশেষ পদ্ধতি যার মাধ্যমে একই ডেটাসেটের একাধিক সাবসেট তৈরি করে মেশিন লার্নিং মডেল তৈরি করা হয়, এরফলে ভিন্ন ভিন্ন সাবসেটের জন্য মডেলের প্রিডিকশন অ্যাকুরেসিও আলাদা আলাদা হয়। মনে করুন আমারা একটি ডেটাসেটের জন্য ৫ টি সাবসেট তৈরি করবো, প্রতিটি সাবসেটে থাকা ডেটার সাইজ সমান। এই সাবসেট সমূহকে বলা হয় ফোল্ড। অর্থাৎ আমরা আমাদের ডেটাসেটকে ৫ টি সমান ফোল্ডে ভাগ করলাম। ফোল্ডের সংখ্যাকে ‘কে’ দ্বারা প্রকাশ করা হয়। আমাদের এই উদাহরণের জন্য ‘কে’-এর মান ৫।
ছবি - ক্রস ভ্যালেইডেশন
এবার চারটি ফোল্ডকে ট্রেইনিং সেট এবং একটি ফোল্ডকে টেস্ট সেট হিসাবে ব্যবহার করে সাধারনত আমরা মডেল তৈরি করে থাকি। কে ফোল্ড ক্রস ভ্যালেইডেশনের ক্ষেত্রে ১ম বারের পরেও আরও কয়েকবার একই পদ্ধতির পুনরাবৃত্তি করা হয়। ‘কে’-এর সমান সংখ্যকবার আলাদা আলাদা ফোল্ড ব্যবহার করে ট্রেইনিং ও টেস্টিং সেটের মাধ্যমে মডেল তৈরি করা হয়। প্রথমবার যে ফোল্ডটিকে টেস্ট সেট হিসাবে ব্যবহার করা হয়, ২য় বার আর সেটিকে টেস্ট সেটে ব্যবহার করা হয়না, বরং সেটিকে ট্রেইনিং সেটে যুক্ত করে ট্রেইনিং সেটের আরেকটি ফোল্ডকে টেস্ট সেটে ব্যবহার করা। এভাবে ‘কে’ সংখ্যক বার একই পদ্ধতির পুনরাবৃত্তি করা হয়। এর ফলে প্রতিবারেই ট্রেইনিং এবং টেস্ট সেটের ডেটায় ভিন্নতা থাকে এবং ফলাফল হিসাবে প্রতিটি মডেলেই প্রিডিকশন অ্যাকুরেসিতে কিছুটা পার্থক্য থাকতে পারে।
কে ফোল্ড ক্রস ভ্যালেইডেশনের মাধ্যমে আমরা বুঝতে পারি কোন মডেল ভিন্ন ভিন্ন ডেটার ক্ষেত্রে তার অ্যাকুরেসি পারফরম্যান্সে কতখানি পরিবর্তিত হয় এবং সার্বিক ভাবে ভিন্ন ভিন্ন ডেটার ক্ষেত্রে অ্যাভারেজ অ্যাকুরেসি কত।
কে ফোল্ড ক্রস ভ্যালেইডেশনের কিছু বৈশিষ্ট্য,
  • ভিন্ন ভিন্ন ফোল্ডের ক্ষেত্রে আলাদা আলাদা পারফরম্যান্স পাওয়া যায়, ফলে মডেলটি ওভারঅল কতখানি ভালো কাজ করবে সেটি জানা যায়।
  • কে ফোল্ড ক্রস ভ্যালেইডেশনের মাধ্যমে ওভারফিটিং দূর করা সম্ভব।
  • সিকোয়েন্সিয়াল ডেটার ক্ষেত্রে এই মডেল কার্যকরী নয়।
  • ট্রেইনিং টাইম বেশী লাগে এবং অধিক কম্পিউটেশনাল রিসোর্স ব্যবহার করে।
পাইথনে কে ফোল্ড ক্রস ভ্যালেইডেশন
আমরা চাইলে যেকোনো অ্যালগরিদমের উপরেই কে ফোল্ড ক্রস ভ্যালেইডেশনে পদ্ধতি প্রয়োগ করে দেখতে পারি এবং একইসাথে একাধিক অ্যালগরিদমের উপরেই কে ফোল্ড ক্রস ভ্যালেইডেশনে পদ্ধতি প্রয়োগ করে দেখতে ডেটাসেটের জন্য কোন পদ্ধতিটি ভালো কাজ করবে। কে ফোল্ড ক্রস ভ্যালেইডেশনের জন্য আমরা ক্যান্সার সারভাইভ্যাল Haberman’s ডেটাসেটটি ব্যবহার করবো, ইতোমধ্যে লজিস্টিক রিগ্রেশনঃ বাইনোমিয়াল অধ্যায়ে এই ডেটাসেট সম্পর্কে বিস্তারিত আলোচনা করা হয়েছে তাই এখানে আর নতুন করে ডেটাসেটের বর্ণনা দেয়া হচ্ছে না।
প্রথমেই আমরা প্রয়োজনীয় লাইব্রেরী ইমপোর্ট এবং ডেটাসেট লোড করে নিচ্ছি,
import pandas as pd
from sklearn.model_selection import cross_validate
from sklearn.linear_model import LogisticRegression
from sklearn import metrics
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix,accuracy_score
from sklearn import svm
from sklearn.model_selection import train_test_split
url='https://raw.githubusercontent.com/fazlyrabbi77/Cancer-Prediction-Logistic-Regression/master/haberman.csv'
df = pd.read_csv(url)
df.head()
টার্গেট ভ্যারিয়েবল এবং ফিচার ভ্যারিয়েবলস সেট করে নেব,
features=['age','operation_year','axil_nodes']
X=df[features]
df['status']=df['status'].map({1:0, 2:1})
y=df.status
ট্রেইনিং ও টেস্টের জন্য ডেটাসেটকে স্প্লিট করে নিচ্ছি ( মডেল তৈরি করার জন্য, ভ্যালেইডেশনের জন্য সম্পূর্ণ ডেটাসেটকেই ব্যবহার করা হবে )
X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=4)
এবার প্রথমেই সাপোর্ট ভেক্টর মেশিন মডেল তৈরি করে নিচ্ছি এবং মডেলটি ১০ টি ফোল্ডের মাধ্যমে ক্রস ভ্যালেইডেট করবো। নিচের ছবিতে আমরা দেখতে পাচ্ছি ১০ ফোল্ডের জন্য আলাদা আলাদা অ্যাকুরেসি স্কোর এবং তাদের গড় অ্যাকুরেসি স্কোর, যার মান ০.৭৩১৯ বা ৭৩.১৯%।
svm_ml = svm.SVC(kernel='linear').fit(X_train, y_train)
cv_svm = cross_validate(svm_ml, X, y, cv=10)
print(cv_svm['test_score'])
print(cv_svm['test_score'].mean())
আমরা চাইলে এই স্কোরের মাধ্যমে একটি ডেটাফ্রেম তৈরি করতে পারি,
score_df_svm=pd.DataFrame(cv_svm)
score_df_svm
স্কোরগুলো প্লট করলে আমরা সহজেই ভিজুয়ালাইজ করতে পারি ভিন্ন ভিন্ন ফোল্ডের জন্য অ্যাকুরেসি কেমন ছিল।
ax = score_df_svm.test_score.plot.bar()
কে ফোল্ড ক্রস ভ্যালেইডেশনে পদ্ধতি যেহেতু একাধিক অ্যালগরিদমের উপর প্রয়োগ করা যায় তাই আমরা লজিস্টিক রিগ্রেশন মডেলেও এই পদ্ধতির প্রয়োগ করে দেখতে চাই লজিস্টিক রিগ্রেশনের ক্ষেত্রে ক্রস ভ্যালেইডেশনের পারফম্যান্স কেমন হয়।
logreg = LogisticRegression()
logreg.fit(X_train, y_train)
cv_logit = cross_validate(logreg, X, y, cv=10)
print(cv_logit['test_score'])
print(cv_logit['test_score'].mean())
লজিস্টিক রিগ্রেশনের ক্ষত্রে ১০ টি ফোল্ডের অ্যাভারেজ স্কোর ০.৭৪৫০ বা ৭৪.৫% । অর্থাৎ আমরা বুঝতে পারছি সাপোর্ট ভেক্টর মেশিনের তুলনায় লজিস্টিক রিগ্রেশনের পারফরম্যান্স সামান্য বেশী।