وبلاگ رسانگار
با ما حرفه ای باشید

سرور مجازی NVMe

الگوریتم ساده بیز در پایتون با Scikit-Learn

0 9
زمان لازم برای مطالعه: 7 دقیقه


هنگام مطالعه احتمال و آمار، یکی از اولین و مهمترین قضایایی که دانش آموزان یاد می گیرند، قضیه است قضیه بیز. این قضیه پایه و اساس استدلال قیاسی است که تمرکز دارد روی تعیین احتمال وقوع یک رویداد بر اساس روی آگاهی قبلی از شرایطی که ممکن است با رویداد مرتبط باشد.

این طبقه بندی کننده ساده لوح بیز قدرت این قضیه را به یادگیری ماشین می آورد و یک طبقه بندی بسیار ساده و در عین حال قدرتمند می سازد. در این مقاله مروری خواهیم داشت روی این طبقه‌بندی‌کننده چگونه کار می‌کند، چه برنامه‌های کاربردی مناسبی دارد، و چگونه از آن فقط در چند خط از Python و کتابخانه Scikit-Learn استفاده کنیم.

نظریه پشت قضیه بیز

اگر شما در رشته های علوم کامپیوتر، ریاضیات یا هر رشته دیگری که شامل آمار است مطالعه کرده اید، به احتمال زیاد در مقطعی به فرمول زیر برخورد کرده اید:

P(H|E) = (P(E|H) * P(H)) / P(E)

جایی که

  • P(H|E) احتمال فرضیه است H با توجه به این رویداد E، یک احتمال پسین.
  • P(E|H) احتمال وقوع است E با توجه به اینکه فرضیه H درست است.
  • P(H) احتمال فرضیه است H درست بودن (صرف نظر از هر رویداد مرتبط)، یا احتمال قبلی H.
  • P(E) احتمال وقوع رویداد (صرف نظر از فرضیه) است.

این قضیه بیز است. در نگاه اول ممکن است درک آن سخت باشد، اما اگر آن را از طریق یک مثال بررسی کنیم، بسیار شهودی است:

بیایید بگوییم که ما علاقه مندیم بدانیم که آیا یک ایمیل حاوی کلمه است یا خیر ارتباط جنسی (رویداد) هرزنامه (فرضیه) است. اگر به شرح قضیه برگردیم، این مسئله را می توان به صورت زیر فرموله کرد:

P(class=SPAM|contains="sex") = (P(contains="sex"|class=SPAM) * P(class=SPAM)) / P(contains="sex")

که در زبان انگلیسی ساده عبارت است از: احتمال یک ایمیل حاوی کلمه ارتباط جنسی هرزنامه بودن برابر با نسبت ایمیل های اسپم است که حاوی کلمه هستند ارتباط جنسی ضرب در نسبت ایمیل های هرزنامه و تقسیم بر نسبت ایمیل های حاوی کلمه ارتباط جنسی.

بیایید قطعه قطعه این را تشریح کنیم:

  • P(class=SPAM|contains="sex") با توجه به اینکه این ایمیل حاوی کلمه است، احتمال هرزنامه بودن یک ایمیل است ارتباط جنسی. این چیزی است که ما علاقه مند به پیش بینی آن هستیم.
  • P(contains="sex"|class=SPAM) احتمال وجود یک ایمیل حاوی کلمه است ارتباط جنسی با توجه به اینکه این ایمیل به عنوان SPAM شناخته شده است. این داده‌های آموزشی ما است که نشان‌دهنده همبستگی بین ایمیلی که هرزنامه در نظر گرفته می‌شود و چنین ایمیلی حاوی کلمه است. ارتباط جنسی.
  • P(class=SPAM) احتمال هرزنامه بودن یک ایمیل (بدون آگاهی قبلی از کلمات موجود در آن) است. این به سادگی نسبت ایمیل هایی است که در کل مجموعه آموزشی ما هرزنامه هستند. ما در این مقدار ضرب می کنیم زیرا علاقه مندیم که بدانیم اطلاعات مربوط به ایمیل های هرزنامه چقدر مهم است. اگر این مقدار کم باشد، اهمیت رویدادهای مرتبط با ایمیل‌های هرزنامه نیز کم خواهد بود.
  • P(contains="sex") احتمال وجود یک ایمیل حاوی کلمه است ارتباط جنسی. این به سادگی نسبت ایمیل های حاوی کلمه است ارتباط جنسی در کل مجموعه آموزشی ما ما بر این مقدار تقسیم می کنیم زیرا کلمه انحصاری تر است ارتباط جنسی است، مهمتر زمینه ای است که در آن ظاهر می شود. بنابراین، اگر این عدد کم باشد (کلمه به ندرت ظاهر می شود)، می تواند یک شاخص عالی باشد که در مواردی که ظاهر می شود، یک ویژگی مناسب برای تجزیه و تحلیل است.

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

