পারফরমেন্স – নিউরাল নেটওয়ার্ক

আমরা গত ২ পোস্টে দুইটা আলাদা আলাদা মডেল বানিয়ে দেখেছি । আমরা এটাও দেখেছি যে CNN মডেল অনেক ভালো একুরেসি দিয়েছে। একুরেসি কি আসলেই সব একটা মডেলের? একুরেসি দিয়ে কি কোন মডেল যাচাই করা উচিত? আমরা কিভাবে বুঝবো যে আমাদের মডেল পার্ফেক্ট কি না? চলুন উত্তরগুলো খোজার চেষ্টা করি।

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

history = model.fit(X_train, y_train, epochs=30, batch_size=32, validation_data=(X_val,y_val))

হ্যা, জাস্ট এতটুকুই পরিবর্তন করেছি। এতে লাভ হচ্ছে সবগুলো ইপোকের তথ্য history ভেরিয়েবলের মধ্যে সংরক্ষিত থাকছে। এগুলা থেকে আমরা আমাদের মডেল এনালাইসিস করা চেষ্টা করব।

একটা মডেলের প্রতিটা ইপোকের প্রতিটা লাইন দেখে দেখে মাথায় রাখা একরকম অসম্ভব। বরং আমরা যদি তথ্য গুলো গ্রাফ আকারে দেখি তাহলে বুঝতে অনেক সুবিধা হয়। প্রথমে আমরা loss দেখবঃ

 from matplotlib import pyplot as plt #import required library
 plt.plot(history.history['loss'])
 plt.plot(history.history['val_loss'])
 plt.title('CNN model Loss')
 plt.ylabel('loss')
 plt.xlabel('epoch')
 plt.legend(['train', 'val'], loc='upper left')
 plt.show()

উপরের কোডটি ভেঙ্গে বলার কিছু নেই। matplotlib ব্যবহার করে history ভেরিয়েবলের ট্রেনিং লস এবং ভ্যালিডেশন লস প্লট করেছি। আউট আসবে নিম্নরূপঃ

ট্রেনিং লস অনেক আস্তে আস্তে কমছে। ৩০ ইপোক পর্যন্ত কমছিল। আমরা আগেই জানি মডেলের উদ্দেশ্য হচ্ছে লস কে 0 তে নিয়ে যাওয়া (যদিও একপ্রকার অসম্ভব )। তার মানে যদি আরো কয়েকবার ট্রেনিং করানো যেত, তাহলে বোধহয় ভালো হত। ৩০ এর জায়গা ৫০ ইপোক। কিন্তু আপনি যখনি ভ্যালিডেশন লস এর দিকে তাকাবেন, তখনি একটু মাথা ঘুরবে। হ্যা, একটু খানি পাগলাটে। যখন ইচ্ছা হচ্ছে কমে যাচ্ছে আবার যখন ইচ্ছা হচ্ছে বেড়ে যাচ্ছে। তবে এটা দেখে ঘাবড়াবার কোন কারণ নেই। আস্তে আস্তে এটা স্বাভাবিক হয়ে যাবে আপনার কাছে। যদি ট্রেনিং লস এর হাল এরকম হতো, তাহলে চিন্তার অনেক কারণ ছিল।

এবার চলুন একুরেসির গ্রাফ প্লট করে ফেলিঃ

 plt.plot(history.history['accuracy'])
 plt.plot(history.history['val_accuracy'])
 plt.title('CNN model Loss')
 plt.ylabel('loss')
 plt.xlabel('epoch')
 plt.legend(['train', 'val'], loc='upper left')
 plt.show()

এটার অবস্থাও একই রকম প্রথম দিকে ভ্যালিডেশন একুরেসি অনেক তাড়াতাড়ি বেড়ে গেছে কিন্তু পরে আর কোন উন্নতি নেই।

উপরোক্ত ঘটনার জন্য আপনি আপনার ডেটাসেটকে দোষ দিতে পারেন। ডেটা আর মডেলকেও কিছুটা কিভাবে টিউন করবেন সেটা আমরা পরবর্তী পোস্টগুলোতে দেখব।

এবার আমরা দেখব কনফিউশন ম্যাট্রিক্স। কনফিউশন ম্যাট্রিক্সের মাধ্যমে আমরা একটা মডেলের পারফরমেন্স তুলে ধরতে পারি। এর মাধ্যমেই আপনি দেখতে পারেন কতগুলো ভুলকে সঠিক আর সঠিককে ভুল করা হয়েছে। আমরা এই তথ্যকে ৪টি ক্যাটাগরিতে ভাগ করতে পারি।

  • True Positive
  • True Negative
  • False Positive
  • False Negative

