機器學習 - 訓練/測試

評估模型

在機器學習中,我們創建模型來預測某些事件的結果,就像在上一章中當我們了解重量和發動機排量時,預測了汽車的二氧化碳排放量一樣。

要衡量模型是否足夠好,我們可以使用一種稱為訓練/測試的方法。

什么是訓練/測試

訓練/測試是一種測量模型準確性的方法。

之所以稱為訓練/測試,是因為我們將數據集分為兩組:訓練集和測試集。

80% 用于訓練,20% 用于測試。

您可以使用訓練集來訓練模型。

您可以使用測試集來測試模型。

訓練模型意味著創建模型。

測試模型意味著測試模型的準確性。

從數據集開始

從要測試的數據集開始。

我們的數據集展示了商店中的 100 位顧客及其購物習慣。

實例

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 的購物。這可能是過擬合的跡象。

但是 R-squared 分數呢? R-squared score很好地指示了我的數據集對模型的擬合程度。

R2

還記得 R2,也稱為 R平方(R-squared)嗎?

它測量 x 軸和 y 軸之間的關系,取值范圍從 0 到 1,其中 0 表示沒有關系,而 1 表示完全相關。

sklearn 模塊有一個名為 rs_score() 的方法,該方法將幫助我們找到這種關系。

在這里,我們要衡量顧客在商店停留的時間與他們花費多少錢之間的關系。

實例

我們的訓練數據在多項式回歸中的擬合度如何?

import numpy
from 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
from 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 美元,似乎與圖表相對應: