You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ML-For-Beginners/translations/bn/4-Classification/2-Classifiers-1
localizeflow[bot] f46c8576d7
chore(i18n): sync translations with latest source changes (chunk 1/1, 12 changes)
3 months ago
..
solution chore(i18n): sync translations with latest source changes (chunk 1/1, 300 changes) 5 months ago
README.md chore(i18n): sync translations with latest source changes (chunk 1/1, 12 changes) 3 months ago
assignment.md chore(i18n): sync translations with latest source changes (chunk 1/1, 300 changes) 5 months ago
notebook.ipynb 🌐 Update translations via Co-op Translator 11 months ago

README.md

রান্নার শ্রেণীবিভাজক ১

এই পাঠে, আপনি গত পাঠ থেকে সংরক্ষণকৃত একটি পরিপূর্ণ, পরিষ্কার ডেটাসেট ব্যবহার করবেন যা রান্নার ধরন সম্পর্কে।

আপনি এই ডেটাসেট ব্যবহার করে বিভিন্ন শ্রেণীবিভাজকের মাধ্যমে একটি নির্দিষ্ট জাতীয় রান্নার ধরন পূর্বানুমান করবেন একটি উপাদানের গ্রুপের ভিত্তিতে। এই প্রক্রিয়ায়, আপনি শিখবেন কীভাবে অ্যালগরিদমগুলিকে শ্রেণীবিভাগের কাজের জন্য ব্যবহার করা যায়।

পঠনের পূর্বে কুইজ

প্রস্তুতি

ধরা যাক আপনি পাঠ ১ সমাপ্ত করেছেন, নিশ্চিত করুন যে cleaned_cuisines.csv ফাইলটি মূল /data ফোল্ডারে রয়েছে এই চারটি পঠনের জন্য।

অনুশীলন - একটি জাতীয় রান্না পূর্বানুমান করুন

  1. এই পাঠের notebook.ipynb ফোল্ডারে কাজ করে, সেই ফাইলটি এবং Pandas লাইব্রেরি আমদানি করুন:

    import pandas as pd
    cuisines_df = pd.read_csv("../data/cleaned_cuisines.csv")
    cuisines_df.head()
    

    ডেটা এরকম দেখায়:

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 0 indian 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
1 1 indian 1 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
2 2 indian 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
3 3 indian 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
4 4 indian 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 1 0
  1. এখন, আরও কিছু লাইব্রেরি আমদানি করুন:

    from sklearn.linear_model import LogisticRegression
    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
    from sklearn.svm import SVC
    import numpy as np
    
  2. প্রশিক্ষণের জন্য X ও y কোঅর্ডিনেটকে দুটি ডেটাফ্রেমে ভাগ করুন। cuisine হতে পারে লেবেল ডেটাফ্রেম:

    cuisines_label_df = cuisines_df['cuisine']
    cuisines_label_df.head()
    

    এটি এরকম দেখাবে:

    0    indian
    1    indian
    2    indian
    3    indian
    4    indian
    Name: cuisine, dtype: object
    
  3. Unnamed: 0 কলাম এবং cuisine কলামটি বাদ দিন, drop() কল ব্যবহার করে। বাকী ডেটা সংরক্ষণ করুন প্রশিক্ষণযোগ্য বৈশিষ্ট্য হিসেবে:

    cuisines_feature_df = cuisines_df.drop(['Unnamed: 0', 'cuisine'], axis=1)
    cuisines_feature_df.head()
    

    আপনার বৈশিষ্ট্যগুলো এরকম দেখায়:

almond angelica anise anise_seed apple apple_brandy apricot armagnac artemisia artichoke ... whiskey white_bread white_wine whole_grain_wheat_flour wine wood yam yeast yogurt zucchini
0 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
1 1 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
2 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
3 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
4 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 1 0

এখন আপনার মডেল প্রশিক্ষণের জন্য প্রস্তুত!

শ্রেণীবিভাজক নির্বাচন

আপনার ডেটা পরিষ্কার এবং প্রশিক্ষণের জন্য প্রস্তুত হওয়ায়, আপনাকে সিদ্ধান্ত নিতে হবে কোন অ্যালগরিদমটি কাজের জন্য ব্যবহার করবেন।

