Notizblock-Cheat Blat fir séier Datevirveraarbechtung

Dacks hunn d'Leit, déi an d'Beräich vun der Data Science erakommen, manner wéi realistesch Erwaardunge vun deem wat op hinnen erwaart. Vill Leit mengen datt se elo cool neural Netzwierker schreiwen, e Stëmmassistent vum Iron Man erstellen oder jiddereen op de Finanzmäert schloen.
Awer Aarbecht Daten Wëssenschaftler ass dategedriwwen, an ee vun de wichtegsten an Zäitopwendende Aspekter ass d'Veraarbechtung vun den Donnéeën ier se an en neuralt Netzwierk fidderen oder se op eng gewësse Manéier analyséiert.

An dësem Artikel wäert eis Team beschreiwen wéi Dir Daten séier an einfach mat step-by-step Instruktiounen a Code veraarbecht kënnt. Mir hu probéiert de Code zimmlech flexibel ze maachen a konnt fir verschidden Datesätz benotzt ginn.

Vill Fachleit fannen vläicht näischt Aussergewéinleches an dësem Artikel, awer Ufänger kënnen eppes Neies léieren, a jiddereen dee laang gedreemt huet en separaten Notizbuch fir séier a strukturéiert Datenveraarbechtung ze maachen, kann de Code kopéieren a fir sech selwer formatéieren, oder Luet de fäerdege Notizbuch vum Github erof.

Mir hunn den Dataset kritt. Wat fir nächst ze maachen?

Also, de Standard: mir musse verstoen wat mir ze dinn hunn, d'Gesamtbild. Fir dëst ze maachen, benotze mir Pandas fir einfach verschidden Datentypen ze definéieren.

import pandas as pd #импортируем pandas
import numpy as np  #импортируем numpy
df = pd.read_csv("AB_NYC_2019.csv") #читаем датасет и записываем в переменную df

df.head(3) #смотрим на первые 3 строчки, чтобы понять, как выглядят значения

Notizblock-Cheat Blat fir séier Datevirveraarbechtung

df.info() #Демонстрируем информацию о колонках

Notizblock-Cheat Blat fir séier Datevirveraarbechtung

Loosst eis d'Kolonnwäerter kucken:

  1. Entsprécht d'Zuel vun den Zeilen an all Kolonn der Gesamtzuel vun de Linnen?
  2. Wat ass d'Essenz vun den Donnéeën an all Kolonn?
  3. Wéi eng Kolonn wëlle mir zielen fir Prognosen dofir ze maachen?

D'Äntwerten op dës Froen erlaaben Iech d'Datesaz ze analyséieren an ongeféier e Plang fir Är nächst Handlungen ze zéien.

Och, fir e méi déif Bléck op d'Wäerter an all Kolonn, kënne mir d'Pandas beschreiwen () Funktioun benotzen. Wéi och ëmmer, den Nodeel vun dëser Funktioun ass datt et keng Informatioun iwwer Kolonnen mat Stringwäerter gëtt. Mir këmmeren eis spéider mat hinnen.

df.describe()

Notizblock-Cheat Blat fir séier Datevirveraarbechtung

Magic Visualiséierung

Loosst eis kucken wou mir guer keng Wäerter hunn:

import seaborn as sns
sns.heatmap(df.isnull(),yticklabels=False,cbar=False,cmap='viridis')

Notizblock-Cheat Blat fir séier Datevirveraarbechtung

Dëst war e kuerze Bléck vun uewen, elo wäerte mir op méi interessant Saache weidergoen