নামগুলো শুনেই কনফিউজড? স্বাভাবিক। হাজার হলেও কনফিউশন ম্যাট্রিক্স নাম এর। তবুও চলুন আরেকটু ভেঙ্গে বোঝার চেষ্টা করি। উপরের চারটা টার্ম বোঝার জন্য আপনাকে যেকোন একটা ক্লাসকে ধরে ঝুলে থাকতে হবে। দল পরিবর্তন করলেই শেষ, কনফিউশন আর দূর করতে পারবেন না।

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

  • True Positiveঃ ধরুন আপনি আপনার মডেলকে একটা বিড়ালের ইমেজ দিয়ে বললেন ক্লাসিফাই করতে। আপনার মডেলের আউটপুট আসলো বিড়াল। তারমানে সত্যি বলেছে। এক্ষেত্রে এটা True Positive। কারণ বিড়াল আপনার কাছে সবসময় পজিটিভ, বাকি সবাই নেগেটিভ।
  • True Negative: এবার আপনি একটা কুকুরের ইমেজ দিয়ে টেস্ট করলেন এবং আউটপুট আসলো কুকুর। এক্ষেত্রেও আপনার মডেল সত্যি বলেছে কিন্তু আপনি যাকে সাপোর্ট করেছেন তার নাম বলেনি। বলেছে এটা বিড়াল না, কুকুর। যেটা আপনার কাছে নেগেটিভ, যতবড় সত্যি হোক না কেন। এক্ষেত্রে এটাকে বলা হয় True Negative।
  • False Positiveঃ এবার আপনি একটি কুকুরের ইমেজ দিলেন আর আপনার মডেল বলল যে এটা বিড়াল। আপনার পক্ষ্যে বললেও ভুল বলেছে। এক্ষেত্রে এটা False Positive.
  • False Negativeঃ আপনি বিড়ালের ইমেজ দিচ্ছেন আর আপনার মডেল বলছে এটা কুকুর। সবথেকে ভয়ংকর অবস্থা। একে তো মিথ্যা বলছে তার উপর আবার আপনার পক্ষ্যেও বলছে না। এটা হলো False Negative।

আশা করি কনফিউশন কিছুটা হলেও দূর হয়েছে। এবার চলুন দেরী না করে কনফিউশন ম্যাট্রিক্স প্লট করে ফেলি। তবে তার আগে আমাদের predicted ক্লাসগুলোর নামও দরকার হবে।

predicted = model.predict(X_test)

যেহেতু এটা আমাদেরকে 0 থেকে 1 এর মধ্যে কোন সংখ্যা দিবে, সেহেতু আমাদেরকে এটাকে 0 অথবা 1 এ পরিবর্তন করতে হবে। যদি ০.৫ এর কম হয় তাহলে 0 নাহলে 1।

predicted = (predicted>0.5)

আমাদের এখন দুইটা এরে কাজে লাগবে। predicted এবং y_test । predicted এর মধ্যে মডেলের দেয়া আউটপুটগুলো আছে আর y_test এর মধ্যে আছে আসল তথ্য। চলুন এবার কনফিউশন ম্যাট্রিক্স দেখে নেই।

from sklearn.metrics import confusion_matrix,accuracy_score,precision_score,recall_score,f1_score,matthews_corrcoef,classification_report,roc_curve
 import seaborn as sns
 import matplotlib.pyplot as plt
LABELS = ['Cat', 'Dog']
 conf_matrix = confusion_matrix(y_test, predicted)
 plt.figure(figsize=(8, 8))
 sns.heatmap(conf_matrix, xticklabels=LABELS, yticklabels=LABELS, annot=True, fmt="d");
 plt.title("Confusion matrix")
 plt.ylabel('True class')
 plt.xlabel('Predicted class')
 plt.show()

উপরের ইমেজটি হল আমাদের কাংখিত কনফিউশন ম্যাট্রিক্স। আমাদের সর্বমোট টেস্ট ডেটা ছিল ৫০০০। এর মধ্যে ২০৫৩ টি বিড়ালের ইমেজ এবং ২০৬২ টি কুকুরের ইমেজকে সঠিকভাবে প্রেডিক্ট করেছে। কিন্তু ৪৫৫ টি কুকুরের ইমেজকে বিড়াল বলেছে আবার ৪৩০ বিড়ালের ইমেজকে কুকুরের ইমেজ বলেছে। এই সংখ্যা দেখেই আপনি ধারণা করে নিতে পারেন যে আপনি মডেলের কাছে যেটা চাচ্ছেন আসলে সেটা কতটুকু দিতে পারছে। আর সবথেকে বেশি গুরুত্বপূর্ণ হলো, কোন কোন ক্লাসের জন্য বেশি ভুল বলছে। সেগুলার ডেটা কেমন আছে। ডেটা ঠিক করা উচিত নাকি মডেলেই সমস্যা।

সাধারণ চোখে দেখলেই ব্যাপারগুলো বুঝতে পারবেন। তবে এজন্য আগের ৪টি টার্ম বোঝা জরুরী। আশা করি আপনারা ইতিমধ্যেই সব বুঝতে পেরেছেন। না বুঝলে জানাবেন।


Leave a Reply

Your email address will not be published. Required fields are marked *