دو سؤال متفاوت دربارهٔ برچسب‌ها

جدول فراوانی می‌گوید هر برچسب چند بار دیده شده و جدول نسبت می‌گوید سهم آن از کل مشاهده‌ها چقدر است. برای نمونهٔ کوچک، همین دو خروجی برای دیدن عدم‌توازن کلاس‌ها یا ترکیب پاسخ‌ها مفیدند. بااین‌حال نسبت مشاهده‌شده الزاماً احتمال واقعی جامعه نیست. پیش از تفسیر، بدانید داده از کجا آمده و آیا نمونه نمایندهٔ موقعیتی است که درباره‌اش نتیجه می‌گیرید.

شمارش با Counter چگونه کار می‌کند؟

Counter یک زیرکلاس دیکشنری برای شمارش عناصر قابل‌هش است و رشته‌ها برای این کار مناسب‌اند. در این پروژه بزرگی حروف حفظ می‌شود؛ A و a دو برچسب متفاوت‌اند. تبدیل همهٔ برچسب‌ها به حروف کوچک ممکن است در بعضی کاربردها مطلوب باشد، اما سیاستی جداست. شمارنده نباید بدون درخواست، مقدارهایی را که در دامنه معنای متفاوت دارند یکسان کند.

مخرج را از کل داده بگیرید

نسبت هر برچسب برابر تعداد آن تقسیم بر تعداد کل برچسب‌هاست، نه تعداد دسته‌های یکتا. اگر شش مشاهده و سه دسته داشته باشید، تقسیم بر سه فراوانی نسبی تولید نمی‌کند. این اشتباه معمولاً عددهایی بزرگ‌تر از یک یا مجموعی نابرابر یک می‌سازد. بهتر است متغیر total را با نام روشن از طول فهرست ورودی بسازید و فقط یک بار برای تمام دسته‌ها به کار ببرید.

فهرست خالی و تقسیم بر صفر

برای ورودی خالی، دو نگاشت خالی برمی‌گردانیم؛ هیچ برچسبی وجود ندارد که نسبت آن محاسبه شود. در comprehension اگر شمارنده خالی باشد، بدنه اجرا نمی‌شود و تقسیم انجام نمی‌گیرد. این رفتار را باید بفهمید، نه اینکه صرفاً به اتفاق نتیجه تکیه کنید. اگر می‌خواستید دسته‌های ازپیش‌تعریف‌شده را با نسبت صفر نمایش دهید، آن قرارداد متفاوت و نیازمند توضیح معنای مخرج صفر بود.

دقت عددی و نمایش درصد

برای برچسبی با دو مشاهده از شش، نسبت یک‌سوم است و در float نمایش ده‌دهی محدود و تقریبی دارد. تست مناسب عددی باید تلورانس کوچک داشته باشد. گردکردن همهٔ نسبت‌ها پیش از ذخیره ممکن است مجموع نمایش را کمی کمتر یا بیشتر از یک کند. بهتر است مقدار محاسباتی را نگه دارید و گردکردن نمایشی را جدا انجام دهید؛ درصد نیز نسبت ضرب در صد است، نه نوع آماری تازه.

چه نتیجه‌ای از عدم‌توازن می‌گیریم؟

اگر یک کلاس بیشتر دیده شود، مدل همیشه‌پیش‌بینی‌کنندهٔ همان کلاس ممکن است accuracy ظاهراً بالایی داشته باشد. جدول فراوانی کمک می‌کند خط مبنا و معیار ارزیابی را آگاهانه انتخاب کنید، اما خودش مدل را ارزیابی نمی‌کند. برای تقسیم آموزش و آزمون نیز به وابستگی زمانی یا گروهی توجه کنید. حفظ نسبت کلاس‌ها همیشه برای دادهٔ زمانی مجاز نیست و نباید فقط از روی شمارش تصمیم گرفت.

آزمون و توسعهٔ گزارش

ورودی خالی، یک برچسب تکراری و دو برچسب با فراوانی برابر را تست کنید. مجموع counts باید با طول ورودی برابر باشد و برای دادهٔ غیرخالی، مجموع ratios نزدیک یک بماند. برای ادغام دو گزارش، تعدادها را جمع و نسبت‌ها را دوباره محاسبه کنید؛ میانگین سادهٔ نسبت دو نمونه با اندازهٔ متفاوت غلط است. این تمرین تفاوت عدد خلاصه و اطلاعات لازم برای ترکیب درست گزارش‌ها را نشان می‌دهد.

نمونه‌کد و قرارداد پروژه

labels: فهرست برچسب‌های رشته‌ای؛ تفاوت بزرگی حروف حفظ شود؛ خالی بودن فهرست مجاز است.

counts: تعداد هر برچسب؛ ratios: تعداد تقسیم بر طول کل. برای فهرست خالی هر دو نگاشت خالی‌اند.

from collections import Counter


def solve(data):
    counts = dict(Counter(data['labels']))
    total = len(data['labels'])
    return {'counts': counts,
            'ratios': {label: count / total for label, count in counts.items()}}

print(solve({'labels': ['A', 'B', 'A', 'C', 'B', 'A']}))

خروجی مورد انتظار

{
  "counts": {
    "A": 3,
    "B": 2,
    "C": 1
  },
  "ratios": {
    "A": 0.5,
    "B": 0.3333333333333333,
    "C": 0.16666666666666666
  }
}

پرسش‌های متداول

آیا نسبت‌ها باید دقیقاً به یک جمع شوند؟

از نظر ریاضی بله، اما float و گردکردن نمایش می‌توانند اختلاف کوچکی بسازند؛ تست با تلورانس مناسب انجام شود.

آیا می‌توان نسبت دو گزارش را مستقیم میانگین گرفت؟

فقط در شرایط خاص اندازهٔ نمونهٔ برابر. راه عمومی، ادغام تعدادها و تقسیم بر مجموع مشاهده‌هاست.

تمرین عملی و قدم بعدی

پروژهٔ «جدول فراوانی برچسب‌ها» همین قرارداد را در میزکار ارزیابی می‌کند. ابتدا خروجی نمونه را دستی محاسبه کنید، سپس تابع را اجرا کنید و یک ورودی مرزی متفاوت بسازید. نمونه‌کد راهی برای توضیح منطق است؛ برای یادگیری، علت هر شرط و انتخاب ساختار داده را بدون نگاه‌کردن به کد توضیح دهید. اجرای موفق با قبولی ارزیابی متفاوت است؛ نتیجه باید برای تمام حالت‌های تعریف‌شده درست بماند.

منابع و مطالعهٔ بیشتر

برای بررسی جزئیات و ادامهٔ مطالعه؛ متن این راهنما مستقلاً برای نوونتیکس نوشته شده است.