خانه > مقالات آموزشی > یادگیری نظارت شده و کلاسه بندی بیز ساده – بخش دوم : کد نویسی

یادگیری نظارت شده و کلاسه بندی بیز ساده – بخش دوم : کد نویسی

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

در این قسمت ما کتابخانه sklearn را بررسی خواهیم کرد. sklearn در پایتون امکان استفاده از الگوریتم های یادگیری ماشین عمومی مانند  بیز ساده را فراهم می کند. ( همچنین شامل الگوریتم های دیگر مانند SVM نیز هست … که بخشی از پست ‌های آینده بررسی خواهیم کرد) پس داشتن آن، شما را از کد نویسی دستی و اجرای  الگوریتم بیز ساده خلاص می‌ کند.

به یک مرد برنامه ای بدهید، او را یک روز خسته کنید.

کد نویسی بیز ساده sklearn
به یک مرد برنامه ای بدهید، او را یک روز خسته کنید.
به یک مرد برنامه نویسی یاد بدهید، او را یک عمر خسته کنید.

تمرین کد نویسی

در این تمرین، ما مدل را با مجموعه ‌ای از ایمیل‌های علامت ‌گذاری شده با عنوان هرزنامه ( Spam ) یا غیر هرزنامه ( Not Spam ) آموزش خواهیم داد. ۷۰۲ ایمیل به طور مساوی بین هرزنامه و غیرهرزنامه تقسیم شده‌ است. سپس، ما مدل را بر روی ۲۶۰ ایمیل آزمایش خواهیم کرد. ما از مدل برای پیش ‌بینی دسته ی این ایمیل‌ ها استفاده کرده و دقت مدل را با کلاسه ‌بندی صحیح که قبلاً می ‌دانیم  مقایسه می ‌کنیم.

این یک نمونه کلاسیک از داده کاوی است.

پیش نیاز ها :

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

  • نصب پایتون
  • نصب pip
  • نصب sklearn از پایتون : pip install scikit-learn
  • نصب numpy: pip install numpy
  • نصب SciPy : pip install scipy

۰- دانلود

من یک مخزن در گیت هاب برای پایگاه داده‌ ها و کد نمونه ایجاد کرده‌ ام. می توانید از اینجا آن را دانلود کنید (از پوشه ی chapter 1 استفاده کنید ). پایگاه داده ای که ارائه شده همین پایگاه داده ای است که در این بخش استفاده می شود. من پیشنهاد می‌ کنم که این مقاله را دنبال کنید و خودتان کد نویسی را انجام دهید. در صورتی که شکست خوردید، می ‌توانید از نسخه ی من استفاده کرده یا به آن رجوع کنید.

۱- پالایش و آماده‌ سازی داده ‌ها

ما دو پوشه ی ایمیل های آزمایش ( test-mails ) و ایمیل های آموزش ( train-mails ) داریم. ما از ایمیل های آموزش برای آموزش مدل استفاده خواهیم  کرد. نمونه داده‌ های ایمیل نمونه به این شکل است:

Subject: re : 2 . 882 s - > np np
> deat : sun , 15 dec 91 2 : 25 : 2 est > : michael < mmorse @ vm1 . yorku . ca > > subject : re : 2 . 864 query > > wlodek zadrozny ask " anything interest " > construction " s > np np " . . . second , > much relate : consider construction form > discuss list late reduplication ? > logical sense " john mcnamara name " tautologous thus , > level , indistinguishable " , , here ? " . ' john mcnamara name ' tautologous support those logic-base semantics irrelevant natural language . sense tautologous ? supplies value attribute follow attribute value . fact value name-attribute relevant entity ' chaim shmendrik ' , ' john mcnamara name ' false . tautology , . ( reduplication , either . )

خط اول موضوع است و محتوا از خط سوم شروع می شود.

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

number-numbermsg[number].txt : example 3-1msg1.txt (this are non spam emails)
OR
spmsg[Number].txt : example spmsga162.txt (these files are of spam emails).

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

این متن را در نظر بگیرید:

