一、嵌套交叉驗證算法
嵌套交叉驗證是交叉驗證的擴展,目的是幫助選擇模型並優化模型參數,在數據集很小時也可以避免過擬合的問題。
嵌套交叉驗證的核心思想是將數據集劃分為K個互斥子集,用其中K-1個子集進行模型訓練,剩下的子集用於模型評估。為避免過擬合,這個過程會反覆進行多次,最後取平均評估指標。
而嵌套的部分則是在每次交叉驗證外層,再次劃分數據集為訓練集和測試集,用不同的模型評估指標進行模型選擇。
二、嵌套交叉驗證特徵選擇
嵌套交叉驗證算法中,一個很重要的應用是特徵選擇。特徵選擇是為了減少維度,防止出現擬合過程中出現維度災難,同時也可以提高模型的穩定性。
在交叉驗證中實現特徵選擇有兩種方法:1)選擇統計顯著性的特徵;2)根據交叉驗證誤差進行選擇。用統計顯著性的特徵選擇是用統計學方法來檢測特徵是否不顯著,模型評估也可以用ROC曲線、ROC曲線下面積等指標。用交叉驗證誤差進行特徵選擇的方法則是將交叉驗證的誤差作為特徵子集的度量標準,看哪個特徵子集效果最好。
三、嵌套交叉驗證代碼
from sklearn.model_selection import GridSearchCV, KFold from sklearn.metrics import make_scorer param_grid = {'C': [0.1, 1, 10], 'gamma': [0.1, 1, 10]} scoring = make_scorer(mean_squared_error, greater_is_better=False) outer_cv = KFold(n_splits=10) inner_cv = KFold(n_splits=5) gscv = GridSearchCV(estimator=SVC(kernel='rbf'), param_grid=param_grid, scoring=scoring, cv=inner_cv) nested_score = cross_val_score(gscv, X=X, y=y, cv=outer_cv, scoring=scoring)
四、嵌套交叉驗證最佳模型
嵌套交叉驗證最主要的作用是選擇最佳的模型,並優化模型參數。模型的評價標準常用的有均方誤差,最大似然估計等。
在嵌套交叉驗證中,外層循環會分割數據集成訓練集和測試集,然後在內層循環中選擇最好的參數組合進行模型訓練。
最後以嵌套交叉驗證的結果為準來比較模型的性能。選擇出表現最好的模型,可以得到最適合的模型參數。
五、嵌套交叉驗證結果
嵌套交叉驗證可以用來評估模型的性能指標,通常情況下會使用預測分數進行評估。如果觀察到同一模型的預測分數隨着不同的子數據集而變化很大,那麼可能是模型對數據集的細微變化過度敏感,需要重新考慮選擇其他模型。
可通過繪製箱線圖來直觀展示多次嵌套交叉驗證結果的變化與分佈。
六、嵌套交叉驗證特徵
嵌套交叉驗證最重要的作用是模型選擇與驗證。也可以用於特徵選擇。在內層交叉驗證中我們選擇不同特徵子集訓練模型,並比較它們的性能。在外層交叉驗證中對每個特徵子集計算平均交叉驗證誤差,從而選擇在此基礎上進行訓練的最佳特徵子集。得到最佳特徵子集之後,我們使用完整的訓練集重新訓練模型並進行預測。
from sklearn.model_selection import cross_val_score from sklearn.linear_model import LassoCV from sklearn.datasets import load_boston boston = load_boston() X, y = boston.data, boston.target elasticnet = LassoCV(cv=inner_cv, normalize=True) outer_scores = cross_val_score(elasticnet, X, y, cv=outer_cv)
七、嵌套交叉驗證的優勢
嵌套交叉驗證相對於其他交叉驗證方法有以下幾個優勢:
1、在保證偏差不變的情況下,降低了方差的預測誤差;
2、能夠比較模型之間的差異,選擇最佳模型並優化參數;
3、通過特徵選擇能夠減少維度,提高模型的穩定性。
八、嵌套交叉驗證能不能畫混淆矩陣
嵌套交叉驗證更多地用於模型的選擇與訓練,而不是分類或者回歸問題的預測。因此不一定需要使用混淆矩陣。
九、嵌套交叉驗證和交叉驗證區別
嵌套交叉驗證其實是交叉驗證的擴展,在交叉驗證的外層再增加一層循環來選擇最佳模型。
交叉驗證一般只做一次交叉驗證作為評估模型的綜合性能,而嵌套交叉驗證可以讓我們做多次交叉驗證,每次交叉驗證都可以訓練多種不同的模型並進行參數優化,可更準確的選擇最佳模型。
from sklearn.model_selection import cross_val_score, KFold kf = KFold(n_splits=10) scores = cross_val_score(clf, X, y, cv=kf)
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/157546.html