فصل ۲ - پروژهٔ یادگیری ماشین از ابتدا تا انتها
در این فصل یک پروژهٔ نمونه را از ابتدا تا انتها پیش خواهید برد و خود را در نقش دانشمند دادهای تصور میکنید که بهتازگی در یک شرکت املاک استخدام شده است. این مثال ساختگی است؛ هدف، نشاندادن مراحل اصلی یک پروژهٔ یادگیری ماشین است، نه آموختن مطالبی دربارهٔ کسبوکار املاک. مراحل اصلی که طی خواهیم کرد عبارتاند از:
- نگاهکردن به تصویر کلی.
- دریافت دادهها.
- کاوش و مصورسازی دادهها برای بهدستآوردن بینش.
- آمادهسازی دادهها برای الگوریتمهای یادگیری ماشین.
- انتخاب یک مدل و آموزش آن.
- تنظیم دقیق مدل.
- ارائهٔ راهحل.
- راهاندازی، پایش و نگهداری سامانه.
کار با دادههای واقعی
هنگام یادگیری دربارهٔ یادگیری ماشین، بهتر است بهجای مجموعهدادههای مصنوعی با دادههای دنیای واقعی آزمایش کنید. خوشبختانه هزاران مجموعهدادهٔ باز در حوزههای بسیار متنوع وجود دارد. چند محل برای یافتن داده عبارتاند از:
- مخزنهای محبوب دادهٔ باز: OpenML.org، Kaggle.com، PapersWithCode.com، مخزن یادگیری ماشین دانشگاه UC Irvine، مجموعهدادههای Amazon AWS و مجموعهدادههای TensorFlow.
- درگاههای تجمیعی که مخزنهای دادهٔ باز را فهرست میکنند: DataPortals.org و OpenDataMonitor.eu.
- صفحههای دیگری که تعداد زیادی مجموعهدادهٔ محبوب را معرفی میکنند: فهرست مجموعهدادههای یادگیری ماشین در Wikipedia، وبسایت Quora.com و بخش مجموعهدادهها در Reddit.
در این فصل از مجموعهدادهٔ «قیمت مسکن کالیفرنیا» از مخزن StatLib استفاده میکنیم.۱ این مجموعهداده بر پایهٔ سرشماری سال ۱۹۹۰ کالیفرنیا ساخته شده است. دادهها دقیقاً جدید نیستند - در آن زمان هنوز میشد خانهٔ خوبی را در منطقهٔ خلیج با قیمت قابلپرداخت خرید - اما برای آموزش ویژگیهای مناسبی دارند، بنابراین وانمود میکنیم دادهها جدید هستند. برای مقاصد آموزشی، نویسنده یک ویژگی دستهای به داده افزوده و چند ویژگی را حذف کرده است.
شکل ۲-۱. قیمتهای مسکن کالیفرنیا
نگاهکردن به تصویر کلی
به شرکت «مسکن یادگیری ماشین» خوش آمدید! نخستین مأموریت شما استفاده از دادههای سرشماری کالیفرنیا برای ساخت مدلی از قیمت مسکن در این ایالت است. دادهها معیارهایی مانند جمعیت، درآمد میانه و قیمت میانهٔ مسکن را برای هر گروه بلوکی در کالیفرنیا دربرمیگیرند. گروههای بلوکی کوچکترین واحد جغرافیایی هستند که ادارهٔ سرشماری ایالات متحده برای آنها دادهٔ نمونه منتشر میکند؛ جمعیت هر گروه بلوکی معمولاً بین ۶۰۰ تا ۳۰۰۰ نفر است. برای اختصار، در ادامه آنها را «ناحیه» مینامیم.
مدل باید از این دادهها یاد بگیرد و بتواند با دریافت سایر معیارها، قیمت میانهٔ مسکن را در هر ناحیه پیشبینی کند.
صورتبندی مسئله
نخستین پرسش از مدیرتان این است که هدف کسبوکار دقیقاً چیست. ساخت مدل احتمالاً هدف نهایی نیست. شرکت قرار است چگونه از این مدل استفاده کند و چه منفعتی ببرد؟ دانستن هدف اهمیت زیادی دارد، زیرا مشخص میکند مسئله را چگونه صورتبندی کنید، چه الگوریتمهایی برگزینید، از چه معیار عملکردی برای ارزیابی مدل استفاده کنید و چه مقدار زمان برای تنظیم آن صرف کنید.
مدیر پاسخ میدهد که خروجی مدل - پیشبینی قیمت میانهٔ مسکن یک ناحیه - همراه با سیگنالهای فراوان دیگر۲ به سامانهٔ یادگیری ماشین دیگری داده خواهد شد. آن سامانهٔ پاییندستی تصمیم میگیرد آیا سرمایهگذاری در یک منطقه ارزش دارد یا نه. درستبودن این پیشبینی حیاتی است، زیرا مستقیماً بر درآمد اثر میگذارد.
پرسش بعدی این است که راهحل فعلی، در صورت وجود، چگونه کار میکند. وضعیت موجود اغلب معیاری مرجع برای عملکرد فراهم میکند و سرنخهایی دربارهٔ شیوهٔ حل مسئله میدهد. مدیر توضیح میدهد که قیمت مسکن ناحیهها فعلاً بهصورت دستی توسط کارشناسان برآورد میشود: گروهی اطلاعات تازهٔ هر ناحیه را گردآوری میکند و هرگاه نتواند قیمت میانهٔ مسکن را بهدست آورد، با قواعد پیچیده آن را تخمین میزند.
شکل ۲-۲. یک Pipeline (خط لوله) یادگیری ماشین برای سرمایهگذاری در املاک
روش فعلی پرهزینه و زمانبر است و تخمینها نیز چندان خوب نیستند؛ هرگاه قیمت میانهٔ واقعی بعداً مشخص میشود، کارشناسان اغلب میبینند تخمینشان بیش از ۳۰ درصد خطا داشته است. به همین دلیل، شرکت فکر میکند آموزش مدلی برای پیشبینی قیمت میانهٔ مسکن با استفاده از سایر دادههای هر ناحیه سودمند خواهد بود. دادههای سرشماری برای این هدف مناسب به نظر میرسند، زیرا قیمت میانهٔ مسکن هزاران ناحیه و اطلاعات دیگری را شامل میشوند.
Pipelineها
دنبالهای از مولفههای پردازش داده را «Pipeline داده» مینامند. Pipelineها در سامانههای یادگیری ماشین بسیار رایجاند، زیرا معمولاً دادهٔ زیادی باید دستکاری شود و تبدیلهای متعددی روی آن اعمال گردد.
مولفهها معمولاً بهصورت ناهمگام اجرا میشوند. هر مولفه حجم زیادی داده را میگیرد، آن را پردازش میکند و نتیجه را در مخزن دادهٔ دیگری مینویسد. مدتی بعد، مولفهٔ بعدی این داده را دریافت و خروجی خودش را تولید میکند. هر مولفه تا حد زیادی مستقل است و رابط میان مولفهها صرفاً همان مخزن داده است. این ساختار، درک سامانه را با کمک نمودار جریان داده آسان میکند و تیمهای مختلف میتوانند روی مولفههای متفاوت تمرکز کنند. افزون بر این، اگر یک مولفه از کار بیفتد، مولفههای پاییندستی اغلب میتوانند - دستکم برای مدتی - با آخرین خروجی آن مولفه به کار ادامه دهند؛ بنابراین معماری نسبتاً مقاوم است.
البته اگر پایش مناسب وجود نداشته باشد، خرابی یک مولفه ممکن است مدتی پنهان بماند. در این حالت داده کهنه میشود و عملکرد کل سامانه افت میکند.
انتخاب نوع مسئلهٔ یادگیری
اکنون اطلاعات کافی برای طراحی سامانه دارید. ابتدا تعیین کنید مدل به چه نوع نظارتی برای آموزش نیاز دارد: مسئله از نوع یادگیری نظارتشده، بدون نظارت، نیمهنظارتشده، خودنظارتشده یا یادگیری تقویتی است؟ آیا مسئلهٔ طبقهبندی است، رگرسیون است یا چیز دیگری؟ آیا باید از یادگیری دستهای استفاده کنید یا یادگیری برخط؟ پیش از ادامه، خودتان به این پرسشها پاسخ دهید.
این مسئله آشکارا یک مسئلهٔ معمول یادگیری نظارتشده است، زیرا مدل با نمونههای برچسبدار آموزش میبیند؛ هر نمونه خروجی مورد انتظار، یعنی قیمت میانهٔ مسکن ناحیه، را دارد. مسئله از نوع رگرسیون است، چون از مدل خواسته میشود یک مقدار را پیشبینی کند. دقیقتر اینکه «رگرسیون چندگانه» است، زیرا سامانه برای پیشبینی از چند ویژگی - مانند جمعیت ناحیه و درآمد میانه - استفاده میکند. همچنین «رگرسیون تکمتغیره» است، چون برای هر ناحیه تنها یک مقدار را پیشبینی میکنیم. اگر قرار بود چند مقدار برای هر ناحیه پیشبینی شود، مسئله «رگرسیون چندمتغیره» بود.
سرانجام، جریان پیوستهای از داده وارد سامانه نمیشود، نیازی جدی به سازگاری سریع با دادهٔ متغیر نداریم و حجم داده آنقدر کم است که در حافظه جا میشود؛ بنابراین یادگیری دستهای معمول کفایت میکند.
انتخاب معیار عملکرد
گام بعدی انتخاب یک معیار عملکرد است. یک معیار رایج برای مسائل رگرسیون «ریشهٔ میانگین مربعات خطا» یا RMSE است. این معیار تصویری از اندازهٔ خطای معمول پیشبینیهای سامانه میدهد و به خطاهای بزرگ وزن بیشتری میدهد. معادلهٔ ۲-۱ فرمول ریاضی محاسبهٔ RMSE را نشان میدهد.
معادلهٔ ۲-۱. ریشهٔ میانگین مربعات خطا (RMSE)
RMSE(X,h) = √[(1/m) Σi=1m (h(x(i)) − y(i))²]
نمادگذاری
این معادله چند نماد بسیار رایج در یادگیری ماشین را معرفی میکند که در سراسر کتاب استفاده خواهند شد:
- m تعداد نمونههای مجموعهدادهای است که RMSE را روی آن اندازه میگیرید. برای نمونه، اگر RMSE را روی مجموعهٔ اعتبارسنجی شامل ۲۰۰۰ ناحیه ارزیابی کنید، m = 2,000 است.
- x(i) بردار همهٔ مقادیر ویژگیها، بهجز برچسب، برای نمونهٔ iام است و y(i) برچسب آن نمونه، یعنی مقدار خروجی مطلوب، است. برای مثال اگر ناحیهٔ نخست در طول جغرافیایی −118.29° و عرض جغرافیایی 33.91° قرار گرفته باشد، ۱۴۱۶ نفر جمعیت، درآمد میانهٔ ۳۸٬۳۷۲ دلار و قیمت میانهٔ خانهٔ ۱۵۶٬۴۰۰ دلار داشته باشد، با نادیدهگرفتن سایر ویژگیها میتوان نوشت x(1) = [−118.29, 33.91, 1416, 38372]T و y(1) = 156400.
- X ماتریسی است که همهٔ مقادیر ویژگیها، بدون برچسبها، را برای تمام نمونهها دربرمیگیرد. هر سطر متعلق به یک نمونه است و سطر iام برابر ترانهادهٔ x(i) است که با (x(i))T نمایش داده میشود.۳
- h تابع پیشبینی سامانه است که «فرضیه» نیز نامیده میشود. وقتی بردار ویژگی x(i) به سامانه داده شود، مقدار پیشبینیشدهٔ ŷ(i) = h(x(i)) را تولید میکند. اگر سامانه برای ناحیهٔ نخست قیمت ۱۵۸٬۴۰۰ دلار پیشبینی کند، آنگاه ŷ(1) = 158400 و خطای پیشبینی این ناحیه برابر ۲۰۰۰ دلار است.
- RMSE(X,h) تابع هزینهای است که روی مجموعهٔ نمونهها با استفاده از فرضیهٔ h اندازهگیری میشود.
در کتاب برای مقادیر اسکالر، مانند m یا y(i)، و نام توابع مانند h از حروف کوچک ایتالیک، برای بردارها مانند x(i) از حروف کوچک ضخیم و برای ماتریسها مانند X از حروف بزرگ ضخیم استفاده میشود.
اگرچه RMSE معمولاً معیار ترجیحی برای مسائل رگرسیون است، در بعضی زمینهها ممکن است تابع دیگری مناسبتر باشد؛ برای نمونه وقتی ناحیههای پرت فراواناند. در آن حالت میتوانید «میانگین خطای مطلق» یا MAE را، که «میانگین انحراف مطلق» نیز نامیده میشود، در نظر بگیرید:
معادلهٔ ۲-۲. میانگین خطای مطلق (MAE)
MAE(X,h) = (1/m) Σi=1m |h(x(i)) − y(i)|
هر دو معیار RMSE و MAE راهی برای اندازهگیری فاصلهٔ میان دو بردارند: بردار پیشبینیها و بردار مقادیر هدف. معیارهای فاصله یا «نُرم»های گوناگونی وجود دارند:
- گرفتن ریشهٔ مجموع مربعات، یعنی RMSE، متناظر با نُرم اقلیدسی یا ℓ₂ است؛ همان برداشت آشنای ما از فاصله. این نُرم با ∥·∥₂ یا گاهی صرفاً ∥·∥ نشان داده میشود.
- گرفتن مجموع قدر مطلقها، یعنی MAE، متناظر با نُرم ℓ₁ است که با ∥·∥₁ نمایش داده میشود. گاهی آن را «نُرم منهتن» مینامند، زیرا فاصلهٔ دو نقطه را در شهری میسنجد که حرکت فقط در امتداد بلوکهای متعامد شهر ممکن است.
- بهطور کلی، نُرم ℓk یک بردار v با n مؤلفه به صورت ∥v∥k = (|v₁|k + |v₂|k + ... + |vₙ|k)1/k تعریف میشود. نُرم ℓ₀ تعداد مؤلفههای ناصفر را میدهد و ℓ∞ بزرگترین قدر مطلق مؤلفهها را مشخص میکند.
هرچه شاخص نُرم بزرگتر باشد، تمرکز آن بر مقادیر بزرگ بیشتر و توجهش به مقادیر کوچک کمتر میشود. به همین دلیل RMSE نسبت به دادههای پرت حساستر از MAE است. بااینحال، هنگامی که دادههای پرت بهصورت نمایی نادر باشند، مانند توزیع زنگولهای، RMSE بسیار خوب عمل میکند و معمولاً ترجیح داده میشود.
بررسی فرضها
در پایان این مرحله بهتر است همهٔ فرضهایی را که تاکنون شما یا دیگران مطرح کردهاند فهرست و بررسی کنید؛ این کار میتواند مشکلات جدی را زود آشکار کند. برای نمونه، فرض کردهاید قیمتهایی که سامانه تولید میکند همانگونه به سامانهٔ یادگیری ماشین پاییندستی داده و استفاده خواهند شد. اما اگر سامانهٔ پاییندستی قیمتها را به دستههایی مانند «ارزان»، «متوسط» یا «گران» تبدیل کند و فقط از این دستهها استفاده کند چه؟ در این صورت دقیقبودن خود قیمت چندان مهم نیست؛ کافی است دسته درست تشخیص داده شود. اگر چنین باشد، مسئله باید از ابتدا بهصورت طبقهبندی صورتبندی میشد، نه رگرسیون. بهتر است پس از ماهها کار روی سامانهٔ رگرسیون به چنین نکتهای پی نبرید.
خوشبختانه پس از گفتوگو با تیم مسئول سامانهٔ پاییندستی مطمئن میشوید که واقعاً به قیمتهای دقیق نیاز دارند، نه فقط دستهبندی آنها. بنابراین چراغها سبز است و میتوانید کدنویسی را آغاز کنید.
دریافت دادهها
وقت آن رسیده است که دستبهکار شوید. درنگ نکنید؛ لپتاپ را بردارید و مثالهای کد را همراه کتاب اجرا کنید. همانطور که در پیشگفتار گفته شد، تمام مثالهای کد کتاب متنباز هستند و بهصورت Notebookهای Jupyter در دسترس قرار دارند. این Notebookها اسناد تعاملی شامل متن، تصویر و قطعهکد اجرایی - در این کتاب Python - هستند. کتاب فرض میکند Notebookها را روی Google Colab اجرا میکنید؛ سرویسی رایگان که اجازه میدهد هر Notebook Jupyter را مستقیماً برخط و بدون نصب چیزی روی رایانه اجرا کنید. اگر ترجیح میدهید از سکوی دیگری مانند Kaggle استفاده کنید یا همهچیز را روی رایانهٔ خود نصب کنید، دستورالعملهای صفحهٔ GitHub کتاب را ببینید.
اجرای مثالهای کد با Google Colab
ابتدا مرورگر وب را باز کنید و نشانی https://homl.info/colab3 را وارد کنید. این نشانی شما را به Google Colab میبرد و فهرست Notebookهای کتاب را نمایش میدهد. برای هر فصل یک Notebook وجود دارد و چند Notebook و آموزش اضافه نیز برای NumPy، Matplotlib، Pandas، جبر خطی و حساب دیفرانسیل فراهم شده است. برای نمونه با انتخاب فایل 02_end_to_end_machine_learning_project.ipynb، Notebook فصل ۲ در Google Colab باز میشود.
هر Notebook Jupyter از فهرستی از «سلولها» تشکیل شده است. هر سلول یا کد اجرایی دارد یا متن. اگر روی نخستین سلول متنی، که جملهٔ Welcome to Machine Learning Housing Corp.! را در خود دارد، دوبار کلیک کنید، سلول برای ویرایش باز میشود. Notebookهای Jupyter برای قالببندی از نحو Markdown استفاده میکنند؛ برای نمونه **bold** برای متن ضخیم، *italics* برای ایتالیک، # Title برای عنوان و [url](link text) برای لینک. متن را تغییر دهید و سپس Shift-Enter را بزنید تا نتیجه نمایش داده شود.