Fèy notepad-tronpe pou pre-traitement done rapid

Souvan moun k ap antre nan domèn Syans Done yo gen mwens pase atant reyalis nan sa k ap tann yo. Anpil moun panse ke kounye a yo pral ekri rezo neral fre, kreye yon asistan vwa soti nan Iron Man, oswa bat tout moun nan mache finansye yo.
Men travay Done Syantis se done-kondwi, ak youn nan aspè ki pi enpòtan ak tan konsome se trete done yo anvan manje li nan yon rezo neral oswa analize li nan yon sèten fason.

Nan atik sa a, ekip nou an pral dekri kijan ou ka trete done byen vit ak fasil ak enstriksyon etap pa etap ak kòd. Nou te eseye fè kòd la byen fleksib epi yo ka itilize pou diferan seri done.

Anpil pwofesyonèl pa ka jwenn anyen ekstraòdinè nan atik sa a, men débutan yo pral kapab aprann yon bagay nouvo, ak nenpòt moun ki gen lontan reve fè yon kaye separe pou pwosesis done rapid ak estriktire ka kopye kòd la ak fòma li pou tèt yo, oswa telechaje kaye fini an soti nan Github.

Nou te resevwa dataset la. Kisa pou fè apre?

Se konsa, estanda a: nou bezwen konprann sa nou ap fè fas ak, foto an jeneral. Pou fè sa, nou itilize panda tou senpleman defini diferan kalite done.

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

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

Fèy notepad-tronpe pou pre-traitement done rapid

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

Fèy notepad-tronpe pou pre-traitement done rapid

Ann gade valè kolòn yo:

  1. Èske kantite liy ki nan chak kolòn koresponn ak kantite total liy yo?
  2. Ki sans done yo nan chak kolòn?
  3. Ki kolòn nou vle vize pou nou fè prediksyon pou li?

Repons kesyon sa yo pral pèmèt ou analize seri done a epi apeprè trase yon plan pou pwochen aksyon ou yo.

Epitou, pou yon gade pi fon nan valè yo nan chak kolòn, nou ka itilize fonksyon panda describe(). Sepandan, dezavantaj nan fonksyon sa a se ke li pa bay enfòmasyon sou kolòn ki gen valè fisèl. Nou pral fè fas ak yo pita.

df.describe()

Fèy notepad-tronpe pou pre-traitement done rapid

Vizyalizasyon majik

Ann gade kote nou pa gen okenn valè ditou:

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

Fèy notepad-tronpe pou pre-traitement done rapid

Sa a te yon gade kout soti nan pi wo a, kounye a nou pral deplase sou bagay ki pi enteresan

Ann eseye jwenn epi, si sa posib, retire kolòn ki gen yon sèl valè nan tout ranje (yo pa pral afekte rezilta a nan okenn fason):

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

Koulye a, nou pwoteje tèt nou ak siksè pwojè nou an kont liy kopi (liy ki gen menm enfòmasyon an nan menm lòd ak youn nan liy ki egziste yo):

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

Nou divize dataset la an de: youn ak valè kalitatif, ak lòt la ak valè quantitative

Isit la nou bezwen fè yon ti klarifikasyon: si liy ki gen done ki manke nan done kalitatif ak quantitative yo pa trè korelasyon youn ak lòt, Lè sa a, nou pral bezwen deside ki sa nou sakrifye - tout liy yo ak done ki manke yo, se sèlman yon pati nan yo, oswa sèten kolòn. Si liy yo gen rapò, Lè sa a, nou gen tout dwa divize an de. Sinon, ou pral premye bezwen fè fas ak liy yo ki pa korelasyon done ki manke yo nan kalitatif ak quantitative, epi sèlman Lè sa a, divize seri done a an de.

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

Nou fè sa pou fè li pi fasil pou nou trete de diferan kalite done sa yo - pita nou pral konprann konbyen pi fasil sa fè lavi nou.

Nou travay ak done quantitative

Premye bagay nou ta dwe fè se detèmine si gen "kolòn espyon" nan done yo quantitative. Nou rele kolòn sa yo paske yo prezante tèt yo kòm done quantitative, men yo aji kòm done kalitatif.

Ki jan nou ka idantifye yo? Natirèlman, tout depann sou nati done w ap analize a, men an jeneral kolòn sa yo ka gen ti done inik (nan rejyon an nan 3-10 valè inik).

print(df_numerical.nunique())

Yon fwa nou te idantifye kolòn espyon yo, nou pral deplase yo soti nan done quantitative nan done kalitatif:

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

