کافه‌تدریس

از کلاس درس تا مسابقات Kaggle: بهبود پیش‌بینی وقوع سیل با کتابخانه Optuna

کتابخانه Optuna

امروز با یکی دیگر از فصل‌های تجربیات ما در مسابقات Kaggle همراه شما هستیم. پس از بررسی مراحل انجام اولین مسابقه ما درباره پیش‌بینی سن صدف‌ها، این بار با یک چالش جدید روبرو هستیم: پیش‌بینی احتمال وقوع سیل با استفاده از مدل‌های رگرسیون. در این مقاله، تجربیات خود را از سری مسابقات Kaggle Playground فصل ۴، قسمت ۵ با شما به اشتراک می‌گذاریم. به بررسی پیچیدگی‌های پیش‌بینی سطح سیل و استراتژی‌هایی که برای بهبود مدل‌های خود، به‌ویژه با استفاده از کتابخانه Optuna ، به کار برده‌ایم، خواهیم پرداخت.

فهرست مطالب پنهان‌کردن فهرست
  1. 1. رقابت و توضیحات مجموعه‌داده سیل
    1. 1.1. درباره مسابقه و بیان مسئله
    2. 1.2. درک مجموعه داده‌ها
  2. 2. تحلیل اکتشافی داده‌ها (EDA)
    1. 2.1. بررسی توزیع و نرمال بودن داده‌ها
    2. 2.2. تحلیل داده‌های پرت
    3. 2.3. تحلیل مقادیر منحصر به فرد
    4. 2.4. همبستگی و روابط ویژگی‌ها
  3. 3. پیش‌پردازش داده
    1. 3.1. مقیاس‌بندی و نرمال‌سازی
    2. 3.2. مقادیر گم‌شده
    3. 3.3. یکپارچگی عملیات با Pipeline
  4. 4. مهندسی ویژگی
    1. 4.1. ایجاد ویژگی‌های جدید برای پیش‌بینی سیل
      1. 4.1.1. تعاملات زیرساخت و اقلیم
      2. 4.1.2. ویژگی‌های آماری برای نتیجه بهتر
    2. 4.2. چرا ویژگی‌های آماری؟
      1. 4.2.1. کاربرد آن‌ها در کجا است؟
      2. 4.2.2. چگونه پیش‌بینی‌های ما را بهبود بخشیدند؟
      3. 4.2.3. کاربردهایی که در آن‌ها ویژگی‌های آماری می‌درخشند
      4. 4.2.4. تأثیرات و پیشنهادات
  5. 5. انتخاب، آموزش و بهبود مدل با کتابخانه Optuna
    1. 5.1. آزمایش مدل و ادغام در Pipeline
    2. 5.2. شروع ساده
    3. 5.3. تنظیم هایپرپارامتر با کتابخانه Optuna
    4. 5.4. کتابخانه Optuna
      1. 5.4.1. چرا کتابخانه Optuna یک ابزار قدرتمند است؟
      2. 5.4.2. کاربردهای کتابخانه Optuna در پروژه‌های یادگیری ماشین
      3. 5.4.3. چقدر حرفه‌ای است؟
      4. 5.4.4. کتابخانه Optuna چگونه کار می‌کند؟
      5. 5.4.5. منابع بیشتر برای کتابخانه Optuna
    5. 5.5. روش ترکیبی Voting Regressor
      1. 5.5.1. چرا Voting Regressor؟
  6. 6. ارزیابی مدل: بررسی عمیق R² و RMSE
    1. 6.1. درک R²
    2. 6.2. درک RMSE
    3. 6.3. تعادل بین R² و RMSE
    4. 6.4. ارزیابی و مقایسه مدل‌ها
  7. 7. فرآیند ارسال: راهبردهای موثر برای رقابت در Kaggle
    1. 7.1. تابلو نتایج Kaggle:
    2. 7.2. استراتژی ارسال: بهینه‌سازی هر تلاش
      1. 7.2.1. برنامه‌ریزی ارسال‌ها:
      2. 7.2.2. آزمایش و اصلاح:
      3. 7.2.3. تابلو نتایج عمومی در مقابل خصوصی:
      4. 7.2.4. زمان‌بندی استراتژیک:
      5. 7.2.5. نتایج اعتبارسنجی متقاطع:
      6. 7.2.6. همکاری تیمی:
    3. 7.3. تشویق و چشم‌اندازهای آینده
  8. 8. درس‌های کلیدی آموخته شده
  9. 9. نتیجه‌گیری: یادگیری از طریق چالش‌های علم داده
    1. 9.1. منابع:
  10. 10. یادگیری ماشین لرنینگ را از امروز شروع کنید!

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

