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.
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.
Der Bewertungsindex lautet diesmal MCC.
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.
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.
Es gibt Daten und Beschriftungen. Aber ich weiß nicht, was ich zuerst tun soll. Es gab einen hilfreichen Beitrag für diejenigen, die sagten.
2 ~ 4 werden in Kaggle Summary: BOSCH (Kernel) mit spezifischem Code in 4. EDA von wichtigen Merkmalen eingeführt.
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_))
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='.')
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)
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.
Ä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.
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.
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