Finalman, nou te konplètman separe done quantitative ak done kalitatif e kounye a, nou ka travay avèk li byen. Premyèman, nou bezwen konprann ki kote nou gen valè vid (NaN ak nan kèk ka 0 pral aksepte kòm valè vid).

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

Nan pwen sa a, li enpòtan pou konprann nan ki kolòn zewo yo ka endike valè ki manke: èske sa a akòz ki jan done yo te kolekte? Oswa li ka gen rapò ak valè done yo? Yo dwe reponn kesyon sa yo ka pa ka.

Se konsa, si nou toujou deside ke nou ka manke done kote ki gen zewo, nou ta dwe ranplase zewo yo ak NaN pou fè li pi fasil travay ak done pèdi sa yo pita:

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

Koulye a, ann wè ki kote nou manke done:

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

Fèy notepad-tronpe pou pre-traitement done rapid

Isit la valè sa yo andedan kolòn ki manke yo ta dwe make an jòn. Epi, koulye a plezi a kòmanse - ki jan fè fas ak valè sa yo? Èske mwen ta dwe efase ranje ki gen valè oswa kolòn sa yo? Oswa ranpli valè vid sa yo ak kèk lòt?

Isit la se yon dyagram apwoksimatif ki ka ede w deside sa ki ka, an prensip, dwe fè ak valè vid:

Fèy notepad-tronpe pou pre-traitement done rapid

0. Retire kolòn ki pa nesesè yo

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

1. Èske kantite valè vid nan kolòn sa a pi gran pase 50%?

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

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

2. Efase liy ki gen valè vid

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

3.1. Mete yon valè o aza

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

3.2. Mete yon valè konstan

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. Mete valè mwayèn oswa pi souvan

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. Mete valè a kalkile pa yon lòt modèl

Pafwa valè yo ka kalkile lè l sèvi avèk modèl regresyon lè l sèvi avèk modèl ki soti nan bibliyotèk sklearn oswa lòt bibliyotèk menm jan an. Ekip nou an pral konsakre yon atik separe sou fason sa ka fè nan fiti prè.

Se konsa, pou kounye a, naratif la sou done quantitative yo pral entèwonp, paske gen anpil lòt nuans sou fason yo pi byen fè preparasyon done ak pre-pwosesis pou travay diferan, ak bagay debaz yo pou done quantitative yo te pran an kont nan atik sa a, ak kounye a se tan pou retounen nan done kalitatif ke nou separe plizyè etap tounen soti nan sa yo quantitative. Ou ka chanje kaye sa a jan ou vle, adapte li a diferan travay, pou ke pre-pwosesis done ale trè vit!

Done kalitatif

Fondamantalman, pou done kalitatif, yo itilize metòd One-hot-coding la pou fòme li soti nan yon fisèl (oswa objè) nan yon nimewo. Anvan w ale nan pwen sa a, ann itilize dyagram ak kòd ki anwo a pou fè fas ak valè vid yo.

df_categorical.nunique()

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

Fèy notepad-tronpe pou pre-traitement done rapid

0. Retire kolòn ki pa nesesè yo

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

1. Èske kantite valè vid nan kolòn sa a pi gran pase 50%?

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

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

2. Efase liy ki gen valè vid

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

3.1. Mete yon valè o aza

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

3.2. Mete yon valè konstan

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)

Se konsa, nou te finalman te gen yon manch sou nil nan done kalitatif. Koulye a, li lè yo fè yon sèl-cho-kodaj sou valè yo ki nan baz done ou a. Metòd sa a trè souvan itilize pou asire ke algorithm ou a ka aprann nan bon jan kalite done.

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

Se konsa, nou te finalman fini pwosesis separe done kalitatif ak quantitative - tan konbine yo tounen

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

Apre nou te konbine done yo ansanm nan yon sèl, nou ka finalman itilize transfòmasyon done lè l sèvi avèk MinMaxScaler nan bibliyotèk la sklearn. Sa a pral fè valè nou yo ant 0 ak 1, ki pral ede lè fòmasyon modèl la nan tan kap vini an.

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

Done sa yo kounye a pare pou nenpòt bagay - rezo neral, algoritm estanda ML, elatriye!

Nan atik sa a, nou pa t 'pran an kont travay ak done seri tan, paske pou done sa yo ou ta dwe itilize teknik pwosesis yon ti kras diferan, tou depann de travay ou. Nan tan kap vini an, ekip nou an pral konsakre yon atik separe nan sijè sa a, epi nou espere ke li pral kapab pote yon bagay enteresan, nouvo ak itil nan lavi ou, jis tankou sa a.

Sous: www.habr.com

Add nouvo kòmantè