در ادامه مروری بر روش کار ما، درس‌هایی که آموختیم و دیدگاه‌های منحصربه‌فردی که به دست آوردیم، آورده شده است.

رقابت و توضیحات مجموعه‌داده سیل

درباره مسابقه و بیان مسئله

در مسابقه “رگرسیون با مجموعه داده‌های پیش‌بینی سیل”، وظیفه ما توسعه مدلی است که بتواند به‌طور دقیق احتمال وقوع سیل را بر اساس عوامل مختلف پیش‌بینی کند. این چالش فرصتی عالی برای به‌کارگیری و بهبود مهارت‌های یادگیری ماشین ما، در پیش‌بینی یک بلای طبیعی بحرانی است که بسیاری از مناطق جهان را تحت تأثیر قرار می‌دهد. مسابقه از R2  برای ارزیابی مدل‌ها استفاده می‌کند که میزان تطابق پیش‌بینی‌های ما با احتمال واقعی وقوع سیل را اندازه‌گیری می‌کند.

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

درک مجموعه داده‌ها

مجموعه داده‌های این مسابقه، شامل مجموعه‌های آموزشی و آزمایشی (train & test)، از یک مدل یادگیری عمیق که بر روی داده‌های عوامل پیش‌بینی سیل آموزش دیده، تولید شده است. این مجموعه داده شامل ۲۲ ویژگی (Feature) است که همگی در ریسک وقوع سیل تأثیرگذار هستند:

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

تحلیل اکتشافی داده‌ها (EDA)

در این بخش، به تحلیل اکتشافی داده‌های (Exploratory data analysis – EDA) مجموعه داده‌ پیش‌بینی سیل می‌پردازیم، ساختار داده‌ها و توزیع‌های رسم شده را بررسی کرده و روابط ویژگی‌ها را تحلیل کردیم تا به نتایج ارزشمندی دست یابیم.

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

ابتدا با رسم هیستوگرام (Histogram) برای هر ویژگی، توزیع آن‌ها را بررسی کردیم. در بررسی‌هایمان، توزیع‌هایی نزدیک به نرمال برای تمامی ویژگی‌ها مشاهده شد که فرآیند پیش‌پردازش را ساده‌تر کرد. یکنواختی در توزیع‌ داده‌ها نشان‌دهنده کم بودن تعداد داده‌های پرت می باشد. به عبارتی مجموعه داده‌ای با رفتار مناسب را نشان می دهد که با فرضیات مدل‌های رگرسیون ما هم‌خوانی داشت.

تحلیل داده‌های پرت

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

        
            Column MonsoonIntensity outliers = 0.83% (9244 out of 1117957)
            Column TopographyDrainage outliers = 0.86% (9575 out of 1117957)
            Column RiverManagement outliers = 2.65% (29617 out of 1117957)
            Column Deforestation outliers = 2.53% (28235 out of 1117957)
            Column Urbanization outliers = 0.82% (9184 out of 1117957)
            Column ClimateChange outliers = 0.78% (8702 out of 1117957)
            Column DamsQuality outliers = 2.78% (31097 out of 1117957)
            Column Siltation outliers = 0.81% (9079 out of 1117957)
            Column AgriculturalPractices outliers = 0.81% (9006 out of 1117957)
            Column Encroachments outliers = 2.79% (31141 out of 1117957)
            Column IneffectiveDisasterPreparedness outliers = 0.80% (8945 out of 1117957)
            Column DrainageSystems outliers = 2.69% (30060 out of 1117957)
            Column CoastalVulnerability outliers = 0.91% (10209 out of 1117957)
            Column Landslides outliers = 0.79% (8865 out of 1117957)
            Column Watersheds outliers = 0.83% (9245 out of 1117957)
            Column DeterioratingInfrastructure outliers = 0.80% (8971 out of 1117957)
            Column PopulationScore outliers = 0.83% (9290 out of 1117957)
            Column WetlandLoss outliers = 2.64% (29499 out of 1117957)
            Column InadequatePlanning outliers = 0.83% (9299 out of 1117957)
            Column PoliticalFactors outliers = 0.87% (9707 out of 1117957)
            Column FloodProbability outliers = 0.50% (5579 out of 1117957)
        
    

