Notepad-cheat sheet għal preproċessar veloċi tad-Data

Ħafna drabi n-nies li jidħlu fil-qasam tax-Xjenza tad-Data jkollhom aspettattivi inqas minn realistiċi ta’ dak li jistenniehom. Ħafna nies jaħsbu li issa se jiktbu netwerks newrali friski, joħolqu assistent tal-vuċi minn Iron Man, jew jegħlbu lil kulħadd fis-swieq finanzjarji.
Imma xogħol Data Ix-xjenzat huwa mmexxi mid-dejta, u wieħed mill-aspetti l-aktar importanti u li jieħu ħafna ħin huwa l-ipproċessar tad-dejta qabel ma jdaħħalha f'netwerk newrali jew janalizzaha b'ċertu mod.

F'dan l-artikolu, it-tim tagħna se jiddeskrivi kif tista' tipproċessa d-dejta malajr u faċilment b'istruzzjonijiet u kodiċi pass pass. Aħna ppruvajna nagħmlu l-kodiċi pjuttost flessibbli u jista 'jintuża għal settijiet ta' dejta differenti.

Ħafna professjonisti jistgħu ma jsibu xejn straordinarju f'dan l-artikolu, iżda dawk li jibdew ikunu jistgħu jitgħallmu xi ħaġa ġdida, u kull min ilu joħlom li jagħmel notebook separat għall-ipproċessar tad-dejta veloċi u strutturat jista 'jikkopja l-kodiċi u jifformattjah għalihom infushom, jew niżżel in-notebook lest minn Github.

Irċevejna s-sett tad-dejta. X'għandek tagħmel wara?

Allura, l-istandard: irridu nifhmu dak li qed nittrattaw, l-istampa ġenerali. Biex tagħmel dan, nużaw pandas biex sempliċement niddefinixxu tipi ta 'dejta differenti.

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

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

Notepad-cheat sheet għal preproċessar veloċi tad-Data

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

Notepad-cheat sheet għal preproċessar veloċi tad-Data

Ejja nħarsu lejn il-valuri tal-kolonna:

  1. In-numru ta' linji f'kull kolonna jikkorrispondi man-numru totali ta' linji?
  2. X'inhi l-essenza tad-dejta f'kull kolonna?
  3. Liema kolonna rridu nimmiraw sabiex nagħmlu tbassir għaliha?

It-tweġibiet għal dawn il-mistoqsijiet jippermettulek tanalizza s-sett tad-dejta u bejn wieħed u ieħor tfassal pjan għall-azzjonijiet li jmiss tiegħek.

Ukoll, għal ħarsa aktar profonda lejn il-valuri f'kull kolonna, nistgħu nużaw il-funzjoni pandas describe(). Madankollu, l-iżvantaġġ ta 'din il-funzjoni huwa li ma tipprovdix informazzjoni dwar kolonni b'valuri ta' string. Aħna ser nittrattawhom aktar tard.

df.describe()

Notepad-cheat sheet għal preproċessar veloċi tad-Data

Viżwalizzazzjoni maġika

Ejja nħarsu lejn fejn m'għandna l-ebda valuri:

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

Notepad-cheat sheet għal preproċessar veloċi tad-Data

Din kienet ħarsa qasira minn fuq, issa se ngħaddu għal aktar affarijiet interessanti

Ejja nippruvaw insibu u, jekk possibbli, ineħħu kolonni li għandhom valur wieħed biss fir-ringieli kollha (ma jaffettwaw ir-riżultat bl-ebda mod):

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

Issa aħna nipproteġu lilna nfusna u s-suċċess tal-proġett tagħna minn linji duplikati (linji li fihom l-istess informazzjoni fl-istess ordni bħal waħda mil-linji eżistenti):

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

Aħna naqsmu s-sett tad-dejta fi tnejn: wieħed b'valuri kwalitattivi, u l-ieħor b'dawk kwantitattivi

Hawnhekk irridu nagħmlu kjarifika żgħira: jekk il-linji b'dejta nieqsa f'dejta kwalitattiva u kwantitattiva ma tantx ikunu korrelatati ma 'xulxin, allura jkollna niddeċiedu dak li nissagrifikaw - il-linji kollha b'dejta nieqsa, parti minnhom biss, jew ċerti kolonni. Jekk il-linji huma korrelatati, allura għandna kull dritt li naqsmu s-sett tad-dejta fi tnejn. Inkella, l-ewwel ser ikollok bżonn tittratta l-linji li ma jikkorrelatawx id-dejta nieqsa fi kwalitattivi u kwantitattivi, u mbagħad biss taqsam is-sett tad-dejta fi tnejn.

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

Nagħmlu dan biex nagħmluha aktar faċli għalina biex nipproċessaw dawn iż-żewġ tipi differenti ta’ data – aktar tard nifhmu kemm dan jagħmilha aktar faċli għal ħajjitna.

Naħdmu b'dejta kwantitattiva

L-ewwel ħaġa li għandna nagħmlu hija li niddeterminaw jekk hemmx "kolonni spy" fid-dejta kwantitattiva. Dawn il-kolonni nsejħu hekk għax jippreżentaw lilhom infushom bħala data kwantitattiva, iżda jaġixxu bħala data kwalitattiva.

