Wir werden die Informationen von Kaggle aktualisieren, der in der Vergangenheit teilgenommen hat. Hier werden wir die Dateneinführung von Predicting Red Hat Business Value und die prominente Diskussion im Forum aufgreifen. Der Code des Gewinners des Wettbewerbs ist in Kaggle Summary: Red Hat (Part 2) zusammengefasst. Dies ist eine Zusammenfassung, Diskussion und ein Beispielcode. (Derzeit im Bau)
Dieser Artikel verwendet Python 2.7, Numpy 1.11, Scipy 0.17, Scikit-Learn 0.18, Matplotlib 1.5, Seaborn 0.7, Pandas 0.17. Es wurde bestätigt, dass es an einem Jupiter-Notebook funktioniert. (Bitte ändern Sie% matplotlib inline entsprechend) Wenn Sie beim Ausführen des Beispielskripts Fehler finden, ist es hilfreich, wenn Sie einen Kommentar abgeben können.
Wie bei vielen Unternehmen kann RedHat Kundeninformationen in chronologischer Reihenfolge erfassen. Red Hat erforscht eine Methode, um vorherzusagen, welche Person angesprochen werden soll und wie sie anhand der Vorhersage entsprechend dem Verhalten des Kunden angesprochen werden soll. In diesem Wettbewerb versucht Kaggler, einen Klassifizierungsalgorithmus zu erstellen, um den potenziellen Geschäftswert von Red Hat anhand der Kundenmerkmale und -aktivitäten vorherzusagen.
Die charakteristischen Punkte dieser Zeit sind wie folgt.
Der Bewertungsindex lautet diesmal ROC. ([Japanische Version von Wikipedia](https://ja.wikipedia.org/wiki/%E5%8F%97%E4%BF%A1%E8%80%85%E6%93%8D%E4%BD%9C % E7% 89% B9% E6% 80% A7))
ROC ist der Standardindex zur Bewertung von binären Klassifizierungsproblemen. Detaillierte Erklärungen finden Sie auf verschiedenen Websites. Suchen Sie daher nach "ROC" und "F-Measure", um weitere Informationen zu erhalten.
Darüber hinaus drückt das Format der übermittelten Datei die Entsprechung zwischen der Aktivitäts-ID und der Wahrscheinlichkeit des Ergebnisses in CSV aus.
activity_id,outcome
act1_1,0
act1_100006,0
act1_100050,0
etc.
Diese Daten bestehen aus zwei verschiedenen Dateien (People-Datei, act_train-Datei). Die Personendatei enthält persönliche Informationen, die mit der Kunden-ID verknüpft sind. Die Aktivitätsdatei enthält den Verhaltensverlauf des Kunden, der mit der Kunden-ID verknüpft ist, und das Ergebnis (Ergebnis) dieses Verhaltens.
Die Personendatei besitzt die Art des Kunden (char *). Alle Funktionen (char *) außer char_38 sind anonymisierte Kategoriedaten. char_38 enthält fortlaufende Werte, keine kategorialen Informationen.
Das Ergebnis der Aktivitätsdatei gibt an, ob der Kunde über einen bestimmten Zeitraum ein bestimmtes Ziel erreicht hat. Die Aktivitätsdatei enthält auch Informationen mit dem Namen activity_category. Dies zeigt die Kategorie an, zu der die Merkmalsmenge (char *) jeder Indexinformation gehört. Beispielsweise zeigen Daten vom Typ 1 (char *) und Daten vom Typ 2-7 (char *) unterschiedliche Merkmalsmengen. Ich werde.
Der Zweck dieses Wettbewerbs besteht darin, die Kunden vorherzusagen, die durch das Zusammenführen dieser beiden Datendateien mit person_id einen Geschäftswert generieren.
act_test.csv
activity_id date activity_category char_1 char_2 char_3 char_4 char_5 char_6 char_7 char_8 char_9 char_10
people_id
ppl_100004 act1_249281 2022-07-20 type 1 type 5 type 10 type 5 type 1 type 6 type 1 type 1 type 7 type 4 NaN
ppl_100004 act2_230855 2022-07-20 type 5 NaN NaN NaN NaN NaN NaN NaN NaN NaN type 682
ppl_10001 act1_240724 2022-10-14 type 1 type 12 type 1 type 5 type 4 type 6 type 1 type 1 type 13 type 10 NaN
people.csv
char_1 group_1 char_2 date char_3 char_4 char_5 char_6 char_7 char_8 ... char_29 char_30 char_31 char_32 char_33 char_34 char_35 char_36 char_37 char_38
people_id
ppl_100 type 2 group 17304 type 2 2021-06-29 type 5 type 5 type 5 type 3 type 11 type 2 ... False True True False False True True True False 36
ppl_100002 type 2 group 8688 type 3 2021-01-06 type 28 type 9 type 5 type 3 type 11 type 2 ... False True True True True True True True False 76
ppl_100003 type 2 group 33592 type 3 2022-06-10 type 4 type 8 type 5 type 2 type 5 type 2 ... False False True True True True False True True 99
4.1. Exploration of the date features Importieren Sie zunächst die Bibliothek und die Daten.
import_data.py
import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)
import matplotlib.pyplot as plt
%matplotlib inline
train = pd.read_csv('../input/act_train.csv', parse_dates=['date'])
test = pd.read_csv('../input/act_test.csv', parse_dates=['date'])
ppl = pd.read_csv('../input/people.csv', parse_dates=['date'])
df_train = pd.merge(train, ppl, on='people_id')
df_test = pd.merge(test, ppl, on='people_id')
del train, test, ppl
Schauen wir uns den Inhalt der Daten an.
show_day.py
for d in ['date_x', 'date_y']:
print('Start of ' + d + ': ' + str(df_train[d].min().date()))
print(' End of ' + d + ': ' + str(df_train[d].max().date()))
print('Range of ' + d + ': ' + str(df_train[d].max() - df_train[d].min()) + '\n')
Klicken Sie hier für das Ausführungsergebnis.
Start of date_x: 2022-07-17
End of date_x: 2023-08-31
Range of date_x: 410 days 00:00:00
Start of date_y: 2020-05-18
End of date_y: 2023-08-31
Range of date_y: 1200 days 00:00:00
Sie können sehen, dass wir Daten für mehrere Jahre betrachten. Eigentlich sind diese Daten anonymisiert, aber dieses Mal gehen wir davon aus, dass wir uns seit mehreren Jahren mit Daten befassen. date_x enthält Daten für ein Jahr und date_y enthält Daten für drei Jahre. Die Endzeit ist für date_x und date_y gleich.
Visualisieren Sie nach der Gruppierung nach Datum die Ergebniswahrscheinlichkeit.
feature_structure.py
date_x = pd.DataFrame()
date_x['Class probability'] = df_train.groupby('date_x')['outcome'].mean()
date_x['Frequency'] = df_train.groupby('date_x')['outcome'].size()
date_x.plot(secondary_y='Frequency', figsize=(20, 10))
Wenn wir uns die Grafik ansehen, können wir sehen, dass es nur wenige Wochenendereignisse gibt und die Wahrscheinlichkeit, dass das Ergebnis 1 ist, ebenfalls verringert wird. Darüber hinaus ist ersichtlich, dass der Durchschnittswert des Ergebnisses an Wochentagen stabil ist, an Wochenenden jedoch auf 0,4 bis 0,3 fällt. Schauen wir uns auch date_y an.
show_day_y.py
date_y = pd.DataFrame()
date_y['Class probability'] = df_train.groupby('date_y')['outcome'].mean()
date_y['Frequency'] = df_train.groupby('date_y')['outcome'].size()
# We need to split it into multiple graphs since the time-scale is too long to show well on one graph
i = int(len(date_y) / 3)
date_y[:i].plot(secondary_y='Frequency', figsize=(20, 5), title='date_y Year 1')
date_y[i:2*i].plot(secondary_y='Frequency', figsize=(20, 5), title='date_y Year 2')
date_y[2*i:].plot(secondary_y='Frequency', figsize=(20, 5), title='date_y Year 3')
Hier ist das Ergebnis.
Wie bei date_x können Sie den Unterschied an Wochentagen und Feiertagen erkennen.
4.1.2. test set In der bisherigen Analyse haben wir die Beziehung zwischen Ergebnis und Datum gesehen. Wir werden prüfen, ob diese Beziehung in den Testdaten erkennbar ist. Natürlich können Sie das Ergebnis der Testdaten nicht sehen. Daher überprüfen wir nur die Verteilung der Stichprobe.
show_test.py
date_x_freq = pd.DataFrame()
date_x_freq['Training set'] = df_train.groupby('date_x')['activity_id'].count()
date_x_freq['Testing set'] = df_test.groupby('date_x')['activity_id'].count()
date_x_freq.plot(secondary_y='Testing set', figsize=(20, 8),
title='Comparison of date_x distribution between training/testing set')
date_y_freq = pd.DataFrame()
date_y_freq['Training set'] = df_train.groupby('date_y')['activity_id'].count()
date_y_freq['Testing set'] = df_test.groupby('date_y')['activity_id'].count()
date_y_freq[:i].plot(secondary_y='Testing set', figsize=(20, 8),
title='Comparison of date_y distribution between training/testing set (first year)')
date_y_freq[2*i:].plot(secondary_y='Testing set', figsize=(20, 8),
title='Comparison of date_y distribution between training/testing set (last year)
Das Ergebnis ist wie folgt.
Überprüfen Sie die Ähnlichkeit mit Zugdaten aus dem Korrelationskoeffizienten.
correlation.py
print('Correlation of date_x distribution in training/testing sets: ' + str(np.corrcoef(date_x_freq.T)[0,1]))
print('Correlation of date_y distribution in training/testing sets: ' + str(np.corrcoef(date_y_freq.fillna(0).T)[0,1]))
Correlation of date_x distribution in training/testing sets: 0.853430807691
Correlation of date_y distribution in training/testing sets: 0.709589035055
In date_x habe ich eine ähnliche Struktur in Trainings- und Testdaten gefunden. Dies bedeutet, dass Zug- und Testdaten nach Personen aufgeteilt werden, nicht nach Zeit oder anderen Faktoren. Ebenso sind die Merkmale im September und Oktober zu sehen.
Sie können sehen, dass die Korrelation bei date_y niedrig ist. Die Testdaten enthalten viele Spitzen im ersten Jahr, und es scheint, dass sich die Korrelation der Spitzen von Jahr zu Jahr ändert. Schauen wir uns die Korrelation nach Jahr an.
correlation_date_y.py
print('date_y correlation in year 1: ' + str(np.corrcoef(date_y_freq[:i].fillna(0).T)[0,1]))
print('date_y correlation in year 2: ' + str(np.corrcoef(date_y_freq[i:2*i].fillna(0).T)[0,1]))
print('date_y correlation in year 3: ' + str(np.corrcoef(date_y_freq[2*i:].fillna(0).T)[0,1]))
date_y correlation in year 1: 0.237056344324
date_y correlation in year 2: 0.682344221229
date_y correlation in year 3: 0.807207224857
Sie sehen, dass die Korrelation im dritten Jahr am höchsten ist.
4.1.3. Probability features Lassen Sie uns die Datumswahrscheinlichkeit als Merkmalsgröße generieren.
probability_features.py
from sklearn.metrics import roc_auc_score
features = pd.DataFrame()
features['date_x_prob'] = df_train.groupby('date_x')['outcome'].transform('mean')
features['date_y_prob'] = df_train.groupby('date_y')['outcome'].transform('mean')
features['date_x_count'] = df_train.groupby('date_x')['outcome'].transform('count')
features['date_y_count'] = df_train.groupby('date_y')['outcome'].transform('count')
_=[print(f.ljust(12) + ' AUC: ' + str(round(roc_auc_score(df_train['outcome'], features[f]), 6))) for f in features.columns]
date_x_prob AUC: 0.626182
date_y_prob AUC: 0.720296
date_x_count AUC: 0.465697
date_y_count AUC: 0.475916
4.2. Group_1 date trick In diesem Wettbewerb [magische Funktionen auf Kerneln veröffentlicht](https://www.kaggle.com/ijkilchenko/predicting-red-hat-business-value/python-ver-of-group-1-and-date -Trick / Code ) Wurde verwendet, um einen ROC von über 90% zu erreichen. Hier erklären wir den Kernel, der die magische Funktion erklärt.
Importieren Sie zunächst die Bibliothek.
import pandas as pd
import numpy as np
import datetime
from itertools import product
from scipy import interpolate ## For other interpolation functions.
Lesen Sie als Nächstes die Daten und codieren Sie den Booleschen Wert in 01. Ändern Sie auch das Datum in Datum / Uhrzeit.
# Load and transform people data.
ppl = pd.read_csv('../input/people.csv')
# Convert booleans to integers.
p_logi = ppl.select_dtypes(include=['bool']).columns
ppl[p_logi] = ppl[p_logi].astype('int')
del p_logi
# Transform date.
ppl['date'] = pd.to_datetime(ppl['date'])
Machen Sie dasselbe für die Act-Datei. Füllen Sie die Ergebnisspalte mit nan und erstellen Sie sie. Kombinieren Sie Zug und Test.
# Load activities.
# Read and combine.
activs = pd.read_csv('../input/act_train.csv')
TestActivs = pd.read_csv('../input/act_test.csv')
TestActivs['outcome'] = np.nan ## Add the missing column to the test set.
activs = pd.concat([activs, TestActivs], axis=0) ## Append train and test sets.
del TestActivs
Es gibt viele Variablen in der act-Datei, aber wir werden nur auf people_id, result, activity_id und date abzielen. Die extrahierten Aktivierungen werden aus der Personendatei mit der gelesenen ppl (people_id) verknüpft und zusammengeführt.
# Extract only required variables.
activs = activs[['people_id', 'outcome', 'activity_id', 'date']] ## Let's look at these columns only.
# Merge people data into activities.
## This keeps all the rows from activities.
d1 = pd.merge(activs, ppl, on='people_id', how='right')
## These are the indices of the rows from the test set.
testset = ppl[ppl['people_id'].isin(d1[d1['outcome'].isnull()]['people_id'])].index
d1['activdate'] = pd.to_datetime(d1['date_x'])
del activs
Lassen Sie uns zunächst die Daten visualisieren. Beispiel hier enthält kein Beispielskript Der Analyseinhalt ist jedoch sehr einfach. Der Zweck hier sind die folgenden drei.
Schauen wir uns char_38 an, den einzigen angegebenen kontinuierlichen Wert. Hier ist das Ergebnis der Division von char_38 des Zuges durch das Ergebnis.
Es hat eine ziemlich charakteristische Verteilung. Vergleichen Sie als nächstes die Verteilung von char_38 mit train und test.
Sie können sehen, dass sie fast die gleiche Verteilung haben. Schauen wir uns als nächstes die Beziehung zwischen Personendaten und Ergebnis an. Zeichnen Sie Kunden mit allen 0en und 1 Ergebnissen und Kunden mit 0en und 1en in einem Balkendiagramm.
Sie sehen, dass fast alle Kunden auf 0 oder 1 ausgerichtet sind. Visualisieren Sie abschließend die Beziehung zwischen char_38 und ROC. Schauen wir uns hier das Vorhersageergebnis an, wenn nur 0 oder 1 Kundendaten verwendet werden, und das Vorhersageergebnis von Kundendaten, die beide enthalten. Die Beschreibung von dmi3kno beschreibt nicht speziell, welcher Algorithmus verwendet wurde, aber ich denke, dass wahrscheinlich XGBoost verwendet wird.
Aus den obigen Ergebnissen wurde herausgefunden, dass die Ergebnisse fast aller Kunden mit ziemlich hoher Genauigkeit einfach unter Verwendung von char_38 vorhergesagt werden können. Auf der anderen Seite können wir sehen, dass die Einschätzung für Kunden, die das Ergebnis auf dem Weg geändert haben, schwach ist.
Betrachten wir zunächst den Status von 6 Kunden, die ihr Ergebnis in der Mitte des Prozesses in chronologischer Reihenfolge geändert haben.
Sie können sehen, dass viele Kunden das Ergebnis während der Beobachtung nur einmal ändern. Das Problem ist diesmal die Analyse von Zeitreihendaten, die Änderungen dieses Ergebnisses vorhersagen. Schauen wir uns als nächstes an, wann ein bestimmter Kundencluster das Ergebnis geändert hat. Schauen wir uns eine Variable an, die nur wenige fehlende Werte enthält, hier die Variable group_1. Schauen wir uns das gleiche Diagramm wie zuvor mit 6 zufällig ausgewählten Gruppen_1 an.
Sie können sehen, dass die Änderungen genau die gleichen sind wie bei der grafischen Darstellung mit people_id. Mit anderen Worten, das Ziel dieses Wettbewerbs wird das Problem sein, den Änderungspunkt für jede Gruppe vorherzusagen_1.
Diese "Zwischenelemente" müssen in ihre jeweiligen Gruppen (0 oder 1) gebracht werden.
Die bisherige Analyse wirft einige Fragen auf.
Wenn man diese betrachtet, wird es wie folgt.
Ambivalent ist hier eine Gruppe, die sowohl 0 als auch 1 enthält, Uniform ist eine Gruppe mit nur einer einzigen 0 und 1 und unbekannt ist eine Gruppe, die für die Testgruppe einzigartig ist. Als nächstes wollen wir sehen, wie viele Aktivitäten jede Gruppe enthält. Wenn Sie diese beispielsweise zufällig vorhersagen (ohne eindeutigen Indikator), können Sie sehen, wie hoch die Entropiemaximierung am höchsten ist. Wenn Sie XGBoost und char_38 verwenden, erhalten Sie einen Hinweis darauf.
Eine andere Sache, in der ambivalenten Gruppe, werden wir untersuchen, wie oft sich das Ergebnis geändert hat.
Bouncing ist eine Gruppe, in der bidirektionale Änderungen von 0 nach 1 und von 1 nach 0 auftreten. Unter diesen Sprüngen werden wir uns einige Gruppen ansehen, die sich mehr als einmal geändert haben.
##
## 0 1 2 3
## 25646 3687 565 1
Schließlich visualisieren wir einige dieser Gruppen, deren Ergebnisse sich mehrfach geändert haben.
Recommended Posts