[PYTHON] Kaggle Zusammenfassung: BOSCH (Intro + Forumsdiskussion)

Einführung

Wir werden die Informationen von Kaggle aktualisieren, der in der Vergangenheit teilgenommen hat. Hier werden wir die Dateneinführung von BOSCH und die prominente Diskussion im Forum aufgreifen. Für den Code des Gewinners des Wettbewerbs und des nützlichen Kernels Kaggle Summary: BOSCH (Gewinner), [Kaggle Summary: BOSCH (Kernel)](http: // qiita.com/TomHortons/items/359f8e39b9cd424c2360), eine Zusammenfassung und Diskussionszusammenfassung. (Der Inhalt des Forums wird später hinzugefügt.)

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. Forum
  5. Referenz

Hintergrund

logo

BOSCH ist ein globaler Hersteller von mechanischen Teilen. Wir haben unsere eigenen Produktionsstätten auf der ganzen Welt, und natürlich enthalten die fertigen Produkte selten fehlerhafte Produkte. Der durch dieses fehlerhafte Produkt verursachte wirtschaftliche Verlust ist groß und die Ursache des fehlerhaften Produkts ist kompliziert. Der Zweck dieser Zeit besteht daher darin, vorherzusagen, ob ein fehlerhaftes Produkt oder ein gutes Produkt hergestellt werden kann, basierend auf den Beobachtungsdaten, die von der BOSCH-Produktionsanlage erhalten wurden.

Die charakteristischen Punkte dieser Zeit sind wie folgt.

2. Bewertungsindex

Der Bewertungsindex lautet diesmal MCC.

MCC = \frac{(TP * TN) - (FP * FN)}{\sqrt{(TP + FP)(TP + FN)(TN + FP)(TN + FN)}},

Bei Etikettendaten beträgt die Wahrscheinlichkeit fehlerhafter Produkte etwa 1 zu 1000. Wenn beispielsweise vorausgesagt wird, dass alle Produkte gut sind, liegt die richtige Antwortrate über 99%. Mit F Measure oder MCC ist es möglich, solche extrem uneinheitlichen Daten richtig auszuwerten.

Darüber hinaus drückt das Format der übermittelten Datei die Entsprechung zwischen ID und Antwort in CSV aus.

Id,Response
1,0
2,1
3,0
etc.

3. Einführung von Daten

Es gibt drei Arten von diesen Daten.

Wenn ein fehlerhaftes Produkt auftritt, ist 'Antwort' = 1, und wenn es ein gutes Produkt ist, ist 'Antwort' = 0. Alle Daten sind (sehr) groß und anonymisiert, und alle Spaltennamen werden durch "Produktionslinie \ _station \ _features" dargestellt. Beispielsweise sind "L3_S36_F3939" die numerischen Daten für die 3. Zeile, die 36. Station und die 3939. Merkmalsmenge.

numeric data Die Daten sind so groß, dass das Programm beim Lesen der numerischen Daten auf dem Laptop angehalten wird. Überprüfen Sie daher zunächst nur den Spaltennamen und die Anzahl der Proben. TRAIN_NUMERIC ist der Pfad zu train_numeric.csv.

check_numeric.py


import numpy as np
import pandas as pd

numeric_cols = pd.read_csv(TRAIN_NUMERIC, nrows = 1).columns.values
print numeric_cols
print 'cols.shape: ', numeric_cols.shape

F0 = pd.read_csv(TRAIN_NUMERIC, usecols=(numeric_cols[:2].tolist() + ['Response']))
print 'F0.shape: ', F0.shape

Das Ausführungsbeispiel sieht folgendermaßen aus.

array(['Id', 'L0_S0_F0', 'L0_S0_F2', 'L0_S0_F4', 'L0_S0_F6', 'L0_S0_F8',
       'L0_S0_F10', 'L0_S0_F12', 'L0_S0_F14', 'L0_S0_F16', 'L0_S0_F18',
       'L0_S0_F20', 'L0_S0_F22', 'L0_S1_F24', 'L0_S1_F28', 'L0_S2_F32',
       'L0_S2_F36', 'L0_S2_F40', 'L0_S2_F44', 'L0_S2_F48', 'L0_S2_F52',
       'L0_S2_F56', 'L0_S2_F60', 'L0_S2_F64', 'L0_S3_F68', 'L0_S3_F72',
       .....
       'L3_S50_F4245', 'L3_S50_F4247', 'L3_S50_F4249', 'L3_S50_F4251',
       'L3_S50_F4253', 'L3_S51_F4256', 'L3_S51_F4258', 'L3_S51_F4260',
       'L3_S51_F4262', 'Response'], dtype=object)
cols.shape:  (970,)
F0.shape:  (1183747, 2)

ID ist ein Parameter, der der Datums- und Kategoriedatei zugeordnet ist. Sie sehen, dass es 968 erklärende Variablen für fehlerhafte Produkte gibt. Sie können auch sehen, dass die Anzahl der Proben mit 1.183.747 sehr groß ist. Jede Variable enthält die folgenden reellen Zahlen und fehlenden Werte.

              Id  L0_S0_F0  Response
0              4     0.030         0
1              6       NaN         0
2              7     0.088         0
3              9    -0.036         0

categorical data Betrachten Sie die kategorialen Daten auf die gleiche Weise. TRAIN_CAT ist der Pfad zu train_categorical.csv.

check_category.py


cat_cols = pd.read_csv(TRAIN_CAT, nrows = 1).columns.values
print 'cat_cols: ', cat_cols
print 'cat_cols.shape: ', cat_cols.shape

cats = pd.read_csv(TRAIN_CAT, usecols=(cat_cols[:2].tolist()))
print 'cats.shape: ', cats.shape
print cats

Dies ist das Ausführungsergebnis.

cat_cols: ['Id' 'L0_S1_F25' 'L0_S1_F27' ..., 'L3_S49_F4237' 'L3_S49_F4239'
 'L3_S49_F4240']

cat_cols.shape:  (2141,)

cats.shape:  (1183747, 2)

              Id L0_S1_F25
0              4       NaN
1              6       NaN
2              7       NaN
3              9       NaN
4             11       NaN
5             13       NaN
6             14       NaN
7             16       NaN
8             18       NaN

Die Anzahl der Stichproben entspricht der Anzahl der numerischen Daten, und die Anzahl der Variablen beträgt 2141, was fast dem Doppelten entspricht. 'Antwort' ist nicht in den Kategoriedaten enthalten.

date data Schauen wir uns zum Schluss die Datumsdatei an. TRAIN_DATE ist der Pfad zu train_date.csv.

check_date.py


date_cols = pd.read_csv(TRAIN_DATE, nrows = 1).columns.values
date = pd.read_csv(TRAIN_DATE, usecols=(date_cols[:2].tolist()))

print 'date_cols.shape: ', date_cols.shape
print date_cols
print 'date.shape: ', date.shape
print date

Dies ist das Ausführungsergebnis.

date_cols.shape:  (1157,)
['Id' 'L0_S0_D1' 'L0_S0_D3' ..., 'L3_S51_D4259' 'L3_S51_D4261'
 'L3_S51_D4263']
date.shape:  (1183747, 2)
              Id  L0_S0_D1
0              4     82.24
1              6       NaN
2              7   1618.70
3              9   1149.20
4             11    602.64
5             13   1331.66

Die Anzahl der Variablen beträgt 1157, was etwas größer als die numerische Zahl ist. Die Anzahl der Proben ist gleich. Das Ende des Variablennamens ändert sich von F nach D, z. B. "L0_S0_D1". Beispielsweise bedeutet L0_S0_D1 den Zeitstempel von L0_S0_F0 und L0_S0_D3 den Zeitstempel von L0_S0_F2. Ich habe nicht untersucht, warum die Variablen mehr als numerische Daten sind.

  1. Forum Hier sind einige der herausragenden Interaktionen, die ich beim Durchsuchen der Foren gefunden habe. Da die direkte Lösung und die im Forum erschienenen Beispielprogramme in einem anderen Artikel zusammengefasst sind, konzentrieren wir uns hier auf Know-how und allgemeine Diskussion.

4.1 Was ist zuerst zu tun, wenn Sie unbekannte multivariate Daten haben?

Es gibt Daten und Beschriftungen. Aber ich weiß nicht, was ich zuerst tun soll. Es gab einen hilfreichen Beitrag für diejenigen, die sagten.

Picture1.png

  1. Da es sich möglicherweise um einen Teil der Rohdaten handelt, visualisieren Sie diese zunächst mit einer Tabelle. Zu diesem Zeitpunkt sind die fehlenden Werte und numerischen Daten über dem Schwellenwert farbig und die gesamten Daten werden grob visuell bestätigt.
  2. Erstellen Sie die kumulative Verteilung der Beschriftungen, die Sie für alle Variablen im selben Diagramm schätzen möchten. Überprüfen Sie zu diesem Zeitpunkt, ob ein Muster vorhanden ist.
  3. Nehmen Sie wichtige Variablen mit einem Standard für die Informationsmenge auf, z. B. feature_importance von XGBoost, gini, entropy. 4.3 Zeichnen Sie alle in 3 ausgewählten Merkmalskombinationen mithilfe eines Streudiagramms.

2 ~ 4 werden in Kaggle Summary: BOSCH (Kernel) mit spezifischem Code in 4. EDA von wichtigen Merkmalen eingeführt.

Ich habe den Beispielcode 2 erstellt.

Geben Sie alle Variablen als [violinplot] in eine Datei aus (http://qiita.com/TomHortons/items/5b585a6860ff5ccd5ba5). Bitte stellen Sie den Pfad so ein, wie Sie möchten.

from scipy import stats
import pandas as pd
import numpy as np
import matplotlib as mpl
mpl.use('Agg')
import matplotlib.pyplot as plt
import seaborn as sns


DATA_DIR = "../input"


TRAIN_NUMERIC = "{0}/train_numeric.csv".format(DATA_DIR)
TEST_NUMERIC = "{0}/test_numeric.csv".format(DATA_DIR)

COL_BATCH = 100
numeric_cols = pd.read_csv(TRAIN_NUMERIC, nrows = 1).columns.values

for n_ in range(len(numeric_cols)/COL_BATCH):
    cols = numeric_cols[(n_*COL_BATCH):(n_*COL_BATCH+COL_BATCH)].tolist()
    train = pd.read_csv(TRAIN_NUMERIC, index_col = 0, usecols=(cols + ['Response']))
    X_neg, X_pos = train[train['Response'] == 0].iloc[:, :-1], train[train['Response']==1].iloc[:, :-1]
    
    BATCH_SIZE = 10
    dummy = []
    source = train.drop('Response', axis=1)

    for n in list(range(0, train.shape[1], BATCH_SIZE)):
        data = source.iloc[:, n:n+BATCH_SIZE]
        data_cols = data.columns.tolist()
        dummy.append(pd.melt(pd.concat([data, train.Response], axis=1), id_vars = 'Response', value_vars = data_cols))
        
    FIGSIZE = (3*(BATCH_SIZE),4*(COL_BATCH/BATCH_SIZE))
    _, axs = plt.subplots(len(dummy), figsize = FIGSIZE)
    for data, ax in zip(dummy, axs):
        v_plots = sns.violinplot(x = 'variable',  y = 'value', hue = 'Response', data = data, ax = ax, split =True)
    v_plots.get_figure().savefig("violin_{0}.jpg ".format(n_))

Über die Erstellung von Streuzeichnungen von 4

Daten, die viele fehlende Werte wie diese Zeit enthalten, können nicht als Streudiagramm angezeigt werden. Speichern Sie daher jede Variable vor dem Plotten auf dem Medianwert. Unten ist ein Beispiel.

import pandas as pd
import numpy as np
import seaborn as sns

features_names = [
    'L0_S11_F298', 'L1_S24_F1672', 'L1_S24_F766', 'L1_S24_F1844',
    'L1_S24_F1632', 'L1_S24_F1723', 'L1_S24_F1846', 'L1_S25_F2761',
    'L1_S25_F2193'
]
features = pd.read_csv(TRAIN_NUMERIC, index_col = 0, usecols=(features_names + ['Response'])).reset_index()
for f in features.columns[:-1]:
    features[f][np.isnan(features[f])] = features[f].median()
    
X_neg, X_pos = features[features['Response'] == 0], features[features['Response']==1]
volumes = len(X_pos) if len(X_pos)<len(X_neg) else len(X_neg)
features = pd.concat([X_pos, X_neg]).reset_index(drop=True)
g = sns.pairplot(features, hue="Response", vars=test.columns.tolist()[:-1], markers='.')

4.2 Was tun, wenn die Daten zu groß sind?

Es scheint, dass die Daten dieses Mal durch die Entwicklung einer Vorverarbeitung erheblich reduziert werden können. (Es kann sogar auf einem Laptop von ca. 8G ausgeführt werden)

Diskussion 1

Picture1.png

a) Löschen Sie doppelte Daten, da die Kategoriedaten doppelte Daten enthalten b) Wie in Einführung in den Kernel erläutert, werden in jeder Station mehr als 95% der Datumsdateien dupliziert. Wenn Sie diese löschen, können Sie Datumsfunktionen verwenden. c) Verwenden Sie alle numerischen Daten

