[PYTHON] Ich besuchte die Schule und nahm zum ersten Mal am SIGNATE BEGINNER Limited-Wettbewerb teil.

Zunaechst

Ich habe diesen Artikel geschrieben, weil ich dachte, dass das Posten dieses unvollendeten Codes die Aufmerksamkeit vieler Menschen auf sich ziehen und mir Verbesserungen und Abhilfemaßnahmen geben würde, z. B. was ich falsch gemacht habe und was ich hätte tun sollen. Ehrlich gesagt denke ich, dass es viele Fragen gibt, z. B. warum Sie dies tun, aber ich würde mich freuen, wenn Sie es mit einem warmen Auge sehen könnten.

Selbsteinführung und Wettbewerb

Diesmal habe ich am Wettbewerb vom 1. Oktober teilgenommen. https://signate.jp/competitions/295

Um mich kurz vorzustellen, habe ich im April dieses Jahres angefangen, eine AI-Programmierschule zu besuchen. Ich bin gerade dabei, den Job zu wechseln, habe keine Programmiererfahrung und bin von der Philosophischen Fakultät.

Zunächst nahm ich diesmal etwas spät teil und begann langsam ab dem 13. Oktober. In der ersten Woche habe ich mir nur die Daten angesehen und den Code mit Bezug auf das geschrieben, was ich gelernt habe. Ich konnte jedoch wegen wiederholter Fehler nicht einmal einreichen ...

Dann, eine Woche vor dem Ende des Wettbewerbs, bekam ich endlich das Kaggle Start Book und beschloss, es zu kopieren und so etwas zu machen. In Bezug auf EDA hat SIGNATE QUEST kostenlos veröffentlicht, daher habe ich darauf hingewiesen.

Bibliothek verwendet dieses Mal

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import LabelEncoder
import optuna
import optuna.integration.lightgbm as lgb 
from sklearn.model_selection import  train_test_split
from sklearn.metrics import log_loss

Merkmalsextraktion

Importieren Sie vorerst die Daten und sehen Sie sich den Inhalt an. (Die Entwicklungsumgebung verwendete Kaggles Notizbuch)

train = pd.read_csv("../input/signatecomp/train.csv",header=0)
test = pd.read_csv("../input/signatecomp/test.csv",header=0)

print(train.info())
print(train.head())
print(train.info())
print(train.head())

Schauen wir uns hier die Eigenschaften der Daten an. Schauen Sie sich zuerst die numerischen Variablen an.

test.hist(figsize=(20,20), color='r')

Als nächstes betrachten wir kategoriale Variablen.

emplength_var = train['employment_length'].value_counts()

#Geben Sie den Diagrammtitel an
emplength_var.plot.bar(title="employment_Häufigkeit der Länge")

#Geben Sie den Namen der x-Achse an
plt.xlabel('employment_length')

#Geben Sie den Namen der y-Achse an
plt.ylabel('count')

#Code erforderlich, um das erstellte Diagramm anzuzeigen
plt.show()

#Visualisierung des Balkendiagramms
purpose_var = train['purpose'].value_counts() 
purpose_var.plot.bar()

#Anzeige des Balkendiagramms des Zwecks
plt.show()

# application_Visualisierung des Balkendiagramms
application_var = train['application_type'].value_counts() 
application_var.plot.bar()

# application_Anzeige des Balkendiagramms
plt.show()

#Visualisierung des Grad-Balkendiagramms
grade_var = train['grade'].value_counts()
grade_var.value_counts() 

#Anzeige des Grad-Balkendiagramms
plt.show()

Als nächstes betrachten wir die Beziehung zwischen der Zielvariablen und der kategorialen Variablen.

#Index (Zeile) Laufzeitspalte, Darlehen_Kreuztabelle mit der Statusspalte als Spalte
cross_term = pd.crosstab(train['term'],train['loan_status'], margins = True)

#Teilen Sie die ChargedOff-Spalte durch die All-Spalte und teilen Sie die Variable c_Ersatz für Rate
c_rate = cross_term['ChargedOff'] / cross_term['All']

#Teilen Sie die FullyPaid-Spalte durch die All-Spalte und die Variable f_Ersatz für Rate
f_rate = cross_term['FullyPaid'] / cross_term['All']

#Variable c_Rate und Variable f_Rate als variables Kreuz_Neue Spalte c im Begriff_rate、f_Als Rate ersetzen
cross_term['c_rate'] = c_rate
cross_term['f_rate'] = f_rate
#Anzeige der Kreuztabelle
print(cross_term)

#Teilen Sie die ChargedOff-Spalte durch die All-Spalte und teilen Sie die Variable c_Ersatz für Rate
c_rate = cross_term['ChargedOff'] / cross_term['All']

#Teilen Sie die FullyPaid-Spalte durch die All-Spalte und die Variable f_Ersatz für Rate
f_rate = cross_term['FullyPaid'] / cross_term['All']

#Variable c_Rate und Variable f_Rate als variables Kreuz_Neue Spalte c im Begriff_rate、f_Als Rate ersetzen
cross_term['c_rate'] = c_rate
cross_term['f_rate'] = f_rate

