مهدی قدسی‌زاده
مهدی قدسی‌زاده
خواندن ۵ دقیقه·۵ سال پیش

۳- آشنایی با کتابخانه scikit-learn - رگرسیون لاجستیک و کمی‌بیشتر

موضوع این قسمت یادگیری ماشین آشنایی با کتابخانه معروف و محبوب scikit-learn هست و سعی می‌کنیم در مورد الگوریتم‌های مربوط به دسته‌بندی-classification- مثال‌هایی را بررسی کنیم ولی به صورت دقیق‌تر در مورد موارد زیر بحث می‌کنیم:

  • کارکرد الگوریتم‌های دسته‌بندی و انتخاب بهترین الگوریتم
  • پیاده‌سازی الگوریتم Preception با استفاده از sklearn
  • پیاده‌سازی الگوریتم رگرسیون لاجستیک




قبل از اینکه ادامه این مطلب رو بخونید اگر برای اولین بار هست حتما به قسمت صفر یادگیری ماشین مراجعه کنید.

برای دسترسی به کدها هم گیتهاب دوره رو دنبال و ستاره دار کنید با کلیک بر روی گزینه binder در هر فایل می‌تونید کد رو در مروگر خودتون بدون نیاز به نصب نیازمندی‌ها اجرا کنید:

https://github.com/ghodsizadeh/learn_ml_with_mehdi

الگوریتم‌های دسته‌بندی

الگوریتم‌های دسته‌بندی الگوریتم‌هایی هستند که برای برچسب‌زدن به داده‌ها استفاده می‌شوند، این الگوریتم‌ها کاربردهای متنوعی دارند، می‌تونید از اونها با استفاده از تاریخچه قیمت سهام صعودی یا نزولی بودن قیمت سهام رو پیش‌بینی کرد یا با استفاده از اطلاعات بیمار در مورد نوع بیماری فرد پیش‌بینی‌هایی ارائه داد یا مثل کاری که در قسمت قبل و این قسمت انجام می‌دیم گونه‌های گیاه زنبق رو دسته‌بندی کرد!

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

برای پیاده‌سازی یادگیری ماشینی ۵ قدم اصلی وجود داره که در مورد همه اونها به مرور صحبت می‌کنیم:

  1. انتخاب ویژگی‌ها و جمع‌آوری برچسب داده‌‌ها
  2. انتخاب یک شاخص عملکرد
  3. انتخاب الگوریتم دسته‌بندی و الگوریتم بهینه‌سازی
  4. ارزیابی عملکرد مدل
  5. بهبود الگوریتم.

در این قسمت و دو قسمت بعدی بیشتر در مورد الگوریتم‌های‌ها صحبت می‌کنیم و بعد از اون به صورت دقیق‌تر در مورد پیش‌پردازش(Preprocessing) و hyper parameter tuning می‌پردازیم.



پیاده‌سازی الگوریتم Preception با استفاده از scikit-learn

در قسمت قبلی سعی کردیم با استفاده از روابط ریاضی و با کمک کتابخانه numpy مدل precption را پیاده کردیم و سعی کردیم دسته‌بندی‌ گل‌های زنبق را با استفاده از اون انجام بدیم. در قسمت قبل خودمون رو محدود به دو گونه زنبق کرده بودیم ولی اینبار از سه گونه رایج این گیاه استفاده می کنیم و همچنان برای تصویر‌سازی مناسب فقط از دو ویژگی برای پیش‌بینی داده‌ها استفاده می‌کنیم.

https://gist.github.com/ghodsizadeh/4ea7ce637447d4804010318706da8f3e

اینبار داده‌ها را از دیتاست‌های کتابخانه سایکیت‌لرن دریافت می‌کنیم و ویژگی سوم و چهارم(پایتون از صفر می‌شماره) که طول کاسبرگ و گلبرگ هست را به عنوان ویژگی نمونه انتخاب می‌کنیم.

با توجه به اینکه داده‌ها یکپارچه هست برای تمرین و تست از تابع train_test_split استفاده می‌کنیم که با توجه به نسبتی که ما مایلیم داده‌‌ها رو تقسیم می‌کنه. ورودی stratify شاید کمی ناآشنا باشه این ورودی به تابع اعلام می‌کنه که توزیع برچسب‌ها(گونه‌های زنبق) بین دو نمونه تست و تمرین تقریبا مشابه باشند، با این کار امکان اینکه الگوریتم با همه داده‌ها آشنا بشه در مرحله تمرین آشنا بشه رو فراهم می‌کنیم.

پیش‌پردازش یا Preprocessing یکی از مسائل مهم در الگوریتم‌های یادگیری ماشینی است، در یک پست مجزا مفصل راجع به این موضوع صحبت می‌کنیم. در این مرحله برای اینکه یک پیش‌بینی مناسب ارائه بدیم نیاز به پیش‌پردازش داده‌ها داریم. برای اینکار از ماژول preprocessing کتابخانه scikit-learn استفاده می‌کنیم. در این بخش ما یک پردازشگر می‌سازیم که داده‌ها را با توجه به الگوریتم از پیش تعریف شده به یک توزیع با میانگین صفر و واریانس ۱تبدیل می‌کنه.

