Data Preprocessing in Python

Nazrin
4 min readJul 5, 2021

Dataların keyfiyyəti və ondan əldə edilə bilən faydalı məlumatlar modelimizin öyrənmə qabiliyyətinə birbaşa təsir göstərdiyindən Data Preprocessing Data Science layihələrində önəmli addımlardandır.Bu səbəbdən modeli qurmamışdan əvvəl datamızı hazırlamaq son dərəcə vacibdir.

Data Preprocessing 3 əsas addımdan ibarətdir.

  1. Missing value və outlier-lərin silinməsi və ya əvəz edilməsi
  2. Categorical value-larin dəyişdirilməsi
  3. Dataset-in normallaşdırılması

Bu məqalədə Pokemon dataset-indən istifadə edəcəyik.Dataset haqqında ətraflı məlumat üçün məqalənin sonundakı linkə keçid edə bilərsiniz.

İlk öncə bizim üçün lazım olan kitabxanaları yükləyib,dataset-imizə ilkin baxış keçirək.

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
pokemon_data=pd.read_csv('pokemon.csv')
pokemon_data.head()
pokemon_data.shape
pokemon_data.info()

Handling with Outliers

Outlier-lər müəyyən aralıqdan aşan ədədlərdir.(ya çox böyük ya çox kiçik).Dataset-də nə qədər çox outlier-lər varsa modelimizin dəqiqliyi bir o qədər az olacaq.

Outlier-ləri vizual şəkildə müəyyən etmək üçün ən asan yollardan biri boxplot qurmaqdır.

sns.boxplot(x='HP',data=pokemon_data)

Outlier-ləri müəyyən edib,silmək üçün başqa yollarda var.Bu məqalədə Z-score testindən istifadə edəcəyik.

outliers=[]
def detect_outliers(data):
threshold=3
mean = np.mean(data)
std =np.std(data)


for i in data:
z_score= (i - mean)/std
if np.abs(z_score) > threshold:
outliers.append(i)
return outliers

İndi isə funksiyanı bütün sütunlara tətbiq edib,outlier-ləri siləcəyik.

outlier_pt=detect_outliers(pokemon_data['HP'])
pokemon_data['HP']=pokemon_data['HP'].sort_values()
pokemon_data['HP']=pokemon_data[pokemon_data['HP']<min(outlier_pt)]

Boxplotu qurub outlier-lərin silindiyinə baxaq.

Gördüyünüz kimi HP sütununda heç bir outlier-lər qalmadı.Digər sütunlara tətbiqini github kodundan baxa bilərsiz.

Handling Null Values

Hər hansı bir dataset-də mütləq şəkildə null dəyişənlər olur.Məsələnin classification və ya regression olmasından asılı olmayaraq null value-lar silinməli və ya dəyişilməlidir.Çünki alqoritmlər null value-lar ilə işləyə bilmir.

Bəs nə zaman biz null value-lari silməli və ya əvəz etməliyik?

Əgər null dəyişənlər datasetimizin kiçik bir hissəsini təşkil edirsə,eyni zamanda dataset-imiz böyükdürsə biz onları silə bilərik.Yox əgər dataset-imiz kiçik və böyük bir hissəsini təşkil edirsə biz null dəyişənləri mean,median və ya mode ilə əvəz etməliyik.

Null dəyişənləri tapmaq üçün ilk olaraq dataset-i yoxlamaq lazımdır.Bunun üçün aşağıdakı kodu yazaq.

pokemon_data.isnull().sum()

Name sütununda 1 ədəd olduğu üçün həmin sətri silə bilərik.Amma Type 2 sütununda 386 olduğuna görə, həmçinin categorical dəyişən olduğu üçün null dəyişənləri yeni bir kategoriya yaradıb,onunla əvəz edəcəyik.Digər sütunlardaki null dəyişənləri isə mean ilə əvəz edək.