تحلیل مقادیر منحصر به فرد

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

همبستگی و روابط ویژگی‌ها

ما با استفاده از یک نمودار Heatmap، همبستگی (Correlation) بین ویژگی‌ها و متغیر هدف را بررسی کردیم. تحلیل نشان داد که همه ویژگی‌ها فقط همبستگی متوسطی با متغیر هدف، “FloodProbability” داشتند، که مقادیر آن بین 0.17 تا 0.19 بود. این نشان می‌دهد که هر یک از ویژگی‌ها به تنهایی قدرت پیش‌بینی بالایی ندارند، اما به طور کلی، هنگام استفاده از آن‌ها به صورت تجمعی در مدل، هنوز می‌توانند به تحلیل‌های ارزشمندی منجر شوند.

مقادیر همبستگی بین هر ویژگی و متغیر هدف، FloodProbability:

        
            Encroachments                      0.463551
            TopographyDrainage                 0.458728
            InadequatePlanning                 0.455136
            PopulationScore                    0.451415
            Watersheds                         0.450488
            Siltation                          0.449248
            MonsoonIntensity                   0.444528
            DeterioratingInfrastructure        0.444167
            IneffectiveDisasterPreparedness    0.443369
            Urbanization                       0.442168
            DrainageSystems                    0.441420
            DamsQuality                        0.441402
            CoastalVulnerability               0.439917
            PoliticalFactors                   0.437561
            WetlandLoss                        0.437045
            Deforestation                      0.434314
            ClimateChange                      0.429403
            RiverManagement                    0.426491
            Landslides                         0.425099
            AgriculturalPractices              0.421145
            FloodProbability                   0.047226
            dtype: float64
        
    

پیش‌پردازش داده

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

مقیاس‌بندی و نرمال‌سازی

 بمنظور مقیاس‌بندی و نرمال‌سازی (Scaling and Normalization)، با توجه به توزیع نزدیک به نرمال ویژگی‌ها، از StandardScaler برای نرمال‌سازی داده استفاده کردیم. روش StandardScaler ویژگی‌ها را به گونه‌ای مقیاس می‌دهد که میانگین آنها صفر و انحراف معیار آنها یک باشد، که به ویژه برای مدل‌های حساس به مقیاس ویژگی‌ها مانند رگرسیون، بسیار مفید است.

مقادیر گم‌شده

 در مجموعه داده، هیچ مقدار گم‌شده‌ای (Missing Values) وجود نداشت.

یکپارچگی عملیات با Pipeline

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

مهندسی ویژگی

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

ایجاد ویژگی‌های جدید برای پیش‌بینی سیل

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

 تعاملات زیرساخت و اقلیم

خطرات سیل اغلب از تعامل بین کیفیت زیرساخت‌ها و عوامل اقلیمی (Infrastructure and Climate Interactions) ناشی می‌شود. برای به تصویر کشیدن این تعامل، دو ویژگی تعاملی (interaction) ایجاد کردیم:

نکته: برای جلوگیری از تقسیم بر صفر در هنگام ایجاد ویژگی‌های جدید که شامل تقسیم می‌شوند، یک مقدار کوچک، اپسیلون (epsilon)، به مخرج اضافه کردیم. این امر تضمین می‌کند که حتی اگر برخی ویژگی‌ها دارای مقادیر صفر باشند، از محاسبات غیرممکن که منجر به مقادیر NaN (Not a Number) می‌شوند، جلوگیری شود.

