У меня очень несбалансированный набор данных (5000 положительных, 300000 отрицательных).Я использую sklearn RandomForestClassifier, чтобы попытаться предсказать вероятность положительного класса.У меня есть данные за несколько лет, и одна из функций, которые я разработал, - это класс в предыдущем году, поэтому я отказываюсь тестировать последний год набора данных в дополнение к своему тестовому набору в течение тех лет, когда я обучаюсь.на.
Вот что я попробовал (и результат):
Повышение дискретизации с SMOTE и SMOTEENN (странные распределения баллов, см. Первое изображение, предсказанные вероятности для положительного и отрицательного классов одинаковыт. е. модель предсказывает очень низкую вероятность для большинства положительного класса)
Понижение выборки до сбалансированного набора данных (вспомним ~ 0,80 для набора тестов, но 0,07 для набора тестов вне года изогромное количество общих негативов в наборе несбалансированных вне года, см. второе изображение)
Оставьте его несбалансированным (странное распределение баллов снова, точность возрастает до ~ 0,60, а отзыв падает до 0,05 и 0,10 для теста и выходанабор тестов за год)
XGBoost (чуть лучше вспомнить тестовый набор за год, 0,11)
Что мне попробовать дальше?Я хотел бы оптимизировать для F1, так как ложные срабатывания и ложные отрицания одинаково плохи в моем случае.Я хотел бы включить перекрестную проверку в k-кратном порядке и прочитал, что я должен сделать это перед повышением частоты, а) если я сделаю это / это может помочь, и б) как я могу включить это в конвейер, подобный следующему:
from imblearn.pipeline import make_pipeline, Pipeline
clf_rf = RandomForestClassifier(n_estimators=25, random_state=1)
smote_enn = SMOTEENN(smote = sm)
kf = StratifiedKFold(n_splits=5)
pipeline = make_pipeline(??)
pipeline.fit(X_train, ytrain)
ypred = pipeline.predict(Xtest)
ypredooy = pipeline.predict(Xtestooy)