<jupyter_start><jupyter_text><jupyter_code>%matplotlib inline<jupyter_output><empty_output><jupyter_text>'কনফিউশন ম্যাট্রিক্স' নিয়ে কনফিউশন নয় আরমনে আছে ক্লাসিফিকেশনস সমস্যার জন্য আমরা ব্যবহার করেছিলাম অ্যাকুরেসির একটা পরিমাপ? আমাদের সুপারভাইজার মডেল কেমন পারফর্ম করছে তার একটা সামারি বোঝা যায় এই অ্যাকুরেসি থেকে। ক্লাসিফিকেশন সমস্যার সবচেয়ে সহজ ব্যাপারটা আমরা দেখেছি বাইনারি ক্লাসিফিকেশন এ। মেশিন লার্নিং সমস্যায় এটা বেশ কমন এবং কনসেপচুয়ালি আমাদের কাজে লাগে। বাইনারি ক্লাসিফিকেশন মানে হচ্ছে সেটার আউটকাম হবে পজেটিভ অথবা নেগেটিভ। হ্যাঁ অথবা না। আমাদের মডেল কেমন ফাংশন করছে সেটা নির্ভর করবে এই পজিটিভ এবং নেগেটিভ ক্লাস কতটা ভুল করছে তার ম্যাট্রিক্স এ। তবে এখানে একটা কথা আছে - পজেটিভ মানে সেটা যে ভালো বা সেটা আমাদেরকে বেশি বেনিফিট বা ভ্যালু দেয় সেরকম না কিন্তু। এটা নির্ভর করবে আমরা কি ধরনের স্টাডি করছি এবং তার অবজেক্টিভ কি? আবার নেগেটিভ মানে যে খারাপ সে রকম নাও হতে পারে, এটা নির্ভর করছে আমরা কি ধরনের আউটকাম আশা করছি।একটা গল্প দিলে বোঝা যাবে বেশি। আমার পাঠকেরা আমাকে বেশি গল্প দিতে বলেন।ধরা যাক আমরা একটা অ্যাপ্লিকেশন ডেভলপ করছি যার কাজ হচ্ছে একজন সম্ভাব্য রোগীকে স্ক্রিনিং করে আলাদা করে ফেলবে তার সেই রোগটা আছে অথবা নেই। এটাকে কিছুটা অটোমেটেড আর্লি ডিটেকশন বলতে পারি যাতে সেই সম্ভাব্য রোগী পুরোপুরি অসুস্থ হবার আগেই তাকে ঠিকমতো ট্রিটমেন্ট দেয়া যায়। শুরুতেই যদি টেস্টটা নেগেটিভ হয় তাহলে আমরা ধরে নেব সম্ভাব্য রোগী সুস্থ আছেন। এর পাশাপাশি যদি এই স্ক্রিনিং টেস্ট পজিটিভ হয় তাহলে সেই রোগীকে আরও বাড়তি টেস্ট এর মধ্যে দিয়ে যেতে হবে। কিভাবে এটা সমস্যা হলো?এখানে আমরা পজিটিভ ক্লাসকে আসলে নেগেটিভ ধারণা বলতে পারি, কারণ একজন রোগী যখন পজিটিভ হবেন - সেটা আসলে রোগীর কাছে একটা নেগেটিভ জিনিস। আসল কথা কেউ এখানে পজিটিভ হতে চাইবেন না। বরং এই স্ক্রিনিং টেস্ট এর আউটকাম যদি নেগেটিভ হয় সেটাই রোগীর জন্য পজিটিভ। অর্থাৎ আমরা চাইব টেস্টে যত নেগেটিভ হয় ততই ভালো। তাই বলে যে আমাদের মডেল সব সময় ঠিকমতো পজেটিভ বা নেগেটিভ আউটকাম দিতে পারবে সেটাও না। যখন আমাদের অ্যাপ্লিকেশন সত্যিকারের পজিটিভকে নেগেটিভ অথবা সত্যিকারের নেগেটিভকে পজেটিভ বলবে তখনই সমস্যা হয়ে যাবে দুদিকেই। এই ভুল দুদিকে হলেও দুদিকেই দু'ধরনের কনসিকোয়েন্স আছে। হয়তোবা একটা ভুল থেকে আরেকটা ভুলের মাশুল দিতে হবে অনেক বেশি, তবুও আমরা চাইব না কোনভাবেই এই দুই ধরনের ভুল হোক।সারাজীবন জেনেছি যেকোন ব্যাপারে দুধরনের জিনিস হতে পারে। পরে জানবো ভেতরের জিনিস।১. পজিটিভ (P): স্যাম্পলের অবজারভেশন পজিটিভ, যেমন রোগ আছে একজন মানুষের, সত্যিকারের রোগ২. নেগেটিভ (N): অবজারভেশন নেগেটিভ, মানে তার আসলে রোগ নেই, স্বাস্থ্যবান মানুষআমাদের গল্প শুরু হলো বলে। দেখে নেই আরো ৪টা নতুন জিনিস।৩. ট্রু পজিটিভ (TP): সত্যিকারের পজিটিভ মানে আসলে রোগ আছে, এবং প্রেডিকশনও তাই, পজিটিভ - ঠিক প্রেডিকশন করেছে - ট্রু প্রেডিকশন৪. ফলস নেগেটিভ (FN): সত্যিকারের পজিটিভ মানে অবজারভেশন পজিটিভ, কিন্তু প্রেডিকশন ভুল করেছে, ভুল করে নেগেটিভ দিয়েছে - ফলস প্রেডিকশন৫. ট্রু নেগেটিভ (TN): আসলে নেগেটিভ, মানে আমাদের অবজারভেশনে নেগেটিভ, এবং প্রেডিকশন এসেছে নেগেটিভ - ট্রু প্রেডিকশন৬. ফলস পজিটিভ (FP): আসলে নেগেটিভ, মানে অবজারভেশন নেগেটিভ, তবে ভুলে প্রেডিকশন এসেছে পজিটিভ হিসেবে- ফলস প্রেডিকশনগল্পে গল্পে কি কি ভুল হতে পারে? প্রথম ভুল হবে যখন একজন সুস্থ মানুষকে সেই অ্যাপ্লিকেশনটা পজিটিভ হিসেবে দেখাবে, তখন সেই মানুষটাকে রোগী বলবো এবং তাকে পরবর্তী কয়েকটা টেস্ট এর মধ্যে দিয়ে যেতে হবে। এতে সমস্যা দুটো। প্রথমত, সেই মানুষটি মানসিকভাবে বিপর্যস্ত হয়ে পড়বে, দ্বিতীয়তঃ তার খরচ বাড়তে থাকবে নতুন টেস্টগুলোর জন্য। এই ভুল পজিটিভ প্রেডিকশন কে আমরা বলি ‘ফলস পজিটিভ’। এটাকে পরিসংখ্যানের ভাষায় আমরা বলি টাইপ ১ এরর। তবে, দ্বিতীয় ভুলটি ভয়াবহ। একজন সত্যিকারের রোগীকে এই অ্যাপ্লিকেশন নেগেটিভ হিসেবে ক্লাসিফাই করবে, এর মানে হচ্ছে তাকে আর পরবর্তী নতুন কোন টেস্ট এবং তার অ্যাসোসিয়েটেড ট্রিটমেন্ট বাদ পড়ে যেতে পারে। এর ফলাফল সেই সত্যিকারের রোগীকে ভয়াবহ দিকে ঠেলে দিতে পারে। এ ধরনের ভুল যাকে আমরা বলছি ভুল নেগেটিভ প্রেডিকশন, তাকে আমরা মেশিন লার্নিং এ ভাষায় বলি ‘ফলস নেগেটিভ’। পরিসংখ্যানের ভাষায় আমরা এই ‘ফলস নেগেটিভ’কে বলি টাইপ ২ এরর।এখানে কি চাইবো?আমরা চাইবো যেকোনোভাবে যাতে আমাদের অ্যাপ্লিকেশন যত কম ‘ফলস নেগেটিভ’ দিতে পারে। ‘ফলস নেগেটিভ’ একটা ভয়াবহ জিনিস বিশেষ করে রোগের ক্ষেত্রে। সেই থেকে ‘ফলস পজিটিভ’ হলে আমরা সেই সুস্থ মানুষের কাছে ক্ষমা চেয়ে নেব। তবে আমরা চেষ্টা করব যাতে দুটো ভুলই কমে আসে আমাদের এপ্লিকেশনে।আমাদের কি করনীয়?বাইনারি ক্লাসিফিকেশনকে ঠিকমতো ইভালুয়েট করতে হলে একটা ভালো কম্প্রিহেনসিভ গাইডলাইন হচ্ছে ‘কনফিউশন মাট্রিক্স’ ব্যবহার করা। যখন আমাদের ক্লাসিফিয়ের তার প্রেডিকশন এ কনফিউজড হয়ে ভুল করবে, তখন আমাদের জানা দরকার সে আসলে কোন ভুল করতে অন্য কি ভুল করে ফেলল? বাইনারি ক্লাসিফিকেশন না হলে যদি অন্যান্য ক্লাসিফিকেশন নিয়ে কাজ কাজ করতাম, তাহলে কি হতো? ধরা যাক আমরা ডিজিট রিকগনিশন মানে সংখ্যকে ঠিকমতো ক্লাসিফাই করতে পারছে কিনা সেটা দেখতে চাইছি। তখন আমরা দেখতে চাইবো সংখ্যা ১ আসলে মিসক্লাসিফাই হয়ে অন্য কোন সংখ্যায় রূপান্তর হচ্ছে, অথবা সংখ্যা ৬ কতবার ভুল করে সংখ্যা ৮ এর মত করে ক্লাসিফাই হচ্ছে। বেশি বলে ফেললাম?আচ্ছা ঠিক আছে, আমরা আপাতত বাইনারি ক্লাসিফিকেশন নিয়েই থাকি। যেহেতু বাইনারি ক্লাসিফিকেশন এর আউটকাম মাত্র দুটো, এর মানে হচ্ছে আমাদের কনফিউশন ম্যাট্রিক্সের দুটো সারি এবং দুটো কলাম থাকবে। আমরা এভাবে বলতে পারি এটা একটা ২ বাই ৩ অ্যারে, যেখানে সারিগুলো রিপ্রেজেন্ট করছে সত্যিকারের আসল ক্লাসকে। ছবি দেখুন, মোট চারটা সেল। আমাদের কলামগুলো রিপ্রেজেন্ট করছে প্রেডিকটেড ক্লাসকে। এখানে প্রথম কলামে কতগুলো পজিটিভ স্যাম্পলকে পজেটিভ অথবা নেগেটিভ হিসেবে প্রেডিক্ট করেছে। এরপরের কলামে আমরা দেখব কতগুলো নেগেটিভ স্যাম্পলকে ভুল করে পজেটিভ অথবা নেগেটিভ হিসেবে প্রেডিক্ট করেছে।আমরা হাতেকলমের মানুষ, দেখি হাতেকলমে। কনফিউশন ম্যাট্রিক্সের শুরুতে লাগে একটা প্রেডিকশনের সেট। একে মেলাবো আসল টার্গেট ভ্যালু, মানে সত্যিকারের ডেটার সাথে। ধরে নেই আমাদের ৪জন রোগী এসেছিলেন হাসপাতালে। তাদের মধ্যে ৩জনের রোগ ধরা পড়েছে। y_true এ ১ হচ্ছে রোগ ধরা পড়েছে। আমাদের এপ্লিকেশন অসাধারণ, সে y_pred এ প্রেডিকশনে একই জিনিস প্রেডিকশন করেছে। ১০০ তে ১০০। তাহলে কি হবে কনফিউশন ম্যাট্রিক্সে?চিত্র 0 এ চোখ বুলিয়ে দেখুন একবার। এখনই বোঝার দরকার নেই।![alt text](https://github.com/raqueeb/Intermediate-scikit-learn/raw/master/assets/cm0.png) চিত্র: ০মডেল তৈরী, আমাদের ট্রেনিং ডেটা থেকে মডেল তৈরী করলাম, এখন টেস্ট করার পালা। সেজন্য আসল ডেটাসেটকে ভাগ করে ট্রেনিং এবং টেস্ট সেট করে রেখেছি আমাদের কাছে। বোঝার জন্য আমাদের টেস্ট সেট ৪জন সম্ভাব্য রোগী নিয়ে। টেস্ট সেট বলে এর আসল উত্তর আমাদের কাছে আছে। সম্ভাব্য রোগী ১ = পজিটিভসম্ভাব্য রোগী ২ = পজিটিভসম্ভাব্য রোগী ৩ = নেগেটিভসম্ভাব্য রোগী ৪ = পজিটিভ<jupyter_code># ০ হচ্ছে নেগেটিভ, ১ হচ্ছে পজিটিভ
# ০ মানে রোগ নেই, ১ মানে রোগ আছে
# ৪ জন রোগীর স্যাম্পল
y_true = [1, 1, 0, 1] # টার্গেট ক্লাস, আসল 