ویژگی‌های آماری برای نتیجه بهتر

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

        
            # Feature Engineering
            def Feature_Engineering(data):
                epsilon = 1e-9
                # Statistical new Features:
                data['mean'] = data[original_features].mean(axis=1)
                data['std'] = data[original_features].std(axis=1)
                data['max'] = data[original_features].max(axis=1)
                data['min'] = data[original_features].min(axis=1)
                data['median'] = data[original_features].median(axis=1)
                data['ptp'] = data[original_features].values.ptp(axis=1)
                data['q25'] = data[original_features].quantile(0.25, axis=1)
                data['q75'] = data[original_features].quantile(0.75, axis=1)
                # Infrastructure and Climate Interactions:
                data['InfrastructurePreventionInteraction'] = (data['DamsQuality'] + \
                data['DrainageSystems'] + data['DeterioratingInfrastructure'] ) * \ 
                (data['RiverManagement'] + data['IneffectiveDisasterPreparedness'] + \
                data['InadequatePlanning'])
                data['ClimateAnthropogenicInteraction'] = (data['MonsoonIntensity'] + \
                data['ClimateChange'] ) * (data['Deforestation'] + \
                data['Urbanization'] + data['AgriculturalPractices'] + \
                data['Encroachments'] )
                return data
            X_train = Feature_Engineering(X_train)
        
    

چرا ویژگی‌های آماری؟

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

کاربرد آن‌ها در کجا است؟

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

چگونه پیش‌بینی‌های ما را بهبود بخشیدند؟

در مسابقه پیش‌بینی سیل، ویژگی‌های آماری عملکرد مدل را به طور قابل توجهی بهبود بخشیدند. آن‌ها نمای کلی و مختصری از تنوع داده‌ها و گرایش‌های مرکزی (central tendencies) فراهم کردند که باعث درک بهتر و پیش‌بینی احتمال وقوع سیل شدند. این ویژگی‌ها بسیار مهم بودند زیرا داده‌های پیچیده و با بعد بالا (high-dimensional) را به فرم‌هایی تبدیل کردند که الگوریتم‌های پیش‌بینی ما به طور مؤثری می‌توانستند پردازش کنند. دقت و قابلیت اطمینان پیش‌بینی‌های ما به طور قابل توجهی بهبود یافت، که این امر اهمیت درک خصوصیات مجموعه داده‌ها را نشان می‌دهد.

کاربردهایی که در آن‌ها ویژگی‌های آماری می‌درخشند

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

تأثیرات و پیشنهادات

بررسی های ما نشان داد که ویژگی‌های آماری، خلاصه‌های مختصری از الگوهای داده و گرایش‌های مرکزی ارائه می‌دهند که به پیش‌بینی‌های بهبود یافته منجر می‌شوند. این ویژگی‌ها به طور مؤثری تنوع (variability) و روندها (trends) را به تصویر می‌کشند و عملکرد مدل را نسبت به استفاده از داده‌های خام به تنهایی، افزایش می‌دهند.

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

انتخاب، آموزش و بهبود مدل با کتابخانه Optuna

در مسیر پیش‌بینی احتمال وقوع سیل برای مسابقه  Kaggle Playground Series، انتخاب و تنظیم دقیق مدل‌های رگرسیون یک گام حیاتی بود. ما چندین مدل پیشرفته را آزمایش کردیم تا بهترین مدل را برای مجموعه داده خود تعیین کنیم. در ادامه جزئیات فرآیند انتخاب مدل ما آمده است:

آزمایش مدل و ادغام در Pipeline

ما استراتژی مدل‌سازی خود را با دقت طراحی کردیم و مدل‌های رگرسیون پیشرفته را در یک Pipeline که شامل مقیاس‌بندی داده‌ها از طریق StandardScaler و به دنبال آن مدل رگرسیون بود، ادغام کردیم. این رویکرد ساختارمند اطمینان حاصل کرد که داده‌های ما به طور مداوم پیش‌پردازش شده‌اند و منجر به نتایج قابل تکرار و قوی می‌شوند.

در ادامه چگونگی تناسب هر مدل با جریان کاری ما و دلایل انتخاب آن‌ها آمده است:

XGBoost

LightGBM

CatBoost

برای مطالعه بیشتر کلیک کنید: مدل Catboost چیست؟ راهنمای کامل استفاده از Catboost در یادگیری ماشین