“Hi, this is Alice. Hope you are doing well and enjoying your vacation.”

در اینجا کلماتی مانند هستم، این، باشد، و غیره واقعاً در تجزیه و تحلیل کمکی نمی کنند. چنین کلماتی نیز کلمات توقف (Stop Words) نامیده می شوند. از این رو، در این تمرین، ما ۳۰۰۰ کلمه ای از فرهنگ لغت که بیشترین استفاده را دارند را در ایمیل ها در نظر می گیریم. مطابق کد داده شده این کار انجام می شود.

بعد از پالایش، آنچه نیاز داریم این است که باید ماتریسی را برای تکرار هر کلمه ایجاد کنیم.

به عنوان مثال اگر مطلب پس از پالایش حاوی این متن است: “Hi, this is Alice. Happy Birthday Alice”، تکرار کلمات به صورت زیر ایجاد می شود.

word      :   Hi this is Alice Happy Birthday
frequency :   1   1    1  2      1      1

و ما برای هر مدرک به این ماتریس نیاز داریم. تابع extract_features ( بخش ۲ ) زیر، این کار را انجام می دهد و سپس کلماتی که کمتر استفاده می شوند را از هر مطلب حذف می کند.

def make_Dictionary(root_dir):
   all_words = []
   emails = [os.path.join(root_dir,f) for f in os.listdir(root_dir)]
   for mail in emails:
        with open(mail) as m:
            for line in m:
                words = line.split()
                all_words += words
   dictionary = Counter(all_words)
   # if you have python version 3.x use commented version.
   # list_to_remove = list(dictionary)
   list_to_remove = dictionary.keys()
   for item in list_to_remove:
       # remove if numerical. 
       if item.isalpha() == False:
            del dictionary[item]
        elif len(item) == 1:
            del dictionary[item]
    # consider only most 3000 common words in dictionary.
   dictionary = dictionary.most_common(3000)
   return dictionary

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

در آخر ما فقط ۳۰۰۰ کلمه متداول را استخراج می کنیم.

۲- استخراج ویژگی ها و ماتریس برچسب مربوطه

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

word      :   Hi this is Alice Happy Birthday
frequency :   1   1    1  2      1      1
word      :   Hi this is Alice Happy Birthday
frequency :   1   1    1  2      1      1

 

def extract_features(mail_dir):
  files = [os.path.join(mail_dir,fi) for fi in os.listdir(mail_dir)]
  features_matrix = np.zeros((len(files),3000))
  train_labels = np.zeros(len(files))
  count = 0;
  docID = 0;
  for fil in files:
    with open(fil) as fi:
      for i,line in enumerate(fi):
        if i == 2:
          words = line.split()
          for word in words:
            wordID = 0
            for i,d in enumerate(dictionary):
              if d[0] == word:
                wordID = i
                features_matrix[docID,wordID] = words.count(word)
      train_labels[docID] = 0;
      filepathTokens = fil.split('/')
      lastToken = filepathTokens[len(filepathTokens) - 1]
      if lastToken.startswith("spmsg"):
          train_labels[docID] = 1;
          count = count + 1
      docID = docID + 1
  return features_matrix, train_labels

۳- آموزش و پیش بینی با استفاده از بیز ساده در sklearn

مستندات بیز ساده درsklearn  با صراحت در مورد استفاده و پارامترهای آن توضیح داده است.

در واقع ، بیز ساده در Sklearn سه گزینه برای آموزش مدل ارائه می دهد:

گاوسی : در کلاسه بندی استفاده می شود و فرض می کند که ویژگی ها از توزیع عادی پیروی می کنند.

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

برنولی : اگر بردارهای ویژگی شما باینری باشند (مثلا صفر و یک) مدل binomial استفاده می شود. یکی از کاربرد های آن می تواند کلاسه بندی متن با مدل «دسته ی کلمات» باشد که ۱ و ۰ به ترتیب “کلمه در مطلب رخ می دهد” و “کلمه در مطلب رخ نمی دهد” هستند.

در این تمرین از بیز ساده ی گاوسی استفاده خواهیم کرد. کد استفاده شده به صورت زیر می باشد.

