Notepad - варақаи фиреб барои коркарди зуди маълумот

Аксар вақт одамоне, ки ба соҳаи илми маълумот ворид мешаванд, назар ба интизориҳои воқеии он чизе, ки онҳоро интизор аст, камтар доранд. Бисёр одамон фикр мекунанд, ки ҳоло онҳо шабакаҳои нейронии олӣ менависанд, ёвари овозиро аз 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 строчки, чтобы понять, как выглядят значения

Notepad - варақаи фиреб барои коркарди зуди маълумот

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

Notepad - варақаи фиреб барои коркарди зуди маълумот

Биёед ба арзишҳои сутун назар андозем:

  1. Оё шумораи сатрҳои ҳар як сутун ба шумораи умумии сатрҳо мувофиқат мекунад?
  2. Моҳияти маълумот дар ҳар як сутун чист?
  3. Кадом сутунро мо мехоҳем ҳадаф қарор диҳем, то дар бораи он пешгӯиҳо кунем?

Ҷавобҳо ба ин саволҳо ба шумо имкон медиҳанд, ки маҷмӯи маълумотро таҳлил кунед ва нақшаи амалҳои навбатии худро тақрибан тартиб диҳед.

Инчунин, барои амиқтар дидани арзишҳо дар ҳар як сутун, мо метавонем функсияи pandas describe() -ро истифода барем. Аммо, камбудии ин функсия дар он аст, ки вай дар бораи сутунҳои дорои арзишҳои сатр маълумот намедиҳад. Мо баъдтар бо онҳо сарукор хоҳем кард.

df.describe()

Notepad - варақаи фиреб барои коркарди зуди маълумот

Визуализатсияи ҷодугарӣ

Биёед бубинем, ки дар куҷо мо умуман арзиш надорем:

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

Notepad - варақаи фиреб барои коркарди зуди маълумот

Ин як нигоҳи кӯтоҳ аз боло буд, ҳоло мо ба чизҳои ҷолибтар мегузарем

Биёед кӯшиш кунем, ки сутунҳоеро пайдо кунем ва агар имконпазир бошад, дар ҳама сатрҳо танҳо як арзиш доранд (онҳо ба натиҷа таъсир намерасонанд):

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

Notepad - варақаи фиреб барои коркарди зуди маълумот

Дар ин ҷо он арзишҳое, ки дар дохили сутунҳо нестанд, бояд бо ранги зард қайд карда шаванд. Ва акнун шавқовар оғоз мешавад - чӣ гуна бояд бо ин арзишҳо мубориза бурд? Оё ман бояд сатрҳоро бо ин арзишҳо ё сутунҳо нест кунам? Ё ин арзишҳои холиро бо дигар арзишҳо пур кунед?

Ин як диаграммаи тахминӣ аст, ки метавонад ба шумо дар муайян кардани он, ки аслан бо арзишҳои холӣ чӣ кор кардан мумкин аст, кӯмак кунад:

Notepad - варақаи фиреб барои коркарди зуди маълумот

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-coding барои формат кардани он аз сатр (ё объект) ба адад истифода мешавад. Пеш аз гузаштан ба ин нуқта, биёед диаграмма ва рамзи дар боло зикршударо барои кор бо арзишҳои холӣ истифода барем.

df_categorical.nunique()

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

Notepad - варақаи фиреб барои коркарди зуди маълумот

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)

Пас аз он ки мо маҷмӯаҳои додаҳоро ба як муттаҳид кардем, дар ниҳоят мо метавонем табдилдиҳии маълумотро бо истифода аз MinMaxScaler аз китобхонаи sklearn истифода барем. Ин арзишҳои моро байни 0 ва 1 месозад, ки ҳангоми омӯзиши модел дар оянда кӯмак хоҳад кард.

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

Ин маълумот ҳоло барои ҳама чиз омода аст - шабакаҳои нейрон, алгоритмҳои стандартии ML ва ғайра!

Дар ин мақола мо кор бо маълумотҳои силсилаи вақтро ба назар нагирифтаем, зеро барои чунин маълумот шумо бояд вобаста ба вазифаи худ усулҳои коркарди каме гуногунро истифода баред. Дар оянда дастаи мо ба ин мавзӯъ мақолаи алоҳида бахшида хоҳад кард ва мо умедворем, ки он метавонад ба ҳаёти шумо чизи ҷолиб, нав ва муфидро ворид кунад, ба монанди ин.

Манбаъ: will.com

Илова Эзоҳ