Duilleag meallta Notepad airson ro-phròiseasadh dàta luath

Gu math tric bidh daoine a tha a’ dol a-steach don raon Saidheans Dàta a’ sùileachadh nas lugha na reusanta air na tha a’ feitheamh riutha. Tha mòran den bheachd gum bi iad a-nis a’ sgrìobhadh lìonraidhean neural fionnar, a’ cruthachadh neach-cuideachaidh guth bho Iron Man, no a’ bualadh air a h-uile duine anns na margaidhean ionmhais.
Ach obraich Dàta Tha neach-saidheans air a stiùireadh le dàta, agus is e aon de na taobhan as cudromaiche agus as caitheamh ùine a bhith a’ giullachd an dàta mus tèid a bhiadhadh a-steach do lìonra neural no a mhion-sgrùdadh ann an dòigh shònraichte.

San artaigil seo, bheir an sgioba againn cunntas air mar as urrainn dhut dàta a phròiseasadh gu sgiobalta agus gu furasta le stiùireadh ceum air cheum agus còd. Dh’ fheuch sinn ris a’ chòd a dhèanamh gu math sùbailte agus ghabhadh a chleachdadh airson diofar stòran-dàta.

Is dòcha nach lorg mòran de phroifeiseantaich dad iongantach san artaigil seo, ach bidh e comasach do luchd-tòiseachaidh rudeigin ùr ionnsachadh, agus faodaidh neach sam bith a tha air a bhith a’ bruadar o chionn fhada leabhar notaichean air leth a dhèanamh airson giullachd dàta luath is structarail an còd a chopaigeadh agus a chruth dhaibh fhèin, no luchdaich sìos an leabhar notaichean crìochnaichte bho Github.

Fhuair sinn an stòr-dàta. Dè an ath rud a nì thu?

Mar sin, an ìre: feumaidh sinn tuigsinn cò ris a tha sinn a’ dèiligeadh, an dealbh iomlan. Gus seo a dhèanamh, bidh sinn a’ cleachdadh pandathan gus dìreach diofar sheòrsaichean dàta a mhìneachadh.

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

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

Duilleag meallta Notepad airson ro-phròiseasadh dàta luath

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

Duilleag meallta Notepad airson ro-phròiseasadh dàta luath

Bheir sinn sùil air luachan nan colbhan:

  1. A bheil an àireamh de loidhnichean anns gach colbh a’ freagairt ris an àireamh iomlan de loidhnichean?
  2. Dè an t-adhbhar a tha aig an dàta anns gach colbh?
  3. Dè an colbh a tha sinn airson a chuimseachadh gus ro-innse a dhèanamh air a shon?

Leigidh freagairtean nan ceistean sin leat an dàta a mhion-sgrùdadh agus plana a dhealbhadh airson na h-ath ghnìomhan agad.

Cuideachd, airson sùil nas doimhne a thoirt air na luachan anns gach colbh, is urrainn dhuinn an gnìomh pandathan tuairisgeul () a chleachdadh. Ach, is e ana-cothrom na gnìomh seo nach eil e a’ toirt seachad fiosrachadh mu cholbhan le luachan sreang. Bidh sinn a 'dèiligeadh riutha nas fhaide air adhart.

df.describe()

Duilleag meallta Notepad airson ro-phròiseasadh dàta luath

Draoidheachd lèirsinneach

Bheir sinn sùil air far nach eil luachan againn idir:

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

Duilleag meallta Notepad airson ro-phròiseasadh dàta luath

B 'e sealladh goirid a bha seo bho shuas, a-nis gluaisidh sinn air adhart gu rudan nas inntinniche

Feuchaidh sinn ri colbhan a lorg agus, ma ghabhas e dèanamh, aig nach eil ach aon luach anns a h-uile sreath (cha toir iad buaidh air an toradh ann an dòigh sam bith):

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

A-nis bidh sinn gar dìon fhèin agus soirbheachas ar pròiseact bho loidhnichean dùblaichte (loidhnichean anns a bheil an aon fhiosrachadh san aon òrdugh ri aon de na loidhnichean a th’ ann):

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

