এস্টিমেটরের কাজের ধাপ

আগেই বলেছি "এস্টিমেটর" হচ্ছে সাইকিট-লার্নের ভাষায় মডেল। তার কাজের ধারা বুঝলে অনেকটাই আমরা বুঝে যাবো।

এখন সাইকিট-লার্ন ‘এস্টিমেটর’ এপিআই এর কাজের ধারা বোঝার চেষ্টা করি। সিকোয়েন্স ধরে।

১ম ধাপ

বেছে নিন একটা মডেল ক্লাস। এখানে আমরা বেছে নিয়েছি K-nearest neighbors ক্লাসিফায়ার। কেন? সবচেয়ে সোজা। খালি চোখে দেখা যায়। খুবই সাধারণ একটা অ্যালগরিদম তবে বেশ ইফেক্টিভ। আমার প্রিয় আলগরিদম বটে। ধরুন, আপনি ট্রেনিং ডাটাকে প্লট করেছেন অনেকগুলো ডট দিয়ে। এখন যে নতুন ডটকে প্রেডিক্ট করতে যাচ্ছেন, সে আসলে অন্য ডটগুলো থেকে কত কাছে আছে। “কে” এর মান তিন হলে, নতুন ডাটা তার কাছের তিনটা ডট থেকে একই ধরণের ‘লেবেল’ পাবে ভোটের ভিত্তিতে।

ধরুন, আপনার কাছে বেশ কিছু কমলা আর পেয়ারা আছে। দুটো ফলের রং আর মাপ হচ্ছে ফলগুলোর বৈশিষ্ট ধরার ফিচার। ফলগুলোর মাপগুলোকে প্লট করলাম নিচের ছবির মতো করে। এখন হটাৎ করে আপনাকে ওই দুটো ফলের একটা ফল দিয়ে বলা হলো এই ফলটা কি হতে পারে? আগের ফলগুলোর সাথে মাপগুলোর মধ্যে সবচেয়ে কাছের মাপটা যেই ফলের দিকে যাবে ফলটা ওই দিকেই যাবে। এখানে “কে” এর মান তিন এবং পাঁচ হবার কারণে দু ধরণের উত্তর দেখছি দূরত্ব আর ভোটের ভিত্তিতে।

সাদা অংশ (নাম না জানা ফল) কে প্রেডিক্ট করতে হবে আমাদের

শুরুতেই সাইকিট লার্ন থেকে একটা জুতসই এস্টিমেটর ক্লাস ইমপোর্ট করতে হবে মডেলের ক্লাস হিসেবে। আমরা জানি, সাইকিট-লার্নে প্রতিটা মডেল ক্লাসকে রিপ্রেজেন্ট করা হয় পাইথন ক্লাস দিয়ে। আমাদের প্রতিটা মেশিন লার্নিং মডেল ইমপ্লিমেন্ট করতে হয় তাদের নিজস্ব ক্লাস ব্যবহার করে। এগুলোর নাম হচ্ছে এস্টিমেটর ক্লাস। আমাদের এখানে K-nearest neighbors ক্লাসিফিকেশন অ্যালগরিদমকে ইমপ্লিমেন্ট করা হচ্ছে KNeighborsClassifier ক্লাস দিয়ে। এটা আসছে আমাদের sklearn এর neighbors মডিউল থেকে।

from sklearn.neighbors import KNeighborsClassifier

২য় ধাপ

মডেলের হাইপার-প্যারামিটার বেছে নিন। মনে আছে, আমরা কোন প্যারামিটার না দিলে কি হবে? আগেই বলেছি সাইকিট-লার্নের ডিফল্ট ভ্যালু নিয়ে নেবার কথা, ঠিক নয় কি? আমরা না দিলে সেটা নিজে থেকে নিয়ে নেবে। আমাদের এখানে টিউনিং প্যারামিটার হিসেবে আপাততঃ দিচ্ছি n_neighbors=1, মানে একটা নেইবার। KNeighborsClassifier এর সবচেয়ে দরকারি প্যারামিটার হচ্ছে তার নেইবারের সংখ্যা।

আরেকটা কথা। এটাকে অনেকে বলেন “এস্টিমেটর”কে ইনস্ট্যান্সিয়েট করা। মানে মডেলের একটা ‘ইনস্ট্যান্স’ চালু করা। সাইকিট-লার্নে আমরা মডেলের ‘ইনস্ট্যান্স’ চালু করার সময় হাইপার-প্যারামিটারগুলোর ভ্যালুগুলোকে পাঠিয়ে দেই ওই মডেলে। একটা মডেলের ক্লাস কিন্তু ওই মডেলের ইনস্ট্যান্স নয়। এদুটো আলাদা জিনিস। আমরা যখন মডেল এর একটা ‘ইনস্ট্যান্স’ চালু করি, সেটা হাইপার-প্যারামিটারগুলো ‘স্টোর’ করে রাখে। আমরা এখনো মডেলকে কোন ডাটা দেখাইনি। সাইকিট-লার্ন এপিআই ইন্টারফেস কিন্তু ‘মডেলের বেছে নেয়া’র কাজ থেকে ডাটার ওপর মডেলের অ্যাপ্লিকেশনকে আলাদা করে রাখে।

