|
|
# রান্নার শ্রেণীবিভাগকারী ২
|
|
|
|
|
|
এই দ্বিতীয় শ্রেণীবিভাগের পাঠে, আপনি সংখ্যাসূচক ডেটা শ্রেণীবদ্ধ করার আরও উপায় আবিষ্কার করবেন। এছাড়াও আপনি শিখবেন একটি শ্রেণীবিভাগকারী অন্যটির তুলনায় বেছে নেওয়ার পরিণতি সম্পর্কে।
|
|
|
|
|
|
## [পূর্ব-লেকচার কুইজ](https://ff-quizzes.netlify.app/en/ml/)
|
|
|
|
|
|
### পূর্বপ্রয়োজনীয়তা
|
|
|
|
|
|
আমরা ধরে নিচ্ছি যে আপনি পূর্ববর্তী পাঠগুলি সম্পন্ন করেছেন এবং আপনার `data` ফোল্ডারে একটি পরিস্কৃত ডেটাসেট রয়েছে যার নাম _cleaned_cuisines.csv_ এই ৪-পাঠের মূল ফোল্ডারের রুটে।
|
|
|
|
|
|
### প্রস্তুতি
|
|
|
|
|
|
আমরা আপনার _notebook.ipynb_ ফাইলে পরিস্কৃত ডেটাসেট লোড করে ফেলেছি এবং এটিকে X এবং y ডেটাফ্রেমে ভাগ করেছি, মডেল নির্মাণ প্রক্রিয়ার জন্য প্রস্তুত।
|
|
|
|
|
|
## একটি শ্রেণীবিভাগ মানচিত্র
|
|
|
|
|
|
আগে, আপনি Microsoft-এর চিট শীট ব্যবহার করে ডেটা শ্রেণীবদ্ধ করার বিভিন্ন বিকল্প সম্পর্কে জানেন। Scikit-learn একটি অনুরূপ, কিন্তু আরও সূক্ষ্ম চিট শীট অফার করে যা আপনার এস্টিমেটর (অন্য একটি শব্দ শ্রেণীবিভাগকারীদের জন্য) নির্বাচন আরও সংকুচিত করতে সাহায্য করতে পারে:
|
|
|
|
|
|