هر مدل با استفاده از یک تقسیم‌بندی آموزش-آزمایش (train-test-split) ارزیابی شد که به دلیل محدودیت زمانی ضروری بود. اگرچه این رویکرد برای نیازهای ما کافی بود، اما توصیه می‌کنیم برای ارزیابی جامع‌تر و دقیق‌تر از اعتبارسنجی متقاطع (cross validation) استفاده کنید. اعتبارسنجی متقاطع داده‌ها را به چندین بخش تقسیم می‌کند و هر بخش را به عنوان مجموعه اعتبارسنجی استفاده کرده و بر روی باقی مانده‌ها آموزش می‌دهد، و در نتیجه تخمین قابل اعتمادتر از عملکرد مدل ارائه می‌دهد.

شروع ساده

 با مدل‌های پایه‌ای (basic models) برای تنظیم یک خط مبنا (baseline) برای عملکرد شروع کنید. ابتدا آن‌ها را با مقادیر پیش‌فرض هایپرپارامترها اجرا کنید تا یک معیار پایه‌ای ایجاد شود. در مراحل بعدی، هایپرپارامترها را تنظیم کنید و عملکرد را با خط مبنا مقایسه کنید. این رویکرد تکراری به شناسایی بهبودها کمک می‌کند و اطمینان می‌دهد که تلاش‌های پیچیده برای انتخاب مدل و تنظیم هایپرپارامترها، بهبود واقعی در عملکرد را ایجاد می‌کنند.

تنظیم هایپرپارامتر با کتابخانه Optuna

تنظیم هایپرپارامتر نقش مهمی در بهینه‌سازی مدل‌های ما ایفا کرد و برای این کار از کتابخانه Optuna استفاده کردیم. قابلیت‌های پیشرفته کتابخانه Optuna راهی کارآمد و ساده برای شناسایی بهترین پارامترها فراهم کرد که با توجه به محدودیت‌های زمانی ما بسیار حیاتی بود.

کتابخانه Optuna

 کتابخانه Optuna یک چارچوب بهینه‌سازی هایپرپارامتر پیشرفته است که در تنظیم خودکار پارامترها برای بهبود عملکرد مدل برتری ویژه ای دارد. این ابزار از یک الگوریتم هوشمند به نام تخمین‌گر Parzen با ساختار درختی (TPE- Tree-structured Parzen Estimator) استفاده می‌کند تا به طور کارآمد فضای هایپرپارامترها را کاوش کند. کتابخانه Optuna مدل‌ها را موثرتر از روش‌های سنتی جستجوی شبکه‌ای یا تصادفی (grid search & random search) بهینه می‌کند. در ادامه نگاهی دقیق‌تر به تجربه ما با کتابخانه Optuna و دلایلی که آن را به یک ابزار قدرتمند تبدیل می‌کند، داریم.

چرا کتابخانه Optuna یک ابزار قدرتمند است؟

مزایا:

معایب:

کاربردهای کتابخانه Optuna در پروژه‌های یادگیری ماشین

کتابخانه Optuna در جنبه‌های مختلف پروژه‌های یادگیری ماشین برتری دارد، از جمله:

انتخاب مدل: شناسایی بهترین ترکیب مدل‌ها و هایپرپارامترها برای وظایفی مانند رگرسیون، طبقه‌بندی(classification) و خوشه‌بندی.

تنظیم پارامترها: بهینه‌سازی هایپرپارامترها برای الگوریتم‌هایی مانند gradient boosting، شبکه‌های عصبی و ماشین‌های بردار پشتیبان(svm).

بهینه‌سازیPipeline : ادغام و تنظیم کل خطوط پردازش ML شامل پیش‌پردازش، انتخاب ویژگی و مدل‌سازی.

چقدر حرفه‌ای است؟

