Маалыматтарды тез иштетүү үчүн блокнот-чет барагы

Көбүнчө Data Science тармагына кирген адамдар аларды эмне күтүп турганын реалдуу күткөндөн азыраак болушат. Көптөгөн адамдар азыр сонун нейрон тармактарын жазам, Iron Manдан үн жардамчысын түзөбүз же каржы базарларында баарын жеңебиз деп ойлошот.
Бирок иште маалыматтар Окумуштуу маалыматтарга негизделген жана эң маанилүү жана көп убакытты талап кылган аспектилердин бири бул маалыматтарды нейрондук тармакка киргизүүдөн же белгилүү бир жол менен талдоодон мурун иштетүү.

Бул макалада биздин команда сиз кадам-кадам инструкциялар жана код менен маалыматтарды кантип тез жана оңой иштете аларыңызды сүрөттөп берет. Биз кодду бир топ ийкемдүү кылууга аракет кылдык жана ар кандай маалымат топтомдору үчүн колдонулушу мүмкүн.

Көптөгөн адистер бул макалада укмуштуудай эч нерсе таба алышпашы мүмкүн, бирок башталгычтар жаңы нерсени үйрөнө алышат жана маалыматтарды тез жана структуралаштырылган иштетүү үчүн өзүнчө блокнот жасоону көптөн бери кыялданган ар бир адам кодду көчүрүп, аны өзү үчүн форматтаса болот, же даяр блокнотту Githubдан жүктөп алыңыз.

Биз маалымат топтомун алдык. Андан кийин эмне кылуу керек?

Демек, стандарт: биз эмне менен алектенип жатканыбызды, жалпы сүрөттү түшүнүшүбүз керек. Бул үчүн, биз жөн гана ар кандай маалымат түрлөрүн аныктоо үчүн пандаларды колдонобуз.

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() #Демонстрируем информацию о колонках

Маалыматтарды тез иштетүү үчүн блокнот-чет барагы

Келгиле, мамычанын маанилерин карап көрөлү:

  1. Ар бир тилкедеги саптардын саны саптардын жалпы санына туура келеби?
  2. Ар бир тилкедеги маалыматтардын маңызы эмнеде?
  3. Ал үчүн болжолдоолорду жасоо үчүн кайсы тилкени максат кылгыбыз келет?

Бул суроолорго жооптор сизге маалымат топтомун талдап, кийинки иш-аракеттериңиздин планын түзүүгө мүмкүндүк берет.

Ошондой эле, ар бир тилкедеги маанилерди тереңирээк көрүү үчүн, биз pandas describe() функциясын колдоно алабыз. Бирок, бул функциянын кемчилиги сап маанилери бар мамычалар жөнүндө маалымат бербейт. Алар менен кийинчерээк сүйлөшөбүз.

df.describe()

Маалыматтарды тез иштетүү үчүн блокнот-чет барагы

Сыйкырдуу визуализация

Келгиле, бизде эч кандай баалуулуктар жок экенин карап көрөлү:

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

Маалыматтарды тез иштетүү үчүн блокнот-чет барагы

Бул жогорудан кыскача көрүнүш эле, эми биз кызыктуураак нерселерге өтөбүз

Келгиле, бардык саптарда бир гана мааниге ээ болгон мамычаларды табууга жана мүмкүн болсо алып салууга аракет кылалы (алар натыйжага эч кандай таасир тийгизбейт):

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

Эми биз өзүбүздү жана долбоордун ийгилигин кайталанма саптардан коргойбуз (учурдагы саптардын бири менен бирдей тартипте бирдей маалыматты камтыган саптар):

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

Берилиштер топтомун экиге бөлөбүз: бири сапаттык мааниге ээ, экинчиси сандык мааниге ээ

Бул жерде биз бир аз тактоо керек: эгерде сапаттык жана сандык маалыматтарда жетишпеген маалыматтары бар сызыктар бири-бири менен өтө корреляцияланбаса, анда биз эмнени курмандыкка чалаарыбызды чечишибиз керек - жетишпеген маалыматтары бар бардык саптар, алардын бир бөлүгү гана, же айрым мамычалар. Эгерде сызыктар корреляцияланган болсо, анда биз маалымат топтомун экиге бөлүүгө толук укугубуз бар. Болбосо, адегенде жетишпеген маалыматтарды сапаттык жана сандык жактан салыштырбаган сызыктар менен иштешиңиз керек, андан кийин гана маалымат топтомун экиге бөлүңүз.

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

Биз муну бул эки башка типтеги маалыматтарды иштетүүнү жеңилдетүү үчүн жасайбыз - кийинчерээк бул биздин жашообузду канчалык жеңилдеткенин түшүнөбүз.

Биз сандык маалыматтар менен иштейбиз

Эң биринчи биз сандык маалыматтарда "шпион тилкелери" бар же жок экенин аныкташыбыз керек. Биз бул мамычаларды деп атайбыз, анткени алар өздөрүн сандык маалымат катары көрсөтүшөт, бирок сапаттык маалымат катары иштешет.

Аларды кантип аныктайбыз? Албетте, мунун баары сиз анализдеп жаткан маалыматтардын табиятынан көз каранды, бирок жалпысынан мындай мамычалар уникалдуу маалыматтарга ээ болушу мүмкүн (3-10 уникалдуу маанилердин аймагында).

print(df_numerical.nunique())

Биз шпиондук тилкелерди аныктагандан кийин, аларды сандык маалыматтардан сапаттык маалыматтарга өткөрөбүз:

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