Kif nistgħu nidentifikawhom? Naturalment, kollox jiddependi min-natura tad-dejta li qed tanalizza, iżda b'mod ġenerali kolonni bħal dawn jista 'jkollhom ftit dejta unika (fir-reġjun ta' 3-10 valuri uniċi).

print(df_numerical.nunique())

Ladarba nkunu identifikajna l-kolonni tal-ispjuni, se nċaqalquhom minn dejta kwantitattiva għal dejta kwalitattiva:

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']) #добавляем третью колонку-шпион в качественные данные

Fl-aħħarnett, isseparajna kompletament id-dejta kwantitattiva mid-dejta kwalitattiva u issa nistgħu naħdmu magħha kif suppost. L-ewwel, irridu nifhmu fejn għandna valuri vojta (NaN u f'xi każijiet 0 se jiġu aċċettati bħala valuri vojta).

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

F'dan il-punt, huwa importanti li tifhem f'liema kolonni żerijiet jistgħu jindikaw valuri neqsin: dan huwa minħabba kif inġabret id-dejta? Jew jista 'jkun relatat mal-valuri tad-dejta? Dawn il-mistoqsijiet għandhom jiġu mwieġba fuq bażi ta’ każ b’każ.

Għalhekk, jekk għadna niddeċiedu li nistgħu nkunu nieqes id-dejta fejn hemm żerijiet, għandna nissostitwixxu ż-żeri b'NaN biex nagħmluha aktar faċli biex taħdem b'din id-dejta mitlufa aktar tard:

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

Issa ejja naraw fejn qed neqsin id-dejta:

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

Notepad-cheat sheet għal preproċessar veloċi tad-Data

Hawnhekk dawk il-valuri ġewwa l-kolonni li huma neqsin għandhom ikunu mmarkati bl-isfar. U issa jibda l-gost - kif tittratta dawn il-valuri? Għandi nħassar ringieli b'dawn il-valuri jew kolonni? Jew imla dawn il-valuri vojta b'xi oħrajn?

Hawnhekk hawn dijagramma approssimattiva li tista 'tgħinek tiddeċiedi x'jista', fil-prinċipju, isir b'valuri vojta:

Notepad-cheat sheet għal preproċessar veloċi tad-Data

0. Neħħi kolonni mhux meħtieġa

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

1. In-numru ta' valuri vojta f'din il-kolonna huwa akbar minn 50%?

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

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

2. Ħassar linji b'valuri vojta

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

3.1. Daħħal valur każwali

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

3.2. Daħħal valur kostanti

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. Daħħal il-valur medju jew l-aktar frekwenti

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. Daħħal il-valur ikkalkulat minn mudell ieħor

Xi drabi l-valuri jistgħu jiġu kkalkulati bl-użu ta 'mudelli ta' rigressjoni bl-użu ta 'mudelli mil-librerija sklearn jew libreriji oħra simili. It-tim tagħna se jiddedika artiklu separat dwar kif dan jista’ jsir fil-futur qarib.

Għalhekk, għalissa, in-narrattiva dwar id-dejta kwantitattiva se tiġi interrotta, minħabba li hemm ħafna sfumaturi oħra dwar kif tagħmel aħjar il-preparazzjoni tad-dejta u l-ipproċessar minn qabel għal kompiti differenti, u l-affarijiet bażiċi għad-dejta kwantitattiva tqiesu f'dan l-artikolu, u issa wasal iż-żmien li nerġgħu lura għal data kwalitattiva li isseparajna diversi passi lura minn dawk kwantitattivi. Tista' tibdel dan in-notebook kif tixtieq, tadattah għal ħidmiet differenti, sabiex il-preproċessar tad-dejta jmur malajr ħafna!

Data kwalitattiva

Bażikament, għal dejta kwalitattiva, jintuża l-metodu One-hot-kodifikazzjoni sabiex jiġi fformattjat minn string (jew oġġett) għal numru. Qabel ma ngħaddu għal dan il-punt, ejja nużaw id-dijagramma u l-kodiċi ta 'hawn fuq biex nittrattaw valuri vojta.

df_categorical.nunique()

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

Notepad-cheat sheet għal preproċessar veloċi tad-Data

0. Neħħi kolonni mhux meħtieġa

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

1. In-numru ta' valuri vojta f'din il-kolonna huwa akbar minn 50%?

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

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

2. Ħassar linji b'valuri vojta

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

3.1. Daħħal valur każwali

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

3.2. Daħħal valur kostanti

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)

Allura, aħna fl-aħħar ltqajna manku fuq nulli fid-dejta kwalitattiva. Issa wasal iż-żmien li twettaq one-hot-coding fuq il-valuri li huma fid-database tiegħek. Dan il-metodu huwa użat ħafna drabi biex jiżgura li l-algoritmu tiegħek jista 'jitgħallem minn data ta' kwalità għolja.

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

Allura, fl-aħħar spiċċajna nipproċessaw data kwalitattiva u kwantitattiva separata - żmien li ngħaqqduhom lura

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

Wara li kkombinajna s-settijiet tad-dejta flimkien f'wieħed, fl-aħħar nistgħu nużaw it-trasformazzjoni tad-dejta billi tuża MinMaxScaler mil-librerija sklearn. Dan se jagħmel il-valuri tagħna bejn 0 u 1, li se jgħinu fit-taħriġ tal-mudell fil-futur.

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

Din id-dejta issa hija lesta għal kull ħaġa - netwerks newrali, algoritmi ML standard, eċċ.!

F'dan l-artikolu, aħna ma qisniex ix-xogħol b'dejta ta 'serje ta' ħin, peress li għal data bħal din għandek tuża tekniki ta 'proċessar kemmxejn differenti, skond il-kompitu tiegħek. Fil-futur, it-tim tagħna se jiddedika artiklu separat għal dan is-suġġett, u nittamaw li jkun jista 'jġib xi ħaġa interessanti, ġdida u utli f'ħajtek, bħal dan.

Sors: www.habr.com

Żid kumment