a und b können als Ergebnis der Analyse dieser Daten verstanden werden. Es ist klar, dass nicht nur der allgemeine Analyseansatz wichtig ist, sondern auch der Ansatz, der der Individualität der einzelnen Daten entspricht. Ich habe gehört, dass c alle numerischen Daten verwendet, aber mein PC hat angehalten. Es scheint, dass es nicht mit pandas.read so wie es ist behandelt werden kann.

Diskussionsteil 2

Picture1.png

Ähnlich wie bei Raddar kann es auch mit 8 GB Speicher einschließlich Berechnungskosten ausgeführt werden, indem eine Vorverarbeitung durchgeführt wird (Löschen des Merkmalsbetrags mit perfekter Korrelation / doppelter Merkmalsmenge). Eine derart ausgefeilte Vorverarbeitung konnte nicht realisiert werden. Ich hoffe, Sie können es mit Winner's Code verstehen.

4.3 Verwendung der Korrelationswärmekarte und der Datenerzeugung

Obwohl es eine große Anzahl von Variablen gibt, scheinen die Rohdaten keine erkennbare Beurteilung zu geben. Daher wird die Merkmalsmenge aus der Korrelation zwischen den Daten erzeugt. In einem anderen Artikel habe ich erklärt, wie man den Unterschied im Korrelationskoeffizienten visualisiert, wenn ein fehlerhaftes Produkt mit einer Wärmekarte auftritt. Finden Sie Variablen, die für Klassifizierungsprobleme nützlich sind, anhand der Wärmekarte der Korrelationskoeffizienten

