Модель случайного леса ухудшается, чем больше данных я использую (несбалансированный набор данных) - PullRequest
0 голосов
/ 23 марта 2019

Итак, я смотрю на данные, чтобы попытаться предсказать, кто откроет сообщение.Двоичный вывод сильно несбалансирован, фактически <1% щелкает.</p>

Прежде всего, после разбиения я пробую разные подмножества набора данных.Сначала я применил разрез до разделения, но я понял, что данные еще не были рандомизированы, поэтому могли иметь некоторую погрешность.Но после разбиения он должен быть полностью рандомизированным

cut = 10000

X_train, X_test, Y_train, Y_test = train_test_split(X_df, y, test_size = 0.2, random_state = 0)

X_train, X_test, Y_train, Y_test = X_train[:int(cut*0.8)], X_test[:int(cut*0.2)], Y_train[:int(cut*0.8)], Y_test[:int(cut*0.2)]

После этого я запускаю модель случайного леса

rf = RandomForestClassifier(n_estimators = 100,
                           n_jobs = -1,
                           oob_score = True,
                           bootstrap = True,
                           random_state = 42,
                           class_weight="balanced")
rf.fit(X_train, Y_train)

Я повторяю это для 10K, 100K, 1M и полного набора данных (~ 1,58 мил).Что странно, так это то, что мне становится все хуже и хужеОдна проблема с данными заключается в том, что прогнозирование 0 / отсутствие клика для всего набора данных даст вам большую точность.И при проверке матрицы путаницы прогнозирования я заметил, что с увеличением размера выборки модель становится все более «агрессивной», пытаясь классифицировать все большую и большую долю данных в виде клика, и, следовательно, точность снижается.Как мне с этим бороться?Я попытался логистической регрессии с той же проблемой.Я надеюсь достичь некоторого подмножества данных с очень высоким рейтингом кликов, чтобы на них можно было ориентироваться (например, получать 80% кликов, ориентируясь на 20% аудитории или аналогичных), но чем большеДанные, которые я использую дальше от этого я получаю.Что я могу сделать, чтобы справиться с этим?И я не понимаю, почему высокочастотная модель не просто все время предсказывает все 0 (поскольку это дало бы большую точность), и почему это меняется с увеличением размера выборки.Esp при переходе от 100K к 1M выборок, модель идет от прогноза 5%, клик до 27%, и точность снижается.Опять же, точность здесь, очевидно, не очень хорошая мера, но как мне подойти к поиску наилучшего поднабора для преобразования с использованием полного набора данных, при этом модель, просто прогнозирующая все больше и больше, будет щелкать до тех пор, пока он в конечном итоге не будет предсказывать всех и будет иметь ту же точность, что и выборочное среднее?

#10 K samples
print('{:.0f} samples \nR^2 Training Score: {:.2f}  \nR^2 Validation Score: {:.2f}'.format(
    X_train.shape[0]/0.8, rf.score(X_train, Y_train), rf.score(X_test, Y_test)))
confusion_matrix(Y_test, rf.predict(X_test))


out:
10000 samples 
R^2 Training Score: 0.97  
R^2 Validation Score: 0.97
array([[1947,   52],
       [   1,    0]], dtype=int64)

#100K samples
print('{:.0f} samples \nR^2 Training Score: {:.2f}  \nR^2 Validation Score: {:.2f}'.format(
    X_train.shape[0]/0.8, rf.score(X_train, Y_train), rf.score(X_test, Y_test)))
confusion_matrix(Y_test, rf.predict(X_test))

out:
100000 samples 
R^2 Training Score: 0.95  
R^2 Validation Score: 0.95
array([[19065,   904],
       [    8,    23]], dtype=int64)

#1M samples
print('{:.0f} samples \nR^2 Training Score: {:.2f}  \nR^2 Validation Score: {:.2f}'.format(
    X_train.shape[0]/0.8, rf.score(X_train, Y_train), rf.score(X_test, Y_test)))
confusion_matrix(Y_test, rf.predict(X_test))

out:
1000000 samples 
R^2 Training Score: 0.73  
R^2 Validation Score: 0.73
array([[145618,  53718],
       [   126,    538]], dtype=int64)


#Full dataset
print('{:.0f} samples \nR^2 Training Score: {:.2f}  \nR^2 Validation Score: {:.2f}'.format(
    X_train.shape[0]/0.8, rf.score(X_train, Y_train), rf.score(X_test, Y_test)))
confusion_matrix(Y_test, rf.predict(X_test))

out:
1585125 samples 
R^2 Training Score: 0.66  
R^2 Validation Score: 0.66
array([[206654, 108214],
       [   985,   1173]], dtype=int64)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...