Bidh sinn a 'roinn an dàta ann an dà: aon le luachan càileachd, agus am fear eile le luachan àireamhach

An seo feumaidh sinn soilleireachadh beag a dhèanamh: mura h-eil na loidhnichean le dàta a tha a dhìth ann an dàta càileachdail agus cainneachdail gu math ceangailte ri chèile, feumaidh sinn co-dhùnadh dè a dh’ ìobras sinn - a h-uile loidhne le dàta a tha a dhìth, dìreach pàirt dhiubh, no colbhan sònraichte. Ma tha na loidhnichean co-cheangailte, tha a h-uile còir againn an dàta a roinn na dhà. Rud eile, feumaidh tu an toiseach dèiligeadh ris na loidhnichean nach eil co-cheangailte ris an dàta a tha a dhìth ann an càileachdail agus àireamhach, agus dìreach an uairsin roinn an dàta gu dà.

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

Bidh sinn a’ dèanamh seo gus a dhèanamh nas fhasa dhuinn an dà sheòrsa dàta seo a phròiseasadh - nas fhaide air adhart tuigidh sinn cho fada nas fhasa a nì seo ar beatha.

Bidh sinn ag obair le dàta cainneachdail

Is e a’ chiad rud a bu chòir dhuinn a dhèanamh faighinn a-mach a bheil “colbhan brathaidh” anns an dàta cainneachdail. Canaidh sinn na colbhan sin ris gu bheil iad gan taisbeanadh fhèin mar dhàta cainneachdail, ach ag obair mar dàta càileachdail.

Ciamar a dh’aithnicheas sinn iad? Gu dearbh, tha e uile an urra ri nàdar an dàta a tha thu a 'dèanamh anailis, ach san fharsaingeachd is dòcha nach eil mòran dàta sònraichte aig na colbhan sin (timcheall air 3-10 luachan sònraichte).

print(df_numerical.nunique())

Aon uair ‘s gu bheil sinn air na colbhan brathaidh a chomharrachadh, gluaisidh sinn iad bho dhàta cainneachdail gu dàta càileachdail:

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

Mu dheireadh, tha sinn air dàta cainneachdail a sgaradh gu tur bho dhàta càileachdail agus a-nis is urrainn dhuinn obrachadh leis mar bu chòir. Is e a 'chiad rud a bhith a' tuigsinn far a bheil luachan falamh againn (NaN, agus ann an cuid de chùisean thèid gabhail ri 0 mar luachan falamh).

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

Aig an ìre seo, tha e cudromach tuigsinn dè na colbhan a dh’ fhaodadh a bhith a’ comharrachadh luachan a tha a dhìth: a bheil seo mar thoradh air mar a chaidh an dàta a chruinneachadh? No am faodadh e a bhith co-cheangailte ri luachan dàta? Feumar na ceistean sin a fhreagairt air stèidh cùis ma seach.

Mar sin, ma cho-dhùnas sinn fhathast gur dòcha gu bheil sinn a’ call dàta far a bheil neamhan, bu chòir dhuinn NaN a chuir an àite nan neamhan gus a dhèanamh nas fhasa obrachadh leis an dàta caillte seo nas fhaide air adhart:

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

A-nis chì sinn far a bheil sinn a 'call dàta:

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

Duilleag meallta Notepad airson ro-phròiseasadh dàta luath

An seo bu chòir na luachan sin taobh a-staigh nan colbhan a tha a dhìth a bhith air an comharrachadh ann am buidhe. Agus a-nis tha an spòrs a 'tòiseachadh - ciamar a dhèiligeas tu ris na luachan sin? Am bu chòir dhomh sreathan a sguabadh às leis na luachan no na colbhan sin? No lìon na luachan falamh sin le feadhainn eile?

Seo dealbh tuairmseach a chuidicheas tu gus co-dhùnadh dè as urrainn, ann am prionnsapal, a dhèanamh le luachan falamh:

Duilleag meallta Notepad airson ro-phròiseasadh dàta luath

