Skip to content

Latest commit

 

History

History
388 lines (257 loc) · 33.8 KB

File metadata and controls

388 lines (257 loc) · 33.8 KB

ساخت مدل رگرسیون با استفاده از Scikit-learn: چهار روش رگرسیون

یادداشت مبتدیان

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

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

اینفوگرافیک توسط Dasani Madipalli

معرفی

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

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

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

یادگیری ماشین برای مبتدیان – درک رگرسیون خطی

🎥 برای مشاهده ویدئوی کوتاه معرفی رگرسیون خطی روی تصویر بالا کلیک کنید.

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

پیش‌نیاز

تا حالا باید با ساختار داده‌های کدو حلوایی که بررسی می‌کنیم آشنا شده باشید. می‌توانید این داده‌ها را در فایل notebook.ipynb این درس که پیش‌بارگذاری و پاک‌سازی شده است پیدا کنید. در این فایل، قیمت کدو حلوایی به ازای هر بوشل در یک فریم داده جدید نمایش داده شده است. مطمئن شوید که می‌توانید این دفترچه‌ها را در کرنل‌های Visual Studio Code اجرا کنید.

آماده‌سازی

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

  • بهترین زمان خرید کدو حلوایی چه زمانی است؟
  • چه قیمتی می‌توانم برای یک جعبه کدوهای کوچک انتظار داشته باشم؟
  • آیا باید آن‌ها را در سبدهای نیم بوشل خریداری کنم یا جعبه ۱ و ۱/۹ بوشل؟

بیایید بیشتر در این داده کاوش کنیم.

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

نگاهی به داده‌هایی که در دفترچه همراه این درس پیش‌بارگذاری شده است بیندازید. داده‌ها آماده‌اند و یک نمودار پراکندگی اولیه برای نشان دادن داده ماه ترسیم شده است. شاید بتوانیم با پاک‌سازی بیشتر داده‌ها جزئیات بیشتری درباره طبیعت داده‌ها به دست آوریم.

خط رگرسیون خطی

همانطور که در درس ۱ آموختید، هدف تمرین رگرسیون خطی این است که خطی ترسیم کنیم که:

  • رابطه متغیرها را نشان دهد. رابطه بین متغیرها را نشان دهد.
  • پیش‌بینی انجام دهد. پیش‌بینی دقیقی از اینکه یک نقطه داده جدید در رابطه با آن خط کجا قرار می‌گیرد، ارائه دهد.

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

این فاصله‌ها به دلایل دوگانه به توان دو می‌رسند:

  1. مقدار نسبت به جهت: می‌خواهیم خطای -۵ را برابر با خطای +۵ در نظر بگیریم. با مربع گرفتن همه مقدارها مثبت می‌شوند.

  2. مجازات نقاط پرت: توان دو دادن وزن بیشتری به خطاهای بزرگتر می‌دهد و خط را مجبور می‌کند که نزدیک به نقاط دورتر بماند.

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

🧮 ریاضیات را به من نشان بده

این خط که خط بهترین برازش نامیده می‌شود را می‌توان با یک معادله بیان کرد:

Y = a + bX

X متغیر «توضیحی» است. Y متغیر «وابسته» است. شیب خط b است و a مقدار y-عرض از مبدأ (y-intercept) است که به مقدار Y هنگامی که X = 0 اشاره دارد.

محاسبه شیب

ابتدا شیب b را محاسبه کنید. اینفوگرافیک توسط Jen Looper

به عبارت دیگر، و با اشاره به سوال اصلی داده‌های کدو حلوایی ما: «پیش‌بینی قیمت کدو حلوایی به ازای هر بوشل با توجه به ماه»، X اشاره به قیمت دارد و Y به ماه فروش اشاره می‌کند.

معادله را کامل کنید

مقدار Y را محاسبه کنید. اگر حدود ۴ دلار پرداخت می‌کنید، حتماً ماه آوریل است! اینفوگرافیک توسط Jen Looper

ریاضیات محاسبه خط باید شیب خط را که به مقدار عرض از مبدأ نیز وابسته است نشان دهد، یعنی جایی که مقدار Y وقتی X = 0 قرار دارد.