Scikit-learn শ্রেণীবিভাগকে সুপারভাইজড লার্নিংয়ের অন্তর্ভুক্ত করেছে, এবং সেই বিভাগের মধ্যে আপনি অনেক ধরনের শ্রেণীবিভাজক পাবেন। বিভিন্ন প্রকার প্রথম দৃষ্টিতে বিভ্রান্তিকর হতে পারে। নিম্নলিখিত পদ্ধতিগুলোতে শ্রেণীবিভাজন কৌশল রয়েছে:

  • লিনিয়ার মডেল
  • সাপোর্ট ভেক্টর মেশিন
  • স্টোকাস্টিক গ্রেডিয়েন্ট ডিসেন্ট
  • নিকটতম প্রতিবেশী
  • গাউসিয়ান প্রসেস
  • ডিসিশন ট্রি
  • এনসম্বল পদ্ধতি (ভোটিং শ্রেণীবিভাজক)
  • মাল্টিক্লাস ও মাল্টি আউটপুট অ্যালগরিদম (মাল্টিক্লাস ও মাল্টিলেবেল শ্রেণীবিভাগ, মাল্টিক্লাস-মাল্টি আউটপুট শ্রেণীবিভাগ)

আপনি নিউরাল নেটওয়ার্ক দিয়ে ডেটা শ্রেণীবিভাগ করতেও পারেন, তবে সেটি এই পাঠের সীমার বাইরে।

কোন শ্রেণীবিভাজক বেছে নেবেন?

তাহলে, কোন শ্রেণীবিভাজক বেছে নেবেন? প্রায়ই, একাধিক চালিয়ে দেখভাল করা এবং ভাল ফলাফল খোঁজা বেছে নেওয়ার একটি উপায়। Scikit-learn একটি সাইড বাই সাইড তুলনা দেখায় একটি তৈরি ডেটাসেটের উপর, যেখানে KNeighbors, SVC দুই ধরনের, GaussianProcessClassifier, DecisionTreeClassifier, RandomForestClassifier, MLPClassifier, AdaBoostClassifier, GaussianNB ও QuadraticDiscrinationAnalysis তুলনা করা হয়েছে; ফলাফল চিত্রায়িত হয়েছে:

শ্রেণীবিভাজকদের তুলনা

প্লটগুলি Scikit-learn এর ডকুমেন্টেশনে তৈরি

AutoML এই সমস্যা মসৃণভাবে সমাধান করে ক্লাউডে এসব তুলনা চালিয়ে, আপনাকে আপনার ডেটারের জন্য সেরা অ্যালগরিদম বেছে নিতে দেয়। এটাকে চেষ্টা করুন এখানে

আরও ভাল উপায়

তবে, অনুমান ছাড়াই আরও ভাল উপায় হলো এই ডাউনলোডযোগ্য এমএল চিট শীট অনুসরণ করা। এখানে, আমরা আবিষ্কার করি, আমাদের মাল্টিক্লাস সমস্যার জন্য আমাদের কিছু বিকল্প আছে:

মাল্টিক্লাস সমস্যার জন্য চিটশীট

মাইক্রোসফটের অ্যালগরিদম চিট শীট এর একটি অংশ, মাল্টিক্লাস শ্রেণীবিভাগের বিকল্পগুলি বর্ণনা করে

এই চিট শীটটি ডাউনলোড করুন, প্রিন্ট করে আপনার দেয়ালে খুঁজে লেগিয়ে রাখুন!

যুক্তি

চলুন দেখি আমরা বিভিন্ন উপায়ের যুক্তি দিতে পারি কি না আমাদের সীমাবদ্ধতাগুলো বিবেচনা করে:

  • নিউরাল নেটওয়ার্ক খুব ভারী। আমাদের পরিষ্কার তবে সীমিত ডেটাসেট এবং আমরা নোটবুকের মাধ্যমে স্থানীয়ভাবে প্রশিক্ষণ চালাচ্ছি, সেজন্য নিউরাল নেটওয়ার্ক এই কাজের জন্য অতিরিক্ত ভারী।
  • কোনো দুই-ক্লাস শ্রেণীবিভাজক নেই। আমরা দুই-ক্লাস শ্রেণীবিভাজক ব্যবহার করব না, সেজন্য one-vs-all বাদ।
  • ডিসিশন ট্রি বা লগিস্টিক রিগ্রেশন কাজ করতে পারে। ডিসিশন ট্রি হতে পারে, বা মাল্টিক্লাস ডেটার জন্য লগিস্টিক রিগ্রেশন।
  • মাল্টিক্লাস বুস্টেড ডিসিশন ট্রি অন্য ধরণের কাজের জন্য। মাল্টিক্লাস বুস্টেড ডিসিশন ট্রি অ-পরিমিত কাজের জন্য উপযোগী, যেমন র্যাঙ্কিং নির্মাণের কাজ, তাই এটি আমাদের জন্য উপযোগী নয়।