Loosst eis probéieren Spalten ze fannen an, wa méiglech, ewechzehuelen déi nëmmen ee Wäert an all Reihen hunn (si wäerten d'Resultat op kee Fall beaflossen):

df = df[[c for c
        in list(df)
        if len(df[c].unique()) > 1]] #Перезаписываем датасет, оставляя только те колонки, в которых больше одного уникального значения

Elo schütze mir eis selwer an den Erfolleg vun eisem Projet vu duplizéierte Linnen (Linnen déi déiselwecht Informatioun an der selwechter Uerdnung enthalen wéi eng vun den existente Linnen):

df.drop_duplicates(inplace=True) #Делаем это, если считаем нужным.
                                 #В некоторых проектах удалять такие данные с самого начала не стоит.

Mir deelen den Dataset an zwee: eng mat qualitative Wäerter, an déi aner mat quantitativen

Hei musse mir eng kleng Klärung maachen: Wann d'Linnen mat fehlenden Donnéeën a qualitativen a quantitativen Donnéeën net ganz matenee korreléiert sinn, da musse mir entscheeden wat mir opferen - all d'Linnen mat fehlenden Donnéeën, nëmmen en Deel vun hinnen, oder bestëmmte Sailen. Wann d'Linnen korreléiert sinn, dann hu mir all Recht d'Datetaz an zwee ze deelen. Soss musst Dir fir d'éischt mat de Linnen ëmgoen, déi net déi fehlend Donnéeën a qualitativ a quantitativ korreléieren, an nëmmen dann d'Dateset an zwee deelen.

df_numerical = df.select_dtypes(include = [np.number])
df_categorical = df.select_dtypes(exclude = [np.number])

Mir maachen dat fir et méi einfach ze maachen fir dës zwou verschidden Zorte vun Daten ze veraarbechten - spéider wäerte mir verstoen wéi vill méi einfach dëst eist Liewen mécht.

Mir schaffen mat quantitativen Donnéeën

Déi éischt Saach, déi mir maache sollten, ass festzestellen, ob et "Spiounskolonnen" an de quantitativen Donnéeën ass. Mir nennen dës Kolonnen dat well se sech als quantitativ Daten presentéieren, awer als qualitativ Daten handelen.

Wéi kënne mir se identifizéieren? Natierlech hänkt alles vun der Natur vun den Donnéeën of, déi Dir analyséiert, awer allgemeng kënnen esou Kolonnen wéineg eenzegaarteg Donnéeën hunn (an der Regioun vun 3-10 eenzegaarteg Wäerter).

print(df_numerical.nunique())

Wann mir d'Spiounsäulen identifizéiert hunn, wäerte mir se vu quantitativen Donnéeën op qualitativ Donnéeën réckelen:

spy_columns = df_numerical[['колонка1', 'колока2', 'колонка3']]#выделяем колонки-шпионы и записываем в отдельную dataframe
df_numerical.drop(labels=['колонка1', 'колока2', 'колонка3'], axis=1, inplace = True)#вырезаем эти колонки из количественных данных
df_categorical.insert(1, 'колонка1', spy_columns['колонка1']) #добавляем первую колонку-шпион в качественные данные
df_categorical.insert(1, 'колонка2', spy_columns['колонка2']) #добавляем вторую колонку-шпион в качественные данные
df_categorical.insert(1, 'колонка3', spy_columns['колонка3']) #добавляем третью колонку-шпион в качественные данные

Schlussendlech hu mir quantitativ Donnéeën komplett vu qualitativen Donnéeën getrennt an elo kënne mir richteg domat schaffen. Als éischt musse mir verstoen wou mir eidel Wäerter hunn (NaN an an e puer Fäll 0 ginn als eidel Wäerter ugeholl).

for i in df_numerical.columns:
    print(i, df[i][df[i]==0].count())

Zu dësem Zäitpunkt ass et wichteg ze verstoen, a wéi enge Spalten Nullen fehlend Wäerter kënnen uginn: ass dëst wéinst wéi d'Donnéeë gesammelt goufen? Oder kéint et mat den Datewäerter verbonne sinn? Dës Froen musse vu Fall zu Fall beäntwert ginn.

Also, wa mir nach ëmmer entscheeden datt mir Daten fehlen wou et Nullen sinn, sollte mir d'Nullen duerch NaN ersetzen fir et méi einfach ze maachen mat dëse verluerene Donnéeën méi spéit ze schaffen:

df_numerical[["колонка 1", "колонка 2"]] = df_numerical[["колонка 1", "колонка 2"]].replace(0, nan)

Loosst eis elo kucken wou mir Daten fehlen:

sns.heatmap(df_numerical.isnull(),yticklabels=False,cbar=False,cmap='viridis') # Можно также воспользоваться df_numerical.info()

Notizblock-Cheat Blat fir séier Datevirveraarbechtung

Hei sollten déi Wäerter an de Sailen déi fehlen a giel markéiert ginn. An elo fänkt de Spaass un - wéi mat dëse Wäerter ëmzegoen? Soll ech Reihen mat dëse Wäerter oder Kolonnen läschen? Oder fëllt dës eidel Wäerter mat aneren?

Hei ass en ongeféieren Diagramm deen Iech hëllefe kann entscheeden wat am Prinzip mat eidel Wäerter ka gemaach ginn:

Notizblock-Cheat Blat fir séier Datevirveraarbechtung

0. Ewechzehuelen onnéideg Saile

df_numerical.drop(labels=["колонка1","колонка2"], axis=1, inplace=True)

1. Ass d'Zuel vun eidel Wäerter an dëser Kolonn méi wéi 50%?

print(df_numerical.isnull().sum() / df_numerical.shape[0] * 100)

df_numerical.drop(labels=["колонка1","колонка2"], axis=1, inplace=True)#Удаляем, если какая-то колонка имеет больше 50 пустых значений

2. Läschen Linnen mat eidel Wäerter

df_numerical.dropna(inplace=True)#Удаляем строчки с пустыми значениями, если потом останется достаточно данных для обучения

3.1. En zoufälleg Wäert aginn

import random #импортируем random
df_numerical["колонка"].fillna(lambda x: random.choice(df[df[column] != np.nan]["колонка"]), inplace=True) #вставляем рандомные значения в пустые клетки таблицы

3.2. E konstante Wäert aginn

from sklearn.impute import SimpleImputer #импортируем SimpleImputer, который поможет вставить значения
imputer = SimpleImputer(strategy='constant', fill_value="<Ваше значение здесь>") #вставляем определенное значение с помощью SimpleImputer
df_numerical[["новая_колонка1",'новая_колонка2','новая_колонка3']] = imputer.fit_transform(df_numerical[['колонка1', 'колонка2', 'колонка3']]) #Применяем это для нашей таблицы
df_numerical.drop(labels = ["колонка1","колонка2","колонка3"], axis = 1, inplace = True) #Убираем колонки со старыми значениями

3.3. Fügt den duerchschnëttleche oder heefegste Wäert un

from sklearn.impute import SimpleImputer #импортируем SimpleImputer, который поможет вставить значения
imputer = SimpleImputer(strategy='mean', missing_values = np.nan) #вместо mean можно также использовать most_frequent
df_numerical[["новая_колонка1",'новая_колонка2','новая_колонка3']] = imputer.fit_transform(df_numerical[['колонка1', 'колонка2', 'колонка3']]) #Применяем это для нашей таблицы
df_numerical.drop(labels = ["колонка1","колонка2","колонка3"], axis = 1, inplace = True) #Убираем колонки со старыми значениями

3.4. Füügt de Wäert vun engem anere Modell berechent

Heiansdo kënne Wäerter berechent ginn mat Regressiounsmodeller mat Modeller aus der Sklearn Bibliothéik oder aner ähnlech Bibliothéiken. Eist Team wäert en separaten Artikel widmen wéi dëst an der nächster Zukunft gemaach ka ginn.

Also, fir de Moment, wäert d'narrativ iwwer quantitativ Donnéeën ënnerbrach ginn, well et vill aner Nuancen iwwer wéi d'Datepräparatioun an d'Virveraarbechtung fir verschidden Aufgaben besser ass, an d'Basis Saache fir quantitativ Donnéeën goufen an dësem Artikel berücksichtegt, an elo ass d'Zäit fir op qualitativ Daten zréckzekommen, déi mir e puer Schrëtt zréck vun de quantitativen getrennt hunn. Dir kënnt dëst Notizbuch änneren wéi Dir wëllt, et un verschidden Aufgaben upassen, sou datt d'Datevirveraarbechtung ganz séier geet!

Qualitativ Daten

Prinzipiell, fir qualitativ Donnéeën, gëtt d'One-Hot-Kodéierungsmethod benotzt fir se vun enger String (oder Objet) op eng Nummer ze formatéieren. Ier mer op dëse Punkt weidergoen, loosst eis den Diagramm an de Code hei uewen benotzen fir mat eidel Wäerter ze këmmeren.

df_categorical.nunique()

sns.heatmap(df_categorical.isnull(),yticklabels=False,cbar=False,cmap='viridis')

Notizblock-Cheat Blat fir séier Datevirveraarbechtung

0. Ewechzehuelen onnéideg Saile

df_categorical.drop(labels=["колонка1","колонка2"], axis=1, inplace=True)

1. Ass d'Zuel vun eidel Wäerter an dëser Kolonn méi wéi 50%?

print(df_categorical.isnull().sum() / df_numerical.shape[0] * 100)

df_categorical.drop(labels=["колонка1","колонка2"], axis=1, inplace=True) #Удаляем, если какая-то колонка 
                                                                          #имеет больше 50% пустых значений

2. Läschen Linnen mat eidel Wäerter

df_categorical.dropna(inplace=True)#Удаляем строчки с пустыми значениями, 
                                   #если потом останется достаточно данных для обучения

3.1. En zoufälleg Wäert aginn

import random
df_categorical["колонка"].fillna(lambda x: random.choice(df[df[column] != np.nan]["колонка"]), inplace=True)

3.2. E konstante Wäert aginn

from sklearn.impute import SimpleImputer
imputer = SimpleImputer(strategy='constant', fill_value="<Ваше значение здесь>")
df_categorical[["новая_колонка1",'новая_колонка2','новая_колонка3']] = imputer.fit_transform(df_categorical[['колонка1', 'колонка2', 'колонка3']])
df_categorical.drop(labels = ["колонка1","колонка2","колонка3"], axis = 1, inplace = True)

Also, mir hunn endlech e Grëff op Null a qualitativen Donnéeën. Elo ass et Zäit fir eng Hot-Kodéierung op d'Wäerter auszeféieren déi an Ärer Datebank sinn. Dës Method gëtt ganz dacks benotzt fir sécherzestellen datt Ären Algorithmus vu qualitativ héichwäerteg Daten léiere kann.

def encode_and_bind(original_dataframe, feature_to_encode):
    dummies = pd.get_dummies(original_dataframe[[feature_to_encode]])
    res = pd.concat([original_dataframe, dummies], axis=1)
    res = res.drop([feature_to_encode], axis=1)
    return(res)

features_to_encode = ["колонка1","колонка2","колонка3"]
for feature in features_to_encode:
    df_categorical = encode_and_bind(df_categorical, feature))

