# শ্রেণীবিভাজনের পরিচিতি এই চারটি পাঠে, আপনি ক্লাসিক মেশিন লার্নিং-এর একটি গুরুত্বপূর্ণ দিক - _শ্রেণীবিভাজন_ - সম্পর্কে জানবেন। আমরা এশিয়া এবং ভারতের অসাধারণ রান্নার একটি ডেটাসেট ব্যবহার করে বিভিন্ন শ্রেণীবিভাজন অ্যালগরিদম নিয়ে কাজ করব। আশা করি আপনি ক্ষুধার্ত! ![এক চিমটি!](../../../../4-Classification/1-Introduction/images/pinch.png) > এই পাঠে প্যান-এশিয়ান রান্নার উদযাপন করুন! ছবি: [Jen Looper](https://twitter.com/jenlooper) শ্রেণীবিভাজন [supervised learning](https://wikipedia.org/wiki/Supervised_learning)-এর একটি রূপ, যা রিগ্রেশন কৌশলগুলোর সাথে অনেক মিল রাখে। যদি মেশিন লার্নিং ডেটাসেট ব্যবহার করে মান বা নাম পূর্বাভাস দেওয়ার উপর ভিত্তি করে হয়, তাহলে শ্রেণীবিভাজন সাধারণত দুটি গ্রুপে বিভক্ত হয়: _বাইনারি শ্রেণীবিভাজন_ এবং _মাল্টিক্লাস শ্রেণীবিভাজন_। [![শ্রেণীবিভাজনের পরিচিতি](https://img.youtube.com/vi/eg8DJYwdMyg/0.jpg)](https://youtu.be/eg8DJYwdMyg "শ্রেণীবিভাজনের পরিচিতি") > 🎥 উপরের ছবিতে ক্লিক করুন একটি ভিডিওর জন্য: MIT-এর John Guttag শ্রেণীবিভাজন পরিচিতি দিচ্ছেন মনে রাখুন: - **লিনিয়ার রিগ্রেশন** আপনাকে ভেরিয়েবলগুলোর মধ্যে সম্পর্ক পূর্বাভাস দিতে এবং একটি নতুন ডেটাপয়েন্ট সেই লাইনের সাথে সম্পর্কিত কোথায় পড়বে তা সঠিকভাবে পূর্বাভাস দিতে সাহায্য করেছিল। উদাহরণস্বরূপ, আপনি পূর্বাভাস দিতে পারতেন _সেপ্টেম্বর বনাম ডিসেম্বর মাসে একটি কুমড়ার দাম কত হবে_। - **লজিস্টিক রিগ্রেশন** আপনাকে "বাইনারি ক্যাটাগরি" আবিষ্কার করতে সাহায্য করেছিল: এই দাম পয়েন্টে, _এই কুমড়া কমলা রঙের হবে নাকি কমলা রঙের হবে না_? শ্রেণীবিভাজন বিভিন্ন অ্যালগরিদম ব্যবহার করে ডেটাপয়েন্টের লেবেল বা শ্রেণী নির্ধারণের অন্যান্য উপায় নির্ধারণ করে। আসুন এই রান্নার ডেটা নিয়ে কাজ করি এবং দেখি, উপাদানগুলোর একটি গ্রুপ পর্যবেক্ষণ করে, আমরা এর উৎস রান্নার ধরন নির্ধারণ করতে পারি কিনা। ## [পাঠের পূর্ববর্তী কুইজ](https://ff-quizzes.netlify.app/en/ml/) > ### [এই পাঠটি R-এ উপলব্ধ!](../../../../4-Classification/1-Introduction/solution/R/lesson_10.html) ### পরিচিতি শ্রেণীবিভাজন মেশিন লার্নিং গবেষক এবং ডেটা বিজ্ঞানীর মৌলিক কার্যক্রমগুলোর একটি। একটি বাইনারি মানের মৌলিক শ্রেণীবিভাজন ("এই ইমেইলটি স্প্যাম কিনা?") থেকে শুরু করে কম্পিউটার ভিশন ব্যবহার করে জটিল ইমেজ শ্রেণীবিভাজন এবং সেগমেন্টেশন পর্যন্ত, ডেটাকে শ্রেণীতে সাজানো এবং এর উপর প্রশ্ন করা সবসময়ই কার্যকর। বিষয়টিকে আরও বৈজ্ঞানিকভাবে বললে, আপনার শ্রেণীবিভাজন পদ্ধতি একটি পূর্বাভাস মডেল তৈরি করে যা ইনপুট ভেরিয়েবল এবং আউটপুট ভেরিয়েবলের মধ্যে সম্পর্ক ম্যাপ করতে সক্ষম করে। ![বাইনারি বনাম মাল্টিক্লাস শ্রেণীবিভাজন](../../../../4-Classification/1-Introduction/images/binary-multiclass.png) > শ্রেণীবিভাজন অ্যালগরিদমের জন্য বাইনারি বনাম মাল্টিক্লাস সমস্যা। ইনফোগ্রাফিক: [Jen Looper](https://twitter.com/jenlooper) আমাদের ডেটা পরিষ্কার করা, ভিজ্যুয়ালাইজ করা এবং আমাদের ML কাজের জন্য প্রস্তুত করার প্রক্রিয়া শুরু করার আগে, আসুন শিখি কীভাবে মেশিন লার্নিং বিভিন্ন উপায়ে ডেটা শ্রেণীবদ্ধ করতে ব্যবহার করা যেতে পারে। [statistics](https://wikipedia.org/wiki/Statistical_classification) থেকে উদ্ভূত, ক্লাসিক মেশিন লার্নিং ব্যবহার করে শ্রেণীবিভাজন `smoker`, `weight`, এবং `age` এর মতো বৈশিষ্ট্য ব্যবহার করে _X রোগের বিকাশের সম্ভাবনা_ নির্ধারণ করে। এটি একটি supervised learning কৌশল যা আপনি আগে করা রিগ্রেশন অনুশীলনের সাথে মিল রাখে। আপনার ডেটা লেবেলযুক্ত এবং ML অ্যালগরিদমগুলো সেই লেবেলগুলো ব্যবহার করে ডেটাসেটের শ্রেণী (বা 'ফিচার') পূর্বাভাস দেয় এবং সেগুলোকে একটি গ্রুপ বা ফলাফলে বরাদ্দ করে। ✅ একটি রান্নার ডেটাসেট কল্পনা করুন। একটি মাল্টিক্লাস মডেল কী উত্তর দিতে পারবে? একটি বাইনারি মডেল কী উত্তর দিতে পারবে? যদি আপনি নির্ধারণ করতে চান যে একটি নির্দিষ্ট রান্না মেথি ব্যবহার করবে কিনা? যদি আপনি দেখতে চান যে, একটি মিস্ট্রি ব্যাগে তারকা মৌরি, আর্টিচোক, ফুলকপি এবং হর্সর‌্যাডিশ থাকলে, আপনি একটি সাধারণ ভারতীয় খাবার তৈরি করতে পারবেন কিনা? [![পাগল মিস্ট্রি ব্যাগ](https://img.youtube.com/vi/GuTeDbaNoEU/0.jpg)](https://youtu.be/GuTeDbaNoEU "পাগল মিস্ট্রি ব্যাগ") > 🎥 উপরের ছবিতে ক্লিক করুন একটি ভিডিওর জন্য। 'Chopped' শো-এর পুরো ধারণা হলো 'মিস্ট্রি ব্যাগ', যেখানে শেফদের এলোমেলো উপাদান দিয়ে একটি খাবার তৈরি করতে হয়। নিশ্চিতভাবেই একটি ML মডেল সাহায্য করত! ## হ্যালো 'classifier' আমরা এই রান্নার ডেটাসেট থেকে যে প্রশ্নটি করতে চাই তা আসলে একটি **মাল্টিক্লাস প্রশ্ন**, কারণ আমাদের কাজ করার জন্য বেশ কয়েকটি সম্ভাব্য জাতীয় রান্না রয়েছে। উপাদানগুলোর একটি ব্যাচ দেওয়া হলে, এই অনেক শ্রেণীর মধ্যে কোনটিতে ডেটা ফিট করবে? Scikit-learn বিভিন্ন অ্যালগরিদম অফার করে যা আপনি ডেটা শ্রেণীবদ্ধ করতে ব্যবহার করতে পারেন, আপনি যে ধরনের সমস্যা সমাধান করতে চান তার উপর নির্ভর করে। পরবর্তী দুটি পাঠে, আপনি এই অ্যালগরিদমগুলো সম্পর্কে শিখবেন। ## অনুশীলন - আপনার ডেটা পরিষ্কার এবং ভারসাম্যপূর্ণ করুন প্রকল্পটি শুরু করার আগে প্রথম কাজটি হলো আপনার ডেটা পরিষ্কার এবং **ভারসাম্যপূর্ণ** করা যাতে আরও ভালো ফলাফল পাওয়া যায়। এই ফোল্ডারের রুটে থাকা _notebook.ipynb_ ফাইল দিয়ে শুরু করুন। প্রথমে ইনস্টল করুন [imblearn](https://imbalanced-learn.org/stable/)। এটি একটি Scikit-learn প্যাকেজ যা আপনাকে ডেটা আরও ভালোভাবে ভারসাম্যপূর্ণ করতে সাহায্য করবে (আপনি এই কাজ সম্পর্কে একটু পরে আরও শিখবেন)। 1. `imblearn` ইনস্টল করতে, `pip install` চালান, যেমন: ```python pip install imblearn ``` 1. আপনার ডেটা আমদানি এবং ভিজ্যুয়ালাইজ করার জন্য প্রয়োজনীয় প্যাকেজগুলো আমদানি করুন, এছাড়াও `imblearn` থেকে `SMOTE` আমদানি করুন। ```python import pandas as pd import matplotlib.pyplot as plt import matplotlib as mpl import numpy as np from imblearn.over_sampling import SMOTE ``` এখন আপনি ডেটা আমদানি করার জন্য প্রস্তুত। 1. পরবর্তী কাজটি হলো ডেটা আমদানি করা: ```python df = pd.read_csv('../data/cuisines.csv') ``` `read_csv()` ব্যবহার করে _cusines.csv_ ফাইলের বিষয়বস্তু পড়া হবে এবং এটি `df` ভেরিয়েবলে রাখা হবে। 1. ডেটার আকৃতি পরীক্ষা করুন: ```python df.head() ``` প্রথম পাঁচটি সারি দেখতে এরকম: ```output | | Unnamed: 0 | cuisine | almond | angelica | anise | anise_seed | apple | apple_brandy | apricot | armagnac | ... | whiskey | white_bread | white_wine | whole_grain_wheat_flour | wine | wood | yam | yeast | yogurt | zucchini | | --- | ---------- | ------- | ------ | -------- | ----- | ---------- | ----- | ------------ | ------- | -------- | --- | ------- | ----------- | ---------- | ----------------------- | ---- | ---- | --- | ----- | ------ | -------- | | 0 | 65 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | | 1 | 66 | indian | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | | 2 | 67 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | | 3 | 68 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | | 4 | 69 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | ``` 1. এই ডেটা সম্পর্কে তথ্য পেতে `info()` কল করুন: ```python df.info() ``` আপনার আউটপুট এরকম দেখাবে: ```output RangeIndex: 2448 entries, 0 to 2447 Columns: 385 entries, Unnamed: 0 to zucchini dtypes: int64(384), object(1) memory usage: 7.2+ MB ``` ## অনুশীলন - রান্না সম্পর্কে শেখা এখন কাজটি আরও আকর্ষণীয় হতে শুরু করেছে। আসুন ডেটার বিতরণ আবিষ্কার করি, রান্না অনুযায়ী 1. `barh()` কল করে ডেটাকে বার আকারে প্লট করুন: ```python df.cuisine.value_counts().plot.barh() ``` ![রান্নার ডেটা বিতরণ](../../../../4-Classification/1-Introduction/images/cuisine-dist.png) রান্নার সংখ্যা সীমিত, কিন্তু ডেটার বিতরণ অসম। আপনি এটি ঠিক করতে পারেন! এর আগে, আরও একটু অনুসন্ধান করুন। 1. রান্না অনুযায়ী কতটা ডেটা উপলব্ধ তা খুঁজে বের করুন এবং এটি প্রিন্ট করুন: ```python thai_df = df[(df.cuisine == "thai")] japanese_df = df[(df.cuisine == "japanese")] chinese_df = df[(df.cuisine == "chinese")] indian_df = df[(df.cuisine == "indian")] korean_df = df[(df.cuisine == "korean")] print(f'thai df: {thai_df.shape}') print(f'japanese df: {japanese_df.shape}') print(f'chinese df: {chinese_df.shape}') print(f'indian df: {indian_df.shape}') print(f'korean df: {korean_df.shape}') ``` আউটপুট এরকম দেখায়: ```output thai df: (289, 385) japanese df: (320, 385) chinese df: (442, 385) indian df: (598, 385) korean df: (799, 385) ``` ## উপাদান আবিষ্কার করা এখন আপনি ডেটার গভীরে যেতে পারেন এবং জানতে পারেন প্রতিটি রান্নার জন্য সাধারণ উপাদানগুলো কী। আপনি পুনরাবৃত্ত ডেটা পরিষ্কার করতে পারেন যা রান্নার মধ্যে বিভ্রান্তি তৈরি করে, তাই আসুন এই সমস্যাটি সম্পর্কে শিখি। 1. একটি ফাংশন `create_ingredient()` তৈরি করুন যা একটি উপাদান ডেটাফ্রেম তৈরি করবে। এই ফাংশনটি একটি অপ্রয়োজনীয় কলাম বাদ দিয়ে শুরু করবে এবং উপাদানগুলো তাদের সংখ্যার ভিত্তিতে সাজাবে: ```python def create_ingredient_df(df): ingredient_df = df.T.drop(['cuisine','Unnamed: 0']).sum(axis=1).to_frame('value') ingredient_df = ingredient_df[(ingredient_df.T != 0).any()] ingredient_df = ingredient_df.sort_values(by='value', ascending=False, inplace=False) return ingredient_df ``` এখন আপনি এই ফাংশনটি ব্যবহার করে রান্না অনুযায়ী শীর্ষ দশটি জনপ্রিয় উপাদানের ধারণা পেতে পারেন। 1. `create_ingredient()` কল করুন এবং `barh()` কল করে এটি প্লট করুন: ```python thai_ingredient_df = create_ingredient_df(thai_df) thai_ingredient_df.head(10).plot.barh() ``` ![থাই](../../../../4-Classification/1-Introduction/images/thai.png) 1. জাপানি ডেটার জন্য একই কাজ করুন: ```python japanese_ingredient_df = create_ingredient_df(japanese_df) japanese_ingredient_df.head(10).plot.barh() ``` ![জাপানি](../../../../4-Classification/1-Introduction/images/japanese.png) 1. এখন চীনা উপাদানগুলো: ```python chinese_ingredient_df = create_ingredient_df(chinese_df) chinese_ingredient_df.head(10).plot.barh() ``` ![চীনা](../../../../4-Classification/1-Introduction/images/chinese.png) 1. ভারতীয় উপাদানগুলো প্লট করুন: ```python indian_ingredient_df = create_ingredient_df(indian_df) indian_ingredient_df.head(10).plot.barh() ``` ![ভারতীয়](../../../../4-Classification/1-Introduction/images/indian.png) 1. শেষ পর্যন্ত, কোরিয়ান উপাদানগুলো প্লট করুন: ```python korean_ingredient_df = create_ingredient_df(korean_df) korean_ingredient_df.head(10).plot.barh() ``` ![কোরিয়ান](../../../../4-Classification/1-Introduction/images/korean.png) 1. এখন, `drop()` কল করে বিভিন্ন রান্নার মধ্যে বিভ্রান্তি তৈরি করে এমন সাধারণ উপাদানগুলো বাদ দিন: সবাই চাল, রসুন এবং আদা পছন্দ করে! ```python feature_df= df.drop(['cuisine','Unnamed: 0','rice','garlic','ginger'], axis=1) labels_df = df.cuisine #.unique() feature_df.head() ``` ## ডেটাসেট ভারসাম্যপূর্ণ করুন এখন আপনি ডেটা পরিষ্কার করেছেন, [SMOTE](https://imbalanced-learn.org/dev/references/generated/imblearn.over_sampling.SMOTE.html) - "Synthetic Minority Over-sampling Technique" - ব্যবহার করে এটি ভারসাম্যপূর্ণ করুন। 1. `fit_resample()` কল করুন, এই কৌশলটি ইন্টারপোলেশনের মাধ্যমে নতুন নমুনা তৈরি করে। ```python oversample = SMOTE() transformed_feature_df, transformed_label_df = oversample.fit_resample(feature_df, labels_df) ``` আপনার ডেটা ভারসাম্যপূর্ণ করে, আপনি এটি শ্রেণীবিভাজন করার সময় আরও ভালো ফলাফল পাবেন। একটি বাইনারি শ্রেণীবিভাজনের কথা ভাবুন। যদি আপনার বেশিরভাগ ডেটা একটি শ্রেণী হয়, একটি ML মডেল সেই শ্রেণীটি আরও ঘন ঘন পূর্বাভাস দেবে, শুধুমাত্র কারণ এর জন্য আরও ডেটা রয়েছে। ডেটা ভারসাম্যপূর্ণ করা যেকোনো অসম ডেটা নিয়ে এই ভারসাম্যহীনতা দূর করতে সাহায্য করে। 1. এখন আপনি উপাদান অনুযায়ী লেবেলের সংখ্যা পরীক্ষা করতে পারেন: ```python print(f'new label count: {transformed_label_df.value_counts()}') print(f'old label count: {df.cuisine.value_counts()}') ``` আপনার আউটপুট এরকম দেখায়: ```output new label count: korean 799 chinese 799 indian 799 japanese 799 thai 799 Name: cuisine, dtype: int64 old label count: korean 799 indian 598 chinese 442 japanese 320 thai 289 Name: cuisine, dtype: int64 ``` ডেটা সুন্দর এবং পরিষ্কার, ভারসাম্যপূর্ণ এবং খুবই সুস্বাদু! 1. শেষ ধাপ হলো আপনার ভারসাম্যপূর্ণ ডেটা, লেবেল এবং বৈশিষ্ট্যসহ, একটি নতুন ডেটাফ্রেমে সংরক্ষণ করা যা একটি ফাইলে রপ্তানি করা যেতে পারে: ```python transformed_df = pd.concat([transformed_label_df,transformed_feature_df],axis=1, join='outer') ``` 1. আপনি `transformed_df.head()` এবং `transformed_df.info()` ব্যবহার করে ডেটার দিকে একবার তাকাতে পারেন। ভবিষ্যতের পাঠে ব্যবহারের জন্য এই ডেটার একটি কপি সংরক্ষণ করুন: ```python transformed_df.head() transformed_df.info() transformed_df.to_csv("../data/cleaned_cuisines.csv") ``` এই নতুন CSV এখন রুট ডেটা ফোল্ডারে পাওয়া যাবে। --- ## 🚀চ্যালেঞ্জ এই কারিকুলামে বেশ কয়েকটি আকর্ষণীয় ডেটাসেট রয়েছে। `data` ফোল্ডারগুলো ঘেঁটে দেখুন সেখানে কি এমন কোনো ডেটাসেট রয়েছে যা বাইনারি বা মাল্টিক্লাস শ্রেণীবিভাজনের জন্য উপযুক্ত? আপনি এই ডেটাসেট থেকে কী প্রশ্ন করবেন? ## [পাঠের পরবর্তী কুইজ](https://ff-quizzes.netlify.app/en/ml/) ## পর্যালোচনা এবং স্ব-অধ্যয়ন SMOTE-এর API অন্বেষণ করুন। এটি কোন ব্যবহার ক্ষেত্রে সবচেয়ে ভালোভাবে ব্যবহৃত হয়? এটি কোন সমস্যাগুলো সমাধান করে? ## অ্যাসাইনমেন্ট [শ্রেণীবিভাজন পদ্ধতি অন্বেষণ করুন](assignment.md) --- **অস্বীকৃতি**: এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা তার জন্য দায়ী থাকব না।