احتمالات کلاس

در قضیه، P(A) نشان دهنده احتمالات هر رویداد است. در طبقه‌بندی‌کننده ساده بیز، می‌توانیم این احتمالات کلاس را به سادگی فراوانی هر نمونه از رویداد تقسیم بر تعداد کل نمونه‌ها تفسیر کنیم. به عنوان مثال، در مثال قبلی تشخیص هرزنامه، P(class=SPAM) نشان دهنده تعداد ایمیل های طبقه بندی شده به عنوان هرزنامه تقسیم بر مجموع همه موارد است (این spam + not spam)

P(class=SPAM) = count(class=SPAM) / (count(class=notSPAM) + count(class=SPAM))

احتمالات مشروط

در قضیه، P(A|B) احتمالات مشروط یک رویداد را نشان می دهد A با توجه به یک رویداد دیگر B. در طبقه‌بندی کننده ساده بیز، اینها احتمال خلفی را رمزگذاری می‌کنند A زمانی رخ می دهد که B درست است.

برای مثال هرزنامه، P(class=SPAM|contains="sex") تعداد مواردی را نشان می دهد که در آن یک ایمیل به عنوان هرزنامه در نظر گرفته می شود و حاوی کلمه است ارتباط جنسی، تقسیم بر تعداد کل ایمیل هایی که حاوی کلمه هستند ارتباط جنسی:

P(class=SPAM|contains="sex") = count(class=SPAM & contains=sex) / count(contains=sex)

برنامه های کاربردی

کاربرد طبقه‌بندی کننده Naive Bayes در سناریوهای مختلف موفقیت آمیز نشان داده شده است. یک مورد استفاده کلاسیک طبقه‌بندی سند است: تعیین اینکه آیا یک سند معین با دسته‌های خاصی مطابقت دارد یا خیر. با این حال، این تکنیک دارای مزایا و محدودیت هایی است.

مزایای

  • Naive Bayes یک الگوریتم ساده و آسان برای پیاده سازی است. به همین دلیل، زمانی که مقدار داده محدود است، ممکن است از مدل های پیچیده تر بهتر عمل کند.
  • Naive Bayes با داده های عددی و دسته بندی به خوبی کار می کند. همچنین می توان از آن برای انجام رگرسیون با استفاده از Gaussian Naive Bayes استفاده کرد.

محدودیت ها

  • با توجه به ساخت قضیه، زمانی که ترکیب خاصی از مقادیر را در داده های آموزشی خود از دست بدهید، به خوبی کار نمی کند. به عبارت دیگر، اگر هیچ برچسب کلاس و مقدار مشخصه خاصی را با هم نداشته باشید (به عنوان مثال class=”spam”، حاوی “$$$”) تخمین احتمال مبتنی بر فرکانس صفر خواهد بود. با توجه به فرض استقلال شرطی Naive-Bayes، وقتی همه احتمالات ضرب شوند، صفر خواهید شد.

  • تا زمانی که دسته بندی ها ساده باشند، Naive Bayes به خوبی کار می کند. به عنوان مثال، برای مشکلات مربوط به کلمات کلیدی به عنوان ویژگی (مثلاً تشخیص هرزنامه) خوب کار می کند، اما زمانی که رابطه بین کلمات مهم است (مثلاً تجزیه و تحلیل احساسات) کار نمی کند.