0. Thoir air falbh colbhan neo-riatanach

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

1. A bheil an àireamh de luachan falamh sa cholbh seo nas àirde na 50%?

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

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

2. Sguab às loidhnichean le luachan falamh

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

3.1. A’ cur a-steach luach air thuaiream

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

3.2. A 'cur a-steach luach seasmhach

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. Cuir a-steach an luach cuibheasach no as trice

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. Cuir a-steach an luach air a thomhas le modail eile

Aig amannan faodar luachan a thomhas le bhith a ’cleachdadh mhodalan ath-tharraing a’ cleachdadh mhodalan bhon leabharlann sklearn no leabharlannan eile den aon seòrsa. Bheir an sgioba againn artaigil air leth seachad air mar a ghabhas seo a dhèanamh a dh’ aithghearr.

Mar sin, airson a-nis, thèid stad a chuir air an aithris mu dhàta cainneachdail, oir tha mòran nuances eile ann a thaobh mar a nì thu ullachadh dàta agus ro-phròiseasadh nas fheàrr airson diofar ghnìomhan, agus chaidh aire a thoirt do na rudan bunaiteach airson dàta cainneachdail san artaigil seo, agus a-nis an t-àm airson tilleadh gu dàta càileachdail, a dhealaich sinn grunn cheuman air ais bhon fheadhainn àireamhach. Faodaidh tu an leabhar notaichean seo atharrachadh mar a thogras tu, ga atharrachadh gu diofar ghnìomhan, gus am bi ro-phròiseasadh dàta a’ dol gu math luath!

Dàta càileachdail

Gu bunaiteach, airson dàta càileachdail, thathas a’ cleachdadh an dòigh còdaidh One-hot-hot gus a chruth bho shreang (no rud) gu àireamh. Mus gluais sinn air adhart chun na h-ìre seo, cleachd sinn an diagram agus an còd gu h-àrd gus dèiligeadh ri luachan falamh.

df_categorical.nunique()

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

Duilleag meallta Notepad airson ro-phròiseasadh dàta luath

0. Thoir air falbh colbhan neo-riatanach

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

1. A bheil an àireamh de luachan falamh sa cholbh seo nas àirde na 50%?

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

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

2. Sguab às loidhnichean le luachan falamh

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

3.1. A’ cur a-steach luach air thuaiream

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

3.2. A 'cur a-steach luach seasmhach

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)

Mar sin, tha làmh againn mu dheireadh air nulls ann an dàta càileachdail. A-nis tha an t-àm ann còdachadh aon-teth a dhèanamh air na luachan a tha san stòr-dàta agad. Tha an dòigh seo glè thric air a chleachdadh gus dèanamh cinnteach gun ionnsaich an algairim agad bho dhàta àrd-inbhe.

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

Mar sin, tha sinn mu dheireadh air crìoch a chuir air giullachd dàta càileachdail is cainneachdail air leth - ùine airson an cur còmhla air ais

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

Às deidh dhuinn na stòran-dàta a chur còmhla ann an aon, is urrainn dhuinn mu dheireadh cruth-atharrachadh dàta a chleachdadh a’ cleachdadh MinMaxScaler bhon leabharlann sklearn. Nì seo na luachan againn eadar 0 agus 1, a chuidicheas nuair a bhios sinn a 'trèanadh a' mhodail san àm ri teachd.

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

Tha an dàta seo a-nis deiseil airson rud sam bith - lìonraidhean neural, algorithms ML àbhaisteach, msaa!

San artaigil seo, cha tug sinn aire do bhith ag obair le dàta sreath ùine, oir airson an leithid de dhàta bu chòir dhut dòighean giullachd beagan eadar-dhealaichte a chleachdadh, a rèir do ghnìomh. Anns an àm ri teachd, bheir an sgioba againn artaigil air leth don chuspair seo, agus tha sinn an dòchas gum bi e comasach dha rudeigin inntinneach, ùr agus feumail a thoirt a-steach do do bheatha, dìreach mar an tè seo.

Source: www.habr.com

Cuir beachd ann