توضیح و کپشن کامل جلسه آموزش عملی رگرسیون با پایتون
در این جلسه، در ادامه مبحث یادگیری نظارتشده و رگرسیون از کتاب Hands-On Machine Learning with Scikit-Learn and PyTorch، چاپ ۲۰۲۶، تلاش کردیم مفاهیم نظری کتاب را در قالب یک پروژه عملی پایتون پیادهسازی کنیم. هدف این جلسه صرفاً نوشتن چند خط کد برای پیشبینی قیمت خودرو نبود، بلکه قصد داشتیم مسیر کامل تبدیل یک مسئله واقعی به یک پروژه یادگیری ماشین را مرحلهبهمرحله بررسی کنیم؛ از ساخت و سازماندهی دادهها گرفته تا پیشپردازش، آموزش مدل، پیشبینی، ارزیابی نتایج و بررسی اتفاقاتی که در پشت صحنه متدهایی مانند fit()، transform() و predict() رخ میدهد.
در ابتدای درس، یک مجموعه داده مصنوعی درباره خودروها ایجاد کردیم. در این مجموعه داده، هر سطر نماینده یک خودرو یا یک نمونه آموزشی بود و هر ستون، یکی از ویژگیهای آن خودرو را نمایش میداد. ویژگیهایی مانند میزان کارکرد خودرو، سن، حجم موتور، برند و نوع گیربکس بهعنوان ورودی مدل در نظر گرفته شدند و قیمت خودرو نیز نقش متغیر هدف را داشت. استفاده از داده مصنوعی به ما این امکان را داد که رابطه تولید قیمت را از قبل بدانیم و سپس بررسی کنیم که آیا مدل رگرسیون میتواند این رابطه را از روی دادهها کشف کند یا خیر. همچنین با اضافهکردن نویز تصادفی به قیمتها نشان دادیم که دادههای دنیای واقعی معمولاً کاملاً منظم و قطعی نیستند و عواملی وجود دارند که ممکن است در مجموعه ویژگیهای ما ثبت نشده باشند.
بخش مهمی از این جلسه به مرور و تعمیق مفاهیم پایه پایتون، NumPy و Pandas اختصاص داشت. بررسی کردیم که یک List در پایتون چیست، عناصر آن چگونه با Index قابل دسترسی هستند و چگونه میتوان از آن برای نگهداری نام برندها یا نام ستونهای داده استفاده کرد. سپس با Dictionary آشنا شدیم و دیدیم که چگونه میتوان برای هر برند، یک اثر عددی بر قیمت تعریف کرد. همچنین مفهوم List Comprehension را بررسی کردیم و نشان دادیم که چگونه میتوان یک حلقه چندخطی را بهشکل فشردهتر و خواناتر نوشت.
در ادامه، آرایههای NumPy و تفاوت آنها با لیستهای پایتون توضیح داده شدند. با استفاده از محاسبات برداری، بدون نوشتن حلقههای طولانی، مقدار قیمت تمام خودروها را بهصورت همزمان محاسبه کردیم. این بخش فرصتی بود تا مفهوم Vectorization را بهتر درک کنیم؛ یعنی اجرای یک عملیات روی تمام عناصر یک آرایه بهصورت مستقیم و بهینه. همچنین با مولد اعداد تصادفی NumPy، مفهوم Seed و قابلتکرار بودن نتایج آشنا شدیم. استفاده از یک Seed ثابت باعث میشود دادهها و نتایج اجرای Notebook در دفعات مختلف یکسان باقی بمانند و بتوانیم آزمایشها را بهصورت علمیتر تکرار کنیم.
پس از تولید دادهها، آنها را در قالب یک Pandas DataFrame سازماندهی کردیم. DataFrame ساختاری جدولی است که شباهت زیادی به یک صفحه Excel یا یک جدول پایگاه داده دارد. در این ساختار، هر سطر یک نمونه و هر ستون یک ویژگی است. در این مثال، ستونهای کارکرد، سن، حجم موتور، برند و نوع گیربکس بهعنوان ویژگیهای ورودی و ستون قیمت بهعنوان Target در نظر گرفته شدند. سپس با دستورهایی مانند head()، shape، dtypes، isna()، value_counts() و describe() ساختار دادهها را بررسی کردیم. این مرحله نشان داد که پیش از آموزش هر مدل، باید ابتدا دادههای خود را بشناسیم، نوع ستونها را بررسی کنیم، وجود مقادیر گمشده را بسنجیم و توزیع مقادیر را مشاهده کنیم.
در بخش بعد، دادهها به دو قسمت X و y تقسیم شدند. متغیر X شامل ویژگیهایی است که مدل برای انجام پیشبینی دریافت میکند و متغیر y شامل پاسخ صحیح یا همان قیمت خودرو است. سپس با استفاده از تابع train_test_split() دادهها را به مجموعه آموزش و مجموعه آزمون تقسیم کردیم. مجموعه آموزش برای یادگیری پارامترهای مدل استفاده میشود، اما مجموعه آزمون باید تا زمان ارزیابی نهایی از مدل پنهان بماند. این جداسازی برای سنجش قدرت تعمیم مدل ضروری است. اگر مدلی فقط روی همان دادههایی که در زمان آموزش دیده است ارزیابی شود، ممکن است نتیجه بسیار خوبی نشان دهد، اما در مواجهه با دادههای جدید عملکرد ضعیفی داشته باشد.
یکی از نکات مهم این پروژه، وجود همزمان ویژگیهای عددی و دستهای بود. ویژگیهایی مانند کارکرد، سن و حجم موتور عددی هستند، اما برند و نوع گیربکس بهصورت رشتهای و دستهای ثبت شدهاند. بیشتر الگوریتمهای یادگیری ماشین نمیتوانند مستقیماً با عباراتی مانند "A"، "B" یا "yes" کار کنند؛ بنابراین لازم بود برای هر نوع ویژگی، پیشپردازش مناسبی انجام شود.
114 ·