Vor kurzem war ich süchtig nach Datenanalyse-Wettbewerben wie Kaggle und Signate und lerne jeden Tag, während ich nach und nach an mehreren Wettbewerben teilnehme. Vor jedem ersten Blick auf die Daten habe ich eine LightGBM-Vorlage, mit der ich die Schwierigkeit des Wettbewerbs und die Tendenz der Daten kenne. Daher werde ich sie veröffentlichen.
Bitte lassen Sie mich wissen, wenn Sie mehr davon machen möchten!
Laden Sie die Daten und importieren Sie die erforderlichen Bibliotheken. Wenn Sie beginnen, ohne die Trainingsdaten sorgfältig zu überprüfen, kann die Datenmenge unerwartet groß sein. Überprüfen Sie daher die Datenmenge.
from datetime import datetime
import numpy as np
import matplotlib.pyplot as plt
import os
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
#Daten lesen
train_df = pd.read_csv("./train.csv")
test_df = pd.read_csv("./test.csv")
print(train_df.shape, test_df.shape)
(891, 12) (418, 11)
train_df
PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
0 1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 NaN S
1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 0 PC 17599 71.2833 C85 C
2 3 1 3 Heikkinen, Miss. Laina female 26.0 0 0 STON/O2. 3101282 7.9250 NaN S
3 4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 0 113803 53.1000 C123 S
4 5 0 3 Allen, Mr. William Henry male 35.0 0 0 373450 8.0500 NaN S
5 6 0 3 Moran, Mr. James male NaN 0 0 330877 8.4583 NaN Q
6 7 0 1 McCarthy, Mr. Timothy J male 54.0 0 0 17463 51.8625 E46 S
7 8 0 3 Palsson, Master. Gosta Leonard male 2.0 3 1 349909 21.0750 NaN S
8 9 1 3 Johnson, Mrs. Oscar W (Elisabeth Vilhelmina Berg) female 27.0 0 2 347742 11.1333 NaN S
9 10 1 2 Nasser, Mrs. Nicholas (Adele Achem) female 14.0 1 0 237736 30.0708 NaN C
10 11 1 3 Sandstrom, Miss. Marguerite Rut female 4.0 1 1 PP 9549 16.7000 G6 S
11 12 1 1 Bonnell, Miss. Elizabeth female 58.0 0 0 113783 26.5500 C103 S
12 13 0 3 Saundercock, Mr. William Henry male 20.0 0 0 A/5. 2151 8.0500 NaN S
13 14 0 3 Andersson, Mr. Anders Johan male 39.0 1 5 347082 31.2750 NaN S
14 15 0 3 Vestrom, Miss. Hulda Amanda Adolfina female 14.0 0
Es ist wichtig, die Daten in jedem Wettbewerb zu sehen. Überprüfen Sie die Mindestdaten, z. B. die nicht verwendeten Zielvariablen "Suvived", "PassengerId" und "Name", da es sich um eindeutige Merkmalsmengen handelt.
Teilen Sie in erklärende Variablen und objektive Variablen.
train_x, train_y = train_df.drop("Survived", axis=1), train_df["Survived"]
Die Feature-Verarbeitung wird ebenfalls durchgeführt, jedoch das Minimum. Dies geschieht nur unter den folgenden drei Gesichtspunkten.
PassengerId
und Name
)def label_encording(data_col):
'''
Etikettencodierung
data_col :Eine Spalte des Zieldatenrahmens
'''
le = LabelEncoder()
le = le.fit(data_col)
#Konvertieren Sie die Beschriftung in eine Ganzzahl
data_col = le.transform(data_col)
return data_col
def preprocess(df):
'''
Vorbehandlung durchführen
df : padnas.Dataframe
Zieldatenrahmen
'''
df = df.drop("PassengerId", axis=1)
df = df.drop("Name", axis=1)
#Konvertieren Sie qualitative Variablen in Zahlen
for column_name in df:
if df[column_name][0].dtypes == object: #Ersetzen Sie fehlende Werte durch NULL
df[column_name] = df[column_name].fillna("NULL")
df[column_name] = label_encording(df[column_name])
elif df[column_name][0].dtypes == ( "int64" or "float64") : #In Bezug auf fehlende Werte-Ersatz 999
df[column_name] = df[column_name].fillna(-999)
return df
Bei der Durchführung der Etikettencodierung ist es nicht gut, wenn die Entsprechung zwischen den Etiketten in den Trainingsdaten und den Testdaten unterbrochen ist, sodass die Trainingsdaten und die Testdaten gleichzeitig einer Merkmalsmengenverarbeitung unterzogen werden.
all_x = pd.concat([train_x, test_df])
preprocessed_all_x = preprocess(all_x)
#Die vorverarbeiteten Daten werden in Trainingsdaten und Testdaten unterteilt.
preprocessed_train_x, preprocessed_test_x = preprocessed_all_x[:train_x.shape[0]], preprocessed_all_x[train_x.shape[0]:]
print(preprocessed_train_x.head(5))
Erstellen Sie eine Klasse, um LightGBM zu lernen. Auf der offiziellen Website unten finden Sie detaillierte Erklärungen zu den Parametern.
"Ziel" und "Metriken" werden entsprechend den Trainingsdaten und dem Wettbewerb geändert.
# LightGBM
import lightgbm as lgb
class lightGBM:
def __init__(self, params=None):
self.model = None
if params is not None:
self.params = params
else:
self.params = {'objective':'binary',
'seed': 0,
'verbose':10,
'boosting_type': 'gbdt',
'metrics':'auc',
'reg_alpha': 0.0,
'reg_lambda': 0.0,
'learning_rate':0.01,
'drop_rate':0.5
}
self.num_round = 20000
self.early_stopping_rounds = self.num_round/100
def fit(self, tr_x, tr_y, va_x, va_y):
self.target_columms = tr_x.columns
print(self.target_columms)
#Datensatz konvertieren
lgb_train = lgb.Dataset(tr_x, tr_y)
lgb_eval = lgb.Dataset(va_x, va_y)
self.model = lgb.train(self.params,
lgb_train,
num_boost_round=self.num_round,
early_stopping_rounds=self.early_stopping_rounds,
valid_names=['train', 'valid'],
valid_sets=[lgb_train, lgb_eval],
verbose_eval=self.num_round/100
)
return self.model
def predict(self, x):
data = lgb.Dataset(x)
pred = self.model.predict(x, num_iteration=self.model.best_iteration)
return pred
def get_feature_importance(self, target_columms=None):
'''
Funktionsausgabe
'''
if target_columms is not None:
self.target_columms = target_columms
feature_imp = pd.DataFrame(sorted(zip(self.model.feature_importance(), self.target_columms)), columns=['Value','Feature'])
return feature_imp
Definition des Lernenden
def model_learning(model, x, y):
'''
Trainiere das Modell.
'''
tr_x, va_x, tr_y, va_y = train_test_split(x, train_y, test_size=0.2, random_state=0)
return model.fit(tr_x, tr_y, va_x, va_y)
Indem Sie das Modell in einer Klasse definieren und an den Lernenden übergeben, können Sie Änderungen im Quellcode minimieren, wenn Sie verschiedene Modelle verwenden.
Wenn Sie beispielsweise XGBoost verwenden möchten, können Sie das sofort zu erlernende Modell durch Umschreiben wie folgt ersetzen.
class XGBoost:
def __init__(self, params=None):
#Initialisierungsprozess~~~
def fit(self, tr_x, tr_y, va_x, va_y):
#Lernprozess~~~
def predict(self, x):
#Auswertungsverarbeitung~~~
xgboost_model = XGBoost()
model_learning(xgboost_model, preprocessed_train_x, train_y)
lightgbm_model = lightGBM()
model_learning(lightgbm_model, preprocessed_train_x, train_y)
Index(['Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Ticket', 'Fare', 'Cabin',
'Embarked'],
dtype='object')
Training until validation scores don't improve for 200.0 rounds
Early stopping, best iteration is:
[172] train's auc: 0.945026 valid's auc: 0.915613
Das Lernen ist abgeschlossen! Es war bald vorbei.
Mit LightGBM können Sie überprüfen, welche der gelernten Funktionen Sie am häufigsten verwendet haben. Dies gibt Ihnen einen Hinweis auf EDA für den nächsten Schritt. Irgendwie stehen "Alter", "Ticket" und "Fahrpreis" ganz oben, daher scheinen Alter und Sitzposition wichtig zu sein, und ich kann die Korrelation zwischen "Alter" und "Überlebt" usw. erkennen. ..
lightgbm_model.get_feature_importance()
Value Feature
0 32 Parch
1 58 SibSp
2 158 Embarked
3 165 Cabin
4 172 Sex
5 206 Pclass
6 1218 Fare
7 1261 Ticket
8 1398 Age
Bewertung des Modells. Das Ausgabeergebnis ist eine Wahrscheinlichkeit, aber dieses Mal muss es entweder "0" oder "1" sein. Formatieren Sie es daher entsprechend.
#Bewertung des Modells zum Testen
proba_ = lightgbm_model.predict(preprocessed_test_x)
proba = list(map(lambda x: 0 if x < 0.5 else 1, proba_))
Formatieren Sie den vorhergesagten Wert gemäß den übermittelten Daten. Dies ist der einfachste Ort, um stecken zu bleiben ...
#Testdaten erstellen
submit_df = pd.DataFrame({"Survived": proba})
submit_df.index.name = "PassengerId"
submit_df.index = submit_df.index + len(train_df) + 1
Speichern Sie den Dateinamen im Format "submit_ {% Y-% m-% d-% H% M% S}". Auf diese Weise können Sie ein versehentliches Überschreiben verhindern und müssen nicht jedes Mal über den Dateinamen nachdenken, was praktisch ist.
#sparen
save_folder = "results"
if not os.path.exists(save_folder):
os.makedirs(save_folder)
submit_df.to_csv("{}/submit_{}.csv".format(save_folder, datetime.now().strftime("%Y-%m-%d-%H%M%S")),index=True)
Als ich dieses Ergebnis einreichte, war der öffentliche Score "0,77033", was "6610. / 20114 Personen" entspricht. (Stand 25.08.2020) Ich denke, es ist keine schlechte Vorlage, um die Schwierigkeit und das Gefühl der Konkurrenz zu erfassen, indem man sie vorerst dreht.
Ich denke immer, dass EDA süß ist, also habe ich EDA in Zukunft fester gemacht.
Recommended Posts