کتابخانه Optuna به دلیل قابلیت اطمینان و کارایی خود، به طور گسترده در تحقیقات دانشگاهی و صنعت استفاده می‌شود. توانایی آن در مدیریت مسائل بهینه‌سازی در مقیاس بزرگ و ارائه نتایج کارآمد، آن را به انتخابی ترجیحی برای پروژه‌های حرفه‌ای علوم داده و یادگیری ماشین تبدیل کرده است. برای مثال، شرکت‌های بزرگ فناوری و مؤسسات مالی به کتابخانه Optuna متکی هستند تا مدل‌های پیش‌بینی و سیستم‌های تصمیم‌گیری خود را بهبود بخشند.

مثال خاص: محققان از تکنیک‌های بهینه‌سازی هایپرپارامتر کتابخانه Optuna برای مدل‌های تشخیص COVID-19 استفاده کردند و به طور قابل‌توجهی سرعت و دقت تشخیص را بهبود بخشیدند. مقاله مرتبط: NCBI

کتابخانه Optuna  چگونه کار می‌کند؟

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

این ابزار همچنین می‌تواند با پارامترهای عددی و دسته‌ای کار کند و آن را برای انواع وظایف یادگیری ماشین همه‌کاره می‌سازد. از تابع create_study Optuna  با direction=’maximize’  یا direction=’minimize’  استفاده کنید تا بهینه‌سازی با معیارهای عملکرد مدل شما همسو شود.

در پروژه ما، از کتابخانه Optuna برای تنظیم هایپرپارامترهای مدل‌های XGBoost ، LightGBM  و CatBoost و همچنین برای یافتن بهترین وزن‌ها برای Voting Regressor استفاده کردیم. علیرغم کمبود زمان برای اعتبارسنجی متقاطع (cross validation)، مکانیزم جستجوی کارآمد در کتابخانه Optuna به ما امکان داد از تقسیم‌بندی آموزش-آزمایش (train-test-split) به طور مؤثر استفاده کنیم و نتایج بهینه را در چارچوب محدودیت‌های ما ارائه دهیم.

مثال کد برای تنظیم هایپرپارامتر:

        
            # Objective function for each model
            def objective(trial, model_class, X_train, y_train, X_test, y_test):
                if model_class == XGBRegressor:
                    params = {
                        'n_estimators': trial.suggest_int('n_estimators', 600, 1000),
                        'learning_rate': trial.suggest_loguniform('learning_rate', 0.01, 0.1),
                        'reg_alpha': trial.suggest_loguniform('reg_alpha', 0.01, 1.0),
                        'reg_lambda': trial.suggest_loguniform('reg_lambda', 0.01, 1.0),
                        'max_depth': trial.suggest_int('max_depth', 3, 10),
                        'min_child_weight': trial.suggest_int('min_child_weight', 1, 10)
                    }
                    model = model_class(**params, random_state=42)

                elif model_class == LGBMRegressor:
                    params = {
                        'n_estimators': trial.suggest_int('n_estimators', 600, 1000),
                        'learning_rate': trial.suggest_loguniform('learning_rate', 0.01, 0.1),
                        'max_depth': trial.suggest_int('max_depth', 3, 10),
                        'reg_alpha': trial.suggest_loguniform('reg_alpha', 0.01, 1.0),
                        'reg_lambda': trial.suggest_loguniform('reg_lambda', 0.01, 1.0)
                    }
                    model = model_class(**params, min_child_samples=114, force_col_wise=True, 
                                        num_leaves=183, random_state=42)

                elif model_class == CatBoostRegressor:
                    params = {
                        'iterations': trial.suggest_int('iterations', 2000, 4000),
                        'learning_rate': trial.suggest_loguniform('learning_rate', 0.01, 0.1),
                        'depth': trial.suggest_int('depth', 3, 10),
                        'l2_leaf_reg': trial.suggest_loguniform('l2_leaf_reg', 1, 10)
                    }
                    model = model_class(**params, random_state=42, subsample=0.8, verbose=0)

                # Create pipeline with StandardScaler and model
                pipeline = Pipeline([
                    ('scaler', StandardScaler()),
                    ('model', model)
                ])

                pipeline.fit(X_train, y_train)
                y_pred = pipeline.predict(X_test)
                return r2_score(y_test, y_pred)

            # Function to tune hyperparameters
            def tune_hyperparameters(X_train, y_train, X_test, y_test, model_class, n_trials=15):
                study = optuna.create_study(direction='maximize', sampler=TPESampler())
                study.optimize(lambda trial: objective(trial, model_class,
                              X_train, y_train, X_test, y_test), n_trials=n_trials)
                return study.best_params

            # Voting Regressor Tuning
            def tune_voting_regressor(X_train, y_train, X_test, y_test, 
                                      xgb_params, lgbm_params, catboost_params, n_trials=15):
                def objective(trial):
                    weight_xgb = trial.suggest_int('weight_xgb', 4, 10)
                    weight_lgbm = trial.suggest_int('weight_lgbm', 1, 4)
                    weight_catboost = trial.suggest_int('weight_catboost', 4, 10)

                    xgb_model = XGBRegressor(**xgb_params, random_state=42)
                    lgbm_model = LGBMRegressor(**lgbm_params, random_state=42)
                    catboost_model = CatBoostRegressor(**catboost_params, random_state=42,
                                                       verbose=0)

                    voting_reg = VotingRegressor(
                        estimators=[
                            ('xgb', xgb_model),
                            ('lgbm', lgbm_model),
                            ('catboost', catboost_model)
                        ],
                        weights=[weight_xgb, weight_lgbm, weight_catboost]
                    )

                    pipeline = Pipeline([
                        ('scaler', StandardScaler()),
                        ('model', voting_reg)
                    ])

                    pipeline.fit(X_train, y_train)
                    y_pred = pipeline.predict(X_test)
                    return r2_score(y_test, y_pred)

                study = optuna.create_study(direction='maximize', sampler=TPESampler())
                study.optimize(objective, n_trials=n_trials)
                return study.best_params
        
    

