Sürətli məlumatların əvvəlcədən işlənməsi üçün notebook fırıldaqçı vərəqi

Çox vaxt Data Science sahəsinə daxil olan insanlar, onları nə gözlədiyinə dair real gözləntilərdən az olur. Bir çox insanlar indi sərin neyron şəbəkələri yazacaqlarını, Dəmir Adamdan səsli köməkçi yaradacaqlarını və ya maliyyə bazarlarında hər kəsi məğlub edəcəklərini düşünürlər.
Amma işlə Tarix Elm adamı məlumatlara əsaslanır və ən vacib və vaxt aparan aspektlərdən biri məlumatları neyron şəbəkəsinə daxil etməzdən və ya müəyyən bir şəkildə təhlil etməzdən əvvəl emal etməkdir.

Bu yazıda komandamız addım-addım təlimat və kodla məlumatları necə tez və asanlıqla emal edə biləcəyinizi təsvir edəcək. Biz kodu kifayət qədər çevik etməyə çalışdıq və müxtəlif verilənlər dəstləri üçün istifadə oluna bildik.

Bir çox mütəxəssis bu məqalədə qeyri-adi bir şey tapa bilməz, lakin yeni başlayanlar yeni bir şey öyrənə biləcəklər və uzun müddətdir sürətli və strukturlaşdırılmış məlumatların işlənməsi üçün ayrıca notebook hazırlamaq arzusunda olan hər kəs kodu köçürə və özləri üçün formatlaya bilər və ya bitmiş notebooku Github-dan yükləyin.

Məlumat dəstini aldıq. Bundan sonra nə etməli?

Beləliklə, standart: nə ilə məşğul olduğumuzu, ümumi mənzərəni başa düşməliyik. Bunu etmək üçün biz müxtəlif məlumat növlərini müəyyən etmək üçün pandalardan istifadə edirik.

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

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

Sürətli məlumatların əvvəlcədən işlənməsi üçün notebook fırıldaqçı vərəqi

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

Sürətli məlumatların əvvəlcədən işlənməsi üçün notebook fırıldaqçı vərəqi

Sütun dəyərlərinə baxaq:

  1. Hər sütundakı sətirlərin sayı sətirlərin ümumi sayına uyğundurmu?
  2. Hər sütundakı məlumatların mahiyyəti nədir?
  3. Onun üçün proqnozlar vermək üçün hansı sütunu hədəfləmək istəyirik?

Bu sualların cavabları sizə məlumat dəstini təhlil etməyə və növbəti hərəkətləriniz üçün təxminən plan tərtib etməyə imkan verəcək.

Həmçinin, hər sütundakı dəyərlərə daha dərindən baxmaq üçün pandas describe() funksiyasından istifadə edə bilərik. Lakin bu funksiyanın dezavantajı onun sətir qiymətləri olan sütunlar haqqında məlumat verməməsidir. Onlarla sonra məşğul olacağıq.

df.describe()

Sürətli məlumatların əvvəlcədən işlənməsi üçün notebook fırıldaqçı vərəqi

Sehrli vizuallaşdırma

Heç bir dəyərimiz olmadığı yerə baxaq:

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

Sürətli məlumatların əvvəlcədən işlənməsi üçün notebook fırıldaqçı vərəqi

Bu yuxarıdan qısa bir baxış idi, indi daha maraqlı şeylərə keçəcəyik

Bütün sətirlərdə yalnız bir dəyəri olan sütunları tapmağa və mümkünsə çıxarmağa çalışaq (onlar heç bir şəkildə nəticəyə təsir etməyəcək):

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

İndi biz özümüzü və layihəmizin uğurunu dublikat sətirlərdən qoruyuruq (mövcud xətlərdən biri ilə eyni ardıcıllıqla eyni məlumatları ehtiva edən sətirlər):

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

Verilənlər dəstini ikiyə bölürük: biri keyfiyyət, digəri isə kəmiyyət

