برای ویژگیهای عددی از StandardScaler استفاده کردیم. این Transformer میانگین و انحراف معیار هر ستون عددی را از دادههای آموزشی یاد میگیرد و سپس مقادیر را استاندارد میکند. در این فرایند، مقادیر هر ویژگی به مقیاسی تبدیل میشوند که تقریباً میانگین صفر و انحراف معیار یک دارد. این کار باعث میشود ویژگیهایی با دامنههای بسیار متفاوت، در یک مقیاس قابلمقایسه قرار بگیرند. هرچند رگرسیون خطی معمولی بدون استانداردسازی نیز قابل اجراست، استفاده از StandardScaler در این مثال به ما اجازه داد مفهوم Transformer، متد fit() و ذخیره پارامترهای یادگرفتهشده را بهتر بررسی کنیم.
برای ویژگیهای دستهای از OneHotEncoder استفاده شد. این ابزار هر دسته را به ستونهای صفر و یک تبدیل میکند. برای مثال، اگر ستون برند شامل چهار مقدار A، B، C و D باشد، Encoder میتواند برای هر برند یک ستون جداگانه ایجاد کند. با تنظیم drop="first" یکی از دستهها بهعنوان دسته مبنا حذف شد تا از وابستگی خطی کامل میان ستونهای کدگذاریشده جلوگیری شود. همچنین با تنظیم handle_unknown="ignore" مشخص کردیم که اگر در زمان پیشبینی با یک برند جدید و دیدهنشده مواجه شدیم، برنامه متوقف نشود. البته توضیح داده شد که اجراشدن کد بدون خطا، الزاماً به معنای معتبر بودن علمی پیشبینی برای یک دسته ناشناخته نیست.
سپس با استفاده از ColumnTransformer مشخص کردیم که هر گروه از ستونها باید از چه مسیری عبور کند. ستونهای عددی وارد StandardScaler شدند و ستونهای دستهای از OneHotEncoder عبور کردند. خروجی این دو بخش در نهایت در کنار یکدیگر قرار گرفت و یک ماتریس کاملاً عددی برای مدل ایجاد شد. این بخش نشان داد که در پروژههای واقعی، معمولاً نمیتوان یک عملیات واحد را روی تمام ستونها اجرا کرد و باید برای انواع مختلف داده، پردازشهای متفاوتی تعریف کرد.
در ادامه، تمام مراحل پیشپردازش و مدل رگرسیون خطی را داخل یک Pipeline قرار دادیم. Pipeline یکی از ابزارهای بسیار مهم Scikit-learn است که مراحل مختلف یک پروژه را به یک زنجیره منظم تبدیل میکند. در این پروژه، داده خام ابتدا وارد بخش Preprocessing میشود، ویژگیهای عددی استاندارد میشوند، ویژگیهای دستهای کدگذاری میشوند و سپس ماتریس حاصل در اختیار مدل LinearRegression قرار میگیرد. مزیت Pipeline این است که تمام این مراحل با یک دستور واحد قابل آموزش و اجرا هستند و احتمال بروز خطاهایی مانند استفاده متفاوت از پیشپردازش در زمان آموزش و پیشبینی کاهش مییابد.
یکی از اصلیترین قسمتهای درس، تحلیل پشت صحنه متد fit() بود. هنگامی که دستور زیر اجرا میشود:
model.fit(X_train, y_train)
در ظاهر تنها یک خط کد داریم، اما در پشت صحنه چندین مرحله انجام میشود. ابتدا StandardScaler میانگین و انحراف معیار ستونهای عددی را فقط از دادههای آموزش محاسبه و ذخیره میکند. سپس OneHotEncoder دستههای موجود در ستونهای برند و گیربکس را شناسایی میکند و ساختار ستونهای جدید را میسازد. پس از تبدیل تمام ویژگیها به یک ماتریس عددی، مدل رگرسیون خطی ضرایبی را پیدا میکند که مجموع مجذور خطاهای پیشبینی را تا حد ممکن کاهش دهند.
بنابراین fit() تنها برای مدلهای پیشبینیکننده نیست. حتی یک Transformer مانند StandardScaler نیز متد fit() دارد، زیرا باید اطلاعاتی را از داده یاد بگیرد. StandardScaler میانگین و انحراف معیار را یاد میگیرد، OneHotEncoder دستهها را یاد میگیرد و LinearRegression ضرایب و عرض از مبدأ را محاسبه میکند. در Scikit-learn معمولاً پارامترهایی که پس از Fit ایجاد میشوند، با یک علامت زیرخط در انتهای نامشان مشخص میشوند؛ مانند mean_، scale_، categories_، coef_ و intercept_.
برای درک عمیقتر رگرسیون خطی، مسئله کمترین مربعات را با استفاده از NumPy نیز بهصورت مستقیم حل کردیم. یک ستون از عدد یک به ماتریس ویژگیها اضافه شد تا بتوانیم Intercept را محاسبه کنیم و سپس با تابع np.linalg.lstsq() ضرایب مدل به دست آمدند. مقایسه ضرایب NumPy و Scikit-learn نشان داد که مدل LinearRegression نیز در اصل در حال حل یک مسئله Least Squares است. این بخش ارتباط میان فرمولهای ریاضی، جبر خطی و کدهای سطح بالای کتابخانه Scikit-learn را روشن کرد.
پس از آموزش، با متد predict() قیمت خودروهای موجود در مجموعه آزمون را پیشبینی کردیم. هنگام اجرای Predict، هیچ پارامتر جدیدی یاد گرفته نمیشود. دادههای آزمون با استفاده از میانگینها، انحراف معیارها و دستههایی که قبلاً از داده آموزش یاد گرفته شدهاند، تبدیل میشوند و سپس مدل قیمت را محاسبه میکند. در این قسمت مفهوم Data Leakage نیز توضیح داده شد.
125 ·