روش محاسبه این مقادیر را می‌توانید در وب‌سایت Math is Fun مشاهده کنید. همچنین با استفاده از این ماشین حساب حداقل مربعات ببینید که چگونه مقدار اعداد بر خط تاثیر می‌گذارد.

همبستگی

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

یک مدل رگرسیون خطی خوب، مدلی است که ضریب همبستگی بالایی (نزدیک به ۱ و دور از ۰) با روش حداقل مربعات و خط رگرسیون داشته باشد.

✅ دفترچه همراه این درس را اجرا کنید و نمودار پراکندگی ماه به قیمت را نگاه کنید. آیا داده‌های ارتباط ماه به قیمت کدو فروش همبستگی بالا یا پایین دارند، طبق تفسیر بصری شما از نمودار پراکندگی؟ آیا این تغییر می‌کند اگر به جای ماه از معیار دقیق‌تری مثل روز سال (یعنی تعداد روزهای گذشته از اول سال) استفاده کنید؟

در کد زیر فرض می‌کنیم داده‌ها را پاک‌سازی کرده‌ایم و یک فریم داده به نام new_pumpkins داریم، شبیه به موارد زیر:

ID Month DayOfYear Variety City Package Low Price High Price Price
70 9 267 نوع پای بالتیمور جعبه ۱ و ۱/۹ بوشل 15.0 15.0 13.636364
71 9 267 نوع پای بالتیمور جعبه ۱ و ۱/۹ بوشل 18.0 18.0 16.363636
72 10 274 نوع پای بالتیمور جعبه ۱ و ۱/۹ بوشل 18.0 18.0 16.363636
73 10 274 نوع پای بالتیمور جعبه ۱ و ۱/۹ بوشل 17.0 17.0 15.454545
74 10 281 نوع پای بالتیمور جعبه ۱ و ۱/۹ بوشل 15.0 15.0 13.636364

کد پاک‌سازی داده در notebook.ipynb موجود است. ما همان مراحل پاک‌سازی درس قبلی را انجام داده‌ایم و ستون DayOfYear را با استفاده از عبارت زیر محاسبه کرده‌ایم:

day_of_year = pd.to_datetime(pumpkins['Date']).apply(lambda dt: (dt-datetime(dt.year,1,1)).days)

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

جستجوی همبستگی

یادگیری ماشین برای مبتدیان – جستجوی همبستگی: کلید رگرسیون خطی

🎥 برای مشاهده ویدئوی کوتاه معرفی همبستگی روی تصویر بالا کلیک کنید.

از درس قبلی احتمالاً دیده‌اید که میانگین قیمت برای ماه‌های مختلف به این شکل است:

میانگین قیمت بر اساس ماه

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

نمودار پراکندگی قیمت در مقابل روز سال

بیایید ببینیم با استفاده از تابع corr آیا همبستگی وجود دارد:

print(new_pumpkins['Month'].corr(new_pumpkins['Price']))
print(new_pumpkins['DayOfYear'].corr(new_pumpkins['Price']))

به نظر می‌رسد همبستگی نسبتاً کوچک است، -۰.۱۵ برای ماه و -۰.۱۷ برای روز سال، اما ممکن است ارتباط مهم دیگری وجود داشته باشد. به نظر می‌رسد خوشه‌های مختلف قیمت با انواع مختلف کدو متناسب است. برای تأیید این فرض، بیایید هر دسته کدو را با رنگ متفاوت ترسیم کنیم. با ارسال پارامتر ax به تابع نمودار پراکندگی، می‌توانیم همه نقاط را روی یک نمودار ترسیم کنیم:

ax=None
colors = ['red','blue','green','yellow']
for i,var in enumerate(new_pumpkins['Variety'].unique()):
    df = new_pumpkins[new_pumpkins['Variety']==var]
    ax = df.plot.scatter('DayOfYear','Price',ax=ax,c=colors[i],label=var)

نمودار پراکندگی قیمت در مقابل روز سال با رنگ

تحقیق ما نشان می‌دهد که نوع کدو تاثیر بیشتری روی قیمت کلی دارد تا تاریخ واقعی فروش. این را می‌توان با نمودار میله‌ای دید:

new_pumpkins.groupby('Variety')['Price'].mean().plot(kind='bar')

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

فعلاً فقط روی یک نوع کدو، 'نوع پای' تمرکز کنیم و ببینیم تاریخ چه تأثیری روی قیمت دارد:

