Prognostizieren Sie Pferderennen mit maschinellem Lernen und streben Sie eine Wiederherstellungsrate von 100% an.
Unter Verwendung aller Rennergebnisdaten für 2019, die in Vorheriger Artikel erhalten wurden, sagen wir die Pferde voraus, die in LightGBM unter den Top 3 sein werden.
Zunächst die Vorbehandlung
import datetime
def preprocessing(results):
df = results.copy()
#Entfernen Sie Elemente, die nicht numerische Zeichenfolgen in der Reihenfolge ihrer Ankunft enthalten
df = df[~(df["Reihenfolge der Ankunft"].astype(str).str.contains("\D"))]
#Die Verwendung von Backslashes in Qiita ist fehlerhaft, daher habe ich sie groß geschrieben.
df["Reihenfolge der Ankunft"] = df["Reihenfolge der Ankunft"].astype(int)
#Teilen Sie das Geschlechtsalter in Geschlecht und Alter
df["Sex"] = df["Sex齢"].map(lambda x: str(x)[0])
df["Alter"] = df["Sexuelles Alter"].map(lambda x: str(x)[1:]).astype(int)
#Teilen Sie das Pferdegewicht in Gewicht und Gewichtsänderung
df["Körpergewicht"] = df["馬Körpergewicht"].str.split("(", expand=True)[0].astype(int)
df["Gewichtsänderung"] = df["Pferdegewicht"].str.split("(", expand=True)[1].str[:-1].astype(int)
#Int Daten,In Float umwandeln
df["Sieg"] = df["Sieg"].astype(float)
#Entfernen Sie unnötige Spalten
df.drop(["Zeit", "Unterschied", "Trainer", "Sexuelles Alter", "Pferdegewicht"], axis=1, inplace=True)
df["date"] = pd.to_datetime(df["date"], format="%Y Jahr%m Monat%d Tag")
return df
results_p = preprocessing(results)
Ich möchte es in Trainingsdaten und Testdaten aufteilen, aber train_test_split kann in diesem Fall nicht verwendet werden, da die Trainingsdaten älter als die Testdaten sein müssen. Aus diesem Grund erstellen wir eine Funktion, die Trainingsdaten und Testdaten in chronologischer Reihenfolge unter Verwendung der Spalte "Datum" trennt, die jetzt vom Typ "Datum / Uhrzeit" ist.
def split_data(df, test_size=0.3):
sorted_id_list = df.sort_values("date").index.unique()
train_id_list = sorted_id_list[: round(len(sorted_id_list) * (1 - test_size))]
test_id_list = sorted_id_list[round(len(sorted_id_list) * (1 - test_size)) :]
train = df.loc[train_id_list].drop(['date'], axis=1)
test = df.loc[test_id_list].drop(['date'], axis=1)
return train, test
Die kategoriale Variable wird zu einer Dummy-Variablen gemacht, aber der Pferdename hat zu viele Kategorien, sodass er diesmal weggelassen wird.
results_p.drop(["Pferdename"], axis=1, inplace=True)
results_d = pd.get_dummies(results_p)
Wenn die Reihenfolge der Ankunft innerhalb der 3. liegt, kennzeichnen Sie sie als 1 und andernfalls als 0 und behandeln Sie sie als objektive Variable.
results_d["rank"] = results_d["Reihenfolge der Ankunft"].map(lambda x: 1 if x < 4 else 0)
results_d.drop(['Reihenfolge der Ankunft'], axis=1, inplace=True)
Teilen Sie die erstellte Funktion split_data in Trainingsdaten und Testdaten auf und trainieren Sie sie mit LightGBM.
import lightgbm as lgb
train, test = split_data(results_d, 0.3)
X_train = train.drop(["rank"], axis=1)
y_train = train["rank"]
X_test = test.drop(["rank"], axis=1)
y_test = test["rank"]
params = {
"num_leaves": 4,
"n_estimators": 80,
"class_weight": "balanced",
"random_state": 100,
}
lgb_clf = lgb.LGBMClassifier(**params)
lgb_clf.fit(X_train.values, y_train.values)
Bewertung nach AUC-Punktzahl.
y_pred_train = lgb_clf.predict_proba(X_train)[:, 1]
y_pred = lgb_clf.predict_proba(X_test)[:, 1]
print(roc_auc_score(y_train, y_pred_train))
print(roc_auc_score(y_test, y_pred))
Ergebnis ist, Trainingsdaten: 0,819 Testdaten: 0,812 war. Ich denke, es ist eine gute Punktzahl für die Tatsache, dass ich noch keine Features gemacht habe. Betrachtet man die Bedeutung von Merkmalsmengen,
importances = pd.DataFrame(
{"features": X_train.columns, "importance": lgb_clf.feature_importances_}
)
importances.sort_values("importance", ascending=False)[:20]
Wenn man dies betrachtet, hängt es fast ausschließlich von den Daten der Gewinnchancen ab, dh ist es zu einem Modell geworden, auf niedrige Gewinnchancen zu setzen </ font>, also erstellen Sie Funktionen usw. Ich möchte es verbessern.
Wir haben eine ausführliche Erklärung im Video! Datenanalyse und maschinelles Lernen beginnend mit der Vorhersage von Pferderennen
Recommended Posts