2 回答

TA貢獻1827條經驗 獲得超8個贊
sklearn 的 Stacked Classifier 頁面指出“... estimators_ 適合整個 X,而Final_estimator_使用cross_val_predict的基本估計器的交叉驗證預測進行訓練?!?/p>
我認為如果您想使用基于 80%-20% 的傳統訓練測試方法,您應該在 StackedClassifier 之外進行。主要原因是使該過程與根據上面記錄的注釋使用堆疊分類器的方式保持一致。
我已經完成了此操作,我的管道/設置描述性如下。我不介意花費額外的時間對每個分類器進行訓練測試,因為最終分類器對 StackedClassifier 的處理效率更高:
以 70%-30% / 80%-20% 的分割運行單獨的分類器(KNN、決策樹、隨機森林、樸素貝葉斯等)。找到最佳參數化。
設置 StackedClassifier,其中每個分類器都適合您通過整個數據確定的最佳參數(此階段沒有分割)
檢查并驗證最終分類器相對于各個分類器性能的結果。
我認為花費的額外時間是不可避免的,因為您正在引入為各個分類器分割數據的額外步驟。對于最終分類器 CV 階段,即使進行分割,最終模型輸入也應在整個數據上運行,以實現單個和最終分類器的最大效率。

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]
添加回答
舉報