موضوع این قسمت یادگیری ماشین آشنایی با کتابخانه معروف و محبوب scikit-learn هست و سعی میکنیم در مورد الگوریتمهای مربوط به دستهبندی-classification- مثالهایی را بررسی کنیم ولی به صورت دقیقتر در مورد موارد زیر بحث میکنیم:
قبل از اینکه ادامه این مطلب رو بخونید اگر برای اولین بار هست حتما به قسمت صفر یادگیری ماشین مراجعه کنید.
برای دسترسی به کدها هم گیتهاب دوره رو دنبال و ستاره دار کنید با کلیک بر روی گزینه binder در هر فایل میتونید کد رو در مروگر خودتون بدون نیاز به نصب نیازمندیها اجرا کنید:
الگوریتمهای دستهبندی الگوریتمهایی هستند که برای برچسبزدن به دادهها استفاده میشوند، این الگوریتمها کاربردهای متنوعی دارند، میتونید از اونها با استفاده از تاریخچه قیمت سهام صعودی یا نزولی بودن قیمت سهام رو پیشبینی کرد یا با استفاده از اطلاعات بیمار در مورد نوع بیماری فرد پیشبینیهایی ارائه داد یا مثل کاری که در قسمت قبل و این قسمت انجام میدیم گونههای گیاه زنبق رو دستهبندی کرد!
انتخاب یک الگوریتم مناسب برای دستهبندی نیازمند تجربه و تمرین هست، هر الگوریتم فروض و نواقص خودش را داره مثل اقتصاد در یادگیری ماشین هم ناهار مجانی وجود نداره، تعبیر این عبارت اینه که هیچ الگوریتمی که همیشه بهتر از همه الگوریتمها عمل کنه وجود نداره و برای پیدا کردنش نیازمند هزینهدادن هستید.
برای پیادهسازی یادگیری ماشینی ۵ قدم اصلی وجود داره که در مورد همه اونها به مرور صحبت میکنیم:
در این قسمت و دو قسمت بعدی بیشتر در مورد الگوریتمهایها صحبت میکنیم و بعد از اون به صورت دقیقتر در مورد پیشپردازش(Preprocessing) و hyper parameter tuning میپردازیم.
در قسمت قبلی سعی کردیم با استفاده از روابط ریاضی و با کمک کتابخانه numpy مدل precption را پیاده کردیم و سعی کردیم دستهبندی گلهای زنبق را با استفاده از اون انجام بدیم. در قسمت قبل خودمون رو محدود به دو گونه زنبق کرده بودیم ولی اینبار از سه گونه رایج این گیاه استفاده می کنیم و همچنان برای تصویرسازی مناسب فقط از دو ویژگی برای پیشبینی دادهها استفاده میکنیم.
اینبار دادهها را از دیتاستهای کتابخانه سایکیتلرن دریافت میکنیم و ویژگی سوم و چهارم(پایتون از صفر میشماره) که طول کاسبرگ و گلبرگ هست را به عنوان ویژگی نمونه انتخاب میکنیم.
با توجه به اینکه دادهها یکپارچه هست برای تمرین و تست از تابع train_test_split استفاده میکنیم که با توجه به نسبتی که ما مایلیم دادهها رو تقسیم میکنه. ورودی stratify شاید کمی ناآشنا باشه این ورودی به تابع اعلام میکنه که توزیع برچسبها(گونههای زنبق) بین دو نمونه تست و تمرین تقریبا مشابه باشند، با این کار امکان اینکه الگوریتم با همه دادهها آشنا بشه در مرحله تمرین آشنا بشه رو فراهم میکنیم.
پیشپردازش یا Preprocessing یکی از مسائل مهم در الگوریتمهای یادگیری ماشینی است، در یک پست مجزا مفصل راجع به این موضوع صحبت میکنیم. در این مرحله برای اینکه یک پیشبینی مناسب ارائه بدیم نیاز به پیشپردازش دادهها داریم. برای اینکار از ماژول preprocessing کتابخانه scikit-learn استفاده میکنیم. در این بخش ما یک پردازشگر میسازیم که دادهها را با توجه به الگوریتم از پیش تعریف شده به یک توزیع با میانگین صفر و واریانس ۱تبدیل میکنه.
نکته مهم در پیشپردازشگرهای scikit-learn: حتما با دادهها تمرین پیشپردازشگر را آماده کنید(fit) و سایر دادهها را با استفاده از transform به حالت جدید تبدیل کنید.
بعد از پردازش دادهها با استفاده از مدل خطی Precption در کتابخانه تمرین و پیشبینی را انجام میدهیم.
روش پیادهسازی الگوریتم دستهبندی در کتابخانه scikit-learn به صورت زیر است:
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 طبق علامتگذاری این دوره) تخمین زده میشود. تابع لاجستیک که پیشبینی کننده احتمال یک رویداد است بردی بین ۰تا ۱ دارد.
برای مقایسه مدل لاجستیک و Perception میشه به عنوان یک نورون مصنوعی به اونها نگاه کرد که تابع فعالسازی متفاوتی دارند:
(تابع فعالسازی تابعی است که روابط خطی را با یک عملیات ریاضی به یک فضای غیرخطی منتقل میکند در بحث شبکههای عصبی در این مورد صحبت خواهد شد.)
حالا وقت مشاهده نحوه اجرا و عملکرد رگرسیون لاجستیک در کتابخانه scikit-learn است و خوشبختانه اینکار خیلی ساده است:
مثل قسمت قبل یک مدل لاجستیک با ویژگیهای مشخص ساخته شد. ورودی C یک پارامتر برای جلوگیری از بیشبرازش-overfitting- با استفاده regularization است و multi_class ورودی است که تعیین کننده نگاه مدل به خروجی است. ovr برای شرایطی است که هر ورودی می تواند به چند دسته تعلق داشته باشد ولی multinomial برای حالتی است که هر نموه متعلق به یک دستهاست به عنوان تمرین میتوانید خط کامنت شده را در کد گیتهاب تغییر بدید و نتیجه را مشاهده کنید.معمولا multinomial روش مناسبتری برای دستهبندی است ولی برای نمایش بهتر از ovr استفاده میکنیم.
هرچند مدل لاجستیک هم پیشبینی کاملی ارائه نمیکنه ولی به نسبت مدل preception مرزهای بهتری تعیین میکنه.
امیدوارم که این قسمت براتون مفید بوده باشه و بتونین ازش توی کارهاتون استفاده کنید، مجددا یادآوری میکنم اگر دفعه اول هست که این سری رو مطالعه میکنید و یا برای دسترسی به لیست محتوای منتشر شده حتما به قسمت صفرش مراجعه کنید:
برای دسترسی به کدها و اجراشون به گیتهاب درس و برای دسترسی به کدهای این قسمت به صورت مستقیم به لینک زیر مراجعه کنید:
https://bit.ly/3atZnrm
اگر مایل بودید از محتوای بیشتری بهرهمند بشید حتما توی کانال تلگرام این دوره هم عضو بشید و ممنون از اینکه این دوره رو به دوستاتون معرفی میکنید.