Акыр-аягы, биз сапаттык маалыматтардан сандык маалыматтарды толугу менен бөлүп алдык жана азыр биз аны менен туура иштей алабыз. Биринчи нерсе, бизде бош баалуулуктар бар экенин түшүнүү (NaN, ал эми кээ бир учурларда 0 бош маанилер катары кабыл алынат).

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

Бул учурда, кайсы тилкелерде нөл жетишпеген маанилерди көрсөтүшү мүмкүн экенин түшүнүү маанилүү: бул маалыматтар кантип чогултулганына байланыштуубу? Же бул маалымат баалуулуктарына байланыштуу болушу мүмкүнбү? Бул суроолорго ар бир учурда жооп берүү керек.

Демек, эгерде биз дагы эле нөлдөр бар жерде маалымат жок болушу мүмкүн деп чечсек, кийин бул жоголгон маалыматтар менен иштөөнү жеңилдетүү үчүн нөлдөрдү NaN менен алмаштырышыбыз керек:

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

Эми биз кайсы жерде маалыматтар жетишпей жатканын карап көрөлү:

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

Маалыматтарды тез иштетүү үчүн блокнот-чет барагы

Бул жерде жок болгон мамычалардын ичиндеги баалуулуктар сары менен белгилениши керек. Эми кызыктуу башталат - бул баалуулуктар менен кантип күрөшүү керек? Бул маанилер же мамычалар менен саптарды жок кылышым керекпи? Же бул бош баалуулуктарды башка баалуулуктар менен толтурасызбы?

Бул жерде, негизинен, бош баалуулуктар менен эмне кылса болорун чечүүгө жардам бере турган болжолдуу диаграмма:

Маалыматтарды тез иштетүү үчүн блокнот-чет барагы

0. Керексиз мамычаларды алып салыңыз

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

1. Бул тилкедеги бош маанилердин саны 50%дан ашабы?

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

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

2. Бош маанилери бар саптарды жок кылыңыз

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

3.1. Кокус маани киргизүү

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

3.2. Туруктуу маани киргизүү

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. Орточо же эң көп болгон маанини киргизиңиз

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. Башка модел менен эсептелген маанини киргизиңиз

Кээде баалуулуктар sklearn китепканасынын же башка ушул сыяктуу китепканалардын моделдерин колдонуу менен регрессия моделдерин колдонуу менен эсептелиши мүмкүн. Биздин команда жакынкы келечекте муну кантип жасоо керектиги жөнүндө өзүнчө макала арнайт.

Ошентип, азыр сандык маалыматтар жөнүндө баяндоо үзгүлтүккө учурайт, анткени ар кандай тапшырмалар үчүн маалыматтарды даярдоо жана алдын ала иштетүүнү кантип жакшыраак жасоо керектиги жөнүндө көптөгөн башка нюанстар бар жана сандык маалыматтар үчүн негизги нерселер ушул макалада эске алынган, жана азыр сандык маалыматтардан бир нече кадамды бөлүп алган сапаттык маалыматтарга кайтууга убакыт келди. Сиз бул блокнотту каалагандай өзгөртө аласыз, аны ар кандай тапшырмаларга ылайыкташтырсаңыз болот, андыктан маалыматтарды алдын ала иштетүү абдан тез болот!

Сапаттуу маалыматтар

Негизинен, сапаттык маалыматтар үчүн, аны саптан (же объекттен) санга форматтоо үчүн One-hot-коддоо ыкмасы колдонулат. Бул пунктка өтүүдөн мурун, келгиле, бош баалуулуктар менен иштөө үчүн жогорудагы диаграмманы жана кодду колдонолу.

df_categorical.nunique()

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

Маалыматтарды тез иштетүү үчүн блокнот-чет барагы

0. Керексиз мамычаларды алып салыңыз

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

1. Бул тилкедеги бош маанилердин саны 50%дан ашабы?

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

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

2. Бош маанилери бар саптарды жок кылыңыз

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

3.1. Кокус маани киргизүү

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

3.2. Туруктуу маани киргизүү

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)

Ошентип, биз акыры сапаттык маалыматтардагы нөлдөрдү чечтик. Эми маалымат базаңыздагы баалуулуктарга бир ысык коддоону жүргүзүүгө убакыт келди. Бул ыкма сиздин алгоритмиңиздин жогорку сапаттагы маалыматтардан үйрөнүшүн камсыз кылуу үчүн көп колдонулат.

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

Ошентип, биз акыры өзүнчө сапаттык жана сандык маалыматтарды иштеп чыгууну аяктадык - аларды кайра бириктирүүгө убакыт келди

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

Берилиштер топтомун бириктиргенден кийин, акыры sklearn китепканасынан MinMaxScaler аркылуу маалыматтарды трансформациялоону колдоно алабыз. Бул биздин баалуулуктарыбызды 0 жана 1 ортосунда түзөт, бул келечекте моделди үйрөтүүдө жардам берет.

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

Бул маалыматтар азыр баарына даяр - нейрон тармактары, стандарттуу ML алгоритмдери, ж.б.!

Бул макалада биз убакыт серияларынын маалыматтары менен иштөөнү эске алган жокпуз, анткени мындай маалыматтар үчүн сиз өзүңүздүн тапшырмаңызга жараша бир аз башкача иштетүү ыкмаларын колдонушуңуз керек. Келечекте биздин команда бул темага өзүнчө макала арнайт жана ал сиздин жашооңузга ушул сыяктуу кызыктуу, жаңы жана пайдалуу нерселерди киргизе алат деп ишенебиз.

Source: www.habr.com

Комментарий кошуу