Ħ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
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 строчки, чтобы понять, как выглядят значения
df.info() #Демонстрируем информацию о колонках
Ejja nħarsu lejn il-valuri tal-kolonna:
- In-numru ta' linji f'kull kolonna jikkorrispondi man-numru totali ta' linji?
- X'inhi l-essenza tad-dejta f'kull kolonna?
- 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()
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')
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()
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:
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')
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