Я работаю с данными НФЛ, прогнозируя результаты игр. Мои исходные данные (используемые для обоих процессов ниже) состоят из примерно 3800 строк по 20 отдельных характеристик (по десять для каждой команды, плюс дата, идентификатор игры, команда хозяев и гостей, а также столбцы побед дома/победы на выезде).
Модель A циклически проходит через определенные диапазоны дат для разделения обучения/тестирования. То есть я использую жесткие обрезки, поэтому каждый набор является смежным по дате. Я использую даты, которые отражают разделение 50%, 55% и т. д. до 85%. С помощью этой модели каждый из 8 результатов точности составляет ~ 61%, что типично для прогнозов НФЛ (возможно, немного завышено).
Модель «B» использует модуль train_test_split. от sklearn для разделения данных в тех же процентах, что и выше. Я понимаю, что этот метод перемешивает данные, поэтому я знаю, что каждое разделение работает с данными, отличными от модели A. Но при использовании этого метода процентная точность для каждого цикла составляет ~ 82%, что НАМНОГО выше, чем у модели A, и, по-видимому, необоснованно. Поэтому я хочу понять, правильно ли я реализую один (или оба) из этих методов.
(ПРИМЕЧАНИЕ. Я новичок в Python и машинном обучении, и в обоих этих методах модели представляют собой отредактированные версии других существующих работ). Любая помощь будет принята с благодарностью. И если кто-нибудь сможет показать мне, как прикрепить исходный файл CSV, я буду рад это сделать.
Соответствующая часть модели A
. ..
train_test_date_range = ['2017-11-02', '2018-10-04', '2019-09-05', '2019-12-01', '2020-11-05', '2021-10-03', '2022-01-02', '2022-11-24']
features = [
'team_1_average_ptsScored_last_five',
'team_1_average_feature_1_last_five',
Код: Выделить всё
FEATURE LIST ABBREVIATED FOR CLARITY
'team_2_average_feature_9_allowed_last_three_away',
'team_2_average_feature_10_allowed_last_three_away'
для tt_line_date в train_test_date_range:
Код: Выделить всё
train_data = match_stats[match_stats['date'] < tt_line_date]
test_data = match_stats[match_stats['date'] >= tt_line_date]
X_train = train_data[features]
X_test = test_data[features]
Y_train = train_data['team_1_result']
Y_test = test_data['team_1_result']
names = ["Log Reg"]
classifiers = [
LogisticRegression()
]
for name, clf in zip(names, classifiers):
# Fit the classifier on the training data and make predictions
clf.fit(X_train, Y_train)
test_data[name + '_team_1_result'] = clf.predict(X_test)
accuracy = clf.score(X_test, Y_test)
print(name + ' accuracy at T/T_Line ' + tt_line_date + ' =', format(accuracy, ".2%"))
Выходные данные модели «A»
Точность регистрации журнала на T/T_Line 2017-11-02 = 62,11%
Точность регистрации журнала на T/T_Line 04.10.2018 = 61,83%
и т. д.
Соответствующая часть модели «B»
...
train_test_split_range = [0,5, 0,55, 0,6, 0,65, 0,7, 0,75, 0,8, 0,85]
для tt_line в train_test_split_range:
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=tt_line, random_state=42)
Код: Выделить всё
model = LogisticRegression()
scaler = StandardScaler()
scaled_train = scaler.fit_transform(X_train)
scaled_test = scaler.fit_transform(X_test)
model.fit(X_train, y_train)
y_pred_proba = model.predict_proba(X_train)[:, 1]
y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred)
recall = recall_score(y_test, y_pred)
f1 = f1_score(y_test, y_pred)
roc_auc = roc_auc_score(y_test, model.predict_proba(X_test)[:, 1])
# Calculate pseudo r squared
# Modified from: https://github.com/scikit-learn/scikit-learn/issues/25982
ll_null = log_loss(y_train, [y_train.mean()] * len(y_train))
ll_model = log_loss(y_train, y_pred_proba)
pseudo_r2 = 1 - ll_model / ll_null
# Print the metrics
print(f"\033[1m\033[4mResults at " + str(tt_line) + " train/test split\033[0m")
print(f"Accuracy: {accuracy:.3f}")
print(f"Precision: {precision:.3f}")
print(f"Recall: {recall:.3f}")
print(f"F1-score: {f1:.3f}")
print(f"ROC AUC: {roc_auc:.3f}")
print(f"Pseudo R-squared: {pseudo_r2:.3f}")
print()
Выходные данные модели «B» (1 из 8, но типичные)
Результаты при 0,5 поезда/теста разделение
Точность: 0,820
Прецизионность: 0,828
Показ: 0,854
Оценка F1: 0,841
ROC AUC: 0,896
Псевдо R-квадрат: 0,490
Подробнее здесь: https://stackoverflow.com/questions/792 ... erent-resu