آموزش و تست یادگیری ماشین

ارزیابی مدل

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

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

آموزش/تست چیست

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

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

۸۰٪ برای آموزش و ۲۰٪ برای تست استفاده می‌شود.

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

می‌توانید از مجموعه‌ی تست برای تست مدل استفاده کنید.

تدریب مدل به معنای ایجاد مدل است.

تست مدل به معنای تست دقت مدل است.

از بسته‌ی داده شروع کنید

از بسته‌ی داده‌ای که می‌خواهید تست کنید شروع کنید.

بسته‌ی داده‌های ما ۱۰۰ مشتری در فروشگاه و عادات خرید آن‌ها را نشان می‌دهد.

مثال

import numpy
import matplotlib.pyplot as plt
numpy.random.seed(2)
x = numpy.random.normal(3, 1, 100)
y = numpy.random.normal(150, 40, 100) / x
plt.scatter(x, y)
plt.show()

نتیجه:

محور x دقیقاتی است که قبل از خرید می‌گذرد.

محور y مقدار پولی است که در خرید هزینه شده است.


اجرای نمونه

جداسازی آموزشی/تست

مجموعه آموزشی باید 80٪ انتخاب تصادفی از داده‌های اصلی باشد.

مجموعه تست باید 20٪ باقی‌مانده باشد.

train_x = x[:80]
train_y = y[:80]
test_x = x[80:]
test_y = y[80:]

نمایش مجموعه آموزشی

نمایش نمودار نقطه‌ای مشابه مجموعه آموزشی:

مثال

plt.scatter(train_x, train_y)
plt.show()

نتیجه:

این نیز مانند مجموعه داده‌های اصلی به نظر می‌رسد، بنابراین به نظر می‌رسد که انتخاب معقولی است:


اجرای نمونه

نمایش مجموعه تست

برای اطمینان از اینکه مجموعه تست کاملاً متفاوت نیست، باید به مجموعه تست نیز نگاه کنیم.

مثال

plt.scatter(test_x, test_y)
plt.show()

نتیجه:

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


اجرای نمونه

تطبیق مجموعه داده‌ها

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

برای رسم خطی که از داده‌ها عبور می‌کند، ما از ماژول matplotlib استفاده می‌کنیم plott() روش:

مثال

خط چندجهانی بازگشتی را که از داده‌های داده‌ها عبور می‌کند، رسم کنید:

import numpy
import matplotlib.pyplot as plt
numpy.random.seed(2)
x = numpy.random.normal(3, 1, 100)
y = numpy.random.normal(150, 40, 100) / x
train_x = x[:80]
train_y = y[:80]
test_x = x[80:]
test_y = y[80:]
mymodel = numpy.poly1d(numpy.polyfit(train_x, train_y, 4))
myline = numpy.linspace(0, 6, 100)
plt.scatter(train_x, train_y)
plt.plot(myline, mymodel(myline))
plt.show()

نتیجه:


اجرای نمونه

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

اما نمره R-squared چطور؟ نمره R-squared score به خوبی نشان‌دهنده تطابق مجموعه داده‌های من با مدل است.

R2

آیا R2 یا به عبارت دیگر R مربع (R-squared) را به خاطر می‌آورید؟

این میزان رابطه بین محور x و y را اندازه‌گیری می‌کند، که در محدوده 0 تا 1 قرار دارد، جایی که 0 نشان‌دهنده عدم رابطه و 1 نشان‌دهنده رابطه کامل است.

پلاگین sklearn یک ماژول به نام rs_score() این روش، که به ما کمک می‌کند این رابطه را پیدا کنیم.

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

مثال

چگونه داده‌های آموزشی ما در تابع بازگشتی چندجهانی تطابق دارند؟

import numpy
از sklearn.metrics import r2_score
numpy.random.seed(2)
x = numpy.random.normal(3, 1, 100)
y = numpy.random.normal(150, 40, 100) / x
train_x = x[:80]
train_y = y[:80]
test_x = x[80:]
test_y = y[80:]
mymodel = numpy.poly1d(numpy.polyfit(train_x, train_y, 4))
r2 = r2_score(train_y, mymodel(train_x))
print(r2)

اجرای نمونه

توجه:نتیجه 0.799 نشان می‌دهد که رابطه خوبی وجود دارد.

ورود مجموعه تست

در حال حاضر، حداقل در مورد داده‌های آموزشی، ما یک مدل خوبی ایجاد کرده‌ایم.

پس، ما باید از داده‌های تست برای تست مدل استفاده کنیم تا بررسی کنیم که آیا نتایج مشابهی ارائه می‌دهد یا خیر.

مثال

اجازه دهید در حالی که از داده‌های تست استفاده می‌کنیم،确定 R2 فرقه را مشخص کنیم:

import numpy
از sklearn.metrics import r2_score
numpy.random.seed(2)
x = numpy.random.normal(3, 1, 100)
y = numpy.random.normal(150, 40, 100) / x
train_x = x[:80]
train_y = y[:80]
test_x = x[80:]
test_y = y[80:]
mymodel = numpy.poly1d(numpy.polyfit(train_x, train_y, 4))
r2 = r2_score(test_y, mymodel(test_x))
print(r2)

اجرای نمونه

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

مقدار پیش‌بینی

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

مثال

اگر مشتری خریدار در فروشگاه 5 دقیقه بماند، او/او چقدر هزینه خواهد کرد؟

print(mymodel(5))

اجرای نمونه

این نمونه پیش‌بینی می‌کند که مشتری 22.88 دلار هزینه کرده است، که به نظر می‌رسد با نمودار مطابقت دارد: