

Bild vom Autor
# Einführung
Wir haben alle Stunden damit verbracht, ein Modell zu debuggen, nur um dann festzustellen, dass es nicht der Algorithmus, sondern ein falscher Nullwert warfare, der Ihre Ergebnisse in Zeile 47.832 manipulierte. Kaggle-Wettbewerbe erwecken den Eindruck, dass Daten als saubere, intestine beschriftete CSVs ohne Klassenungleichgewichte erzeugt werden, aber in Wirklichkeit ist das nicht der Fall.
In diesem Artikel untersuchen wir anhand eines realen Datenprojekts vier praktische Schritte zur Vorbereitung auf den Umgang mit chaotischen, realen Datensätzen.
# NoBroker-Datenprojekt: Ein praktischer Check des realen Chaos
NoBroker ist ein indisches Unternehmen für Immobilientechnologie (Prop-Tech), das Immobilieneigentümer und Mieter direkt auf einem maklerfreien Marktplatz verbindet.

Dieses Datenprojekt wird während des Rekrutierungsprozesses für die Information-Science-Positionen bei NoBroker verwendet.
In diesem Datenprojekt möchte NoBroker, dass Sie ein Vorhersagemodell erstellen, das abschätzt, wie viele Interaktionen eine Immobilie innerhalb eines bestimmten Zeitraums erhalten wird. Wir werden hier nicht das gesamte Projekt abschließen, aber es wird uns dabei helfen, Methoden zu finden, mit denen wir uns an chaotischen Daten aus der realen Welt trainieren können.
Es verfügt über drei Datensätze:
property_data_set.csv- Enthält Immobiliendetails wie Typ, Lage, Ausstattung, Größe, Miete und andere Wohnmerkmale.
property_photos.tsv- Enthält Immobilienfotos.
property_interactions.csv- Enthält den Zeitstempel der Interaktion mit den Eigenschaften.
# Vergleich sauberer Interviewdaten mit echten Produktionsdaten: Der Realitätscheck
Interviewdatensätze sind ausgefeilt, ausgewogen und langweilig. Echte Produktionsdaten? Es ist ein Müllcontainerfeuer mit fehlenden Werten, doppelten Zeilen, inkonsistenten Formaten und stillen Fehlern, die bis Freitag um 17:00 Uhr warten, um Ihre Pipeline zu unterbrechen.
Nehmen Sie den NoBroker-Eigenschaftsdatensatz, ein reales Durcheinander mit 28.888 Eigenschaften in drei Tabellen. Auf den ersten Blick sieht es intestine aus. Wenn Sie jedoch tiefer graben, werden Sie 11.022 fehlende Foto-URLs (Uniform Useful resource Locators), beschädigte JSON-Zeichenfolgen mit betrügerischen Backslashes und mehr finden.
Dies ist die Grenze zwischen sauber und chaotisch. Saubere Daten lehren Sie, Modelle zu bauen, aber Produktionsdaten schulen Sie darin, durch Kämpfe zu überleben.
Wir werden vier Praktiken erkunden, mit denen Sie sich selbst trainieren können.

# Übung Nr. 1: Umgang mit fehlenden Daten
Fehlende Daten sind nicht nur ärgerlich; Es ist ein Entscheidungspunkt. Zeile löschen? Füllen Sie es mit dem Mittelwert? Als unbekannt kennzeichnen? Die Antwort hängt davon ab, warum die Daten fehlen und wie viel Sie sich leisten können, zu verlieren.
Der NoBroker-Datensatz wies drei Arten fehlender Daten auf. Der photo_urls In der Spalte fehlten 11.022 Werte aus 28.888 Zeilen – das sind 38 % des Datensatzes. Hier ist der Code.
Hier ist die Ausgabe.

Durch das Löschen dieser Zeilen würden wertvolle Eigentumsdatensätze gelöscht. Stattdessen bestand die Lösung darin, fehlende Fotos so zu behandeln, als ob es keine gäbe, und weiterzumachen.
def correction(x):
if x is np.nan or x == 'NaN':
return 0 # Lacking images = 0 images
else:
return len(json.hundreds(x.substitute('', '').substitute('{title','{"title')))
pics('photo_count') = pics('photo_urls').apply(correction)
Für numerische Spalten wie total_floor (23 fehlen) und kategoriale Spalten wie building_type (38 fehlen), die Strategie warfare Imputation. Füllen Sie numerische Lücken mit dem Mittelwert und kategoriale Lücken mit dem Modus.
for col in x_remain_withNull.columns:
x_remain(col) = x_remain_withNull(col).fillna(x_remain_withNull(col).imply())
for col in x_cat_withNull.columns:
x_cat(col) = x_cat_withNull(col).fillna(x_cat_withNull(col).mode()(0))
Die erste Entscheidung: Nicht unkritisch löschen!
Verstehe das Muster. Die fehlenden Foto-URLs waren nicht zufällig.
# Übung Nr. 2: Ausreißer erkennen
Ein Ausreißer ist nicht immer ein Fehler, aber er ist immer verdächtig.
Können Sie sich eine 800 Jahre alte Immobilie mit 21 Badezimmern oder einer Fläche von 40.000 Quadratmetern vorstellen? Entweder haben Sie Ihren Traumort gefunden oder jemand hat einen Dateneingabefehler gemacht.
Der NoBroker-Datensatz warfare voller dieser Warnsignale. Boxplots zeigten Extremwerte über mehrere Spalten hinweg: Immobilien mit einem Alter von über 100 Jahren, Größen über 10.000 Quadratfuß (Quadratfuß) und Einlagen über 3,5 Millionen. Bei einigen handelte es sich um echte Luxusimmobilien. Bei den meisten handelte es sich um Dateneingabefehler.
df_num.plot(sort='field', subplots=True, figsize=(22,10))
plt.present()
Hier ist die Ausgabe.

Die Lösung warfare die auf dem Interquartilbereich (IQR) basierende Ausreißerentfernung, eine einfache statistische Methode, die Werte über dem Zweifachen des IQR kennzeichnet.
Um dies zu bewältigen, schreiben wir zunächst eine Funktion, die diese Ausreißer entfernt.
def remove_outlier(df_in, col_name):
q1 = df_in(col_name).quantile(0.25)
q3 = df_in(col_name).quantile(0.75)
iqr = q3 - q1
fence_low = q1 - 2 * iqr
fence_high = q3 + 2 * iqr
df_out = df_in.loc((df_in(col_name) <= fence_high) & (df_in(col_name) >= fence_low))
return df_out # Observe: Multiplier modified from 1.5 to 2 to match implementation.
Und wir führen diesen Code auf numerischen Spalten aus.
df = dataset.copy()
for col in df_num.columns:
if col in ('gymnasium', 'raise', 'swimming_pool', 'request_day_within_3d', 'request_day_within_7d'):
proceed # Skip binary and goal columns
df = remove_outlier(df, col)
print(f"Earlier than: {dataset.form(0)} rows")
print(f"After: {df.form(0)} rows")
print(f"Eliminated: {dataset.form(0) - df.form(0)} rows ({((dataset.form(0) - df.form(0)) / dataset.form(0) * 100):.1f}% discount)")
Hier ist die Ausgabe.

Nach dem Entfernen von Ausreißern schrumpfte der Datensatz von 17.386 Zeilen auf 15.170, wodurch 12,7 % der Daten verloren gingen, während das Modell vernünftig blieb. Der Kompromiss hat sich gelohnt.
Für Zielvariablen wie request_day_within_3dAnstelle einer Löschung wurde eine Kappung verwendet. Werte über 10 wurden auf 10 begrenzt, um zu verhindern, dass excessive Ausreißer die Vorhersagen verzerren. Im folgenden Code vergleichen wir auch die Ergebnisse vorher und nachher.
def capping_for_3days(x):
num = 10
return num if x > num else x
df('request_day_within_3d_capping') = df('request_day_within_3d').apply(capping_for_3days)
before_count = (df('request_day_within_3d') > 10).sum()
after_count = (df('request_day_within_3d_capping') > 10).sum()
total_rows = len(df)
change_count = before_count - after_count
percent_change = (change_count / total_rows) * 100
print(f"Earlier than capping (>10): {before_count}")
print(f"After capping (>10): {after_count}")
print(f"Decreased by: {change_count} ({percent_change:.2f}% of complete rows affected)")
Das Ergebnis?

Eine sauberere Verteilung, bessere Modellleistung und weniger Debugging-Sitzungen.
# Übung Nr. 3: Umgang mit Duplikaten und Inkonsistenzen
Duplikate sind einfach. Inkonsistenzen sind schwer. Eine doppelte Zeile ist einfach df.drop_duplicates(). Ein inkonsistentes Format, etwa ein JSON-String, der von drei verschiedenen Systemen entstellt wurde, erfordert detektivische Arbeit.
Der NoBroker-Datensatz wies eine der schlimmsten JSON-Inkonsistenzen auf, die ich je gesehen habe. Der photo_urls Die Spalte sollte eigentlich gültige JSON-Arrays enthalten, stattdessen warfare sie jedoch mit fehlerhaften Zeichenfolgen, fehlenden Anführungszeichen, maskierten Backslashes und zufälligen nachgestellten Zeichen gefüllt.
text_before = pics('photo_urls')(0)
print('Earlier than Correction: nn', text_before)
Hier ist die Vorher-Korrektur.

Der Repair erforderte mehrere Zeichenfolgenersetzungen, um die Formatierung vor dem Parsen zu korrigieren. Hier ist der Code.
text_after = text_before.substitute('', '').substitute('{title', '{"title').substitute(')"', ')').substitute('),"', ')","')
parsed_json = json.hundreds(text_after)
Hier ist die Ausgabe.

Der JSON warfare nach dem Repair tatsächlich gültig und analysierbar. Es ist nicht der sauberste Weg, diese Artwork der String-Manipulation durchzuführen, aber es funktioniert.
Sie sehen überall inkonsistente Formate: als Zeichenfolgen gespeicherte Datumsangaben, Tippfehler in kategorialen Werten und als Floats gespeicherte numerische IDs.
Die Lösung ist Standardisierung, wie wir es bei der JSON-Formatierung getan haben.
# Übung Nr. 4: Datentypvalidierung und Schemaprüfungen
Alles beginnt, wenn Sie Ihre Daten laden. Später herauszufinden, dass Datumsangaben Zeichenfolgen oder Zahlen Objekte sind, wäre Zeitverschwendung.
Im NoBroker-Projekt wurden die Typen während des CSV-Lesens selbst validiert, da das Projekt im Vorfeld die richtigen Datentypen durchsetzte Pandas Parameter. Hier ist der Code.
information = pd.read_csv('property_data_set.csv')
print(information('activation_date').dtype)
information = pd.read_csv('property_data_set.csv',
parse_dates=('activation_date'),
infer_datetime_format=True,
dayfirst=True)
print(information('activation_date').dtype)
Hier ist die Ausgabe.