Burada kiçik bir aydınlıq gətirməliyik: keyfiyyət və kəmiyyət məlumatlarında çatışmayan məlumatlar olan sətirlər bir-biri ilə çox əlaqəli deyilsə, o zaman nəyi qurban verəcəyimizə qərar verməli olacağıq - çatışmayan məlumatlar olan bütün xətlər, onların yalnız bir hissəsi, və ya müəyyən sütunlar. Əgər xətlər korrelyasiya edilirsə, onda verilənlər bazasını ikiyə bölmək hüququmuz var. Əks təqdirdə, əvvəlcə çatışmayan məlumatları keyfiyyət və kəmiyyət baxımından əlaqələndirməyən xətlərlə məşğul olmalı və yalnız bundan sonra verilənlər bazasını ikiyə bölməli olacaqsınız.

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

Biz bunu bu iki fərqli məlumat növünü emal etməyimizi asanlaşdırmaq üçün edirik - sonra bunun həyatımızı nə qədər asanlaşdırdığını anlayacağıq.

Biz kəmiyyət məlumatları ilə işləyirik

Etməli olduğumuz ilk şey kəmiyyət məlumatlarında “casus sütunlarının” olub olmadığını müəyyən etməkdir. Biz bu sütunları adlandırırıq, çünki onlar özlərini kəmiyyət məlumatı kimi təqdim edirlər, lakin keyfiyyət məlumatı kimi çıxış edirlər.

Onları necə müəyyən edə bilərik? Əlbəttə ki, hər şey təhlil etdiyiniz məlumatların xarakterindən asılıdır, lakin ümumiyyətlə, belə sütunlarda unikal məlumat az ola bilər (3-10 unikal dəyər bölgəsində).

print(df_numerical.nunique())

Casus sütunlarını müəyyən etdikdən sonra onları kəmiyyət məlumatlarından keyfiyyət məlumatlarına keçirəcəyik:

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

Nəhayət, biz kəmiyyət məlumatlarını keyfiyyət məlumatlarından tamamilə ayırdıq və indi onunla düzgün işləyə bilərik. Birincisi, boş dəyərlərimizin harada olduğunu başa düşməkdir (NaN və bəzi hallarda 0 boş dəyərlər kimi qəbul ediləcək).

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

Bu nöqtədə, hansı sütunlarda sıfırların çatışmayan dəyərləri göstərə biləcəyini başa düşmək vacibdir: bu, məlumatların necə toplandığı ilə bağlıdır? Və ya məlumat dəyərləri ilə əlaqəli ola bilərmi? Bu suallara ayrı-ayrılıqda cavab verilməlidir.

Beləliklə, sıfırların olduğu yerlərdə hələ də məlumatların çatışmadığına qərar versək, sonra bu itirilmiş məlumatla işləməyi asanlaşdırmaq üçün sıfırları NaN ilə əvəz etməliyik:

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

İndi gəlin görək məlumatların harada çatışmadığına baxaq:

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

Sürətli məlumatların əvvəlcədən işlənməsi üçün notebook fırıldaqçı vərəqi

Burada sütunların içərisində çatışmayan dəyərlər sarı rənglə qeyd edilməlidir. İndi əyləncə başlayır - bu dəyərlərlə necə məşğul olmaq olar? Bu dəyərləri və ya sütunları olan sətirləri silməliyəm? Yoxsa bu boş dəyərləri başqaları ilə doldurun?

Budur, prinsipcə, boş dəyərlərlə nə edilə biləcəyinə qərar verməyə kömək edə biləcək təxmini diaqram:

Sürətli məlumatların əvvəlcədən işlənməsi üçün notebook fırıldaqçı vərəqi

0. Lazımsız sütunları çıxarın

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

1. Bu sütundakı boş dəyərlərin sayı 50% -dən çoxdur?

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

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

2. Boş dəyərləri olan sətirləri silin

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

