آموزش/آزمون (Train/Test)
مدل یادگیری ماشین باید سنجیده شود. روش «آموزش/آزمون (Train/Test)» داده را به دو بخش می برد: یکی برای ساخت مدل، یکی برای سنجش دقت. این کار جلوی خوش بینانه شدن نتایج را می گیرد.
Train/Test یعنی چه؟
در این روش، معمولاً 80٪ داده برای آموزش و 20٪ برای آزمون است. «آموزش (Train)» یعنی ساخت مدل. «آزمون (Test)» یعنی سنجش دقت مدل روی داده های تازه.
شروع با یک مجموعه داده
با داده های ساختگی شروع می کنیم. x دقیقه های خرید است و y مبلغ خرید است.
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(2)
x = np.random.normal(3, 1, 100)
y = np.random.normal(150, 40, 100) / x
plt.scatter(x, y)
plt.show()
تقسیم به آموزش و آزمون
ساده ترین راه، برش آرایه هاست. اینجا 80 نمونه برای آموزش می گیریم.
import numpy as np
np.random.seed(2)
x = np.random.normal(3, 1, 100)
y = np.random.normal(150, 40, 100) / x
train_x = x[:80]
train_y = y[:80]
test_x = x[80:]
test_y = y[80:]
نکته: می توان با شافل تصادفی هم تقسیم کرد؛ منبع اینجا برش ساده دارد.
نمایش مجموعه آموزش
پراکندگی آموزش باید شبیه کل داده باشد.
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(2)
x = np.random.normal(3, 1, 100)
y = np.random.normal(150, 40, 100) / x
train_x = x[:80]
train_y = y[:80]
plt.scatter(train_x, train_y)
plt.show()
نمایش مجموعه آزمون
آزمون هم باید الگوی مشابهی داشته باشد.
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(2)
x = np.random.normal(3, 1, 100)
y = np.random.normal(150, 40, 100) / x
test_x = x[80:]
test_y = y[80:]
plt.scatter(test_x, test_y)
plt.show()
برازش با چندجمله ای
برای این داده، یک مدل چندجمله ای درجه 4 مناسب به نظر می رسد. چندجمله ای (Polynomial) یعنی جمع جمله های توانی.
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(2)
x = np.random.normal(3, 1, 100)
y = np.random.normal(150, 40, 100) / x
train_x = x[:80]
train_y = y[:80]
equation = np.poly1d(np.polyfit(train_x, train_y, 4))
line_x = np.linspace(0, 6, 100)
plt.scatter(train_x, train_y)
plt.plot(line_x, equation(line_x))
plt.show()
هشدار: برون یابی ممکن است غیرواقعی شود؛ این نشانه بیش برازش است.
محاسبه R2 روی آموزش
نمره R2 میزان توضیح دهندگی مدل را می سنجد. مقدار بین 0 و 1 است.
import numpy as np
from sklearn.metrics import r2_score
np.random.seed(2)
x = np.random.normal(3, 1, 100)
y = np.random.normal(150, 40, 100) / x
train_x = x[:80]
train_y = y[:80]
equation = np.poly1d(np.polyfit(train_x, train_y, 4))
r2 = r2_score(train_y, equation(train_x))
print(r2)
سنجش روی آزمون
حالا همان مدل را روی داده آزمون می سنجیم. اگر نزدیک بود، مدل پایدار است.
import numpy as np
from sklearn.metrics import r2_score
np.random.seed(2)
x = np.random.normal(3, 1, 100)
y = np.random.normal(150, 40, 100) / x
train_x = x[:80]
train_y = y[:80]
test_x = x[80:]
test_y = y[80:]
equation = np.poly1d(np.polyfit(train_x, train_y, 4))
r2 = r2_score(test_y, equation(test_x))
print(r2)
پیش بینی مقدار جدید
وقتی سنجش خوب بود، می توان پیش بینی کرد. مثلاً برای 5 دقیقه.
import numpy as np
np.random.seed(2)
x = np.random.normal(3, 1, 100)
y = np.random.normal(150, 40, 100) / x
train_x = x[:80]
train_y = y[:80]
equation = np.poly1d(np.polyfit(train_x, train_y, 4))
print(equation(5))
جمع بندی سریع
- داده را به آموزش و آزمون جدا کن.
- مدل را فقط با آموزش بساز.
- دقت را با آزمون بسنج.
- R2 نزدیک آموزش و آزمون باشد.
- برون یابی زیاد نکن؛ مراقب بیش برازش باش.
برای موضوع «آموزش/آزمون» می توانی این صفحه را نشانه گذاری کنی. همچنین قبل از این مرحله، صفحه مقیاس بندی را مرور کن.