# বোঝার জন্য, ধরুন, আমাদের অ্যাপ ১০০% সঠিক প্রেডিকশন করেছে (বাস্তবে হবে না) 
y_pred = [1, 1, 0, 1] # প্রেডিকটেড ক্লাস, ক্লাসিফায়ার যা প্রেডিক্ট করেছে<jupyter_output><empty_output><jupyter_text>আগেও বলেছি - তবে এবার উদাহরণে বলছি confusion_matrix(y_true, y_pred) এর রেজাল্ট হচ্ছে একটা ২x২ অ্যারে, যার দুটো সারিই আসল (টার্গেট) ক্লাস, আর কলাম দুটো প্রেডিক্টেড ক্লাস। এখানে এই ম্যাট্রিক্সের প্রথম সারির পুরো লাইন হচ্ছে নেগেটিভ। পরের সারির পুরো লাইন হচ্ছে পজিটিভ। চিত্র ১,২ এবং ৩ দেখুন বারবার।<jupyter_code>from sklearn.metrics import confusion_matrix

labels=[0,1] # ০ মানে রোগ নেই, ১ মানে রোগ আছে

# confusion_matrix(y_true, y_pred, labels=[0,1]) একই জিনিস
# confusion_matrix(y_true, y_pred, labels)
confusion_matrix(y_true, y_pred)<jupyter_output><empty_output><jupyter_text>![alt text](https://github.com/raqueeb/Intermediate-scikit-learn/raw/master/assets/cm7.7.png) চিত্র: ০.১যেখানে টার্গেট এবং প্রেডিকশন ১০০% একই, সেখানে আউটপুট এসেছে আড়াআড়ি, ১ এবং ৩। এখানে দেখুন, প্রথম সারির শুরুর ১ হচ্ছে ট্রু নেগেটিভ, এখানে আসলেও সত্যিকার অর্থে রোগ ছিলো না, মানে নেগেটিভ, এবং প্রেডিকশনে এসেছে নেগেটিভ। দুই নেগেটিভ একসাথে, তাই ট্রু নেগেটিভ। এখানে ক্লাসিফায়ার ঠিকমতো ক্লাসিফাই করেছে। কোন মিস-ক্লাসিফিকেশন নেই।পরের ০ মানে কোন ভুল ক্লাসিফাই হয়নি, কারন এখানে সবকিছুই এক, টার্গেট এবং প্রেডিকশন এক। ভুল ক্লাসিফাই হলে সেটা ফলস পজিটিভ হতো, কারণ এই সারিটাই নেগেটিভ। সেখানে নেগেটিভ যদি প্রেডিকশনে ভুলে পজিটিভ হতো তাহলে সেটা ফলস পজিটিভ হতো। নিচের ছবি দেখুন।![alt text](https://github.com/raqueeb/Intermediate-scikit-learn/raw/master/assets/clf1.png) চিত্র: ১ দ্বিতীয় সারিটা দেখুন। এটার শুরুতে ০। পুরো সারিটা পজিটিভ হলে, এখানে প্রেডিকশন নেগেটিভ হয়নি। কারণ ০, কোন নেগেটিভ প্রেডিকশন না হবার কারণে এটা ভুলভাবে মানে ফলসলি নেগেটিভ হয়নি। এই ঘরটা ফলস নেগেটিভের ঘর। ০ মানে কোন মিস-ক্লাসিফিকেশন নেই।দ্বিতীয় সারির শেষের ৩ সংখ্যাটা দেখি। যেহেতু পুরো সারিটা পজিটিভ, এখানে সত্যিকারের রোগী ছিল ৩ জন, পজিটিভ কেস - প্রেডিকশনেও এসেছে ৩ জন। সেকারণে একে বলা হচ্ছে ট্রু পজিটিভ।আচ্ছা, বলুনতো এখানে তো কোন ভুল প্রেডিকশন হয়নি, তাহলে আড়াআড়ি দুটো ০ কেন? ঠিক ধরেছেন কোন মিস-ক্লাসিফাই হয়নি। একটা পারফেক্ট ক্লাসিফায়ারের শুধুমাত্র ট্রু পজিটিভ এবং ট্রু নেগেটিভ থাকবে। বাকি সব ০, মানে কোন মিস-ক্লাসিফিকেশন নেই। কোন ফলস পজিটিভ এবং ফলস নেগেটিভ থাকবে না। চিত্র ২ দেখুন। সেটা তো পারফেক্ট পৃথিবীর চিত্র, সেটা কি কখনো হবে?![alt text](https://github.com/raqueeb/Intermediate-scikit-learn/raw/master/assets/clf2.png) চিত্র: ২ আসুন, আমাদের ইমপারফেক্ট ওয়ার্ল্ডে, যেখানে অনেক কিছুই ভুল হতে পারে।কি হতে পারে? নিচের ডেটা দেখুন।এবার ধরে নিচ্ছি ৪টা স্যাম্পলে মানে ৪ জন রোগী সন্দেহে হাসপাতালে এসেছিলো (যাদের মধ্যে আসলে ৩ জন রোগী হিসেবে পজিটিভ), তবে আমাদের অ্যাপ সেখানে প্রথম স্যাম্পলে ঠিক করেছে, ১, ১, সত্যিকারে ১, প্রেডিকশনে ১ (ট্রু-পজিটিভ)। ছবিতে গোল মার্ক দেখুন।![alt text](https://github.com/raqueeb/Intermediate-scikit-learn/raw/master/assets/cm-2.png) চিত্র: ৩ আসল ডেটা হ্যাঁ, প্রেডিকশন না এবং হ্যাঁপরের স্যাম্পল সে আসলে রোগী, তবে আমাদের অ্যাপ তাকে মিস-ক্লাসিফাই করেছে 'রোগী নয়' হিসেবে। কি হবে? উপরের ছবিতে দেখুন, ফলস নেগেটিভ মার্ক করা হয়েছে আয়াতক্ষেত্র দিয়ে।  পরের স্যাম্পলে (০, ১) মানুষটা আসলে রোগী ছিলো না। ০ মানে আসলে রোগী না। কিন্তু আমাদের অ্যাপ তাকে মিস-ক্লাসিফাই করে রোগী মানে ১ দিয়ে ফেলেছে। এখানে কি হবে? আসলে রোগী না, কিন্তু প্রেডিকশন ভুল করে রোগী। প্রথম সারি দিয়ে যাই। "আসলে না" সারি দিয়ে শুরু, কিন্তু প্রেডিকশন হ্যাঁ হয়ে গেছে। সেকারণে এটা ফলস ভাবে পজিটিভ, ফলস পজিটিভ। নিচের ছবি দেখুন। ত্রিভুজ দিয়ে মার্ক করা হয়েছে।![alt text](https://github.com/raqueeb/Intermediate-scikit-learn/raw/master/assets/cm-3.png) চিত্র: ৪  আসলে হ্যাঁ এবং প্রেডিকশন না এবং হ্যাঁসবচেয়ে শেষের স্যাম্পল, ১, ১ মানে সে আসলে রোগী, এবং প্রেডিকশনও ঠিক। কি হবে এখানে? যেতে হবে 'আসলে হ্যাঁ' দ্বিতীয় সারি দিয়ে। যেতে হবে যতক্ষণ 'প্রেডিকশন হ্যাঁ' না হয়। 'আসলে হ্যাঁ' যখন 'প্রেডিকশন হ্যাঁ' এর সাথে ক্রস করে তখন ট্রু পজিটিভ হয়। উপরের ছবি দেখুন। গোল করে মার্ক করা হয়েছে সেখানে।<jupyter_code>y_true = [1, 1, 0, 1]   # সত্যিকারের ডেটা
y_pred = [1, 0, 1, 1]   # প্রেডিক্টেড ডেটা

confusion_matrix(y_true, y_pred)<jupyter_output><empty_output><jupyter_text>সবগুলোর যোগফল এখানে। মনে আছে "ট্রু পজিটিভ" ছিলো ২টা। কিভাবে? নিচের ছবিটা দেখুন।![alt text](https://github.com/raqueeb/Intermediate-scikit-learn/raw/master/assets/cm4.png) চিত্র: ৪ সব ঠিকমতো ক্লাসিফাই করেছেএখন পরের কলামটা (১, ০), সত্যিকারের রোগী, তবে আমাদের অ্যাপ ক্লাসিফাই মানে প্রেডিকশন করেছে 'রোগী না' হিসেবে। ফলস নেগেটিভ। একটাই ভুল। সেকারণে ১। তারপরের কলামটা কি হবে? ০, ১? আসলে 'রোগী না' তবে ক্লাসিফাই করেছে রোগী হিসেবে। অবশ্যই ফলস পজিটিভ। ভুল কয়টা? ১টা। ![alt text](https://github.com/raqueeb/Intermediate-scikit-learn/raw/master/assets/cm6.1.png) চিত্র: ৫ দুটো মিস-ক্লাসিফাই করেছেফাইনালি দেখি। সবদিক দিয়ে ৪টা স্যাম্পল (১, ৩) এবং (১, ৩) মিলেছে। আর কি লাগে? ![alt text](https://github.com/raqueeb/Intermediate-scikit-learn/raw/master/assets/cm-1.png) চিত্র: ৬ সব স্যাম্পলের যোগফল ৪এখন দেখুন নিচের উদাহরণগুলো, সিবর্ণ, পান্ডাজ দিয়ে। ক্লাসিফিকেশন রিপোর্ট নিয়ে আলাপ হবে এখন।<jupyter_code>import seaborn as sns

cm = confusion_matrix(y_true, y_pred)

sns.heatmap(cm, annot=True)

import numpy as np

sns.heatmap(cm/np.sum(cm), annot=True, fmt='.2%', cmap='Blues')
from sklearn.metrics import accuracy_score

accuracy_score(y_true, y_pred)<jupyter_output><empty_output><jupyter_text>এখানে ম্যাচ কয়টা?ম্যাচের সংখ্যা = ২স্যাম্পলের সংখ্যা = ৪অ্যাক্যুরেসি = ম্যাচ/স্যাম্পলঅ্যাক্যুরেসি = ২/৪অ্যাক্যুরেসি = ০.৫০<jupyter_code>from sklearn.metrics import classification_report

print(classification_report(y_true, y_pred, digits=2))
# কোড দেখার প্রয়োজন নেই, শুধুমাত্র বোঝার জন্য, ধারণা বুঝলে পরে কোড বুঝবো

labels = ['True Neg','False Pos','False Neg','True Pos']
labels = np.asarray(labels).reshape(2,2)
sns.heatmap(cm, annot=labels, fmt='', cmap='Blues')
# কোড দেখার প্রয়োজন নেই, শুধুমাত্র বোঝার জন্য, ধারণা বুঝলে পরে কোড বুঝবো

group_names = ['True Neg','False Pos','False Neg','True Pos']
group_counts = ['{0:0.0f}'.format(value) for value in
                cm.flatten()]
group_percentages = ['{0:.2%}'.format(value) for value in
                     cm.flatten()/np.sum(cm)]
labels = [f'{v1}\n{v2}\n{v3}' for v1, v2, v3 in
          zip(group_names,group_counts,group_percentages)]
labels = np.asarray(labels).reshape(2,2)
sns.heatmap(cm, annot=labels, fmt='', cmap='Blues')
y_true = [2, 0, 2, 2, 0, 1]
y_pred = [0, 0, 2, 2, 0, 2]

sns.heatmap(confusion_matrix(y_true, y_pred), annot=True)
import pandas as pd

y_Actual =    pd.Series([0, 0, 1, 0, 0, 1, 1, 1, 1, 1], name='Actual')
y_Predicted = pd.Series([1, 0, 1, 0, 0, 0, 0, 1, 0, 0], name='Predicted')

df_confusion = pd.crosstab(y_Actual, y_Actual)

df_confusion
import seaborn as sns

sns.heatmap(df_confusion, annot=True)
df_confusion = pd.crosstab(y_Actual, y_Predicted, rownames=['Actual'], colnames=['Predicted'], margins=True)

df_confusion
import seaborn as sns

sns.heatmap(df_confusion, annot=True)
y_true = ["cat", "ant", "cat", "cat", "ant", "bird"]
y_pred = ["ant", "ant", "cat", "cat", "ant", "cat"]

cm = confusion_matrix(y_true, y_pred, labels=["ant", "bird", "cat"])

df_cm = pd.DataFrame(cm, columns=np.unique(y_true), index = np.unique(y_true))
df_cm.index.name = 'Actual'
df_cm.columns.name = 'Predicted'
sns.heatmap(df_cm, cmap="Blues", annot=True)
from sklearn import svm, datasets

# আমাদের আগের বই থেকে
iris = datasets.load_iris()
X = iris.data
y = iris.target
class_names = iris.target_names
print(iris.target_names)
from sklearn.model_selection import train_test_split

# ডেটাকে ভাগ করি ট্রেনিং এবং টেস্ট সেটে, টেস্ট সেট ডিফল্ট, ২৫% মানে ১৫০ এ ৩৮টা
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
X_test.shape
# একটা ক্লাসিফায়ার চালাই, একটু বেশি রেগুলারাইজড, plot_confusion_matrix
# চালাতে একটা ক্লাসিফায়ার লাগে
classifier = svm.SVC(kernel='linear', C=0.01).fit(X_train, y_train)
import matplotlib.pyplot as plt
from sklearn.metrics import plot_confusion_matrix

plot_confusion_matrix(classifier, X_test, y_test,
                                  cmap=plt.cm.Blues,
                                  display_labels=class_names)
(13 + 10 + 9) + 6
classifier.score(X_test, y_test)
32 / 38<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.2817835473402004, 'fraction_numerical': 0.014392549738958657, 'mean_word_length': 5.157688966116421, 'pattern_counts': {'":': 0, '<': 25, '<?xml version=': 0, '>': 25, 'https://': 9, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 2, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '6', 'dir': 'jupyter-structured-clean-dedup', 'id': '387783', 'license': 'MIT', 'n_tokens_mistral': 12812, 'n_tokens_neox': 15279, 'n_words': 1889, 'path': 'book_plot_confusion_matrix.ipynb', 'repo_name': 'ramzan-git/Intermediate-scikit-learn', 'size': '14174'}