ক্লাস ইমব্যালান্স: ৯৯% অ্যাকুরেসির ফাঁকি

· 2 min read · Syed Omar Faruk Towaha
ক্লাস ইমব্যালান্স: ৯৯% অ্যাকুরেসির ফাঁকি

ধরুন একটা মোবাইল ব্যাংকিং কোম্পানি আপনাকে বলল জালিয়াতি ধরার একটা মডেল বানাতে। দুই সপ্তাহ পর আপনি গর্বের সাথে জানালেন: "আমার মডেল ৯৯.৫% নির্ভুল!"

তারপর কেউ মডেলের কোডটা খুলে দেখল:

def jachai(lenden):
    return "সাধারণ"

সব লেনদেনকে "সাধারণ" বলে দেয়। যেহেতু ৯৯.৫% লেনদেন সত্যিই সাধারণ, অ্যাকুরেসি ৯৯.৫%। আর জালিয়াতি ধরা পড়ে শূন্য। যে কাজের জন্য মডেল বানানো, সেটাই হয় না।

Fraud share
জালিয়াতি বিরল, কিন্তু প্রতিটা অনেক ক্ষতিকর।

সমস্যাটা কোথায়

যখন একটা শ্রেণি (class) অনেক বেশি আর আরেকটা খুব কম, তখন অ্যাকুরেসি মূলত বড় শ্রেণিটাকেই মাপে। এমন পরিস্থিতি খুব সাধারণ:

ভালো প্রশ্ন, ভালো মাপকাঠি

"কতবার ঠিক বললাম?" না জিজ্ঞেস করে জিজ্ঞেস করুন:

Two models
অ্যাকুরেসি একটু কম, কিন্তু কাজের মডেলটা আসলে জালিয়াতি ধরে।

দুটোর মধ্যে টানাপোড়েন আছে। বেশি লেনদেন সন্দেহ করলে রিকল বাড়ে, কিন্তু অনেক সাধারণ গ্রাহকের লেনদেন আটকে যায় আর তারা বিরক্ত হন। কম সন্দেহ করলে গ্রাহক খুশি, কিন্তু জালিয়াতি ফাঁক গলে বেরিয়ে যায়।

কোনটা ঠিক, সেটা নির্ভর করে কোন ভুলের দাম বেশি তার ওপর। ক্যান্সার স্ক্রিনিংয়ে একজন রোগীকে মিস করা অনেক বড় ক্ষতি; স্প্যাম ফিল্টারে একটা স্প্যাম মিস করা ছোট ব্যাপার।

from sklearn.metrics import classification_report, confusion_matrix

print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred, digits=3))

কনফিউশন ম্যাট্রিক্স দেখলে বোঝা যায় ঠিক কী ধরনের ভুল হচ্ছে। এটা অ্যাকুরেসির চেয়ে অনেক বেশি তথ্য দেয়।

সমাধানের উপায়

১. সিদ্ধান্তের সীমা (threshold) বদলানো। মডেল সম্ভাবনা দেয়; ০.৫ এর ওপরে হলেই জালিয়াতি ধরতে হবে, এমন কোনো নিয়ম নেই। ০.২ ও হতে পারে।

২. শ্রেণির ওজন। বিরল শ্রেণিতে ভুলের জন্য বেশি "শাস্তি":

from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier(class_weight="balanced", random_state=0)

৩. রিস্যাম্পলিং। বিরল উদাহরণ কৃত্রিমভাবে বাড়ানো বা বেশি উদাহরণ কিছুটা কমানো। তবে শুধু প্রশিক্ষণের ডেটায়; পরীক্ষার ডেটা অবশ্যই বাস্তবের মতো রাখতে হবে।

৪. বিরল শ্রেণির আরও ডেটা সংগ্রহ। অনেক সময় সবচেয়ে কার্যকর উপায়।

শেষ কথা

কেউ যখন বলে "আমার মডেল ৯৯% নির্ভুল", প্রথম প্রশ্নটা হওয়া উচিত: "আর সবচেয়ে বড় শ্রেণিটা ডেটার কত শতাংশ?" উত্তর যদি ৯৯% হয়, তাহলে আপনি সেই এক লাইনের জাদুকরী মডেলটাই দেখছেন, শুধু সুন্দর পোশাকে।

// related

// prefer the terminal?

Open the terminal blog and type read class-imbalance-99-accuracy-r-faki.