Как агрегировать прогноз стратифицированного разбиения в несколько раз для более чем одного классификатора

#python #machine-learning #scikit-learn #k-fold

Вопрос:

Это мой код:

 fold = StratifiedKFold(10, shuffle= True, random_state=42)
score = []
cat_prediction = []
lgbm_prediction = []
forest_prediction = []
rgb_prediction = []
oldList = []
for train_s, test_s in tqdm(fold.split(X, Y)):
    
    xtrain, ytrain = X.iloc[train_s], Y.iloc[train_s]
    xtest, ytest = X.iloc[test_s], Y.iloc[test_s]   
    
    #xtrain, ytrain = df.drop("Response", 1).iloc[train_s], df.Response.iloc[train_s]
    #xtest, ytest = df.drop("Response", 1).iloc[test_s], df.Response.iloc[test_s]
    model = RGFClassifier(algorithm="RGF_Sib", test_interval=100, normalize = True)
    model.fit(df.drop("Response", 1), df.Response)
    score.append(f1_score(ytest, model.predict(xtest)))
    rgb_prediction.append(model.predict(tt))
    
    model = RandomForestClassifier(class_weight = class_weight)
    model.fit(df.drop("Response", 1), df.Response)
    score.append(f1_score(ytest, model.predict(xtest)))
    forest_prediction.append(model.predict(tt))
    
    model = CatBoostClassifier(iterations= 400, class_weights = class_weight, silent= True)
    model.fit(df.drop("Response", 1), df.Response)
    score.append(f1_score(ytest, model.predict(xtest)))
    cat_prediction.append(model.predict(tt))
    
    model = LGBMClassifier(class_weight = class_weight)
    model.fit(df.drop("Response", 1), df.Response)
    score.append(f1_score(ytest, model.predict(xtest)))
    lgbm_prediction.append(model.predict(tt))
 

Я хочу объединить результаты, чтобы создать смесь различных моделей.
Я пытался

 (cat_prediction   lgbm_prediction   forest_prediction   rgb_prediction)/4
 

и

 (np.mean(cat_prediction , 0)   np.mean(lgbm_prediction, 0)   np.mean(forest_prediction , 0)   np.mean(rgb_prediction, 0))/4
 

Но результат не такой, как хотелось бы.
Как мне этого добиться?

Комментарии:

1. Это классификация, поэтому среднее значение даст вам десятичные точки, вместо этого используйте режим.

2. Вы также можете использовать VotingClassifier() из Scikit-Learn внутри этого стратифицированного цикла, чтобы сократить код.

3. Я просто использовал классификатор голосования, он работает хорошо, но даже не дотягивает до производительности одного классификатора, когда я использовал «voting_method= soft».

4. Да, это не даст вам таких хороших результатов. Такие модели, как LightGBM или Catboost, являются мощными. Обычно они не требуют поддержки какой-либо другой модели. Просто используйте одну модель, такую как LightGBM, тренируйте ее с ранней остановкой и настраивайте с помощью Optuna. Это даст вам лучшие результаты. Необходимо использовать 4 модели, если вы не участвуете в Kaggle.

5. Полезный. Я участвую в хакатоне Zindi.