|
|
|
> টিপ: [এই মানচিত্রটি অনলাইনে দেখুন](https://scikit-learn.org/stable/tutorial/machine_learning_map/) এবং ডকুমেন্টেশন পড়তে পথে ক্লিক করুন।
|
|
|
|
|
|
### পরিকল্পনা
|
|
|
|
|
|
এই মানচিত্রটি খুবই উপকারী যখন আপনি আপনার ডেটা সম্পর্কে স্পষ্ট ধারণা পান, কারণ আপনি এর পথ ধরে হাঁটতে পারেন একটি সিদ্ধান্তে পৌঁছাতে:
|
|
|
|
|
|
- আমাদের কাছে >৫০ নমুনা আছে
|
|
|
- আমরা একটি শ্রেণী পূর্বাভাস দিতে চাই
|
|
|
- আমাদের কাছে লেবেল করা ডেটা আছে
|
|
|
- আমাদের কাছে ১০০ হাজারের কম নমুনা আছে
|
|
|
- ✨ আমরা একটি লিনিয়ার SVC নির্বাচন করতে পারি
|
|
|
- যদি তা কাজ না করে, যেহেতু আমাদের সংখ্যাসূচক ডেটা আছে
|
|
|
- আমরা চেষ্টা করতে পারি ✨ KNeighbors Classifier
|
|
|
- যদি তা কাজ না করে, চেষ্টা করুন ✨ SVC এবং ✨ Ensemble Classifiers
|
|
|
|
|
|
এটি অনুসরণ করার জন্য একটি খুব সহায়ক পথ।
|
|
|
|
|
|
## ব্যায়াম - ডেটা ভাগ করুন
|
|
|
|
|
|
এই পথ অনুসরণ করে, আমরা কিছু লাইব্রেরি আমদানি করার মাধ্যমে শুরু করা উচিত।
|
|
|
|
|
|
1. প্রয়োজনীয় লাইব্রেরি আমদানি করুন:
|
|
|
|
|
|
```python
|
|
|
from sklearn.neighbors import KNeighborsClassifier
|
|
|
from sklearn.linear_model import LogisticRegression
|
|
|
from sklearn.svm import SVC
|
|
|
from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier
|
|
|
from sklearn.model_selection import train_test_split, cross_val_score
|
|
|
from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report, precision_recall_curve
|
|
|
import numpy as np
|
|
|
```
|
|
|
|
|
|
1. আপনার প্রশিক্ষণ এবং পরীক্ষা ডেটা ভাগ করুন:
|
|
|
|
|
|
```python
|
|
|
X_train, X_test, y_train, y_test = train_test_split(cuisines_features_df, cuisines_label_df, test_size=0.3)
|
|
|
```
|
|
|
|
|
|
## লিনিয়ার SVC শ্রেণীবিভাগকারী
|
|
|
|
|
|
সাপোর্ট-ভেক্টর ক্লাস্টারিং (SVC) হচ্ছে সাপোর্ট-ভেক্টর মেশিন পরিবারের একটি সদস্য (নিচে এগুলো সম্পর্কে আরও জানুন)। এই পদ্ধতিতে, আপনি একটি 'কর্নেল' বেছে নিতে পারেন যেটা লেবেলগুলো কিভাবে ক্লাস্টার করবে তা নির্ধারণ করে। 'C' প্যারামিটারটি 'রেগুলারাইজেশন' নির্দেশ করে যা প্যারামিটারগুলোর প্রভাব নিয়ন্ত্রণ করে। কর্নেল হতে পারে [বিভিন্ন](https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html#sklearn.svm.SVC); এখানে আমরা 'linear' সেট করেছি যাতে আমরা লিনিয়ার SVC ব্যবহার করতে পারি। সম্ভাবনা (Probability) ডিফল্ট 'false'; আমরা এটিকে 'true' সেট করেছি সম্ভাবনা অনুমান সংগ্রহ করার জন্য। আমরা ডেটা শাফল করার জন্য র্যান্ডম স্টেট '0' সেট করেছি যাতে সম্ভাবনা পাওয়া যায়।
|
|
|
|
|
|
### ব্যায়াম - একটি লিনিয়ার SVC প্রয়োগ করুন
|
|
|
|
|
|
শ্রেণীবিভাগকারীরা ধারণার জন্য একটি অ্যারে তৈরি করা শুরু করুন। আমরা পরীক্ষার সাথে এই অ্যারেতে ক্রমাগত যোগ করব।
|
|
|
|
|
|
1. একটি লিনিয়ার SVC দিয়ে শুরু করুন:
|
|
|
|
|
|
```python
|
|
|
C = 10
|
|
|
# বিভিন্ন শ্রেণীবিন্যাসকারী তৈরি করুন।
|
|
|
classifiers = {
|
|
|
'Linear SVC': SVC(kernel='linear', C=C, probability=True,random_state=0)
|
|
|
}
|
|
|
```
|
|
|
|
|
|
2. লিনিয়ার SVC ব্যবহার করে আপনার মডেল ট্রেন করুন এবং একটি প্রতিবেদন প্রিন্ট করুন:
|
|
|
|
|
|
```python
|
|
|
n_classifiers = len(classifiers)
|
|
|
|
|
|
for index, (name, classifier) in enumerate(classifiers.items()):
|
|
|
classifier.fit(X_train, np.ravel(y_train))
|
|
|
|
|
|
y_pred = classifier.predict(X_test)
|
|
|
accuracy = accuracy_score(y_test, y_pred)
|
|
|
print("Accuracy (train) for %s: %0.1f%% " % (name, accuracy * 100))
|
|
|
print(classification_report(y_test,y_pred))
|
|
|
```
|
|
|
|
|
|
ফলাফল বেশ ভালো:
|
|
|
|
|
|
```output
|
|
|
Accuracy (train) for Linear SVC: 78.6%
|
|
|
precision recall f1-score support
|
|
|
|
|
|
chinese 0.71 0.67 0.69 242
|
|
|
indian 0.88 0.86 0.87 234
|
|
|
japanese 0.79 0.74 0.76 254
|
|
|
korean 0.85 0.81 0.83 242
|
|
|
thai 0.71 0.86 0.78 227
|
|
|
|
|
|
accuracy 0.79 1199
|
|
|
macro avg 0.79 0.79 0.79 1199
|
|
|
weighted avg 0.79 0.79 0.79 1199
|
|
|
```
|
|
|
|
|
|
## K-Neighbors শ্রেণীবিভাগকারী
|
|
|
|
|
|
K-Neighbors "neighbors" পরিবারভুক্ত ML পদ্ধতির অংশ, যা সুপারভাইজড এবং আনসুপারভাইজড উভয় লার্নিং এর জন্য ব্যবহার করা যেতে পারে। এই পদ্ধতিতে, পূর্বনির্ধারিত সংখ্যক পয়েন্ট তৈরি করা হয় এবং ডেটা এই পয়েন্টগুলোর চারপাশে সংগৃহীত হয় যাতে ডেটার জন্য সাধারণীকৃত লেবেল পূর্বাভাস দেওয়া যায়।
|
|
|
|
|
|
### ব্যায়াম - K-Neighbors শ্রেণীবিভাগকারী প্রয়োগ করুন
|
|
|
|
|
|
আগের শ্রেণীবিভাগকারী ভালো ছিল, এবং ডেটার সাথে ভালো কাজ করেছে, তবে হয়ত আমরা আরও ভালো সঠিকতা পেতে পারি। একটি K-Neighbors শ্রেণীবিভাগকারী চেষ্টা করুন।
|
|
|
|
|
|
1. আপনার শ্রেণীবিভাগকারী অ্যারেতে একটি লাইন যোগ করুন (Linear SVC আইটেমের পরে কমা দিন):
|
|
|
|
|
|
```python
|
|
|
'KNN classifier': KNeighborsClassifier(C),
|
|
|
```
|
|
|
|
|
|
ফলাফল কিছুটা খারাপ:
|
|
|
|
|
|
```output
|
|
|
Accuracy (train) for KNN classifier: 73.8%
|
|
|
precision recall f1-score support
|
|
|
|
|
|
chinese 0.64 0.67 0.66 242
|
|
|
indian 0.86 0.78 0.82 234
|
|
|
japanese 0.66 0.83 0.74 254
|
|
|
korean 0.94 0.58 0.72 242
|
|
|
thai 0.71 0.82 0.76 227
|
|
|
|
|
|
accuracy 0.74 1199
|
|
|
macro avg 0.76 0.74 0.74 1199
|
|
|
weighted avg 0.76 0.74 0.74 1199
|
|
|
```
|
|
|
|
|
|
✅ [K-Neighbors](https://scikit-learn.org/stable/modules/neighbors.html#neighbors) সম্পর্কে জানুন
|
|
|
|
|
|
## সাপোর্ট ভেক্টর শ্রেণীবিভাগকারী
|
|
|
|
|
|
সাপোর্ট-ভেক্টর শ্রেণীবিভাগকারীরা [সাপোর্ট-ভেক্টর মেশিন](https://wikipedia.org/wiki/Support-vector_machine) পরিবারের সদস্য, যেগুলো শ্রেণীবিভাগ এবং রিগ্রেশন কাজের জন্য ব্যবহৃত হয়। SVM "প্রশিক্ষণ উদাহরণগুলোকে স্থানীয় বিন্দুতে ম্যাপ করে" দুটি শ্রেণীর মধ্যে দূরত্ব সর্বাধিক করার জন্য। পরবর্তী ডেটাও এই স্থানে ম্যাপ করা হয় যাতে তার শ্রেণী পূর্বাভাস দেওয়া যায়।
|
|
|
|
|
|
### ব্যায়াম - একটি সাপোর্ট ভেক্টর শ্রেণীবিভাগকারী প্রয়োগ করুন
|
|
|
|
|
|
আসুন সাপোর্ট ভেক্টর শ্রেণীবিভাগকারী দিয়ে একটু উন্নত সঠিকতার চেষ্টা করি।
|
|
|
|
|
|
1. K-Neighbors আইটেমের পরে একটি কমা দিন, তারপর এই লাইনটি যোগ করুন:
|
|
|
|
|
|
```python
|
|
|
'SVC': SVC(),
|
|
|
```
|
|
|
|
|
|
ফলাফল বেশ ভালো!
|
|
|
|
|
|
```output
|
|
|
Accuracy (train) for SVC: 83.2%
|
|
|
precision recall f1-score support
|
|
|
|
|
|
chinese 0.79 0.74 0.76 242
|
|
|
indian 0.88 0.90 0.89 234
|
|
|
japanese 0.87 0.81 0.84 254
|
|
|
korean 0.91 0.82 0.86 242
|
|
|
thai 0.74 0.90 0.81 227
|
|
|
|
|
|
accuracy 0.83 1199
|
|
|
macro avg 0.84 0.83 0.83 1199
|
|
|
weighted avg 0.84 0.83 0.83 1199
|
|
|
```
|
|
|
|
|
|
✅ [Support-Vectors](https://scikit-learn.org/stable/modules/svm.html#svm) সম্পর্কে জানুন
|
|
|
|
|
|
## Ensemble শ্রেণীবিভাগকারী
|
|
|
|
|
|
চলুন পথটি শেষ পর্যন্ত অনুসরণ করি, যদিও পূর্ববর্তী পরীক্ষা বেশ ভালো ছিল। আসুন কিছু 'Ensemble শ্রেণীবিভাগকারী' চেষ্টা করি, বিশেষ করে Random Forest এবং AdaBoost:
|
|
|
|
|
|
```python
|
|
|
'RFST': RandomForestClassifier(n_estimators=100),
|
|
|
'ADA': AdaBoostClassifier(n_estimators=100)
|
|
|
```
|
|
|
|
|
|
ফলাফল খুব ভালো, বিশেষ করে Random Forest এর জন্য:
|
|
|
|
|
|
```output
|
|
|
Accuracy (train) for RFST: 84.5%
|
|
|
precision recall f1-score support
|
|
|
|
|
|
chinese 0.80 0.77 0.78 242
|
|
|
indian 0.89 0.92 0.90 234
|
|
|
japanese 0.86 0.84 0.85 254
|
|
|
korean 0.88 0.83 0.85 242
|
|
|
thai 0.80 0.87 0.83 227
|
|
|
|
|
|
accuracy 0.84 1199
|
|
|
macro avg 0.85 0.85 0.84 1199
|
|
|
weighted avg 0.85 0.84 0.84 1199
|
|
|
|
|
|
Accuracy (train) for ADA: 72.4%
|
|
|
precision recall f1-score support
|
|
|
|
|
|
chinese 0.64 0.49 0.56 242
|
|
|
indian 0.91 0.83 0.87 234
|
|
|
japanese 0.68 0.69 0.69 254
|
|
|
korean 0.73 0.79 0.76 242
|
|
|
thai 0.67 0.83 0.74 227
|
|
|
|
|
|
accuracy 0.72 1199
|
|
|
macro avg 0.73 0.73 0.72 1199
|
|
|
weighted avg 0.73 0.72 0.72 1199
|
|
|
```
|
|
|
|
|
|
✅ [Ensemble শ্রেণীবিভাগকারী](https://scikit-learn.org/stable/modules/ensemble.html) সম্পর্কে জানুন
|
|
|
|
|
|
মেশিন লার্নিংয়ের এই পদ্ধতিটি "একাধিক বেস এস্টিমেটরের পূর্বাভাসকে একত্রিত করে" মডেলের গুণমান উন্নত করে। আমাদের উদাহরণে, আমরা Random Trees এবং AdaBoost ব্যবহার করেছি।
|
|
|
|
|
|
- [Random Forest](https://scikit-learn.org/stable/modules/ensemble.html#forest), একটি গড়করণ পদ্ধতি, 'decision trees' এর একটি 'বন' তৈরি করে যেটি র্যান্ডোমনেস সহ অতিপ্রশিক্ষণ এড়ায়। n_estimators প্যারামিটার গাছের সংখ্যা নির্ধারণ করে।
|
|
|
|
|
|
- [AdaBoost](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.AdaBoostClassifier.html) একটি শ্রেণীবিভাগকারী ডেটাসেটে ফিট করে এবং তারপর সেই শ্রেণীবিভাগকারীর কপি একই ডেটাসেটে ফিট করে। এটি ভুল শ্রেণীবদ্ধ আইটেমের ওজনের প্রতি মনোযোগ দেয় এবং পরবর্তী শ্রেণীবিভাগকারীর জন্য ফিট সামঞ্জস্য করে।
|
|
|
|
|
|
---
|
|
|
|
|
|
## 🚀চ্যালেঞ্জ
|
|
|
|
|
|
প্রত্যেকটি পদ্ধতির অনেক প্যারামিটার রয়েছে যেগুলো আপনি টুইক করতে পারেন। প্রতিটির ডিফল্ট প্যারামিটারগুলো গবেষণা করুন এবং ভাবুন এসব প্যারামিটার পরিবর্তন করলে মডেলের গুণমানের উপরে কি প্রভাব পড়বে।
|
|
|
|
|
|
## [পোস্ট-লেকচার কুইজ](https://ff-quizzes.netlify.app/en/ml/)
|
|
|
|
|
|
## পর্যালোচনা ও স্বতঃশিক্ষণ
|
|
|
|
|
|
এই পাঠগুলিতে অনেক টার্মিনোলজি আছে, তাই [এই তালিকাটি](https://docs.microsoft.com/dotnet/machine-learning/resources/glossary?WT.mc_id=academic-77952-leestott) একবার দেখে নিন যা কাজে আসবে!
|
|
|
|
|
|
## অ্যাসাইনমেন্ট
|
|
|
|
|
|
[প্যারামিটার খেলা](assignment.md)
|
|
|
|
|
|
---
|
|
|
|
|
|
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
|
|
**অস্বীকৃতি**:
|
|
|
এই নথিটি AI অনুবাদ সেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনূদিত হয়েছে। আমরা যথাসাধ্য সঠিকতার চেষ্টা করি, তবে স্বয়ংক্রিয় অনুবাদে ভুল বা অসঙ্গতি থাকতে পারে তা দয়া করে বিবেচনা করুন। মূল নথিটি তার স্বদেশী ভাষায়ই কর্তৃত্বপূর্ণ উৎস হিসেবে গণ্য করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য পেশাদার মানব অনুবাদ সরবরাহ করা উত্তম। এই অনুবাদের ব্যবহারে যে কোনও ভুল বোঝাবুঝি বা ভুল অর্থ গ্রহণের জন্য আমরা দায়ী হব না।
|
|
|
<!-- CO-OP TRANSLATOR DISCLAIMER END --> |