نسخه ی نمایشی در Scikit-Learn

زمان دمو است! ما از Python 3 همراه با Scikit-Learn برای ساخت یک آشکارساز هرزنامه بسیار ساده برای پیام‌های SMS استفاده خواهیم کرد (برای شما که جوان هستید، این همان چیزی است که در قرون وسطی برای پیام‌رسانی استفاده می‌کردیم). می توانید مجموعه داده را از اینجا پیدا و دانلود کنید این لینک.

ما به سه کتابخانه نیاز داریم که کدنویسی ما را بسیار ساده تر می کند: scikit-learn، pandas و nltk. شما می توانید استفاده کنید pip یا conda برای نصب اینها

در حال بارگیری داده ها

مجموعه پیام‌های هرزنامه نسخه 1 مجموعه‌ای از پیام‌های برچسب‌گذاری شده پیامکی است که برای تحقیق در مورد هرزنامه پیامکی جمع‌آوری شده‌اند. این شامل یک مجموعه پیام کوتاه به زبان انگلیسی از 5574 پیام است که بر اساس ham (مشروع) یا هرزنامه برچسب گذاری شده است. توزیع در مجموع 4827 پیامک قانونی (86.6 درصد) و در مجموع 747 (13.4 درصد) پیام هرزنامه است.

اگر مجموعه داده را باز کنیم، می بینیم که فرمت دارد (label) (tab) (message)، که چیزی شبیه به این است:

ham	Go until jurong point, crazy.. Available only in bugis n great world la e buffet... Cine there got amore wat...

ham	Ok lar... Joking wif u oni...

spam	Free entry in 2 a wkly comp to win FA Cup final tkts 21st May 2005. Text FA to 87121 to receive entry question(std txt rate)T&C's apply 08452810075over18's

ham	U dun say so early hor... U c already then say...

برای بارگذاری داده ها، می توانیم از Dataframe Pandas استفاده کنیم read_table روش. این به ما امکان می دهد یک جداکننده (در این مورد، یک برگه) تعریف کنیم و نام ستون ها را بر این اساس تغییر دهیم:

import pandas as pd

df = pd.read_table('SMSSpamCollection',
                   sep='\t', 
                   header=None,
                   names=('label', 'message'))

پیش پردازش

هنگامی که داده های خود را آماده کردیم، نوبت به انجام برخی پیش پردازش ها می رسد. تمرکز خواهیم کرد روی حذف واریانس بی فایده برای وظیفه ما. ابتدا باید برچسب ها را از رشته ها به مقادیر باینری برای طبقه بندی کننده خود تبدیل کنیم:

df('label') = df.label.map({'ham': 0, 'spam': 1})

دوم، تمام کاراکترهای پیام را به حروف کوچک تبدیل کنید:

df('message') = df.message.map(lambda x: x.lower())

سوم، هر گونه علامت گذاری را حذف کنید:

df('message') = df.message.str.replace('(^\w\s)', '')

چهارم، با استفاده از پیام‌ها را به کلمات واحد تبدیل کنید nltk. اول، ما باید import و توکنایزر را از console:

import nltk
nltk.download()

یک پنجره نصب ظاهر می شود. به تب “Models” رفته و از ستون “Identifier” “punkt” را انتخاب کنید. سپس روی “دانلود” کلیک کنید و فایل های لازم را نصب می کند. سپس باید کار کند! اکنون می توانیم توکن سازی را اعمال کنیم:

df('message') = df('message').apply(nltk.word_tokenize)

پنجم، تعدادی را اجرا خواهیم کرد ریشه کلمه. ایده stemming این است که متن خود را عادی کنیم زیرا همه انواع کلمات بدون در نظر گرفتن زمان دارای یک معنی هستند. یکی از محبوب ترین الگوریتم های بنیادی، الگوریتم است پورتر استمر:

