Использование другой модели, если условие не выполняется

#python #pandas #dataframe #classification

#питон #панды #фрейм данных #классификация

Вопрос:

TL;DR: У меня есть две хорошие модели, но я хочу использовать одну из них только в некоторых случаях.

Первый кадр данных выглядит следующим образом:

 worker rated_object rating w1 o1 0 w1 o2 0 w1 o3 1 w2 o1 1 w2 o2 1 w2 o4 0 w3 o1 0 w3 o5 1 ...  

Чтобы выяснить , как a worker будет rate работать object , я создал следующую модель, и она хорошо работает (я округлил прогноз до 0 или 1 и добавил их в фрейм данных).:

 import numpy as np import pandas as pd import surprise from surprise import KNNWithMeans from surprise.model_selection import train_test_split reader = Reader(rating_scale=(0, 1)) data = Dataset.load_from_df(df[['worker', 'rated_object', 'rating']], reader) trainset, testset = train_test_split(data, test_size=0.20) algo = KNNWithMeans() algo.fit(trainset) test = algo.test(testset) test = pd.DataFrame(test) test.drop("details", inplace=True, axis=1) test.columns = ['worker', 'rated_object', 'actual', 'cf_predictions']  def g(row):  if row['cf_predictions'] gt; 0.5:  val = 1.0  else:  val = 0.0  return val  test['cf_threshold'] = test.apply(g, axis=1)  

Мой второй фрейм данных намного меньше и содержит только информацию о rated_objcts (и, вероятно, он также не содержит всех объектов из предыдущего фрейма данных):

 rated_object feature_1 feature_2 feature_n rating o1 2.02 0 90.40 0 o2 3.70 1 NaN 1 o3 3.45 0 70.50 1 o4 7.90 1 40.30 0 ...  

Чтобы предсказать rating состояние объекта, я создал модель XGBoost, которая хорошо работает:

 import xgboost as xgb from sklearn import datasets from sklearn.model_selection import train_test_split from sklearn.preprocessing import LabelEncoder  from xgboost import XGBClassifier cols_to_drop = ['rated_object']  df2.drop(cols_to_drop, axis=1, inplace=True) X = df2.drop('rating', axis=1)  y = df2['rating']  X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, random_state=5) model = XGBClassifier()  model.fit(X_train, y_train) y_pred = model.predict(X_test)   

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

 def combination(df, df2):  if num_ratings gt; 2:  # incorporate the first model  return ???cf_predictions???  else:  # incorporate the second model  return ???y_pred???  

Я не уверен, что это будет хороший результат, но я тоже хочу иметь возможность оценить его точность. Должны ли сами модели быть записаны как функции с аналогичным типом вывода? Как я могу подойти к этой проблеме?

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

1. Я не совсем понимаю, во что вы собираетесь перейти combination() . Собираетесь ли вы передать фреймы данных, перечисленные выше, а затем обучить модель, или вы планируете предоставить ей новые данные и попросить ее спрогнозировать, используя одну из 2 моделей, основанных на длине?

2. @cazman Я работаю только с этими двумя кадрами данных, и я хочу посмотреть, насколько точны новые прогнозы, если в некоторых случаях я использую один метод, а в других случаях второй метод. Я немного отредактировал объяснение, я хотел сказать, что буду использовать первый метод только в том случае, если минимум, скажем, 3 работника оценили этот конкретный объект.

3. @cazman Я мог бы с таким же успехом просто создать новую модель, которая применяет определенный вес к каждой из этих двух моделей. Итак, pred = 0,5 * model_1 0,5 model_2, но я сталкиваюсь с одной и той же проблемой: как мне работать с двумя разными моделями, выводящими разные выходные данные из разных кадров данных?

4. Итак, для заданного набора тестов одного типа rated_object, если длина первого df больше 2, прогнозируйте с помощью первой модели, в противном случае прогнозируйте df2, используя вторую модель?

5. @cazman Я надеюсь, что правильно вас понял, да, так что это будет что-то вроде num_ratings = len(df[df['rated_object'] == rated_object]) должно быть gt;2.