3.1. Təsadüfi dəyər daxil edilir

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

3.2. Sabit dəyərin daxil edilməsi

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. Orta və ya ən çox görülən dəyəri daxil edin

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. Başqa bir model tərəfindən hesablanmış dəyəri daxil edin

Bəzən dəyərlər sklearn kitabxanasından və ya digər oxşar kitabxanalardan modellərdən istifadə edərək reqressiya modellərindən istifadə etməklə hesablana bilər. Komandamız bunun yaxın gələcəkdə necə edilə biləcəyinə dair ayrıca məqalə ayıracaq.

Beləliklə, indiyə qədər kəmiyyət məlumatları haqqında hekayə kəsiləcək, çünki müxtəlif tapşırıqlar üçün məlumatların hazırlanması və əvvəlcədən işlənməsini necə daha yaxşı etmək barədə bir çox başqa nüanslar var və kəmiyyət məlumatları üçün əsas şeylər bu məqalədə nəzərə alınıb və indi kəmiyyət məlumatlarından bir neçə addım geriyə ayırdığımız keyfiyyət məlumatlarına qayıtmağın vaxtıdır. Siz bu notebooku istədiyiniz kimi dəyişdirə, onu müxtəlif tapşırıqlara uyğunlaşdıra bilərsiniz ki, verilənlərin əvvəlcədən işlənməsi çox sürətlə gedir!

Keyfiyyətli məlumatlar

Əsasən, keyfiyyətli məlumat üçün onu sətirdən (və ya obyektdən) nömrəyə formatlaşdırmaq üçün One-hot-encoding metodundan istifadə olunur. Bu nöqtəyə keçməzdən əvvəl boş qiymətlərlə məşğul olmaq üçün yuxarıdakı diaqram və koddan istifadə edək.

df_categorical.nunique()

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

Sürətli məlumatların əvvəlcədən işlənməsi üçün notebook fırıldaqçı vərəqi

0. Lazımsız sütunları çıxarın

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

1. Bu sütundakı boş dəyərlərin sayı 50% -dən çoxdur?

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

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

2. Boş dəyərləri olan sətirləri silin

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

3.1. Təsadüfi dəyər daxil edilir

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

3.2. Sabit dəyərin daxil edilməsi

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)

Beləliklə, nəhayət, keyfiyyət məlumatlarında nullları idarə etdik. İndi verilənlər bazanızda olan dəyərlər üzərində bir isti kodlaşdırma yerinə yetirməyin vaxtı gəldi. Bu üsul çox vaxt alqoritminizin yüksək keyfiyyətli məlumatlardan öyrənə bilməsini təmin etmək üçün istifadə olunur.

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

Beləliklə, biz nəhayət ayrı-ayrı keyfiyyət və kəmiyyət məlumatlarının işlənməsini başa çatdırdıq - onları yenidən birləşdirməyin vaxtı gəldi

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

Məlumat dəstlərini bir yerə birləşdirdikdən sonra, nəhayət, sklearn kitabxanasından MinMaxScaler-dən istifadə edərək məlumat transformasiyasından istifadə edə bilərik. Bu, dəyərlərimizi 0 ilə 1 arasında edəcək, bu da gələcəkdə modeli öyrətməyə kömək edəcəkdir.

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

Bu məlumatlar indi hər şeyə hazırdır - neyron şəbəkələri, standart ML alqoritmləri və s.!

Bu yazıda zaman seriyası məlumatları ilə işləməyi nəzərə almadıq, çünki bu cür məlumatlar üçün tapşırığınızdan asılı olaraq bir qədər fərqli emal üsullarından istifadə etməlisiniz. Gələcəkdə komandamız bu mövzuya ayrıca məqalə həsr edəcək və ümid edirik ki, o, sizin həyatınıza bu kimi maraqlı, yeni və faydalı bir şey gətirə biləcək.

Mənbə: www.habr.com

Добавить комментарий