[PYTHON] Kaggle Zusammenfassung: Redhat (Teil 1)

Einführung

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.

Inhaltsverzeichnis

  1. Übersicht
  2. Bewertungsindex
  3. Einführung von Daten
  4. kernels

Hintergrund

front_page.png

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.

2. Bewertungsindex

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.

3. Einführung von Daten

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
  1. Kernels

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.

4.1.1. Datenstruktur

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

__results___6_1.png

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.

__results___8_1.png __results___8_2.png __results___8_3.png

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.

__results___10_1.png __results___10_2.png __results___10_3.png

Ü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

4.3. Bewertung des Ergebnisses und der Gruppe_1, char_38

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.

4.3.1 Was bedeutet char_38?

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.

unnamed-chunk-2-1.png

Es hat eine ziemlich charakteristische Verteilung. Vergleichen Sie als nächstes die Verteilung von char_38 mit train und test.

unnamed-chunk-3-1.png

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.

unnamed-chunk-4-1.png

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.

unnamed-chunk-5-1.png

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.

4.3.2 Merkmale magischer Merkmale

Betrachten wir zunächst den Status von 6 Kunden, die ihr Ergebnis in der Mitte des Prozesses in chronologischer Reihenfolge geändert haben.

unnamed-chunk-6-1.png

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.

unnamed-chunk-7-1.png

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.

unnamed-chunk-8-1.png

Diese "Zwischenelemente" müssen in ihre jeweiligen Gruppen (0 oder 1) gebracht werden.

4.3.3. Fragen

Die bisherige Analyse wirft einige Fragen auf.

Wenn man diese betrachtet, wird es wie folgt.

unnamed-chunk-9-1.png

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.

unnamed-chunk-10-1.png

Eine andere Sache, in der ambivalenten Gruppe, werden wir untersuchen, wie oft sich das Ergebnis geändert hat. unnamed-chunk-11-1.png

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.

unnamed-chunk-13-1.png

Recommended Posts

Kaggle Zusammenfassung: Redhat (Teil 1)
Kaggle Zusammenfassung: Redhat (Teil 2)
Kaggle Zusammenfassung: Outbrain # 2
Kaggle Zusammenfassung: Outbrain # 1
Kaggle verwandte Zusammenfassung
Kaggle ~ Gehäuseanalyse Part ~ Teil1
Kaggle Zusammenfassung: BOSCH (Kernel)
Kaggle Zusammenfassung: BOSCH (Gewinner)
Zusammenfassung der Kaggle-Kernel-Methode [Bild]
Zusammenfassung der Grundkenntnisse von PyPy Teil 1
Kaggle Zusammenfassung: Instacart Market Basket Analyse
Kaggle Zusammenfassung: BOSCH (Intro + Forumsdiskussion)
[Umfrage] Kaggle --Quora 3. Platz Lösungszusammenfassung
28.02.2014 Zusammenfassung der in #ssmjp, Teil 1, vorgestellten Inhalte
[Umfrage] Kaggle --Quora 5. Platz Lösungszusammenfassung
[Umfrage] Kaggle --Quora 4. Platz Lösungszusammenfassung
[Umfrage] Kaggle --Quora 2. Platz Lösungszusammenfassung
Kaggle Memorandum ~ NLP mit Katastrophen-Tweets Teil 1 ~
Kaggle: Einführung in das manuelle Feature Engineering Teil 1