Scikit-learn ব্যবহার

আমরা আমাদের ডেটা বিশ্লেষণের জন্য Scikit-learn ব্যবহার করব। তবে, Scikit-learn এ লগিস্টিক রিগ্রেশন চালানোর অনেক উপায় আছে। দেখে নিন পারামিটারসমূহ কীভাবে দিতে হয়।

মোটামুটি দুটি গুরুত্বপূর্ণ পারামিটার আছে - multi_class এবং solver - যেগুলো Scikit-learn কে লগিস্টিক রিগ্রেশন চালানোর সময় বসাতে হয়। multi_class একটি নির্দিষ্ট আচরণ প্রয়োগ করে। solver এর মান নির্ধারণ করে কোন অ্যালগরিদম ব্যবহার হবে। সব solver সব multi_class মানের সঙ্গে ব্যবহার হবে না।

ডকুমেন্ট অনুযায়ী, মাল্টিক্লাস ক্ষেত্রে, ট্রেনিং অ্যালগরিদম:

  • one-vs-rest (OvR) পদ্ধতি ব্যবহার করে, যদি multi_class অপশন ovr এ থাকে
  • ক্রস-এন্ট্রপি লস ব্যবহার করে, যদি multi_class অপশন multinomial এ থাকে। (বর্তমানে multinomial অপশন শুধুমাত্র lbfgs, sag, saga এবং newton-cg সলভার দ্বারা সমর্থিত)"

🎓 এখানে 'স্কিম' মানে হয় 'ovr' (one-vs-rest) অথবা 'multinomial'। যেহেতু লগিস্টিক রিগ্রেশন মূলত বাইনারি শ্রেণীবিভাগের জন্য ডিজাইন করা, এই পদ্ধতিগুলো মাল্টিক্লাস শ্রেণীবিভাগ ভালোভাবে পরিচালনা করতে দেয়। তথ্যসূত্র

🎓 'সলভার' এর অর্থ হলো "অপ্টিমাইজেশন সমস্যায় ব্যবহৃত অ্যালগরিদম"। তথ্যসূত্র

Scikit-learn নিম্নলিখিত টেবিল দিয়ে দেখায় কীভাবে সলভার বিভিন্ন ধরণের ডেটা কাঠামোর চ্যালেঞ্জ মোকাবেলা করে:

সলভার

অনুশীলন - ডেটা ভাগ করুন

আমরা প্রথম প্রশিক্ষণে লগিস্টিক রিগ্রেশন এ ফোকাস করতে পারি কারণ আপনি পূর্বের একটি পাঠে এই বিষয়ে শিখেছেন। আপনার ডেটা প্রশিক্ষণ ও পরীক্ষা গ্রুপে ভাগ করুন train_test_split() কল করে:

X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisines_label_df, test_size=0.3)

অনুশীলন - লগিস্টিক রিগ্রেশন প্রয়োগ করুন

