Ich habe am 1. Beginner Limited-Wettbewerb (https://signate.jp/competitions/292) teilgenommen, der im August bei SIGNATE stattfand. Dies war das erste Mal, dass ich einen gut abgeschlossenen Wettbewerb absolvierte, aber das Endergebnis war AUC = 0,8588949, was den 13. Platz bedeutete (obwohl es ein sehr halbfertiges Ergebnis war ...). Wenn in diesem Wettbewerb die Punktzahl höher als ein bestimmter Wert war, konnte ich vom Anfänger zum Mittelstufe befördert werden, und ich wurde erfolgreich befördert.
Ich möchte zusammenfassen, was ich getan habe und worauf ich in Zukunft zurückblicken sollte.
Das Modell und die Analyseergebnisse dieses Wettbewerbs werden gemäß den Richtlinien zur Offenlegung von Informationen veröffentlicht.
Die Daten sind Kampagnendaten für Termineinlagen bei Finanzinstituten. Die Quelle der Daten ist hier, aber ich denke, sie wurden leicht verarbeitet. Der Bewertungsindex ist AUC. Siehe den Link oben für Details.
$sw_vers
ProductName: Mac OS X
ProductVersion: 10.13.6
BuildVersion: 17G14019
$python --version
Python 3.7.3
Es ist wie Händewaschen vor dem Kochen, aber es ist wichtig, weil es später möglicherweise nicht reproduziert wird.
Stellen Sie sicher, dass Sie eine Funktion zuweisen, die das Argument `random_seed``` oder
random_state``` verwendet, damit das Ergebnis immer wiedergegeben wird.
Ich legte es in H2O und überprüfte die Informationen der Daten und welche Art von Algorithmus an die Spitze kommt, wenn es von AutoML gedreht wird. Informationen zu H2O finden Sie in Frühere Artikel. Als Ergebnis der Ausführung mit AutoML beim Betrachten der Daten zu diesem Zeitpunkt kam der Algorithmus des Entscheidungsbaumsystems an die Spitze, also in Zukunft LightGBM. Ich entschied mich mit zu gehen.
Notebook-Dateien werden separat für die Datenverarbeitung und Modellkonstruktion vorbereitet (da bei Verwendung einer Datei die Sichtbarkeit schlecht sein kann oder jedes Mal eine unnötige Verarbeitung durchgeführt werden kann).
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import category_encoders as ce
%matplotlib inline
pd.set_option('display.max_columns', None)
random_state = 1234
df = pd.read_csv('./0_rawdata/train.csv')
Ich werde einen Code zum Überprüfen der Daten schreiben. Überprüfen Sie den Datentyp und das Vorhandensein oder Fehlen von Null ↓
df.info()
df.describe()
Visualisierung numerischer Daten ↓
df.hist( figsize=(14, 10), bins=20)
Visualisierung von Zeichenkettendaten ↓
plt.figure( figsize = (20, 15))
cols = ['job', 'marital', 'education', 'default', 'housing', 'loan', 'contact', 'month', 'poutcome']
for i, col in enumerate(cols):
plt.subplot(3,3,i+1)
df[col].value_counts().plot.bar()
plt.title(col)
In der obigen Visualisierung schien, ganz zu schweigen von "id", aber "balance" und "pdays", eine gleichmäßige Verteilung zu haben, so dass wir sie für späteres Lernen verwenden werden. Aus den Daten löschen.
default
Da die meisten Daten nein waren, löschen Sie sie.
Darüber hinaus haben wir Lerndaten erstellt, indem wir die Verarbeitung zum Digitalisieren von Zeichenketten und Kategoriedaten hinzugefügt haben.
df2 = df.copy()
df2 = df2.drop( columns=['id', 'balance', 'pdays', 'default'])
# month
month_map={
'jan':1,
'feb':2,
'mar':3,
'apr':4,
'may':5,
'jun':6,
'jul':7,
'aug':8,
'sep':9,
'oct':10,
'nov':11}
df2['month'] = df2['month'].fillna(0)
df2['month'] = df2['month'].map(month_map)
# job, marital, education, housing, loan, contact, poutcome
cols = ['job', 'marital', 'education', 'housing', 'loan', 'contact', 'poutcome']
ce_onehot = ce.OneHotEncoder(cols=cols,handle_unknown='impute')
ce_onehot.fit( df2 )
df2 = ce_onehot.transform( df2 )
df2['duration'] = df2['duration'] / 3600
df2.to_csv('mytrain.csv', index=False)
import pandas as pd
import numpy as np
import category_encoders as ce
import lightgbm as lgb
#import optuna
from optuna.integration import lightgbm as lgb_optuna
from sklearn import preprocessing
from sklearn.model_selection import train_test_split,StratifiedKFold,cross_validate
from sklearn.metrics import roc_auc_score
pd.set_option('display.max_columns', None)
random_state = 1234
version = 'v1'
Teilen Sie die Daten für Training und Validierung (8: 2).
df_train = pd.read_csv('mytrain.csv')
X = df_train.drop( columns=['y'] )
y = df_train['y']
X_train, X_holdout, y_train, y_holdout = train_test_split(X, y, test_size=0.2, random_state=random_state)
Die folgenden Methoden wurden zur Modellkonstruktion und zur Überprüfung der Genauigkeit verwendet.
def build():
kf = StratifiedKFold(n_splits=5, shuffle=True, random_state=random_state)
lgb_train = lgb_optuna.Dataset(X_train, y_train)
lgbm_params = {
'objective': 'binary',
'metric': 'binary_logloss',
'random_state':random_state,
'verbosity': 0
}
tunecv = lgb_optuna.LightGBMTunerCV(
lgbm_params,
lgb_train,
num_boost_round=100,
early_stopping_rounds=20,
seed = random_state,
verbose_eval=20,
folds=kf
)
tunecv.run()
print( 'Best score = ',tunecv.best_score)
print( 'Best params= ',tunecv.best_params)
return tunecv
tunecv = build()
Trainieren Sie das Modell mit den gesamten Trainingsdaten neu und berechnen Sie die AUC anhand der Verifizierungsdaten ↓
train_data = lgb.Dataset( X_train, y_train )
eval_data = lgb.Dataset(X_holdout, label=y_holdout, reference= train_data)
clf = lgb.train( tunecv.best_params,
train_data,
valid_sets=eval_data,
num_boost_round=50,
verbose_eval=0
)
y_pred = clf.predict( X_holdout )
print('AUC: ', roc_auc_score(y_holdout, y_pred))
# AUC: 0.8486429810797091
# | Was ich getan habe | AUC | Spielstand eingeben | Impressionen |
---|---|---|---|---|
00 | Machen Sie den obigen Prozess zum Standard | 0.8486 | --- | --- |
01 | job , marital , education , poutcome Ändern Sie die Codierung von in Zielcodierung |
0.8458 | --- | Es ging leicht runter, aber sobald es geht |
02 | num_boost_round=200 (Weil sich die Punktzahl etwas mehr zu verbessern schien, wenn ich die Lernkurve herausstellte) | 0.8536 | --- | Es ging hoch. Mach mit |
03 | Beachten Sie, dass sich die Trainingsparameter des Teils, der das Modell in den gesamten Trainingsdaten umschult, von den Parametern für hohe Paratuning unterscheiden. num_boost_round=200、early_stopping_rounds =Vereinigt mit 20. | 0.8585 | --- | Mach mit |
04 | Versuchen Sie, den Optimierungsindex auf AUC zu setzen | 0.8557 | --- | gesenkt. Logloss verlassen |
05 | loan, housing,Ändern Sie den Kontakt auf die ursprüngliche Codierung | 0.8593 | 0.8556 | Die AUC ist aktiv, also werde ich damit weitermachen. Die Submit-Punktzahl ist jedoch etwas niedrig. |
06 | Überprüfen Sie den Unterschied zwischen Testdaten und Trainingsdaten. Im Vergleich zur Visualisierung gibt es keinen großen Unterschied. Ich habe versucht, ein Modell zu erstellen, das Testdaten vorhersagt, aber AUC=0.Da es ungefähr 5 ist, wird beurteilt, dass es keinen Unterschied zwischen Testdaten und Trainingsdaten gibt | --- | --- | --- |
07 | Ändern Sie die Kodierung des Monats (kombinieren Sie mehrere Monate mit einer kleinen Datenmenge). | 0.8583 | 0.8585 | Fast das gleiche wie die 03 AUC. Abgelehnt. |
08 | Ändern Sie die Kodierung des Monats (kombinieren Sie mehrere Monate mit einer kleinen Datenmenge). | 0.8583 | 0.8585 | AUC fiel von 05. Abgelehnt. |
09 | Fügen Sie den y-Durchschnitt des letzten Monats als Spalte wie eine Zeitreihenverzögerungsvariable hinzu | 0.8629 | 0.8559 | Die Trainingsdaten verbesserten die Punktzahl, wurden jedoch abgelehnt, da die Testpunktzahl abnahm. |
10 | age Kategorisieren (kleine Anzahl von Zeilen)age Kombiniert) |
0.8599 | 0.8588 | Subtil verbessert. Ich werde damit gehen. |
11 | Versuchen Sie, in PCA zu gelangen | 0.8574 | --- | gesenkt |
12 | Probieren Sie andere Algorithmen (SVM) aus, RandomForest, LogisticRegression) | --- | --- | gesenkt |
Ich habe versucht, andere Details als die oben genannten zu ändern, aber die Genauigkeit hat sich nicht verbessert. Außerdem ist es ärgerlich, jedes Mal aufzunehmen ... Es scheint, als wäre die Wettbewerbsperiode vorbei.
Es gibt viele andere Dinge, die Sie tun sollten. Ich würde mich freuen, wenn Sie einen Kommentar abgeben könnten. Wenn ich zum nächsten Wettbewerb gehe, möchte ich die Technik einbeziehen, während ich mich auf diese Reflexion und den Kaggle-Kernel beziehe.
Recommended Posts