pokemon_data['Type 2']=pokemon_data['Type 2'].fillna('Unknown')
pokemon_data=pokemon_data[pokemon_data['Name'].notna()]
pokemon_data=pokemon_data.fillna(pokemon_data.mean())

Null dəyişənləri dəyişdikdən sonra yenidən dataset-imizi yoxlayaq.

Gördüyünüz kimi heç bir null dəyişən qalmadı.Artıq digər addımlara keçə bilərik.

Handling with categorical data

Alqortihmlər kategorik dəyişənlərlə işləyə bilmədikləri üçün mütləq şəkildə onları numeric dəyişənlərə çevirməliyik.2 cür kategorik dəyişən var.

Nominal-dəyişənlərin sadəcə adlandırıldığı və heç bir sıralama olmayan dəyişən tipidir.Məsələn cinsiyyət(kişi və qadın).

Ordinal-Dəyişənləri adlandırmaqla bərabər,müəyyən sıralama da var.Misal olaraq : large>medium>small.

Kategorik dəyişənlərlə işləmək üçün bir neçə metodlar var.(one-hot encoding,map( ) function,label encoding).

Burada ən vacib məqam odur ki, ordinal və nominal kategorik dəyişənləri ilə ayrılıqda işləmək lazımdır.Əksər insanların etdikləri ən böyük səhvlərdən biri ordinal və nominal dəyişənləri ayırd edə bilməmələridir.Beləliklə map () funksiyasından və ya LabelEncoder-dan nominal dəyişənlər üçün istifadə ediriksə , o zaman model dəyişənlər arasında bir əlaqənin olduğunu düşünəcək və buda səhv nəticələrə gətirib çıxardacaq.

Bizim dataset-də Type 1 və Type 2 nominal dəyişənlər olduğuna görə One-Hot encoding üsulundan istifadə edəcəyik.

one_hot_encoded_data = pd.get_dummies(pokemon_data, columns = ['Type 1', 'Type 2'])
one_hot_encoded_data.head()

One-hot encoding üsulunun mənfi cəhətlərindən biri sütunların sayının artmasıdır.Bunuda həll etmək üçün PCA metodundan istifadə edirlər.(PCA oxşar xüsusiyyətləri eyni xüsusiyyətlərlə qruplaşdırır).

Data Standardization and normalization

Normalization dəyərlərin dəyişdirilərək 0 və 1 arasında dəyişməsi üçün miqyaslandırma texnikasıdır.Buna Min-Max Scaling-də deyilir.Düsturu:

Standardization, dəyərlərin standard deviation ilə mean ətrafında mərkəzləşdirildiyi başqa bir miqyaslandırma texnikasıdır. Bu o deməkdir ki, atributun mean-i sıfır olur və nəticədə paylanmanın standard deviation-u 0 olur.

Mən bu dataset-də Standardization-dan istifadə edəcəm.Standardization ədədi dəyişənlərə tətbiq olunduğu üçün ədədi dəyişənləri bir yerə yığıb tətbiq edəcəyik.

numerical_features=[feature for feature in pokemon_data.columns if pokemon_data[feature].dtypes!='O']
from sklearn.preprocessing import StandardScaler
scaling=StandardScaler()
scaling.fit(pokemon_data[numerical_features])
pokemon_data.head()

Dataset-də olan ‘#’ və ‘Name’ sütunları model mərhələsinə girməyəcəyi üçün onları silə bilərik.

pokemon_data.drop('#',axis=1,inplace=True)
pokemon_data.drop('Name',axis=1,inplace=True)

Və artıq budur!Dataset-imiz modelləşdirməyə hazırdır!!!

Oxuduğunuz üçün təşəkkürlər!!!

Datatset haqqında ətraflı məlumat:https://pokemon.fandom.com/wiki/Statistics#HP

Dataset üçün link:https://www.kaggle.com/rounakbanik/pokemon

Github linki:https://github.com/nazrnrn/DataAnalysisProject/blob/main/preprocessingpokemon.ipynb

--

--