pie_pumpkins = new_pumpkins[new_pumpkins['Variety']=='PIE TYPE']
pie_pumpkins.plot.scatter('DayOfYear','Price') 

نمودار پراکندگی قیمت در مقابل روز سال

اگر اکنون همبستگی بین قیمت و روز سال را با استفاده از تابع corr محاسبه کنیم، چیزی مانند -0.27 به دست می‌آوریم که نشان می‌دهد آموزش مدل پیش‌بینی منطقی است.

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

pie_pumpkins.dropna(inplace=True)
pie_pumpkins.info()

رویکرد دیگر پر کردن این مقادیر خالی با میانگین ستون مربوطه است.

رگرسیون خطی ساده

یادگیری ماشین برای مبتدیان – رگرسیون خطی و چندجمله‌ای با استفاده از Scikit-learn

🎥 برای دیدن ویدئوی کوتاه معرفی رگرسیون خطی و چندجمله‌ای روی تصویر بالا کلیک کنید.

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

from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split

با جدا کردن مقادیر ورودی (ویژگی‌ها) و خروجی مورد انتظار (برچسب) به آرایه‌های numpy جداگانه شروع می‌کنیم:

X = pie_pumpkins['DayOfYear'].to_numpy().reshape(-1,1)
y = pie_pumpkins['Price']

توجه داشته باشید که ما باید reshape روی داده‌های ورودی اعمال کنیم تا بسته رگرسیون خطی آنها را به درستی بفهمد. رگرسیون خطی انتظار دارد ورودی یک آرایه ۲بعدی باشد که هر سطر آن یک بردار ویژگی‌های ورودی است. در مورد ما چون فقط یک ورودی داریم، به آرایه‌ای با شکل N×1 نیاز داریم که N اندازه دیتاست است.

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

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

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

lin_reg = LinearRegression()
lin_reg.fit(X_train,y_train)

شیء LinearRegression پس از انجام fit شامل تمامی ضرایب رگرسیون است که می‌توان به آن‌ها با استفاده از خاصیت .coef_ دسترسی داشت. در مورد ما، فقط یک ضریب وجود دارد که باید حدود -0.017 باشد. این یعنی قیمت‌ها کمی با گذر زمان کاهش می‌یابد، اما نه خیلی زیاد، حدود ۲ سنت در روز. همچنین می‌توانیم نقطه تقاطع رگرسیون با محور Y را با استفاده از lin_reg.intercept_ مشاهده کنیم - که در مورد ما حدود 21 است و نشان‌دهنده قیمت در ابتدای سال است.

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

pred = lin_reg.predict(X_test)

mse = np.sqrt(mean_squared_error(y_test,pred))
print(f'Mean error: {mse:3.3} ({mse/np.mean(pred)*100:3.3}%)')

خطای ما به نظر می‌رسد حدود ۲ واحد است که حدود ۱۷٪ می‌شود. چندان خوب نیست. شاخص دیگری برای کیفیت مدل، ضریب تعیین است که می‌توان آن را به صورت زیر به دست آورد:

score = lin_reg.score(X_train,y_train)
print('Model determination: ', score)

اگر مقدار ۰ باشد، به این معناست که مدل ورودی‌ها را در نظر نمی‌گیرد و به عنوان بدترین پیش‌بینی‌کننده خطی عمل می‌کند که صرفاً مقدار میانگین نتیجه است. مقدار ۱ نشان می‌دهد که می‌توانیم به‌طور کامل همه خروجی‌های انتظار رفته را پیش‌بینی کنیم. در مورد ما، ضریب حدود ۰.۰۶ است که بسیار پایین است.

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

plt.scatter(X_test,y_test)
plt.plot(X_test,pred)

Linear regression

رگرسیون چندجمله‌ای

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

✅ اینجا چند مثال بیشتر از داده‌هایی وجود دارد که می‌توانند از رگرسیون چندجمله‌ای استفاده کنند

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

✅ چندجمله‌ای‌ها عبارات ریاضی هستند که ممکن است از یک یا چند متغیر و ضرایب تشکیل شوند.

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

