[PYTHON] LightGBM, der erste Schritt, um das Denken in Datenanalyse-Wettbewerben zu beenden

Einführung

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!

Umgebung

Gesamtbild

Daten lesen

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)

Feature-Verarbeitung

Schauen Sie sich zuerst die Daten an

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.

Unterteilt in erklärende Variablen und objektive Variablen

Teilen Sie in erklärende Variablen und objektive Variablen.

train_x, train_y = train_df.drop("Survived", axis=1), train_df["Survived"]

Feature-Verarbeitung

Die Feature-Verarbeitung wird ebenfalls durchgeführt, jedoch das Minimum. Dies geschieht nur unter den folgenden drei Gesichtspunkten.

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))

Modellieren

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)

Lernen

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.

Bewertung der Bedeutung von Merkmalsmengen

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

Erstellung von Evaluierungs- und Übermittlungsdateien

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)

Am Ende

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

LightGBM, der erste Schritt, um das Denken in Datenanalyse-Wettbewerben zu beenden
Verwendung von Datenanalysetools für Anfänger
Python für die Datenanalyse Kapitel 4
Python für die Datenanalyse Kapitel 2
Tipps und Vorsichtsmaßnahmen bei der Datenanalyse
Python für die Datenanalyse Kapitel 3
[In kürzester Zeit verstehen] Python-Grundlagen für die Datenanalyse
Datenvorhersagewettbewerb in 3 Schritten (titanisch)
Vorverarbeitungsvorlage für die Datenanalyse (Python)
Datenanalyse zur Verbesserung von POG 3 ~ Regressionsanalyse ~
Empfohlene Wettbewerbsseite für Datenwissenschaftler
Python-Visualisierungstool für die Datenanalyse
Windows → Linux Tipps zum Einbringen von Daten
Verwendung von "deque" für Python-Daten
Verwenden Sie pathlib in Maya (Python2.7), um sich auf das kommende Python3.7 vorzubereiten
Vorverarbeitung beim maschinellen Lernen 1 Datenanalyseprozess
JupyterLab Grundeinstellung 2 für die Datenanalyse (pip)
JupyterLab Basic Setup für die Datenanalyse (pip)
Datenanalyse in Python Zusammenfassung der Quellen, die Anfänger zuerst betrachten sollten
Datenanalyse zur Verbesserung von POG 2 ~ Analyse mit Jupiter-Notebook ~
Bereiten Sie eine Programmiersprachenumgebung für die Datenanalyse vor
[CovsirPhy] COVID-19 Python-Paket für die Datenanalyse: Laden von Daten
Eine Einführung in die statistische Modellierung für die Datenanalyse
Zeigen Sie FX (Forex) Daten Candle Stick in Python an
Datenanalyse in Python: Ein Hinweis zu line_profiler
Verwenden Sie in Ihrem Python keine readlines () für Anweisungen!
Aufgezeichnete Umgebung für die Datenanalyse mit Python
Verwenden Sie das Kintone API SDK für Python mit Raspberry Pi (speichern Sie Daten einfach in Kintone von Raspberry Pi).