TRAIN_DIR = "../train-mails"
TEST_DIR = "../test-mails"
dictionary = make_Dictionary(TRAIN_DIR)
# using functions mentioned above.
features_matrix, labels = extract_features(TRAIN_DIR)
test_feature_matrix, test_labels = extract_features(TEST_DIR)
from sklearn.naive_bayes import GaussianNB
model = GaussianNB()
#train model
model.fit(features_matrix, labels)
#predict
predicted_labels = model.predict(test_feature_matrix)

۴- امتیاز دقت

در مرحله بعد ، ما نمره دقت را برای برچسب های پیش بینی شده بررسی می کنیم. نمره دقت، درصد پیش بینی های صحیح است. مجدداً ، sklearn برای محاسبه دقیق نمره دقت ، توابع اجرایی خوبی ارائه می کند.

from sklearn.metrics import accuracy_score
accuracy = accuracy_score(test_labels, predicted_labels)

۵- جمع بندی

import os
import numpy as np
from collections import Counter
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score
def make_Dictionary(root_dir):
   all_words = []
   emails = [os.path.join(root_dir,f) for f in os.listdir(root_dir)]
    for mail in emails:
        with open(mail) as m:
            for line in m:
                words = line.split()
                all_words += words
    dictionary = Counter(all_words)
    list_to_remove = dictionary.keys()
    for item in list_to_remove:
        if item.isalpha() == False:
            del dictionary[item]
        elif len(item) == 1:
            del dictionary[item]
    dictionary = dictionary.most_common(3000)
    return dictionary
def extract_features(mail_dir):
  files = [os.path.join(mail_dir,fi) for fi in os.listdir(mail_dir)]
  features_matrix = np.zeros((len(files),3000))
  train_labels = np.zeros(len(files))
  count = 0;
  docID = 0;
  for fil in files:
    with open(fil) as fi:
      for i,line in enumerate(fi):
        if i == 2:
          words = line.split()
          for word in words:
            wordID = 0
            for i,d in enumerate(dictionary):
              if d[0] == word:
                wordID = i
                features_matrix[docID,wordID] = words.count(word)
      train_labels[docID] = 0;
      filepathTokens = fil.split('/')
      lastToken = filepathTokens[len(filepathTokens) - 1]
      if lastToken.startswith("spmsg"):
          train_labels[docID] = 1;
          count = count + 1
      docID = docID + 1
  return features_matrix, train_labels
TRAIN_DIR = "../train-mails"
TEST_DIR = "../test-mails"
dictionary = make_Dictionary(TRAIN_DIR)
print "reading and processing emails from file."
features_matrix, labels = extract_features(TRAIN_DIR)
test_feature_matrix, test_labels = extract_features(TEST_DIR)
model = GaussianNB()
print "Training model."
#train model
model.fit(features_matrix, labels)
predicted_labels = model.predict(test_feature_matrix)
print "FINISHED classifying. accuracy score : "
print accuracy_score(test_labels, predicted_labels)

می توانید کد نوشته شده را اینجا مشاهده کنید.

نمره ی دقتی که از این الگوریتم گرفتید را برای ما در بخش نظرات بنویسید.

 

تکالیفی برای شما

  1. مدل های دیگر را امتحان کنید. چند جمله و برنولی ؛ سپس نمره ی دقت را در روش های مختلف مقایسه کنید.
  2. سعی کنید تعداد تکرار کلمات را از ۳۰۰۰ به مقدار بزرگ تر و کوچک تر تغییر دهید و نمودار دقت را رسم کنید.

نتیجه

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

بیشتر بخوانید :

منبع Medium
0/5 (0 نظر)

درباره‌ی احمدرضا جعفری

همچنین ببینید

10 دوره ی رایگان برتر هوش مصنوعی و یادگیری ماشین

۱۰ دوره برتر هوش مصنوعی و یادگیری ماشین در سال ۲۰۲۰

نیاز به افرادی که در زمینه های هوش مصنوعی و یادگیری ماشین علم و مهارت …

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *