# মেশিন লার্নিং কাজের ধারা

মেশিন লার্নিং অ্যাপ্লাই করার আগে বেশ কিছু জিনিস সম্পর্কে আগে জানতে হয়। আমরা এই চ্যাপ্টারে দেখব, মেশিন লার্নিং অ্যালগরিদম চয়েস থেকে শুরু করে কীভাবে প্রেডিক্টিভ মডেল বিল্ড করবেন সেটা একটা সাধারণ রেসিপির মাধ্যমে প্রকাশ করা যায়।

## `scikit-learn` এর তিনটি অংশ:

![model](http://i.imgur.com/jcYMJNXr.png)

## মডেল

`scikit-learn` লাইব্রেরি ব্যবহার করার সময় সবচেয়ে সাধারণ কাজটি হল যে ক্লাসিফায়ার ব্যবহার করবেন তার একটা অবজেক্ট (মডেল) তৈরি করা। যেমন, আগের বাড়ির আকার ও দরদাম সম্পর্কিত সমস্যার ক্ষেত্রে,

```python
from sklearn import LinearRegression
#Creating the regression model
linear_regression_model = LinearRegression()
```

আমাদের কাজ হবে এই লিনিয়ার রিগ্রেশন মডেলকে ডেটা দিয়ে ট্রেইন করা।

## ফিট (ট্রেইন)

```python
#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` এই দুইটা ফাংশন প্রায়ই থাকে।

## প্রেডিক্ট

```python
#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:**

যেকোন মেশিন লার্নিংয়ের সর্বশেষ লক্ষ থাকে প্রেডিক্ট করা। তবে প্রেডিকশন যেন গ্রাহকের চাহিদা মেটায় সেক্ষেত্রেও নজর রাখতে হবে।

যেমন, আমার তৈরি একটা মডেলের নতুন ডেটা ট্রেনিংয়ে লাগে ২ দিন সময়, প্রেডিক্ট করতে লাগে আরও ১ দিন সময়। এখন ঔ ১ দিনে আরও নতুন ডেটা যদি আসে, সেগুলো ট্রেইন করতে আমার আরও সময় প্রয়োজন। ততক্ষণে ডেটা প্রেডিক্ট করার টাইম লিমিট আরও বেড়ে যাবে। এই মডেল কী কোন সুস্থ স্বাভাবিক মানুষ গ্রহণ করবে? অবশ্যই না, তাই যত কম ট্রেনিং সময়ে একটা মডেল যত কাছাকাছি উত্তর প্রেডিক্ট করতে সক্ষম হয় সেই অ্যালগরিদম ও মেশিন লার্নিং সিস্টেম তত ভাল।

## মেশিন লার্নিং ওয়ার্কফ্লো:

### সঠিক প্রশ্ন জিজ্ঞাসা করা

![askingrightques](http://i.imgur.com/G1bQVcc.jpg)

আমি আসলে কী করতে চাই, এটা দিয়ে শুরু হয় কাজ। বাড়ির আকার ও দামের সমস্যার ক্ষেত্রে বোঝা যায় আমি চাচ্ছি বাড়ির আকার কে ইনপুট দিতে এবং আউটপুটে চাচ্ছি সেটার দাম।

জটিল কাজ সহজ হতে পারে যদি সঠিক প্রশ্ন সেট করার পর আমরা তার উত্তর খুঁজি।

### ডেটা গুছানো

![datapreparation](http://i.imgur.com/qTjV2Wi.jpg)

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

### অ্যালগরিদম সিলেক্ট করা

![selectalgo](http://i.imgur.com/LJ8yM4f.png)

সবচেয়ে কঠিনতম কাজই হল অ্যালগরিদম সিলেক্ট করা। যেসব সমস্যায় সাধারণ লিনিয়ার রিগ্রেশন ব্যবহার করেই কাজ করা যায় সেসব ক্ষেত্রে আর্টিফিশিয়াল নিউরাল নেট ব্যবহার করার কোন মানে হয় না।

যেহেতু একই কাজ বিভিন্ন মডেল দিয়ে করা যায় তাই যে মডেল এরর কম দেখাবে সেটাই সাধারণত সিলেক্ট করা হয়।

অ্যালগরিদম সিলেক্ট করার জন্য অবশ্যই প্রবলেমসেট ও অ্যাভেইল্যাবল ডেটাসেট বুঝতে হবে। যেমন বাড়ি ও দরদামের সমস্যাটি একটি রিগ্রেশন প্রবলেম, আমি যদি এখানে ক্লাস্টারিং (ডেটা ক্লাসিফিকেশন) অ্যালগরিদম অ্যাপ্লাই করি তাহলে অবশ্যই এর প্রেডিকশন খুবই বাজে আসবে।

### মডেল ট্রেইনিং

![model\_training](http://i.imgur.com/A6m2fDS.png)

আমার হাতে থাকা ডেটাসেট দুইভাগে ভাগ করব, একটা হল Training Dataset এবং আরেকটি হল Testing Dataset।

Testing Dataset এর কোন ডেটা-ই Training Dataset এ থাকে না। যদি থাকত তাহলে মেশিন লার্নিংয়ের মূল উদ্দেশ্যই মাটি হয়ে যেত। (মানে তৈরিকৃত মডেল নতুন কিছু শেখার পরিবর্তে ডেটা মুখস্ত করা শিখত, যেমনটা আমরা নিজেরা পরীক্ষা দেওয়ার সময় করে থাকি, তাই না?) এই ট্রেনিং ডেটা মডেলে Feed করে ও লার্নিং অ্যালগরিদম অ্যাপ্লাই করার মাধ্যমে মডেল ট্রেনিং সম্পন্ন করা হয়।

### মডেল টেস্টিং

![testing\_model](http://i.imgur.com/YglPD3U.png)

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 ইনপুট দিয়ে দেখব মডেলটি আউটপুট ১৫ এর কাছাকাছি দিচ্ছে কিনা। যদি দেয় তার মানে আমার মডেলের অ্যালগরিদম সিলেকশন, ডেটা প্রিপ্রসেসিং ও ট্রেইনিং যথাযথ হয়েছে। আর যদি এটা কাজ না করে সেক্ষেত্রে আমার আবার ডেটা প্রিপ্রসেসিং থেকে শুরু করে নতুন অ্যালগরিদম দিয়ে ট্রাই করতে হবে।

মডেল তৈরি করা পুরোটাই ইটারেটিভ প্রসেস, মানে বারংবার করার মাধ্যমেই পারফেকশন আনতে হয়, একবারেই একটা মডেল পারফেক্ট হবে এমন ধারণা করা ঠিক নয়।

![final\_workflow](http://i.imgur.com/rysxrf6.png)

## ওয়ার্কফ্লো গাইডলাইন

### শেষের স্টেপ না, মডেল বিল্ড করার জন্য সতর্ক থাকতে হবে শুরু থেকেই

মডেল বিল্ড করার জন্য শুরু থেকেই সব চিন্তাভাবনা করে আগাতে হবে, কেননা প্রতিটি স্টেপ ই পূর্ববর্তী স্টেপের উপর নির্ভরশীল। অনেকটা চেইন এর মত, একটা অংশ ভুল করলেই আবার প্রথম থেকে শুরু করতে হবে।

তারমানে আল্টিমেট টার্গেট, হাতে থাকা ডেটাসেট, অ্যালগরিদম সিলেকশন সবকিছুই করতে হবে যত্ন ও চিন্তাভাবনার সাথে।

### যেকোন সময় আগের স্টেপে ফিরে যেতে হতে পারে

ধরুন, আপনার কাছে গুণের ডেটাসেট আছে কিন্তু আপনি আউটপুটে চাচ্ছেন দুইটি সংখ্যার যোগের ফলাফল। তারমানে আপনি যা চান তার সাথে ডেটাসেট এর কোন মিল নাই। তাই আমাদের এবার গুণের ডেটাসেট কে রিপ্লেস করতে হবে যোগের ডেটাসেট দিয়ে তারপর আবার মডেলকে ট্রেইন করতে হবে।

### ডেটা সাজানো লাগবেই

RAW ডেটা কখনোই আপনার মনমত সাজানো থাকবে না, মডেল ট্রেইনিংয়ের জন্য সেটাকে অবশ্যই প্রিপ্রসেস করতে হবে।

ডেটা প্রিপ্রসেসিং এই মূলত সবচেয়ে বেশি সময় লাগে।

### ডেটা যত মজা তত

আসলে আপনি মডেলে যত ডেটা ফিড করতে পারবেন তার প্রেডিকশন অ্যাকুরেসি ততটাই বেটার হবে। এই থিওরি স্বতসিদ্ধ।

### প্রবলেম হোক এটা সেটা সল্যুশন হোক ভাল

কখনোই খারাপ সল্যুশনকে পাত্তা দেবেন না। একটা প্রবলেম সল্ভ করার সময় অনেক চেষ্টার পরেও যদি আশানুরূপ পার্ফর্মেন্স না পান, সেক্ষেত্রে অন্যান্য স্টেপগুলো সম্পর্কে প্রশ্ন করুন।

* আমি কি সঠিক প্রশ্ন করছি?
* সমস্যা সমাধান করার মত প্রয়োজনীয় ডেটা কি আমার আছে?
* আমি সিলেক্ট করা অ্যালগরিদম কি সঠিক?

যদি সন্তোষজনক উত্তর না পান তাহলে সমস্যার সমাধান না করাই বেটার। কারণ যে মডেল ৫০% সময় সঠিক উত্তর দেয় আর বাকি ৫০% ভুল উত্তর দেয় সেটা কনফিউশন তৈরি করার জন্যই ভাল, সমস্যা সমাধানের জন্য নয়।

আপাতত এই পর্যন্তই। পরবর্তী পর্বে আমরা মেশিন লার্নিংয়ের ১ম ধাপ দেখব। "কীভাবে সঠিক প্রশ্ন করতে হয়?"
