亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 StackingClassifier 進行訓練/測試分割而不是 CV

使用 StackingClassifier 進行訓練/測試分割而不是 CV

哈士奇WWW 2024-01-15 17:22:00
我最近一直在嘗試 StackingClassifiers,通常它與交叉驗證一起使用(默認值:K-fold,num-folds = 5)。就是這樣寫的:from sklearn.pipeline import Pipelinefrom sklearn.tree import DecisionTreeClassifierfrom sklearn.neighbors import KNeighborsClassifierfrom sklearn.datasets import load_breast_cancerfrom sklearn.model_selection import train_test_split, RandomizedSearchCV, KFoldX, y = load_breast_cancer(return_X_y=True, as_frame=True)model = StackingClassifier(estimators=[        ('tree', Pipeline([('tree', DecisionTreeClassifier(random_state=42))])),        ('knn', Pipeline([('knn', KNeighborsClassifier())])),    ],final_estimator = final_estimator, n_jobs = 10, passthrough = False, cv = KFold())model.fit(X, y)效果很好。然而,k 折交叉驗證作為訓練堆疊分類器的一種方法確實相當慢。理想情況下,我想使用 80% 的訓練數據用于訓練組件模型,另外20%用于訓練 Final_estimator 的方法。根據docs,您可以使用一個迭代器來生成訓練測試分割作為cv(交叉驗證)的輸入(這很奇怪,因為它不再是 CV)。所以我想分為兩部分的問題是否可以使用 StackingClassifier 以這種方式工作,其中根本不使用交叉驗證(CV),而是使用訓練/測試分割(主要是為了加快擬合速度)?如果是這樣,這看起來怎么樣?我將設置什么作為cv的輸入?另一張紙條。查看用戶指南中的潛在 CV 選項 ShuffleSplit 和 nsplits=1 似乎是一個不錯的選擇,我嘗試了它。model = StackingClassifier(estimators=[        ('tree', Pipeline([('tree', DecisionTreeClassifier(random_state=42))])),        ('knn', Pipeline([('knn', KNeighborsClassifier())])),    ],final_estimator = final_estimator, n_jobs = 10, passthrough = False, cv = ShuffleSplit(n_splits=1))model.fit(X, y)但不幸的是這不起作用并引發錯誤:ValueError: cross_val_predict only works for partitions
查看完整描述

2 回答

?
斯蒂芬大帝

TA貢獻1827條經驗 獲得超8個贊

sklearn 的 Stacked Classifier 頁面指出“... estimators_ 適合整個 X,而Final_estimator_使用cross_val_predict的基本估計器的交叉驗證預測進行訓練?!?/p>

我認為如果您想使用基于 80%-20% 的傳統訓練測試方法,您應該在 StackedClassifier 之外進行。主要原因是使該過程與根據上面記錄的注釋使用堆疊分類器的方式保持一致。

我已經完成了此操作,我的管道/設置描述性如下。我不介意花費額外的時間對每個分類器進行訓練測試,因為最終分類器對 StackedClassifier 的處理效率更高:

  1. 以 70%-30% / 80%-20% 的分割運行單獨的分類器(KNN、決策樹、隨機森林、樸素貝葉斯等)。找到最佳參數化。

  2. 設置 StackedClassifier,其中每個分類器都適合您通過整個數據確定的最佳參數(此階段沒有分割)

  3. 檢查并驗證最終分類器相對于各個分類器性能的結果。

我認為花費的額外時間是不可避免的,因為您正在引入為各個分類器分割數據的額外步驟。對于最終分類器 CV 階段,即使進行分割,最終模型輸入也應在整個數據上運行,以實現單個和最終分類器的最大效率。


查看完整回答
反對 回復 2024-01-15
?
繁花不似錦

TA貢獻1851條經驗 獲得超4個贊

您可以獲得的最快加速是KFold(n_splits=2):


model = StackingClassifier(estimators=[

        ('tree', Pipeline([('tree', DecisionTreeClassifier(random_state=42))])),

        ('knn', Pipeline([('knn', KNeighborsClassifier())])),

    ],final_estimator = final_estimator, n_jobs = 10, passthrough = False, cv = KFold(n_splits=2))

cvparam只接受“分區”或“分區者”(正如他們所說的“根據定義”)。它們是KFold(), StratifiedKFold,但不是ShuffleSplit或train_test_split。


分區器:


n =5

x = range(90,100)

cv = KFold(n_splits=n).split(x)


for i,j in cv:

    print("TRAIN:",i,"TEST",j)

TRAIN: [2 3 4 5 6 7 8 9] TEST [0 1]

TRAIN: [0 1 4 5 6 7 8 9] TEST [2 3]

TRAIN: [0 1 2 3 6 7 8 9] TEST [4 5]

TRAIN: [0 1 2 3 4 5 8 9] TEST [6 7]

TRAIN: [0 1 2 3 4 5 6 7] TEST [8 9]

非分區者:


n =5

x = range(90,100)

# cv = KFold(n_splits=n).split(x)

cv = ShuffleSplit(n_splits=n, train_size=.8).split(x)


for i,j in cv:

    print("TRAIN:",i,"TEST",j)

TRAIN: [7 9 0 1 6 4 8 3] TEST [2 5]

TRAIN: [3 2 7 0 8 4 6 1] TEST [5 9]

TRAIN: [5 1 8 7 4 0 2 6] TEST [9 3]

TRAIN: [7 1 5 8 6 9 4 0] TEST [2 3]

TRAIN: [7 0 3 2 6 1 5 9] TEST [4 8]


查看完整回答
反對 回復 2024-01-15
  • 2 回答
  • 0 關注
  • 329 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號