#Variables Kreuz_Entfernen Sie die Zeile Alle aus dem Term und das variable Kreuz_Neu zuordnen
cross_term = cross_term.drop(index = ["All"])

#Kreuztabelle anzeigen
print(cross_term)
#Erstellen Sie einen DataFrame nur für die Spalten, die Sie für das gestapelte Balkendiagramm verwenden möchten
df_bar = cross_term[['c_rate', 'f_rate']]

#Erstellen Sie ein gestapeltes Balkendiagramm
df_bar.plot.bar(stacked=True)

#Grafiktiteleinstellungen
plt.title('Forderungsausfall- und Rückzahlungsrate für jede Rückzahlungsperiode')

#Einstellungen für die Beschriftung der x-Achse
plt.xlabel('Zeitraum')
#Einstellung der Beschriftung der y-Achse
plt.ylabel('Prozentsatz')

#Grafik anzeigen
plt.show()

Wenden Sie diese Arbeit auf alle kategorialen Variablen an (Es ist in Ordnung, den gesamten Code einzufügen, aber es tut mir leid, weil es fast die gleiche Arbeit ist, aber ich werde es weglassen.)

Hinzufügen von Funktionen

Vorläufig habe ich den Durchschnitt genommen und den credit_score logarisch konvertiert, weil er voreingenommen war.

#Hinzufügen von Funktionen
train["log_cre"] = np.log(train.credit_score - train.credit_score.min() + 1)
test["log_cre"] = np.log(test.credit_score - test.credit_score.min() + 1)
train['loam_median'] = train['loan_amnt'] - train['loan_amnt'].median()
train['inter_median'] = train['interest_rate'] - train['interest_rate'].median()
test['loam_median'] = test['loan_amnt'] - test['loan_amnt'].median()
test['inter_median'] = test['interest_rate'] - test['interest_rate'].median()

Datenvorverarbeitung

Diesmal habe ich die Etikettencodierung durchgeführt.

#Zugdaten konvertieren

Label_Enc_list = ['term','grade','purpose','application_type',"employment_length","loan_status"]

#Implementierung der Etikettencodierung
import category_encoders as ce

ce_oe = ce.OrdinalEncoder(cols=Label_Enc_list,handle_unknown='impute')
#Konvertieren Sie Zeichen in Ordnungszahlen
train = ce_oe.fit_transform(train)
#Ändern Sie den Wert vom Anfang von 1 bis zum Anfang von 0
for i in Label_Enc_list:
    train[i] = train[i] - 1

#Testdaten konvertieren
from sklearn.preprocessing import LabelEncoder

category = test.select_dtypes(include='object')

for col in list(category):
  le = LabelEncoder()
  le.fit(test[col])
  le.transform(test[col])
  test[col] = le.transform(test[col])

print(train.head())
print(test.head())

Modellieren

#Holen Sie sich die Werte der objektiven und erklärenden Variablen des Zuges
target = train['loan_status'].values
features = train.drop(['id','loan_status'],axis=1).values

#Testdaten
test_X = test.drop(['id'],axis=1).values

#Teilen Sie den Zug in Trainingsdaten und Verifizierungsdaten auf
(features , val_X , target , val_y) = train_test_split(features, target , test_size = 0.2)

    

def objective(trial):
    lgb_params = {'objective': 'binary',
                  'max_bin': trial.suggest_int("max_bin", 255, 500), 
                  "learning_rate": 0.05,
                  "num_leaves": trial.suggest_int("num_leaves", 32, 128)
                 }
    lgb_train = lgb.Dataset(features, target) #Zum Lernen
    
    lgb_eval = lgb.Dataset(val_X, val_y,reference=lgb_train) #Zum Boosten
    
     #Lernen
    model = lgb.train(lgb_params, lgb_train,
                      valid_sets=[lgb_train,lgb_eval],
                      num_boost_round=1000,
                      early_stopping_rounds=10,
                      verbose_eval=10)
    
    y_pred = model.predict(val_X,
                           num_iteration=model.best_iteration) 
    score = log_loss(val_y,y_pred)
    return score
study = optuna.create_study(sampler=optuna.samplers.RandomSampler(seed=0))
study.optimize(objective, n_trials=20)
study.best_params
lgb_params = {'boosting_type': 'gbdt',
              'objective': 'binary',
                  'max_bin': study.best_params["max_bin"], 
                  "learning_rate": 0.05,
                  "num_leaves": study.best_params["num_leaves"]
                 }
lgb_train = lgb.Dataset(features, target) #Zum Lernen
    
lgb_eval = lgb.Dataset(val_X, val_y,reference=lgb_train) #Zum Boosten

#Lernen
model = lgb.train(lgb_params, lgb_train, valid_sets=[lgb_train,lgb_eval],
                  num_boost_round=1000,
                  early_stopping_rounds=10,
                  verbose_eval=10)


pred = model.predict(test_X,num_iteration=model.best_iteration) 

Datei einreichen

Im Startbuch habe ich Binärdateien unter der Bedingung klassifiziert, dass sie größer als 0,5 sind, aber ich habe die Bedingung geändert, weil ich eine Punktzahl erhalten habe, als ich ungefähr 50 Zeilen angezeigt und angegeben habe, dass sie größer als 0,1 ist, aber ich weiß nicht, wie ich damit umgehen soll Es war ... Ich wollte eine Zuweisung erneut vornehmen, wusste aber nicht, wie ich sie angeben sollte, also mache ich das Dumme, einmal eine Zeile hinzuzufügen, die CSV-Datei zu öffnen und sie zu löschen (; _;) (Sollte ich die Spalte normalerweise mit Header = 0 angegeben haben?)

pred1 = (pred > 0.1).astype(int)
submit = pd.read_csv("../input/signatecomp/submit.csv")
#Ausgabe der Vorhersageergebnisdatei
submit.loc[:,0] = pred1[1:]
submit.to_csv("submit1.csv", index = False)
print("Your submission was successfully saved!")

Ergebnis

Ich wurde befördert, wenn F1Score = 0,355 überschritten wurde, aber ich konnte nicht befördert werden, da es 0,3275218 war.

Reflexionen

Erstens habe ich viel Zeit verschwendet, weil ich versucht habe, Daten auf einer Basis nahe Null zu analysieren.

Als nächstes habe ich ein gewisses Maß an Wissen und Implementierung gelernt, weil ich an der Programmierschule für E-Qualifikation gelernt habe, aber es tut mir leid, weil ich es versäumt habe, das Problem tatsächlich zu lösen und es zu überprüfen. Das Ergebnis war

Schließlich war ich sehr schlecht darin, ähnliche Wettbewerbe in Kaggle zu finden, wie man Code implementiert, wie man Data Engineering macht und so weiter.

Lernen

Als ich zum ersten Mal am Wettbewerb teilnahm, bekam ich viele Dinge, wie schwach ich war, was ich von nun an tun sollte, wie ich mit Fehlern umgehen sollte usw.

Schließlich

Vielen Dank an alle, die dies bisher gesehen haben. Ich bin noch unreif, also werde ich weiter härter arbeiten.

Recommended Posts

Ich besuchte die Schule und nahm zum ersten Mal am SIGNATE BEGINNER Limited-Wettbewerb teil.
MongoDB mit Python zum ersten Mal
Code, an den ich mich gerne erinnert hätte, als ich zum ersten Mal an AtCoder teilgenommen habe (Reflection 1 für das nächste Mal)
Zum ersten Mal in Numpy werde ich es von Zeit zu Zeit aktualisieren
Ich habe zum ersten Mal versucht, Python zu programmieren.
Ich habe Mind Meld zum ersten Mal ausprobiert
Rückblick auf den Wettbewerb für maschinelles Lernen, an dem ich zum ersten Mal gearbeitet habe
Bis Sie die Silbermedaille (Top 3%) in dem Wettbewerb gewinnen, an dem Sie innerhalb eines Monats zum ersten Mal in der Datenwissenschaft teilgenommen haben!
Was ich zum ersten Mal in Python bekommen habe
Ich habe Python zum ersten Mal auf dem Mac ausprobiert.
Registrieren Sie zum ersten Mal eine Aufgabe in cron
Ich habe Python zum ersten Mal mit Heroku ausprobiert
AI Gaming Ich habe es zum ersten Mal versucht
Erster Kaggle (Kaggle ①)
Kaguru zum ersten Mal
Zusammenfassung der Stolperpunkte in Django zum ersten Mal
Ich habe die Google Cloud Vision-API zum ersten Mal ausprobiert
SIGNATE [1st _Beginner Limited Competition] Teilnahme am Bankkunden-Targeting
Ich habe an der ISUCON10-Qualifikationsrunde teilgenommen!
Siehe Python zum ersten Mal
Starten Sie Django zum ersten Mal
Ich habe an Kaggles NFL-Wettbewerb teilgenommen
Was ich durch das Schreiben einer Python Pull-Anfrage zum ersten Mal in meinem Leben gelernt habe
Ein nützlicher Hinweis, wenn Sie Python nach langer Zeit verwenden
Versuchen wir zum ersten Mal Linux
GTUG Girls + PyLadiesTokyo Meetup Ich ging zum ersten maschinellen Lernen
So verwenden Sie MkDocs zum ersten Mal
Signate_ Rückblick auf den 1. Beginner Limited Competition
Versuchen Sie zum ersten Mal, in Qiita zu posten
Ich möchte zum ersten Mal eine Django-Studie zur Mittagsdatenbank [EP1] erstellen
Ich möchte zum ersten Mal eine Django-Studie zum Mittagessen [EP1-4] erstellen
Versuchen Sie vorerst, Arch Linux zu installieren.
Ich habe eine Woche nach Beginn des Programmierens an wettbewerbsorientierten Programmen teilgenommen
Teilnahme an der ersten ISUCON mit dem Team "Ranchu" # ISUCON10 Qualifying