交叉驗(yàn)證(cross validation)是一種驗(yàn)證模型質(zhì)量的手段
1. train_test_split
介紹交叉驗(yàn)證之前,先說一下train_test_split
# import lib
from sklearn.model_selection import train_test_split
from sklearn.metrics import m=mean_absolute_error
from sklearn.Tree import DecisionTree
# split the X,y
train_X, test_X, train_y, test_y = train_test_split(X, y)
# fit model and get predictions
my_model = DecisionTree()
my_model.fit(train_x, train_y)
predictions = my_model.predict(test_y)
# validation
my_mae = mean_absolute_error(test_y, predictions)
該函數(shù)將自變量和因變量分成兩大塊:訓(xùn)練集(train_X, train_y)和測試集(test_X, test_y)汪茧。
可以看出,該函數(shù)自動(dòng)幫我們做了數(shù)據(jù)劃分,參數(shù)test_size
決定訓(xùn)練和測試的劃分比例立哑,通常使用缺省值品腹,比較省事。當(dāng)數(shù)據(jù)足夠大時(shí)莹妒,該函數(shù)可以保證足夠量的訓(xùn)練集來提升質(zhì)量名船。同時(shí)它的缺點(diǎn)
不過缺點(diǎn)是,train_set越大旨怠,模型準(zhǔn)確度越高渠驼,相應(yīng)的test_set數(shù)據(jù)較少,預(yù)測出來的結(jié)果的偶然性(噪聲)也越大鉴腻。反之迷扇,同理百揭。
這種方法適合數(shù)據(jù)集較大的情況。
2. cross_validation
可能有這種情況:數(shù)據(jù)集較小蜓席,甚至小到全部用來做訓(xùn)練集都不一定能保證可觀的模型質(zhì)量器一,這時(shí)候怎么辦呢?用上面的方法是不行了厨内,因?yàn)槲易约河?xùn)練的數(shù)據(jù)都嫌不夠用祈秕,如果再分出一部分做測試,那不雪上加霜嗎雏胃。
這時(shí)候请毛,針對小數(shù)據(jù)集的交叉驗(yàn)證就派上用場了。
-
基本思想:將整個(gè)數(shù)據(jù)集均分為N份瞭亮,進(jìn)行N輪的 "fit-predict"方仿。如此充分利用拮據(jù)的數(shù)據(jù)。
代碼實(shí)現(xiàn)時(shí)统翩,交叉驗(yàn)證最好和Pipeline一起使用仙蚜,可以省很多事。
from sklearn.ensemble import RandomForestRegressor
# impute missing value
from sklearn.preprocessing import Imputer
from sklearn.pipeline import make_pipeline
from sklearn.model_selection import cross_val_score
# 如果不需要填充的話厂汗,Imputer()可以不寫
my_pipeline = make_pipeline(Imputer(), RandomForestRegressor())
# scoring 指定使用什么指標(biāo)衡量模型質(zhì)量,N即輪數(shù)鳍征,默認(rèn)是3
scores = cross_val_score(my_pipeline, X, y, scoring='neg_mean_absolute_error', cv=N)
待補(bǔ)充~