#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.