Как построить классификатор голосования в sklearn, когда отдельные классификаторы соответствуют разным наборам данных? - PullRequest
0 голосов
/ 05 февраля 2019

Я строю классификатор, используя сильно несбалансированные данные.Стратегия, которая мне интересна в тестировании, - это ансамблирование модели с использованием 3 различных наборов данных с передискретизацией .Другими словами, каждый набор данных будет иметь все выборки из редкого класса, но только n выборок из богатого класса ( метод # 4, упомянутый в этой статье ).

Я хочу разместить 3 разных VotingClassifiers в каждом наборе данных с повторной выборкой, а затем объединить результаты отдельных моделей, используя другой VotingClassifier (или аналогичный).Я знаю, что построение единого классификатора голосования выглядит следующим образом:

# First Model
rnd_clf_1 = RandomForestClassifier()
xgb_clf_1 = XGBClassifier()

voting_clf_1 = VotingClassifier(
    estimators = [
        ('rf', rnd_clf_1), 
        ('xgb', xgb_clf_1),
    ],
    voting='soft'
)

# And I can fit it with the first dataset this way:
voting_clf_1.fit(X_train_1, y_train_1)

Но как сложить их три, если они установлены в разных наборах данных?Например, если бы у меня было три подходящих модели (см. Код ниже), я мог бы построить функцию, которая вызывает метод .predict_proba() для каждой из моделей, а затем «вручную» усредняет отдельные вероятности.

Но ... есть ли лучший способ?

# Fitting the individual models... but how to combine the predictions?
voting_clf_1.fit(X_train_1, y_train_1)
voting_clf_2.fit(X_train_2, y_train_2)
voting_clf_3.fit(X_train_3, y_train_3)

Спасибо!

1 Ответ

0 голосов
/ 16 марта 2019

Обычно метод # 4, показанный в статье, реализуется с помощью классификатора того же типа.Похоже, вы хотите попробовать VotingClassifier на каждом примере набора данных.

Эта методология уже реализована в imblearn.ensemble.BalancedBaggingClassifier , который является расширением подхода Sklearn Bagging.,

Вы можете подать оценку как VotingClassifier, а количество оценок - как количество раз, которое вы хотите выполнить выборку набора данных.Используйте параметр sampling_strategy, чтобы указать пропорцию понижающей дискретизации, которую вы хотите получить в классе Majority.

Рабочий пример:

from collections import Counter
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix
from sklearn.ensemble import RandomForestClassifier
import xgboost as xgb
from sklearn.ensemble import RandomForestClassifier, VotingClassifier
from imblearn.ensemble import BalancedBaggingClassifier # doctest: +NORMALIZE_WHITESPACE
X, y = make_classification(n_classes=2, class_sep=2,
weights=[0.1, 0.9], n_informative=3, n_redundant=1, flip_y=0,
n_features=20, n_clusters_per_class=1, n_samples=1000, random_state=10)
print('Original dataset shape %s' % Counter(y))

X_train, X_test, y_train, y_test = train_test_split(X, y,
                                                    random_state=0)

rnd_clf_1 = RandomForestClassifier()
xgb_clf_1 = xgb.XGBClassifier()

voting_clf_1 = VotingClassifier(
    estimators = [
        ('rf', rnd_clf_1), 
        ('xgb', xgb_clf_1),
    ],
    voting='soft'
)

bbc = BalancedBaggingClassifier(base_estimator=voting_clf_1, random_state=42)
bbc.fit(X_train, y_train) # doctest: +ELLIPSIS

y_pred = bbc.predict(X_test)
print(confusion_matrix(y_test, y_pred))

Если вы хотите заставить вас работать с sklearn для классификатора Voting для агрегирования проб.Смотрите здесь .Возможно, вы сможете повторно использовать функции _predict_proba() и _collect_probas() после подбора оценок вручную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...