Also, mir hunn endlech getrennte qualitativ a quantitativ Donnéeën veraarbecht - Zäit fir se zréck ze kombinéieren

new_df = pd.concat([df_numerical,df_categorical], axis=1)

Nodeems mir d'Datesätz zesummen an een kombinéiert hunn, kënne mir endlech Datentransformatioun benotze mat MinMaxScaler aus der sklearn-Bibliothéik. Dëst wäert eis Wäerter tëscht 0 an 1 maachen, wat hëlleft beim Training vum Modell an Zukunft.

from sklearn.preprocessing import MinMaxScaler
min_max_scaler = MinMaxScaler()
new_df = min_max_scaler.fit_transform(new_df)

Dës Donnéeën sinn elo prett fir alles - neural Netzwierker, Standard ML Algorithmen, etc.!

An dësem Artikel hu mir net berücksichtegt d'Aarbecht mat Zäitreihendaten ze berücksichtegen, well fir sou Donnéeën e bëssen ënnerschiddlech Veraarbechtungstechnike benotzen, ofhängeg vun Ärer Aufgab. An Zukunft wäert eis Team en separaten Artikel zu dësem Thema widmen, a mir hoffen datt et fäeg ass eppes interessant, neit an nëtzlech an Ärem Liewen ze bréngen, sou wéi dëst.

Source: will.com

Setzt e Commentaire