#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 вы можете использовать классификатор стекирования. Это должно соответствовать вашим потребностям.
- Создайте список определений вашей базовой модели
base_models = [('SVC', LinearSVC(C = 1)),('RF',RandomForestClassifier(n_estimators=500))]
- Создайте экземпляр своего Мета-ученика
meta_model = LogisticRegressionCV()
- Инстанцируемая Модель укладки
stacking_model = StackingClassifier(estimators=base_models, final_estimator=meta_model, passthrough=True, cv=3)
- Соответствовать и прогнозировать
Комментарии:
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 столбцов, которые я создал в фрейме данных.