آموزش / تست
ارزیابی مدل خود
در یادگیری ماشین ما مدلهایی را برای پیش بینی نتیجه رویدادهای خاصی ایجاد میکنیم، مانند فصل قبل که در آن انتشار CO2 یک ماشین را هنگامی که وزن و اندازه موتور را میدانستیم پیش بینی میکردیم.[۱]
برای اندازهگیری اینکه مدل به اندازه کافی خوب است میتوانیم از روشی به نام Train/Test استفاده کنیم.
Train/Test چیست؟
Train/Test متدی برای اندازهگیری دقت مدل است.
این روش Train/Test نامیده میشود زیرا شما دادههای مجموعه را به دو بخش تقسیم میکنید: مجموعه آموزشی (به انگلیسی: training) و مجموعه تست.
با استفاده از دادههای مجموعه training مدل را آموزش میدهید.
با استفاده از دادههای مجموعه test مدل را تست میدهید
آموزش مدل یعنی ایجاد یک مدل.
تست مدل یعنی سنجش میزان دقت مدل.شروع با یک مجموعه داده (به انگلیسی: Data Set)
با مجموعه دادهای که میخواهید تست کنید شروع کنید.
مجموعه دادههای ما ۱۰۰ مشتری در یک فروشگاه و عادات خرید آنها را نشان میدهد.
مثال
1 import numpy
2 import matplotlib.pyplot as plt
3 numpy.random.seed(2)
4
5 x = numpy.random.normal(3, 1, 100)
6 y = numpy.random.normal(150, 40, 100) / x
7
8 plt.scatter(x, y)
9 plt.show()
نتیجه
محور x تعداد دقایق قبل از خرید کردن را نشان میدهد.
محور y تعداد میزان پول خرج شده برای خرید را نشان میدهد.
تقسیم به Train/Test
مجموعه آموزشی باید انتخاب تصادفی ۸۰٪ از دادههای اصلی باشد.
مجموعه آزمایش باید ۲۰٪ باقی مانده باشد.
1 train_x = x[:80]
2 train_y = y[:80]
3
4 test_x = x[80:]
5 test_y = y[80:]
نمایش مجموعه آموزشی (به انگلیسی: Training Set)
نمودار پراکندگی مشابه با مجموعه آموزشی را نشان میدهد:
مثال
1 plt.scatter(train_x, train_y)
2 plt.show()
نتیجه
شبیه مجموعهٔ داده اصلی است، بنابراین انتخاب منصفانه ای بخ نظر میرسد:
نمایش مجموعه آزمایشی (به انگلیسی: Test Set)
برای اینکه مطمئن شویم که مجموعه تست کاملاً متفاوت نیست، به مجموعه تستها نیز نگاهی میاندازیم.
مثال
1 plt.scatter(test_x, test_y)
2 plt.show()
نتیجه
مجموعه تست مشابه مجموعه داده اصلی است:
سازگاری با مجموعه داده
مجموعه داده چگونه به نظر میرسد؟ به نظر من بهترین راه حل یک رگرسیون چند جمله ای است، بنابراین اجازه دهید ما یک خط رگرسیون چند جمله ای ترسیم کنیم.
برای ترسیم خط در بین نقاط داده، ما از متد plot()
در ماژول matplotlib استفاده میکنیم:
مثال
یک خط رگرسیون چندجملهای در بین نقاط داده رسم میکند:
1 import numpy
2 import matplotlib.pyplot as plt
3 numpy.random.seed(2)
4
5 x = numpy.random.normal(3, 1, 100)
6 y = numpy.random.normal(150, 40, 100) / x
7
8 train_x = x[:80]
9 train_y = y[:80]
10
11 test_x = x[80:]
12 test_y = y[80:]
13
14 mymodel = numpy.poly1d(numpy.polyfit(train_x, train_y, 4))
15
16 myline = numpy.linspace(0, 6, 100)
17
18 plt.scatter(train_x, train_y)
19 plt.plot(myline, mymodel(myline))
20 plt.show()
نتیجه
نتیجه میتواند از پیشنهاد من از مجموعه دادههای متناسب با رگرسیون چند جمله ای را طرفداری کند، اگرچه اگر سعی کنیم مقادیر خارج از مجموعه دادهها را پیش بینی کنیم، نتایج عجیبی به ما میدهد. به عنوان مثال: خط نشان میدهد که مشتری با گذراندن ۶ دقیقه در مغازه میتواند خریدی به ارزش ۲۰۰ دلار داشته باشد. این احتمالاً نشانهای از Overfitting آن است.
اما درمورد امتیاز R-squared چطور؟ امتیاز R-squared نشانگر خوبی از چگونگی سازگاری مجموعه دادههای من در مدل است.
R2
R2 را به یاد دارید، به آن R-squared نیز گفته میشود؟
R2 رابطه بین محور x و محور y را اندازه گیری میکند، و مقدار از ۰ تا ۱ متغیر است، که در آن ۰ به معنای عدم رابطه است و ۱ به معنای کاملاً مرتبط است.
ماژول sklearn روشی به نام rs_score()
دارد که ما را در یافتن این رابطه یاری میکند.
در این حالت ما میخواهیم رابطه بین دقایقی را که مشتری در مغازه میماند و چقدر پول خود را خرج میکند، اندازهگیری کنیم.
مثال
دادههای آموزشی من چقدر خوب با یک رگرسیون چند جمله ای سازگار است؟
1 import numpy
2 from sklearn.metrics import r2_score
3 numpy.random.seed(2)
4
5 x = numpy.random.normal(3, 1, 100)
6 y = numpy.random.normal(150, 40, 100) / x
7
8 train_x = x[:80]
9 train_y = y[:80]
10
11 test_x = x[80:]
12 test_y = y[80:]
13
14 mymodel = numpy.poly1d(numpy.polyfit(train_x, train_y, 4))
15
16 r2 = r2_score(train_y, mymodel(train_x))
17
18 print(r2)
وارد کردن مجموعه تست
اکنون ما مدلی را ساختهایم که خوب است، حداقل وقتی صحبت از دادههای آموزشی است.
حال میخواهیم مدل را با دادههای تست نیز آزمایش کنیم، تا ببینیم نتیجه مشابهی به ما میدهد یا نه.
مثال
میخواهیم امتیاز R2 را هنگام استفاده از دادههای تست بیابیم:
1 import numpy
2 from sklearn.metrics import r2_score
3 numpy.random.seed(2)
4
5 x = numpy.random.normal(3, 1, 100)
6 y = numpy.random.normal(150, 40, 100) / x
7
8 train_x = x[:80]
9 train_y = y[:80]
10
11 test_x = x[80:]
12 test_y = y[80:]
13
14 mymodel = numpy.poly1d(numpy.polyfit(train_x, train_y, 4))
15
16 r2 = r2_score(test_y, mymodel(test_x))
17
18 print(r2)
پیش بینی مقادیر
اکنون که ثابت کردیم که مدل ما خوب است، میتوانیم مقادیر جدید را پیش بینی کنیم.
مثال
اگر مشتری خریدار، ۵ دقیقه در فروشگاه بماند، چقدر پول خرج خواهد کرد؟
print(mymodel(5))
این مثال پیش بینی کرد که مشتری ۲۲٫۸۸ دلار خرج کند، همانطور که به نظر میرسد با نمودار مطابقت دارد:
منابع آموزشی