Scikit-learn یک رابط خط لوله مفید ارائه می‌دهد که مراحل مختلف پردازش داده را با هم ترکیب می‌کند. یک خط لوله زنجیره‌ای از برآوردگرها است. در مورد ما، یک خط لوله می‌سازیم که ابتدا ویژگی‌های چندجمله‌ای را به مدل اضافه می‌کند و سپس رگرسیون را آموزش می‌دهد:

from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import make_pipeline

pipeline = make_pipeline(PolynomialFeatures(2), LinearRegression())

pipeline.fit(X_train,y_train)

استفاده از PolynomialFeatures(2) یعنی اینکه همه چندجمله‌ای‌های درجه دوم از داده ورودی را شامل می‌شویم. در مورد ما، فقط به معنی DayOfYear2 است، اما اگر دو متغیر ورودی X و Y داشته باشیم، این شامل X2، XY و Y2 خواهد بود. ما همچنین می‌توانیم از چندجمله‌ای‌های درجه بالاتر نیز استفاده کنیم اگر بخواهیم.

خط لوله‌ها می‌توانند به همان شیوه شیء LinearRegression اصلی استفاده شوند، یعنی می‌توانیم روی خط لوله fit کنیم و سپس از predict برای دریافت نتایج پیش‌بینی استفاده کنیم. در اینجا نموداری است که داده‌های تست و منحنی تقریب را نشان می‌دهد:

Polynomial regression

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

می‌بینید که کمترین قیمت‌های کدو تنبل در حوالی هالووین مشاهده می‌شود. چگونه می‌توانید این را توضیح دهید؟

🎃 تبریک می‌گوییم، شما به تازگی مدلی ایجاد کردید که می‌تواند در پیش‌بینی قیمت کدو تنبل پای کمک کند. احتمالاً می‌توانید همین روند را برای همه نوع‌های کدو تنبل تکرار کنید، اما این کار خسته‌کننده خواهد بود. حالا بیایید یاد بگیریم چگونه تنوع کدو تنبل را در مدل خود در نظر بگیریم!

ویژگی‌های دسته‌ای

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

ML for beginners - Categorical Feature Predictions with Linear Regression

🎥 روی تصویر بالا کلیک کنید تا یک ویدیوی کوتاه درباره استفاده از ویژگی‌های دسته‌ای ببینید.

در اینجا می‌بینید که قیمت متوسط چگونه بسته به نوع کدو تنبل تغییر می‌کند:

Average price by variety

برای در نظر گرفتن تنوع، ابتدا باید آن را به فرم عددی تبدیل کنیم، یا به اصطلاح آن را کدگذاری کنیم. چند روش وجود دارد:

  • کدگذاری عددی ساده جدولی از گونه‌های مختلف می‌سازد و سپس نام گونه را با یک شماره شاخص در آن جدول جایگزین می‌کند. این روش برای رگرسیون خطی ایده‌آل نیست، چون رگرسیون خطی مقدار عددی شاخص را وارد محاسبات می‌کند و در نتیجه رابطه بین شماره شاخص و قیمت به طور مشهود غیرخطی است، حتی اگر مطمئن شویم که شاخص‌ها به ترتیب خاصی هستند.
  • کدگذاری یک‌گرمی ستون Variety را با ۴ ستون مختلف جایگزین می‌کند، یکی برای هر نوع. هر ستون مقدار 1 دارد اگر سطر مربوط به آن نوع باشد، و 0 در غیر این صورت. این یعنی برای رگرسیون خطی چهار ضریب داریم، یکی برای هر نوع کدو تنبل، که مسئول قیمت اولیه (یا بهتر است بگوییم قیمت اضافی) برای آن نوع مشخص است.

کد زیر نشان می‌دهد چگونه می‌توانیم یک‌گرمی کدگذاری را انجام دهیم:

pd.get_dummies(new_pumpkins['Variety'])
ID FAIRYTALE MINIATURE MIXED HEIRLOOM VARIETIES PIE TYPE
70 0 0 0 1
71 0 0 0 1
... ... ... ... ...
1738 0 1 0 0
1739 0 1 0 0
1740 0 1 0 0
1741 0 1 0 0
1742 0 1 0 0

برای آموزش رگرسیون خطی با استفاده از تنوع کدگذاری شده به صورت یک‌گرمی به عنوان ورودی، فقط کافی است داده‌های X و y را به درستی مقداردهی اولیه کنیم:

X = pd.get_dummies(new_pumpkins['Variety'])
y = new_pumpkins['Price']

باقی کد همان است که قبلاً برای آموزش رگرسیون خطی استفاده کردیم. اگر امتحان کنید، خواهید دید که میانگین مربعات خطا تقریباً همان است، اما ضریب تعیین بسیار بالاتری (~۷۷٪) به دست می‌آوریم. برای پیش‌بینی‌های دقیق‌تر، می‌توانیم ویژگی‌های دسته‌ای بیشتری و همچنین ویژگی‌های عددی مانند Month یا DayOfYear را در نظر بگیریم. برای داشتن یک آرایه بزرگ از ویژگی‌ها، می‌توانیم از join استفاده کنیم:

X = pd.get_dummies(new_pumpkins['Variety']) \
        .join(new_pumpkins['Month']) \
        .join(pd.get_dummies(new_pumpkins['City'])) \
        .join(pd.get_dummies(new_pumpkins['Package']))
y = new_pumpkins['Price']

در اینجا همچنین City و نوع Package را در نظر می‌گیریم که به ما MSE 2.84 (۱۰٪) و ضریب تعیین ۰.۹۴ می‌دهد!

جمع‌بندی همه چیز

برای ساخت بهترین مدل، می‌توانیم داده‌های ترکیبی (ویژگی‌های کدگذاری شده یک‌گرمی و عددی) از مثال بالا را همراه با رگرسیون چندجمله‌ای استفاده کنیم. در اینجا کد کامل برای راحتی شما آمده است:

# تنظیم داده‌های آموزشی
X = pd.get_dummies(new_pumpkins['Variety']) \
        .join(new_pumpkins['Month']) \
        .join(pd.get_dummies(new_pumpkins['City'])) \
        .join(pd.get_dummies(new_pumpkins['Package']))
y = new_pumpkins['Price']

# تقسیم داده‌ها به مجموعه آموزش و تست
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

# تنظیم و آموزش خط لوله
pipeline = make_pipeline(PolynomialFeatures(2), LinearRegression())
pipeline.fit(X_train,y_train)

# پیش‌بینی نتایج برای داده‌های تست
pred = pipeline.predict(X_test)

# محاسبه MSE و ضریب تعیین
mse = np.sqrt(mean_squared_error(y_test,pred))
print(f'Mean error: {mse:3.3} ({mse/np.mean(pred)*100:3.3}%)')

score = pipeline.score(X_train,y_train)
print('Model determination: ', score)

این باید بهترین ضریب تعیین یعنی تقریباً ۹۷٪ و MSE=2.23 (حدود ۸٪ خطای پیش‌بینی) را به ما بدهد.

مدل MSE ضریب تعیین
خطی DayOfYear 2.77 (17.2%) 0.07
چندجمله‌ای DayOfYear 2.73 (17.0%) 0.08
خطی Variety 5.24 (19.7%) 0.77
همه ویژگی‌ها خطی 2.84 (10.5%) 0.94
همه ویژگی‌ها چندجمله‌ای 2.23 (8.25%) 0.97

🏆 آفرین! شما در یک درس چهار مدل رگرسیون ساختید و کیفیت مدل را تا ۹۷٪ بهبود دادید. در بخش نهایی درباره رگرسیون، درباره رگرسیون لجستیک برای تعیین دسته‌ها خواهید آموخت.


🚀 چالش

متغیرهای مختلف را در این دفترچه تست کنید تا ببینید چگونه همبستگی با دقت مدل رابطه دارد.

مرور و خودآموزی

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

تمرین

مدلی بسازید


سلب مسئولیت:
این سند با استفاده از سرویس ترجمه هوش مصنوعی Co-op Translator ترجمه شده است. در حالی که ما در تلاش برای دقت هستیم، لطفاً توجه داشته باشید که ترجمه‌های خودکار ممکن است حاوی خطاها یا نواقص باشند. سند اصلی به زبان مبدأ باید به عنوان منبع معتبر در نظر گرفته شود. برای اطلاعات حیاتی، ترجمه حرفه‌ای انسانی توصیه می‌شود. ما مسئول هیچ گونه سوتفاهم یا تفسیر نادرست ناشی از استفاده از این ترجمه نیستیم.