Die gleiche Validierung wurde auf den Interaktionsdatensatz angewendet.
interplay = pd.read_csv('property_interactions.csv',
parse_dates=('request_date'),
infer_datetime_format=True,
dayfirst=True)
Dies warfare nicht nur eine gute Praxis, sondern auch für alles, was nachgelagert warfare, von wesentlicher Bedeutung. Das Projekt erforderte Berechnungen von Datums- und Zeitunterschieden zwischen dem Aktivierungs- und dem Anforderungsdatum.
Der folgende Code würde additionally einen Fehler erzeugen, wenn Datumsangaben Zeichenfolgen sind.
num_req('request_day') = (num_req('request_date') - num_req('activation_date')) / np.timedelta64(1, 'D')
Durch Schemaprüfungen wird sichergestellt, dass sich die Struktur nicht ändert. In Wirklichkeit werden die Daten jedoch auch driften, da sich ihre Verteilung im Laufe der Zeit tendenziell ändert. Sie können diese Abweichung nachahmen, indem Sie die Eingabeanteile ein wenig variieren lassen und prüfen, ob Ihr Modell oder seine Validierung in der Lage ist, diese Abweichung zu erkennen und darauf zu reagieren.
# Dokumentieren Sie Ihre Reinigungsschritte
In drei Monaten werden Sie sich nicht mehr daran erinnern, warum Sie sich eingeschränkt haben request_day_within_3d auf 10. In sechs Monaten wird Ihr Teamkollege die Pipeline durchbrechen, indem er Ihren Ausreißerfilter entfernt. In einem Jahr wird das Modell in Produktion gehen und niemand wird verstehen, warum es einfach scheitert.
Die Dokumentation ist nicht elective. Das ist der Unterschied zwischen einer reproduzierbaren Pipeline und einem Voodoo-Skript, das so lange funktioniert, bis es nicht mehr funktioniert.
Das NoBroker-Projekt dokumentierte jede Transformation in Codekommentaren und strukturierten Notizbuchabschnitten mit Erklärungen und einem Inhaltsverzeichnis.
# Project
# Learn and Discover All Datasets
# Information Engineering
Dealing with Pics Information
Variety of Interactions Inside 3 Days
Variety of Interactions Inside 7 Days
Merge Information
# Exploratory Information Evaluation and Processing
# Function Engineering
Take away Outliers
One-Scorching Encoding
MinMaxScaler
Classical Machine Studying
Predicting Interactions Inside 3 Days
Deep Studying
# Attempt to right the primary Json
# Attempt to substitute corrupted values then convert to json
# Operate to right corrupted json and get rely of images
Auch die Versionskontrolle ist wichtig. Verfolgen Sie Änderungen an Ihrer Reinigungslogik. Speichern Sie Zwischendatensätze. Führen Sie ein Änderungsprotokoll darüber, was Sie versucht haben und was funktioniert hat.
Das Ziel ist nicht Perfektion. Das Ziel ist Klarheit. Wenn Sie nicht erklären können, warum Sie eine Entscheidung getroffen haben, können Sie sie auch nicht verteidigen, wenn das Modell versagt.
# Letzte Gedanken
Saubere Daten sind ein Mythos. Die besten Datenwissenschaftler sind nicht diejenigen, die vor unordentlichen Datensätzen davonlaufen; Sie sind diejenigen, die wissen, wie man sie zähmt. Sie entdecken die fehlenden Werte vor dem Coaching.
Sie sind in der Lage, Ausreißer zu identifizieren, bevor sie Vorhersagen beeinflussen. Sie prüfen Schemata, bevor sie Tabellen verknüpfen. Und sie schreiben alles auf, damit der nächste nicht bei Null anfangen muss.
Perfekte Daten haben keine wirkliche Wirkung. Es beruht auf der Fähigkeit, mit fehlerhaften Daten umzugehen und dennoch etwas Funktionales zu konstruieren.
Wenn Sie additionally mit einem Datensatz arbeiten müssen und Nullwerte, unterbrochene Zeichenfolgen und Ausreißer sehen, besteht kein Grund zur Sorge. Was Sie sehen, ist kein Drawback, sondern eine Gelegenheit, Ihre Fähigkeiten anhand eines realen Datensatzes unter Beweis zu stellen.
Nate Rosidi ist Datenwissenschaftler und in der Produktstrategie tätig. Er ist außerdem außerordentlicher Professor für Analytik und Gründer von StrataScratch, einer Plattform, die Datenwissenschaftlern hilft, sich mit echten Interviewfragen von High-Unternehmen auf ihre Interviews vorzubereiten. Nate schreibt über die neuesten Developments auf dem Karrieremarkt, gibt Ratschläge zu Vorstellungsgesprächen, stellt Information-Science-Projekte vor und behandelt alles rund um SQL.