منابع بیشتر برای کتابخانه Optuna

همچنین بخوانید: چگونه با چارچوب Optuna عملکرد مدل‌های یادگیری ماشین خود را بهبود دهیم؟

روش ترکیبی Voting Regressor

پس از تنظیم مدل‌ها، آن‌ها را با استفاده از Voting Regressor ترکیب (Ensemble) کردیم که پیش‌بینی‌ها را با میانگین‌گیری خروجی‌های XGBoost ,LightGBM و CatBoost  تجمیع می‌کند. این روش به ما اجازه می‌دهد از نقاط قوت هر مدل استفاده کنیم و به پیش‌بینی‌های دقیق‌تری دست یابیم.

چرا Voting Regressor؟

مزایا:

نکته کلیدی: Voting Regressor از پیش‌بینی‌های چندین مدل بهره می‌برد و نقاط ضعف فردی آن‌ها را هموار می‌کند و بر نقاط قوتشان تمرکز می‌کند تا عملکرد کلی بهتری را ارائه دهد.

بطور خلاصه، روش ما برای ترکیب XGBoost، LightGBM  و CatBoost با استفاده از Voting Regressor و تنظیم دقیق آن‌ها با کتابخانه Optuna، نتایج چشمگیری را به همراه داشت. اگرچه به دلیل محدودیت‌های زمانی از تقسیم آموزش-آزمایش (train-test-split) به جای اعتبارسنجی متقاطع (cross validation) استفاده کردیم، اما توصیه می‌کنیم برای ارزیابی دقیق‌تر و قابل‌اعتمادتر مدل، از اعتبارسنجی متقاطع استفاده کنید. کاوش و به‌کارگیری این تکنیک‌های پیشرفته نه تنها پیش‌بینی‌های ما را بهبود بخشید، بلکه درک ما از بهینه‌سازی مدل و یادگیری ترکیبی را نیز غنی‌تر کرد.

ارزیابی مدل: بررسی عمیق R² و RMSE

در این رقابت، ارزیابی بر اساس امتیاز R² انجام می‌شود که یک معیار بسیار استفاده‌شده برای مدل های  رگرسیون است. با این حال، ما همچنین از خطای جذر میانگین مربعات (RMSE) برای کسب اطلاعات بیشتر در مورد عملکرد مدل خود استفاده کردیم. در ادامه توضیحات مربوط به این معیارها و برخی راهنماها برای استفاده مؤثر از آن‌ها آورده شده است:

درک R²