from nltk.stem import PorterStemmer

stemmer = PorterStemmer()
 
df('message') = df('message').apply(lambda x: (stemmer.stem(y) for y in x))

در نهایت، داده‌ها را به رخدادها تبدیل می‌کنیم، که ویژگی‌هایی هستند که به مدل خود وارد می‌کنیم:

from sklearn.feature_extraction.text import CountVectorizer


df('message') = df('message').apply(lambda x: ' '.join(x))

count_vect = CountVectorizer()
counts = count_vect.fit_transform(df('message'))

می‌توانیم آن را به‌عنوان تعداد کلمات ساده در هر پیام بگذاریم، اما بهتر است از آن استفاده کنیم فرکانس اصطلاح فرکانس سند معکوس، بیشتر به عنوان شناخته شده است tf-idf:

from sklearn.feature_extraction.text import TfidfTransformer

transformer = TfidfTransformer().fit(counts)

counts = transformer.transform(counts)

آموزش مدل

اکنون که استخراج ویژگی را از داده‌های خود انجام داده‌ایم، زمان ساخت مدل خود فرا رسیده است. ما با تقسیم داده های خود به مجموعه های آموزشی و آزمایشی شروع خواهیم کرد:

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(counts, df('label'), test_size=0.1, random_state=69)

سپس، تنها کاری که باید انجام دهیم این است که طبقه‌بندی کننده Naive Bayes را مقداردهی اولیه کرده و داده‌ها را متناسب کنیم. برای مسائل طبقه‌بندی متن، طبقه‌بندی‌کننده چندجمله‌ای ساده بیز مناسب است:

from sklearn.naive_bayes import MultinomialNB

model = MultinomialNB().fit(X_train, y_train)

ارزیابی مدل

هنگامی که طبقه بندی کننده خود را جمع آوری کردیم، می توانیم عملکرد آن را در مجموعه آزمایشی ارزیابی کنیم:

import numpy as np

predicted = model.predict(X_test)

print(np.mean(predicted == y_test))

تبریک می گویم! طبقه بندی کننده ساده ساده ما با این مجموعه آزمایشی 98.2٪ دقت دارد! اما تنها با ارائه دقت کافی نیست، زیرا مجموعه داده ما در مورد برچسب ها نامتعادل است (86.6٪ در مقایسه با 13.4٪ هرزنامه). ممکن است این اتفاق بیفتد که طبقه‌بندی‌کننده ما در عین نادیده گرفتن کلاس هرزنامه، کلاس قانونی را بیش از حد مناسب کند. برای حل این عدم قطعیت، بیایید نگاهی به آن بیندازیم ماتریس سردرگمی:

from sklearn.metrics import confusion_matrix

print(confusion_matrix(y_test, predicted))

این confusion_matrix روش خواهد شد print چیزی شبیه به این:

((478   4)
(   6  70))

همانطور که می بینیم، مقدار خطاها بین مشروع و هرزنامه تقریباً متعادل است، به طوری که 4 پیام قانونی به عنوان هرزنامه و 6 پیام هرزنامه به عنوان مشروع طبقه بندی می شوند. به طور کلی، اینها نتایج بسیار خوبی برای طبقه بندی کننده ساده ما هستند.

نتیجه

در این مقاله شاهد یک کرش-کورس بوده ایم روی هم تئوری و هم عمل طبقه‌بندی‌کننده ساده‌لوح بیز. ما یک طبقه‌بندی‌کننده ساده چندوجهی ساده بیز را گردآوری کرده‌ایم که به دقت 98.2 درصد می‌رسد. روی تشخیص هرزنامه برای پیامک

(برچسب‌ها به ترجمه)# python



منتشر شده در 1403-01-27 19:30:04

امتیاز شما به این مطلب
دیدگاه شما در خصوص مطلب چیست ؟

آدرس ایمیل شما منتشر نخواهد شد.

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید