آموزش

یادگیری ماشین با پایتون: آموزش Scikit-Learn

این آموزش بهت در شروع یادگیری ماشین در پایتون با Scikit-learn کمک می‌کنه.

تاریخ انتشار:
1 شهریور 1405
پایتون
12 دقیقه
یادگیری ماشین
کاربرهای فینکا در چه شرکت‌هایی مشغول به کار هستند؟

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

  • یادگیری نظارت‌شده (Supervised learning): نوعی از یادگیری ماشین که رابطه بین ورودی و خروجی رو یاد می‌گیره. 
  • یادگیری بدون نظارت (Unsupervised learning): نوعی از یادگیری ماشین که ساختار پنهان یک دیتاست بدون برچسب رو پیدا می‌کنه.   
  • یادگیری تقویتی (Reinforcement learning): روشی در یادگیری ماشین که در اون یک عامل نرم‌افزاری یاد می‌گیره چطور در یک محیط عمل کنه تا بیشترین پاداش رو به دست بیاره.

کتابخونه Scikit-learn که به اسم sklearn هم شناخته می‌شه، یکی از کتابخونه‌های قدرتمند و متن‌باز یادگیری ماشین در پایتونه. هدف از ساخت این کتابخونه، راحت‌تر کردن فرآیند پیاده‌سازی مدل‌های آماری و یادگیری ماشین در پایتون بوده. 

این ابزار به متخصص‌ها کمک می‌کنه تا طیف گسترده‌ای از الگوریتم‌های یادگیری ماشین (چه نظارت‌شده و چه بدون نظارت) رو خیلی سریع و با یک رابط یکپارچه پیاده‌سازی کنن. کتابخونه Sklearn بر پایه SciPy ساخته شده و با تمام داده‌های عددی که به‌صورت آرایه‌های NumPy یا ماتریس‌های پراکنده SciPy ذخیره شدن، کار می‌کنه. علاوه بر این، می‌تونه سایر داده‌هایی که قابلیت تبدیل شدن به آرایه‌های عددی دارن (مثل دیتافریم‌های Pandas) رو هم پردازش کنه.  

در این آموزش عملی sklearn، می‌خوایم مراحل مختلف چرخه یادگیری ماشین مثل پردازش داده‌ها، آموزش مدل و ارزیابی اون رو بررسی کنیم.

داده‌ها

اولین بخشی از sklearn که می‌خوایم بررسی کنیم، داده‌هاست. کتابخونه Scikit-learn چند دیتاست استاندارد یادگیری ماشین رو داخل خودش داره؛ این یعنی برای شروع کار، نیازی نیست داده‌ها رو از سایت یا دیتابیس خارجی دانلود کنی.

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

برخلاف دیتاست‌های آماده موجود در sklearn، این دیتاست رو باید از یک منبع خارجی لود کنیم. در ادامه، این داده‌ها رو وارد حافظه می‌کنیم:

خروجی
pH  Temprature  Taste  Odor  Fat   Turbidity  Colour   Grade
0  6.6          35      1     0     1          0     254    high
1  6.6          36      0     1     0          1     253    high
2  8.5          70      1     1     1          1     246     low
3  9.5          34      1     1     0          1     255     low
4  6.6          37      0     0     0          0     255  medium

حالا آماده‌ایم تا کمی اکتشاف داده (Data Exploration) انجام بدیم.

اکتشاف داده‌ها

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

  • داده‌ها
  • اندیس‌ها
  • ستون‌ها

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

اولین کاری که می‌کنیم اینه که متد info() رو روی دیتافریم Pandas خودمون صدا بزنیم؛ با این کار یک خلاصه مفید و مختصر از داده‌های milk_df به دست میاریم. 

خروجی
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1059 entries, 0 to 1058
Data columns (total 8 columns):
 #   Column      Non-Null Count  Dtype  
---  ------      --------------  -----  
 0   pH          1059 non-null   float64
 1   Temprature  1059 non-null   int64  
 2   Taste       1059 non-null   int64  
 3   Odor        1059 non-null   int64  
 4   Fat         1059 non-null   int64  
 5   Turbidity   1059 non-null   int64  
 6   Colour      1059 non-null   int64  
 7   Grade       1059 non-null   object 
dtypes: float64(1), int64(6), object(1)
memory usage: 66.3+ KB
None

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

  • داده‌ها شامل ۱۰۵۹ نمونه (سطر) هستن.
  • در مجموع ۸ ستون داریم که یکی از اون‌ها ستون هدف (یعنی همون چیزی که می‌خوایم پیش‌بینی کنیم) هست.
  • هیچ‌کدوم از ستون‌ها مقادیر گمشده ندارن؛ این موضوع رو می‌شه از ستون Non-Null Count متوجه شد. 
  • همه ویژگی‌ها از نوع داده float64 و int64 هستن، در حالی که برچسب هدف از نوع object هست.
  • داده‌ها روی هم ۶۶.۳ کیلوبایت حافظه مصرف می‌کنن. 

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

به‌عنوان مثال:

خروجی
pH   Temprature        Taste         Odor         Fat   \
count  1059.000000  1059.000000  1059.000000  1059.000000  1059.000000   
mean      6.630123    44.226629     0.546742     0.432483     0.671388   
std       1.399679    10.098364     0.498046     0.495655     0.469930   
min       3.000000    34.000000     0.000000     0.000000     0.000000   
25%       6.500000    38.000000     0.000000     0.000000     0.000000   
50%       6.700000    41.000000     1.000000     0.000000     1.000000   
75%       6.800000    45.000000     1.000000     1.000000     1.000000   
max       9.500000    90.000000     1.000000     1.000000     1.000000   

         Turbidity       Colour  
count  1059.000000  1059.000000  
mean      0.491029   251.840415  
std       0.500156     4.307424  
min       0.000000   240.000000  
25%       0.000000   250.000000  
50%       0.000000   255.000000  
75%       1.000000   255.000000  
max       1.000000   255.000000

همون‌طور که از متد head() برای دیدن پنج سطر اول استفاده کردیم، می‌تونیم با کمک متد tail() پنج سطر آخر دیتاست رو هم بررسی کنیم.

خروجی
pH  Temprature  Taste  Odor  Fat   Turbidity  Colour   Grade
1054  6.7          45      1     1     0          0     247  medium
1055  6.7          38      1     0     1          0     255    high
1056  3.0          40      1     1     1          1     255     low
1057  6.8          43      1     0     1          0     250    high
1058  8.6          55      0     1     1          1     255     low

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

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

مثال Scikit-learn: پیش‌پردازش داده‌ها

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

پیش‌پردازش داده‌ها یکی از مراحل حیاتی در پروژه‌های یادگیری ماشینه، چون داده‌های دنیای واقعی معمولاً نامرتب هستن و ممکنه مشکلاتی از این قبیل داشته باشن: 

  • مقادیر گمشده
  • داده‌های تکراری
  • داده‌های پرت 
  • خطاها
  • نویز (نوسان)

تو باید قبل از اینکه داده‌ها رو به مدل بدی، تمام این مشکلات رو برطرف کنی؛ وگرنه مدل این اشتباهات رو یاد می‌گیره و در پیش‌بینی‌های خودش تکرار می‌کنه.

همون‌طور که قبلاً دیدیم، ستون Grade از نوع Object بود. از اونجا که مدل‌های یادگیری ماشین معمولاً فقط با اعداد کار می‌کنن، باید مقادیر این ستون رو هم به عدد تبدیل کنیم. برای این کار، می‌تونیم مقادیر 'low'، 'medium' و 'high' رو به ترتیب به اعداد 0، 1 و 2 تغییر بدیم.

خروجی
pH  Temprature  Taste  Odor  Fat   Turbidity  Colour  Grade
0     6.6          35      1     0     1          0     254      2
1     6.6          36      0     1     0          1     253      2
2     8.5          70      1     1     1          1     246      0
3     9.5          34      1     1     0          1     255      0
4     6.6          37      0     0     0          0     255      1
...   ...         ...    ...   ...   ...        ...     ...    ...
1054  6.7          45      1     1     0          0     247      1
1055  6.7          38      1     0     1          0     255      2
1056  3.0          40      1     1     1          1     255      0
1057  6.8          43      1     0     1          0     250      2
1058  8.6          55      0     1     1          1     255      0

[1059 rows x 8 columns]

حالا اگر تفاوت مقیاس داده‌ها رو نادیده بگیریم، در نگاه اول به نظر نمی‌رسه داده‌هامون مشکل خاص دیگه‌ای داشته باشن. برای حل مشکل مقیاس، می‌تونیم از کلاس StandardScaler از کتابخونه sklearn استفاده کنیم و داده‌ها رو استانداردسازی کنیم. این کار باعث می‌شه میانگین ویژگی‌ها برابر با 0 و انحراف معیارشون برابر با 1 بشه. 

کد این بخش رو در ادامه می‌بینی: 

خروجی
[-0.02153136 -0.91410734  0.91050291 -0.87296233  0.69960809 -0.98221664 0.5016002 ]

دیگه وقتشه بریم سراغ آموزش مدل.