Bei dieser Methode wird nach einer Kombination von Variablen gesucht, deren Korrelation unterbrochen wird, wenn ein fehlerhaftes Produkt auftritt, und eine neue Variable wird von PCA verwendet (Hauptkomponentenanalyse). Wie in 4.1 erläutert, wird es, da es eine große Anzahl fehlender Werte enthält, zuerst mit dem Medianwert ergänzt. Zu diesem Zeitpunkt ist es möglicherweise möglich, einen neuen Parameter mit dem komplementierten Teil als 1 und dem nicht abgeschlossenen Teil als 0 zu generieren.

4.4. Lösen von Klassifizierungsproblemen durch Deep Learning

In letzter Zeit wird Keras auf Basis von Tensorflow in Kaggle sehr aktiv eingesetzt. Es scheint, dass Deep Learning Over-Learning in extrem uneinheitlichen Daten wie dieser Zeit wahrscheinlich auftritt, selbst wenn die Anzahl der Stichproben angepasst oder Dropout verwendet wird. Trotzdem gab es Leute, die sich mit Keras nähern wollten. Wenn ich später Zeit habe, werde ich eine Erklärung hinzufügen.

Recommended Posts

Kaggle Zusammenfassung: BOSCH (Intro + Forumsdiskussion)
Kaggle Zusammenfassung: BOSCH (Kernel)
Kaggle Zusammenfassung: BOSCH (Gewinner)
Kaggle Zusammenfassung: Outbrain # 2
Kaggle Zusammenfassung: Outbrain # 1
Kaggle verwandte Zusammenfassung
Kaggle Zusammenfassung: Redhat (Teil 1)
Kaggle Zusammenfassung: Redhat (Teil 2)
Zusammenfassung der Kaggle-Kernel-Methode [Bild]