機器學(xué)習(xí)的目的是得到泛化(generalize)的模型,因此,解決過擬合很重要恢共。
訓(xùn)練集、驗證集脂信、測試集
將數(shù)據(jù)分為三個集合:訓(xùn)練集癣蟋、驗證集狰闪、測試集。在訓(xùn)練集上訓(xùn)練模型幔欧,驗證集上評估模型,一旦找到最佳參數(shù)礁蔗,在測試集上最后測試模型雁社。
為什么不劃分為兩個集合,僅有訓(xùn)練集和測試集霉撵?
因為開發(fā)模型時需要調(diào)節(jié)模型配置,通過模型在驗證集上的性能來調(diào)節(jié)超參數(shù)(hyperparameter)徒坡,這樣就導(dǎo)致驗證集的信息泄露(informationo leak)到模型中,很快導(dǎo)致模型在驗證集上過擬合呵曹。而我們最需要的是模型在全新數(shù)據(jù)上的性能何暮。
如果數(shù)據(jù)較少,有三種經(jīng)典的評估方法:
- 簡單的留出驗證海洼;
- K折驗證;
- 帶有打亂數(shù)據(jù)的重復(fù)K折驗證坏逢。
簡單的留出驗證
簡單的留出驗證數(shù)據(jù)劃分.PNG
# 留出驗證
num_validation_samples = 10000
np.random.shuffle(data) # 打亂數(shù)據(jù)
validation_data = data[:num_validation_samples] # 定義驗證集
data = data[num_validation_samples:]
training_data = data[:] # 定義訓(xùn)練集
model = get_model()
model.train(training_data) # 在訓(xùn)練數(shù)據(jù)上訓(xùn)練模型
validation_score = model.evaluate(validation_data) # 在驗證數(shù)據(jù)上評估模型
# 現(xiàn)在你可以調(diào)節(jié)模型是整、重新訓(xùn)練、評估浮入,然后再次調(diào)節(jié)......
model = get_model()
model.train(np.concatenate([training_data,
validation_data])) #一旦調(diào)節(jié)好超參數(shù),
# 通常在所有非測試數(shù)據(jù)是哪個從頭開始訓(xùn)練最終模型
test_score = model.evaluate(test_data)
缺點:如果數(shù)據(jù)較少事秀,無法在統(tǒng)計學(xué)上代表數(shù)據(jù)野舶。表現(xiàn)為不同的隨機打亂宰衙,最終得到的模型性能差別很大。
解決方法:
1一屋、K折驗證;
2陆淀、重復(fù)的 K 折驗證。
np.random.shuffle(x)
https://blog.csdn.net/brucewong0516/article/details/79012233
#現(xiàn)場修改序列轧苫,改變自身內(nèi)容疫蔓。(類似洗牌,打亂順序)
In [30]: arr = np.arange(10)
In [31]: np.random.shuffle(arr)
In [32]: arr
Out[32]: array([5, 2, 7, 0, 6, 3, 4, 1, 8, 9])
#對多維數(shù)組進(jìn)行打亂排列時衅胀,默認(rèn)是對第一個維度也就是列維度進(jìn)行隨機打亂
In [37]: arr = np.arange(12).reshape(3,4)
In [38]: arr
Out[38]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
#將多維數(shù)組打亂
In [39]: np.random.shuffle(arr)
In [40]: arr
Out[40]:
array([[ 4, 5, 6, 7],
[ 0, 1, 2, 3],
[ 8, 9, 10, 11]])