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.
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.
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
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.)
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()
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())
#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)
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!")
Ich wurde befördert, wenn F1Score = 0,355 überschritten wurde, aber ich konnte nicht befördert werden, da es 0,3275218 war.
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.
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.
Vielen Dank an alle, die dies bisher gesehen haben. Ich bin noch unreif, also werde ich weiter härter arbeiten.
Recommended Posts