knn = KNeighborsClassifier(n_neighbors=1)

আমাদেরকে মডেলকে ‘ইনস্ট্যান্সিয়েট’ (মডেলের একটা ‘ইনস্ট্যান্স’ চালু করা) করতে হবে একটা অবজেক্টে। এখানে অবজেক্টের নাম দিতে পারেন ইচ্ছেমতো। এখানে আমরা ব্যবহার করেছি knn, কারণ সবাই শুরুতে এধরণের নাম দেয়। চলুন দেখি অবজেক্টটা।

print(knn)

আমাদের আউটপুট হবে,

KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski', metric_params=None, n_jobs=1, n_neighbors=1, p=2, weights='uniform')

আমাদের knn অবজেক্ট তার ভেতর ট্রেনিং ডাটা থেকে যে মডেল তৈরি করবে সেটার অ্যালগরিদমকে রাখবে। এই অ্যালগরিদমই ব্যবহার হবে নতুন ডাটা প্রেডিকশন করতে। ট্রেনিং ডাটা থেকে যা জ্ঞান পাবে সেটাও স্টোর করবে সে।

৩য় ধাপ

ডাটাকে সাজাই ফীচার ম্যাট্রিক্স এবং টার্গেট ভেক্টরের মতো করে।

এর আগে কি দেখেছি? সাইকিট-লার্ন ডাটা রিপ্রেজেন্টেশনে আমাদের দুই ডাইমেনশনের ফীচার ম্যাট্রিক্স আর এক ডাইমেশনের টার্গেট অ্যারে লাগে।

#ফিচার ম্যাট্রিক্সকে রাখছি

"X" এ X = iris.data

#টার্গেট ভেক্টরকে রাখা হচ্ছে "y" এ

y = iris.target

৪র্থ ধাপ

আমাদের মডেলে ডাটা “ফিট” করা।

knn.fit(X, y)

এর আউটপুট হবে,

KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
metric_params=None, n_jobs=1, n_neighbors=1, p=2,
weights='uniform')

ট্রেনিং সেট থেকে (এখানে যেটা আমাদের পুরো ডাটা, ১৫০টা রেকর্ড) মডেল তৈরি করতে আমরা “ফিট” মেথড কল করবো knn অবজেক্ট থেকে। কল করার সঙ্গে সঙ্গে সে দুটো জিনিসকে আর্গুমেন্ট হিসেবে নেয়। বলুন তো কোন দুটো জিনিস? ঠিক ধরেছেন একটা, ফিচার অ্যারে আর একটা টার্গেট ভেক্টর। সোজা কথায় আগের ধাপে বের করা বড় হাতের X আর ছোট হাতের y কে ‘ফিট’ কমান্ড আসলে ফিচার মেট্রিক্স আর টার্গেট ভেক্টরের মধ্যে সম্পর্কটা শিখিয়ে দেয়় মডেলকে। ফিট কমান্ডের আউটপুট দেখলেই বুঝবেন এই মেথডটা আসলে knn অবজেক্টকে রিটার্ন করে দিচ্ছে সঙ্গে সঙ্গে। পাশাপাশি এর ভেতরের ইন্টার্নাল কম্পিউটেশন করে নিচ্ছে যা ওই মডেল ডিপেন্ডেন্ট। Knn অবজেক্টকে রিটার্ন করার সাথে সাথে পুরো ক্লাসিফায়ার এর ‘স্ট্রিং রিপ্রেজেন্টেশন’ (আউটপুট) দিয়ে দিচ্ছে এখানে। সোজা কথায়, এই মডেলটা যত প্যারামিটার ব্যবহার করেছে, সেগুলো দেখিয়ে দিয়েছে এখানে। পাশাপাশি সাইকিট লার্নের কনভেনশন অনুযায়ী এই ফিট () প্রসেসে মডেল যা শিখছে তা হচ্ছে ফিচার অ্যারে আর টার্গেট ভেক্টরের ভেতরের সম্পর্কটা। এই সম্পর্কটাই হচ্ছে এর ভেতরের প্যাটার্ন।

৫ম ধাপ

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

knn.predict([[3, 5, 4, 2]])

আউটপুট হচ্ছে

array([2])

এখানে আমরা যদি সরাসরি নাম দেখতে চাই তাহলে চালাবো এইটা,

print("Predicted target name:",
iris['target_names'][knn.predict([[3, 5, 4, 2]])])

আউটপুট হবে নাম দিয়ে

Predicted target name: ['virginica']

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