نکته مهم در پیش‌پردازشگرهای scikit-learn: حتما با داده‌ها تمرین پیش‌پردازشگر را آماده کنید(fit) و سایر داده‌ها را با استفاده از transform به حالت جدید تبدیل کنید.
شروhttps://gist.github.com/ghodsizadeh/5dfae631591b354daa864bc7fe7a8094


بعد از پردازش داده‌ها با استفاده از مدل خطی Precption در کتابخانه تمرین و پیش‌بینی را انجام می‌دهیم.

روش پیاده‌سازی الگوریتم دسته‌بندی در کتابخانه scikit-learn به صورت زیر است:

  1. ساخت یک شی‌ از الگوریتم مورد نظر با پارامتر‌ها دلخواه model = Classifier(*args) o
  2. تمرین با داده‌های تمرین model.fit(x_train, y_train) o
  3. پیش‌بینی و ارزیابی عملکرد
y_pred = model.predict(x_test) accuracy_score(y_test,y_pred) # or model.score(x_test,y_test)

در پایین پیاده‌سازی شبه‌کد فوق برای مدل preception را مشاهده می‌کنی:

مشاهده کد در گیتهاب
مشاهده کد در گیتهاب

همانطور که مشاهده می‌کنید این روش با دقت ۹۸ درصد داده‌های تست را دسته‌بندی کرد،‌مشاهده مرزهای تصمیم‌گیری این مدل می‌تواند به درک بهتر عملکرد این مدل کمک کند.

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



رگرسیون لاجستیک

با وجود اینکه مدل perception یک شروع خوب برای ورود به یادگیری ماشینی است ولی مهمترین عیب اون عدم همگرایی برای داده‌هایی است که به صورت کامل خطی نیستند همگرا نمی‌شود. رگرسیون لاجستیک( که برای دسته‌بندی و نه الزاما برای رگرسیون استفاده می‌شود.) یکی از جایگزین‌های رایج برای دسته‌بندی است. برای تعریف ریاضی رگرسیون لاجسیتیک خوبه یک نگاه به ویکی‌پدیا بندازیم:

تابع لاجیت یک تابع است که با استفاده از لگاریتم طبیعی یک تناظر بین احتمال یک رویداد و دامنه اعداد حقیقی برقرار می‌کند و احتمال یک رویداد را به صورت رابطه خطی با پیش‌بینی‌کننده‌ها نشان می‌دهد:


با محاسبه p از رابطه فوق به تابع لاجستیک می‌رسیم:

که با توجه به xهای موجود و با استفاده از روش برآورد درست نمایی بیشینه (Maximum Likelihood Estimation) پارامتر‌ها beta ( یا w طبق علامت‌گذاری این دوره) تخمین زده می‌شود. تابع لاجستیک که پیش‌بینی کننده احتمال یک رویداد است بردی بین ۰تا ۱ دارد.

تابع لاجستیک(سیگمویدsigmoid)
تابع لاجستیک(سیگمویدsigmoid)

برای مقایسه مدل لاجستیک و Perception میشه به عنوان یک نورون مصنوعی به اونها نگاه کرد که تابع فعالسازی متفاوتی دارند:

(تابع فعالسازی تابعی است که روابط خطی را با یک عملیات ریاضی به یک فضای غیرخطی منتقل می‌کند در بحث شبکه‌های عصبی در این مورد صحبت خواهد شد.)



حالا وقت مشاهده نحوه اجرا و عملکرد رگرسیون لاجستیک در کتابخانه scikit-learn است و خوشبختانه اینکار خیلی ساده است:

https://gist.github.com/ghodsizadeh/46dae417e6fb90b9d62ca7c42f1464d4

مثل قسمت قبل یک مدل لاجستیک با ویژگی‌های مشخص ساخته شد. ورودی C یک پارامتر برای جلوگیری از بیش‌برازش-overfitting- با استفاده regularization است و multi_class ورودی است که تعیین کننده نگاه مدل به خروجی‌ است. ovr برای شرایطی است که هر ورودی می تواند به چند دسته تعلق داشته باشد ولی multinomial برای حالتی است که هر نموه متعلق به یک دسته‌است به عنوان تمرین می‌توانید خط کامنت شده را در کد گیتهاب تغییر بدید و نتیجه را مشاهده کنید.معمولا multinomial روش مناسب‌تری برای دسته‌بندی است ولی برای نمایش بهتر از ovr استفاده می‌کنیم.

هرچند مدل لاجستیک هم پیش‌بینی کاملی ارائه نمی‌کنه ولی به نسبت مدل preception مرزهای بهتری تعیین می‌کنه.



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

https://bit.ly/2y5WoHA

برای دسترسی به کدها و اجراشون به گیتهاب درس و برای دسترسی به کدهای این قسمت به صورت مستقیم به لینک زیر مراجعه کنید:

https://bit.ly/3atZnrm

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




یادگیری ماشینپایتونlearn ml with mehdiهوش مصنوعیآموزش
اینجا در مورد برنامه‌نویسی علمی و فنی، مدیریت کارها و کمی هم در رابطه با کتاب می‌نویسم.
شاید از این پست‌ها خوشتان بیاید