امتیاز R² یا ضریب تعیین، اندازه‌گیری می‌کند که مدل رگرسیون ما چقدر خوب تغییرپذیری متغیر هدف را توضیح می‌دهد. این مقدار از 0 تا 1 متغیر است، که:

استفاده از : از R² برای بررسی این که مدل شما چقدر خوب تغییرپذیری داده‌ها را توضیح می‌دهد استفاده کنید. اما به یاد داشته باشید، برای مجموعه داده‌های کوچک یا الگوهای غیرخطی، R²  ممکن است همیشه دقیق نباشد و گاهی اوقات نتایج گمراه‌کننده بدهد.

درک RMSE

خطای جذر میانگین مربعات (RMSE) اندازه‌گیری می‌کند که پیش‌بینی‌های مدل چقدر به مقادیر واقعی نزدیک هستند. این مقدار جذر میانگین تفاوت‌های مربعی بین مقادیر پیش‌بینی‌شده و واقعی است و به نوسانات حساس است.

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

تعادل بین R² و RMSE

استفاده از هر دو معیار R² و RMSE نمای جامع‌تری از عملکرد مدل ارائه می‌دهد:

با تعادل این معیارها، می‌توانید مدل‌های قابل اعتمادتر و دقیق‌تری ایجاد کنید. به دنبال تعادلی باشید که در آن R² نسبتاً بالا و RMSE پایین باشد. این تعادل نشان‌دهنده مدلی است که داده‌ها را خوب توضیح می‌دهد و پیش‌بینی‌های دقیقی می‌کند.

ارزیابی و مقایسه مدل‌ها

با ارزیابی عملکرد مدل پایه خود با استفاده از R² و RMSE شروع کنید. هنگامی که با مدل‌ها و تنظیمات مختلف هایپرپارامترها تکرار می‌کنید، بهبودها را با این پایه مقایسه کنید. این روش به شما کمک می‌کند بفهمید آیا پیچیدگی افزوده‌شده توسط مدل‌های جدید یا تلاش‌های تنظیم هایپرپارامترها بهبود عملکرد واقعی را به همراه دارد یا خیر.

فرآیند ارسال: راهبردهای موثر برای رقابت در Kaggle

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

تابلو نتایج Kaggle:

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

استراتژی ارسال: بهینه‌سازی هر تلاش

در رقابت‌های Kaggle Playground، شرکت‌کنندگان می‌توانند پیش‌بینی‌های خود را تا 5 بار در روز ارسال کنند. این محدودیت روزانه آزمایشات متفکرانه و بهبود مداوم را تشویق می‌کند. در ادامه نحوه مدیریت موثر این کار آورده شده است:

برنامه‌ریزی ارسال‌ها:

آزمایش و اصلاح:

تابلو نتایج عمومی در مقابل خصوصی:

زمان‌بندی استراتژیک:

نتایج اعتبارسنجی متقاطع:

همکاری تیمی:

با دنبال کردن این راهبردها، می‌توانید اطمینان حاصل کنید که هر ارسال شما به طور موثری به بهبود مدل‌ها و نتایج کلی شما کمک می‌کند.

تشویق و چشم‌اندازهای آینده

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

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

درس‌های کلیدی آموخته شده

نتیجه‌گیری: یادگیری از طریق چالش‌های علم داده

شرکت در سری رقابت‌های Kaggle Playground برای تیم ما تجربه‌ای بسیار آموزنده بوده است. چالش پیش‌بینی سیل به ما کمک کرد تا فراتر از انتظارات فکر کنیم و دانش خود در مورد رگرسیون را در مسائل واقعی به کار بگیریم. این کار باعث شد توانایی ما در مقابله با مسائل دنیای واقعی بهبود یابد.

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

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

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

در مقاله‌های آینده، داستان‌های بیشتری از این رقابت‌ها با شما به اشتراک خواهیم گذاشت. هر یک از آن‌ها یک ماجراجویی جدید در یادگیری هستند. منتظر مقاله بعدی از مجموعه مقاله‌های تجربیات ما در مسابقات Kaggle باشید!

منابع:

یادگیری ماشین لرنینگ را از امروز شروع کنید!

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

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

دوره جامع دیتا ساینس و ماشین لرنینگ

خروج از نسخه موبایل