مثال Scikit-learn: آموزش مدل

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

اما از کجا بفهمیم که مدل روی داده‌های جدید (که تا حالا ندیده) هم خوب عمل می‌کنه یا نه؟ تنها راهش اینه که اون رو تست کنیم. 

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

برای تقسیم داده‌ها راه‌های مختلفی وجود داره، اما scikit-learn یک تابع آماده به اسم train_test_split() داره که این کار رو خیلی راحت برامون انجام می‌ده. 

ما از این تابع استفاده می‌کنیم تا داده‌ها رو طوری تقسیم کنیم که ۷۰ درصدشون برای آموزش مدل و ۳۰ درصدشون برای سنجش توانایی مدل در مواجهه با داده‌های جدید استفاده بشن. 

خروجی
Train size: 70% 
Test size: 30%

حالا بیایم چند تا مدل بسازیم. 

ساخت مدل

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

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

  1. رگرسیون لجستیک (Logistic regression)
  2. ماشین بردار پشتیبان (Support vector machine)
  3. کلاسیفایر درخت تصمیم (Decision tree classifier)

مرحله بعدی اینه که ارزیابی کنیم ببینیم مدل‌ها روی داده‌های جدیدی که ندیدن، چقدر خوب عمل می‌کنن. 

مثال Scikit-learn: ارزیابی مدل

هدف از ارزیابی مدل اینه که بفهمیم آیا مدل می‌تونه چیزهایی که یاد گرفته رو روی نمونه‌های جدید پیاده‌سازی کنه یا نه. کتابخونه Scikit-learn کلی معیار مختلف برای ارزیابی عملکرد مدل‌های طبقه‌بندی و رگرسیون در اختیار ما می‌ذاره. 

در این مثال، می‌خوایم از تابع classification_report() (از ماژول metrics) استفاده کنیم تا یک گزارش متنی کامل داشته باشیم. این گزارش معیارهای اصلی ارزیابی طبقه‌بندی مثل precision (دقت)، recall (فراخوانی)، f1_score، accuracy و موارد دیگه رو نشون می‌ده. 

کد مربوط به این بخش این شکلیه:

خروجی
Logistic Regression Results:
              precision    recall  f1-score   support

           0       0.90      0.87      0.88       138
           1       0.94      0.86      0.90       112
           2       0.68      0.82      0.75        68

    accuracy                           0.86       318
   macro avg       0.84      0.85      0.84       318
weighted avg       0.87      0.86      0.86       318

Support Vector Machine Results:
              precision    recall  f1-score   support

           0       1.00      0.96      0.98       138
           1       0.88      0.93      0.90       112
           2       0.88      0.87      0.87        68

    accuracy                           0.93       318
   macro avg       0.92      0.92      0.92       318
weighted avg       0.93      0.93      0.93       318

Decision Tree Results:
              precision    recall  f1-score   support

           0       0.99      1.00      1.00       138
           1       1.00      1.00      1.00       112
           2       1.00      0.99      0.99        68

    accuracy                           1.00       318
   macro avg       1.00      1.00      1.00       318
weighted avg       1.00      1.00      1.00       318

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

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

نتیجه‌گیری

کتابخونه scikit-learn ماژول‌های زیادی داره که پیاده‌سازی مدل‌های یادگیری ماشین رو فوق‌العاده راحت می‌کنه. این ابزارها شامل همه‌چیز می‌شن؛ از ابزارهای پیش‌پردازش برای آماده کردن داده‌ها گرفته، تا انواع مدل‌ها برای پیدا کردن الگوها و در نهایت، معیارهای ارزیابی برای سنجش عملکرد مدل‌ها. 

در این آموزش، ما فقط یک نگاه گذرا به امکانات sklearn انداختیم. اگه می‌خوای عمیق‌تر بشی و ببینی با این کتابخونه چه کارهای دیگه‌ای می‌تونی انجام بدی، منابع متنوعی برای یادگیری وجود داره. برای شروع می‌تونی نگاهی به این موارد بندازی: 

اشتراک‌گذاری
فهرست مطالب
  • داده‌ها
  • مثال Scikit-learn: پیش‌پردازش داده‌ها
  • مثال Scikit-learn: آموزش مدل
  • مثال Scikit-learn: ارزیابی مدل
  • نتیجه‌گیری

دریافت اپلیکیشن فینکا

با اپلیکیشن فینکا، به بیشتر دوره‌ها و مسیرها روی موبایل دسترسی دارید، تمرین می‌کنید و یادگیری رو هم‌زمان روی موبایل و دسکتاپ ادامه می‌دید.