Итак, я смотрю на данные, чтобы попытаться предсказать, кто откроет сообщение.Двоичный вывод сильно несбалансирован, фактически <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)