Техника ансамблирования

#python #machine-learning #data-science #prediction #ensemble-learning

Вопрос:

Я хочу назначить веса нескольким моделям и создать единую модель ансамбля. Я хочу использовать свои выходные данные в качестве входных данных для нового алгоритма машинного обучения, и алгоритм выучит правильные веса. но как я могу предоставить вывод нескольких моделей в качестве входных данных для нового алгоритма ML, когда я получаю такой вывод

 preds1=model1.predict_prob(xx)
[[0.28054154 0.35648097 0.32954868 0.03342881]
 [0.20625692 0.30749627 0.37018309 0.11606372]
 [0.28362306 0.33325501 0.34658685 0.03653508]
 ...

 preds2=model2.predict_prob(xx)
[[0.22153498 0.30271243 0.26420254 0.21155006]
 [0.32327647 0.39197589 0.23899729 0.04575035]
 [0.18440374 0.32447016 0.4736297  0.0174964 ]
 ...
 

Как создать один кадр данных из выходных данных этих 2 или более моделей ?

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

 model = LogisticRegression()
        model.fit(xx_train, yy_train)
        preds1 = model.predict_proba(xx_test)
     

        model = KNeighborsClassifier(n_neighbors=5, metric='minkowski', p=2 )
        model.fit(xx_train, yy_train)
        preds2 = model.predict_proba(xx_test)
        
        # Each weight is evaluated by calculating the corresponding score
        for i in range(len(weights)):
         final_inner_preds = np.argmax(preds1*weights[i]  preds2*(1-weights[i]), axis=1)
       scores_corr_wts[i] = accuracy_score(yy_test, final_inner_preds)
 

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

1. Объединение может быть выполнено многими способами. Самое простое-это усреднение. В вашем случае, я полагаю, вы хотите придать наибольший вес самой высокой вероятности класса вашим моделям? Не могли бы вы, пожалуйста, отредактировать свой вопрос и быть более конкретным?

2. Это отличная тема, но область ее применения слишком велика для ЭТОГО; попробуйте datascience.stackexchange.com вместо этого.

3. @azal Я обновил вопрос

Ответ №1:

В sklearn вы можете использовать классификатор стекирования. Это должно соответствовать вашим потребностям.

  1. Создайте список определений вашей базовой модели

    base_models = [('SVC', LinearSVC(C = 1)),('RF',RandomForestClassifier(n_estimators=500))]

  2. Создайте экземпляр своего Мета-ученика

    meta_model = LogisticRegressionCV()

  3. Инстанцируемая Модель укладки

    stacking_model = StackingClassifier(estimators=base_models, final_estimator=meta_model, passthrough=True, cv=3)

  4. Соответствовать и прогнозировать

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

1. Это хорошее решение моей проблемы, но я хочу написать код с нуля для «Как сделать один кадр данных из выходных данных этих 2 или более моделей ?»

2. Затем просто создайте столбец «Сейчас» в своем df для каждого прогноза пригодности класса моделей. Исходя из вашего predict_proba, у вас есть 4 целевых класса. Поэтому введите еще 8 столбцов в свой df и используйте их для обучения. Получите каждый столбец, например, для первого использования df[‘model1_class1’] = preds1[0:, 0]

3. И в 9 — й колонке будет указана правильная метка (из 4 меток, которые — 1,2,3,4).Я прав ?

4. правильное назначение метки-это ваш вектор y. Матрица вероятностей-это ваш x. Затем вы используете model.fit(x,y) или заранее проходите train_test_split.

5. когда я создам фрейм данных, будет 8 столбцов от df[model1_class1] до df[model2_class4], и после обучения каждый столбец получит разный вес. но из этого кода «final_inner_preds = np.argmax(пред1*веса[i] пред2*(1-веса[I])» пред1*веса[I] реализует, что df[model1_class1] до df[model1_class4] умножается на один вес. Так что будет ли концептуально хорошо, если мы получим 8 разных весов из 8 столбцов, которые я создал в фрейме данных.