মেশিন লার্নিং অ্যাপ্লাই করার আগে বেশ কিছু জিনিস সম্পর্কে আগে জানতে হয়। আমরা এই চ্যাপ্টারে দেখব, মেশিন লার্নিং অ্যালগরিদম চয়েস থেকে শুরু করে কীভাবে প্রেডিক্টিভ মডেল বিল্ড করবেন সেটা একটা সাধারণ রেসিপির মাধ্যমে প্রকাশ করা যায়।
scikit-learn
লাইব্রেরি ব্যবহার করার সময় সবচেয়ে সাধারণ কাজটি হল যে ক্লাসিফায়ার ব্যবহার করবেন তার একটা অবজেক্ট (মডেল) তৈরি করা। যেমন, আগের বাড়ির আকার ও দরদাম সম্পর্কিত সমস্যার ক্ষেত্রে,
from sklearn import LinearRegression
#Creating the regression model
linear_regression_model = LinearRegression()
আমাদের কাজ হবে এই লিনিয়ার রিগ্রেশন মডেলকে ডেটা দিয়ে ট্রেইন করা।
#Let, house_sizes = Contains all size of house
#house_price = Contains all price of house
#Training the model
linear_regression_model.fit(house_sizes, house_prices)
সাধারণত প্রত্যেকটা মডেল এ fit
ও predict
এই দুইটা ফাংশন প্রায়ই থাকে।
#predicted value
"""
Here, test_house_size is a variable which is not a member of training data, rather a unique one
"""
predicted_price = linear_regression_model.predict(test_house_size)
এই predicted_price
ভ্যারিয়েবলে আমি যে সাইজের বাড়ির দাম জানতে চাচ্ছি সেটা অ্যাসাইন হবে।
কেতাবি সংজ্ঞানুসারে,
An orchestrated and repeatable pattern which systematically transforms and processes information to create prediction solutions.
An orchestrated and repeatable pattern:
এর মানে, একই ওয়ার্কফ্লো দিয়ে আমরা সমস্যা ডিফাইন করব, এবং সেই ওয়ার্কফ্লো দিয়েই আমরা সল্যুশন বিল্ড করব।
Transforms and processes information:
ডেটা দিয়ে মডেল তৈরি করার আগে সেটাকে ট্রেনিংয়ের জন্য ব্যবহারযোগ্য করে নিতে হবে।
ধরা যাক আমরা একটা প্রেডিক্টিভ মডেল তৈরি করতে চাচ্ছি যেটা হ্যাঁ বা না তে উত্তর দেয়। ইনপুট ডেটা যদি নিউমেরিক্যাল হয় তাহলে আউটপুটও নিউমেরিক্যাল হলে সুবিধা। এই কারণে, ট্রেনিং ডেটার ক্ষেত্রে যত হ্যাঁ/না ওয়ালা লেবেল আছে ওগুলো আমরা রিপ্লেস করে 1 ও 0 বসিয়ে দিতে পারি। এটাকে ইনফর্মেশন প্রিপ্রসেসিং বলে।
Create prediction solutions:
যেকোন মেশিন লার্নিংয়ের সর্বশেষ লক্ষ থাকে প্রেডিক্ট করা। তবে প্রেডিকশন যেন গ্রাহকের চাহিদা মেটায় সেক্ষেত্রেও নজর রাখতে হবে।
যেমন, আমার তৈরি একটা মডেলের নতুন ডেটা ট্রেনিংয়ে লাগে ২ দিন সময়, প্রেডিক্ট করতে লাগে আরও ১ দিন সময়। এখন ঔ ১ দিনে আরও নতুন ডেটা যদি আসে, সেগুলো ট্রেইন করতে আমার আরও সময় প্রয়োজন। ততক্ষণে ডেটা প্রেডিক্ট করার টাইম লিমিট আরও বেড়ে যাবে। এই মডেল কী কোন সুস্থ স্বাভাবিক মানুষ গ্রহণ করবে? অবশ্যই না, তাই যত কম ট্রেনিং সময়ে একটা মডেল যত কাছাকাছি উত্তর প্রেডিক্ট করতে সক্ষম হয় সেই অ্যালগরিদম ও মেশিন লার্নিং সিস্টেম তত ভাল।
আমি আসলে কী করতে চাই, এটা দিয়ে শুরু হয় কাজ। বাড়ির আকার ও দামের সমস্যার ক্ষেত্রে বোঝা যায় আমি চাচ্ছি বাড়ির আকার কে ইনপুট দিতে এবং আউটপুটে চাচ্ছি সেটার দাম।
জটিল কাজ সহজ হতে পারে যদি সঠিক প্রশ্ন সেট করার পর আমরা তার উত্তর খুঁজি।
এবার আমার সমস্যা সমাধানের জন্য বা মডেল ট্রেইন করার জন্য অবশ্যই ডেটা চিনিয়ে দিতে হবে। একটা মেশিন তখনই একটা ভাল কাজ ও খারাপ কাজের মধ্যে পার্থক্য বের করতে পারবে যদি তাকে ভাল ও খারাপ কাজ দেখিয়ে ট্রেইন করা হয় তাহলেই পরে সে নতুন কোন ঘটনা দেখে তার ট্রেনিং ডেটা থেকে মিলিয়ে নিতে পারবে সেটা ভাল না খারাপ কাজ।
সবচেয়ে কঠিনতম কাজই হল অ্যালগরিদম সিলেক্ট করা। যেসব সমস্যায় সাধারণ লিনিয়ার রিগ্রেশন ব্যবহার করেই কাজ করা যায় সেসব ক্ষেত্রে আর্টিফিশিয়াল নিউরাল নেট ব্যবহার করার কোন মানে হয় না।
যেহেতু একই কাজ বিভিন্ন মডেল দিয়ে করা যায় তাই যে মডেল এরর কম দেখাবে সেটাই সাধারণত সিলেক্ট করা হয়।
অ্যালগরিদম সিলেক্ট করার জন্য অবশ্যই প্রবলেমসেট ও অ্যাভেইল্যাবল ডেটাসেট বুঝতে হবে। যেমন বাড়ি ও দরদামের সমস্যাটি একটি রিগ্রেশন প্রবলেম, আমি যদি এখানে ক্লাস্টারিং (ডেটা ক্লাসিফিকেশন) অ্যালগরিদম অ্যাপ্লাই করি তাহলে অবশ্যই এর প্রেডিকশন খুবই বাজে আসবে।
আমার হাতে থাকা ডেটাসেট দুইভাগে ভাগ করব, একটা হল Training Dataset এবং আরেকটি হল Testing Dataset।
Testing Dataset এর কোন ডেটা-ই Training Dataset এ থাকে না। যদি থাকত তাহলে মেশিন লার্নিংয়ের মূল উদ্দেশ্যই মাটি হয়ে যেত। (মানে তৈরিকৃত মডেল নতুন কিছু শেখার পরিবর্তে ডেটা মুখস্ত করা শিখত, যেমনটা আমরা নিজেরা পরীক্ষা দেওয়ার সময় করে থাকি, তাই না?) এই ট্রেনিং ডেটা মডেলে Feed করে ও লার্নিং অ্যালগরিদম অ্যাপ্লাই করার মাধ্যমে মডেল ট্রেনিং সম্পন্ন করা হয়।
Dataset দুইভাগে ভাগ করার কারণ হচ্ছ, ট্রেইনিং ডেটা দেওয়ার মাধ্যমে মডেলকে আগে শিখাতে হবে। তারপর একটা ইনপুট চয়েস করতে হবে (Testing Dataset) ও ইনপুট টি মডেলকে দিলে তার প্রেডিক্টেড আউটপুট কতটা সঠিক বা ভুল সেটা বের করা যাবে।
তারমানে আমার হাতের সব ডেটাই আমি ট্রেনিংয়ে দিচ্ছি না, তারমানে কিছু ডেটা আমার হাতে থেকে যাচ্ছে যেটা দিয়ে আমি ভেরিফাই করতে পারব আদৌ আমার তৈরি করা মডেলটি কিছু শিখতে পারছে কিনা।
ব্যাপারটা অনেকটা এরকম, ধরি আমার তৈরি করা ML মডেলকে আমি ৩ এর ঘরের নামতা শেখাতে চাই। তাহলে আমি এরকম একটি Dataset তৈরি করব,
৩ X ১ = ৩
৩ X ২ = ৬
৩ X ৩ = ৯
৩ X ৪ = ১২
৩ X ৫ = ১৫
৩ X ৬ = ১৮
৩ X ৯ = ২৭
৩ X ১০ = ৩০
এবার আমি যদি এখান থেকে ট্রেনিং ডেটা ও টেস্টিং ডেটা আলাদা করি তাহলে ডেটাসেটগুলো দাঁড়াবে এরকম,
দ্রষ্টব্য: ডেটাসেট থেকে ট্রেনিং ডেটা ও টেস্টিং ডেটা আলাদা করার জন্যও আলাদা অ্যালগরিদম আছে। ডেটাসেট যদি অনেক কম হয় সেসব ক্ষেত্রে ডেটা সিলেকশনের সফিস্টিকেটেড অ্যালগরিদমগুলো খুবই ভাল কাজ করে। আমরা পরে বিস্তারিত দেখব।
ট্রেনিং ডেটা
৩ X ১ = ৩
৩ X ২ = ৬
৩ X ৩ = ৯
৩ X ৪ = ১২
৩ X ৬ = ১৮
৩ X ৯ = ২৭
৩ X ১০ = ৩০
টেস্টিং ডেটা
৩ X ৫ = ১৫
এখানে পরিষ্কার দেখা যাচ্ছে আমি ট্রেনিং ডেটায় 3 X 5 দেই নাই। তার মানে আমি 3 X 5 বাদে বাকি ডেটা দিয়ে মডেল ট্রেইন করব। তারপর 3 ও 5 ইনপুট দিয়ে দেখব মডেলটি আউটপুট ১৫ এর কাছাকাছি দিচ্ছে কিনা। যদি দেয় তার মানে আমার মডেলের অ্যালগরিদম সিলেকশন, ডেটা প্রিপ্রসেসিং ও ট্রেইনিং যথাযথ হয়েছে। আর যদি এটা কাজ না করে সেক্ষেত্রে আমার আবার ডেটা প্রিপ্রসেসিং থেকে শুরু করে নতুন অ্যালগরিদম দিয়ে ট্রাই করতে হবে।
মডেল তৈরি করা পুরোটাই ইটারেটিভ প্রসেস, মানে বারংবার করার মাধ্যমেই পারফেকশন আনতে হয়, একবারেই একটা মডেল পারফেক্ট হবে এমন ধারণা করা ঠিক নয়।
মডেল বিল্ড করার জন্য শুরু থেকেই সব চিন্তাভাবনা করে আগাতে হবে, কেননা প্রতিটি স্টেপ ই পূর্ববর্তী স্টেপের উপর নির্ভরশীল। অনেকটা চেইন এর মত, একটা অংশ ভুল করলেই আবার প্রথম থেকে শুরু করতে হবে।
তারমানে আল্টিমেট টার্গেট, হাতে থাকা ডেটাসেট, অ্যালগরিদম সিলেকশন সবকিছুই করতে হবে যত্ন ও চিন্তাভাবনার সাথে।
ধরুন, আপনার কাছে গুণের ডেটাসেট আছে কিন্তু আপনি আউটপুটে চাচ্ছেন দুইটি সংখ্যার যোগের ফলাফল। তারমানে আপনি যা চান তার সাথে ডেটাসেট এর কোন মিল নাই। তাই আমাদের এবার গুণের ডেটাসেট কে রিপ্লেস করতে হবে যোগের ডেটাসেট দিয়ে তারপর আবার মডেলকে ট্রেইন করতে হবে।
RAW ডেটা কখনোই আপনার মনমত সাজানো থাকবে না, মডেল ট্রেইনিংয়ের জন্য সেটাকে অবশ্যই প্রিপ্রসেস করতে হবে।
ডেটা প্রিপ্রসেসিং এই মূলত সবচেয়ে বেশি সময় লাগে।
আসলে আপনি মডেলে যত ডেটা ফিড করতে পারবেন তার প্রেডিকশন অ্যাকুরেসি ততটাই বেটার হবে। এই থিওরি স্বতসিদ্ধ।
কখনোই খারাপ সল্যুশনকে পাত্তা দেবেন না। একটা প্রবলেম সল্ভ করার সময় অনেক চেষ্টার পরেও যদি আশানুরূপ পার্ফর্মেন্স না পান, সেক্ষেত্রে অন্যান্য স্টেপগুলো সম্পর্কে প্রশ্ন করুন।
- আমি কি সঠিক প্রশ্ন করছি?
- সমস্যা সমাধান করার মত প্রয়োজনীয় ডেটা কি আমার আছে?
- আমি সিলেক্ট করা অ্যালগরিদম কি সঠিক?
যদি সন্তোষজনক উত্তর না পান তাহলে সমস্যার সমাধান না করাই বেটার। কারণ যে মডেল ৫০% সময় সঠিক উত্তর দেয় আর বাকি ৫০% ভুল উত্তর দেয় সেটা কনফিউশন তৈরি করার জন্যই ভাল, সমস্যা সমাধানের জন্য নয়।
আপাতত এই পর্যন্তই। পরবর্তী পর্বে আমরা মেশিন লার্নিংয়ের ১ম ধাপ দেখব। "কীভাবে সঠিক প্রশ্ন করতে হয়?"