আপনি মাল্টিক্লাস কেস ব্যবহার করছেন, সেজন্য আপনাকে সিদ্ধান্ত নিতে হবে কোন স্কিম এবং কোন সলভার বসাবেন। মাল্টিক্লাস সেটিং সহ এবং liblinear সলভার দিয়ে লগিস্টিক রিগ্রেশন তৈরি করুন।

  1. multi_class সেট করুন ovr এবং solver সেট করুন liblinear দিয়ে একটি লগিস্টিক রিগ্রেশন তৈরি করুন:

    lr = LogisticRegression(multi_class='ovr',solver='liblinear')
    model = lr.fit(X_train, np.ravel(y_train))
    
    accuracy = model.score(X_test, y_test)
    print ("Accuracy is {}".format(accuracy))
    

    অন্য কোনো সলভার যেমন lbfgs চেষ্টা করুন, যা প্রায়ই ডিফল্ট থাকে

    লক্ষ্য করুন, দরকার হলে Pandas এর ravel ফাংশন ব্যবহার করুন ডেটা ফ্ল্যাট করতে।

    নির্ভুলতা ৮০% এর বেশি ভালো!

  2. এই মডেলটি কার্যকর দেখতে পারেন একটি ডেটার সারি (#50) পরীক্ষা করে:

    print(f'ingredients: {X_test.iloc[50][X_test.iloc[50]!=0].keys()}')
    print(f'cuisine: {y_test.iloc[50]}')
    

    ফলাফল মুদ্রিত হয়:

    ingredients: Index(['cilantro', 'onion', 'pea', 'potato', 'tomato', 'vegetable_oil'], dtype='object')
    cuisine: indian
    

    অন্য কোনো সারি নম্বর চেষ্টা করে ফলাফল পরীক্ষা করুন

  3. আরও গভীরে খুঁজে দেখলে, আপনি এই পূর্বাভাসের সঠিকতা পরীক্ষা করতে পারেন:

    test= X_test.iloc[50].values.reshape(-1, 1).T
    proba = model.predict_proba(test)
    classes = model.classes_
    resultdf = pd.DataFrame(data=proba, columns=classes)
    
    topPrediction = resultdf.T.sort_values(by=[0], ascending = [False])
    topPrediction.head()
    

    ফলাফল মুদ্রিত হয়েছে - ভারতীয় রান্না এই মডেলের সেরা অনুমান, ভাল সম্ভাবনার সাথে:

    0
    indian 0.715851
    chinese 0.229475
    japanese 0.029763
    korean 0.017277
    thai 0.007634

    আপনি কি ব্যাখ্যা করতে পারেন কেন মডেলটি বেশ নিশ্চিত যে এটি একটি ভারতীয় রান্না?

  4. আপনার রিগ্রেশন পাঠগুলোর মতো, একটি শ্রেণীবিভাগ প্রতিবেদনের মাধ্যমে আরও বিস্তারিত তথ্য পান:

    y_pred = model.predict(X_test)
    print(classification_report(y_test,y_pred))
    
    precision recall f1-score support
    chinese 0.73 0.71 0.72 229
    indian 0.91 0.93 0.92 254
    japanese 0.70 0.75 0.72 220
    korean 0.86 0.76 0.81 242
    thai 0.79 0.85 0.82 254
    accuracy 0.80 1199
    macro avg 0.80 0.80 0.80 1199
    weighted avg 0.80 0.80 0.80 1199

🚀চ্যালেঞ্জ

এই পাঠে, আপনি আপনার পরিস্কারকৃত ডেটা ব্যবহার করে একটি মেশিন লার্নিং মডেল তৈরি করেছেন যা উপাদানের সিরিজের ভিত্তিতে একটি জাতীয় রান্না পূর্বাভাস দিতে পারে। Scikit-learn যে অসংখ্য অপশন প্রদান করে তা মনোযোগ দিয়ে পড়ুন। 'solver' ধারণাটি গভীরভাবে জানুন যেন পিছনের কাজগুলো বোঝা যায়।

পোস্ট-লেকচার কুইজ

পর্যালোচনা ও স্ব-অধ্যয়ন

এই পাঠে লগিস্টিক রিগ্রেশনের গণিতের আরও গভীর অধ্যয়ন করুন।

অ্যাসাইনমেন্ট

সোলভারগুলি অধ্যয়ন করুন


অস্বীকৃতি: এই নথিটি AI অনুবাদ পরিষেবা Co-op Translator ব্যবহার করে অনূদিত হয়েছে। আমরা যথাসাধ্য সঠিকতার জন্য চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল নথিটি তার স্থানীয় ভাষায় একটি কর্তৃত্বপূর্ণ উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদের পরামর্শ দেওয়া হয়। এই অনুবাদ ব্যবহারের কারণে সৃষ্ট কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যার জন্য আমরা দায়ী নই।