Hızlı Veri ön işleme için not defteri kopya kağıdı

Genellikle Veri Bilimi alanına giren kişilerin kendilerini nelerin beklediğine dair gerçekçi beklentileri yoktur. Pek çok kişi artık harika sinir ağları yazacaklarını, Iron Man'den bir sesli asistan yaratacaklarını veya finans piyasalarında herkesi yeneceklerini düşünüyor.
Ama çalış Veri Bilim adamı veriye dayalıdır ve en önemli ve zaman alıcı yönlerden biri, verileri bir sinir ağına beslemeden önce işlemek veya belirli bir şekilde analiz etmektir.

Bu yazımızda ekibimiz adım adım talimatlar ve kodlarla verileri hızlı ve kolay bir şekilde nasıl işleyebileceğinizi anlatacak. Kodu oldukça esnek ve farklı veri kümeleri için kullanılabilecek hale getirmeye çalıştık.

Pek çok profesyonel bu makalede olağanüstü bir şey bulamayabilir, ancak yeni başlayanlar yeni bir şeyler öğrenebilir ve uzun süredir hızlı ve yapılandırılmış veri işleme için ayrı bir not defteri oluşturmayı hayal eden herkes, kodu kopyalayıp kendileri için biçimlendirebilir veya Bitmiş not defterini Github'dan indirin.

Veri setini aldık. Sonra ne yapacağız?

Yani standart: neyle karşı karşıya olduğumuzu, genel resmi anlamamız gerekiyor. Bunu yapmak için, farklı veri türlerini basitçe tanımlamak için pandaları kullanırız.

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

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

Hızlı Veri ön işleme için not defteri kopya kağıdı

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

Hızlı Veri ön işleme için not defteri kopya kağıdı

Sütun değerlerine bakalım:

  1. Her sütundaki satır sayısı toplam satır sayısına karşılık geliyor mu?
  2. Her sütundaki verilerin özü nedir?
  3. Tahminlerde bulunmak için hangi sütunu hedeflemek istiyoruz?

Bu soruların cevapları, veri setini analiz etmenize ve sonraki eylemleriniz için kabaca bir plan çizmenize olanak sağlayacaktır.

Ayrıca her sütundaki değerlere daha derinlemesine bakmak için pandas define() fonksiyonunu kullanabiliriz. Ancak bu fonksiyonun dezavantajı string değerlerine sahip sütunlar hakkında bilgi vermemesidir. Onlarla daha sonra ilgileneceğiz.

df.describe()

Hızlı Veri ön işleme için not defteri kopya kağıdı

Sihirli görselleştirme

Hiç değerimizin olmadığı yerlere bakalım:

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

Hızlı Veri ön işleme için not defteri kopya kağıdı

Bu yukarıdan kısa bir bakıştı, şimdi daha ilginç şeylere geçeceğiz

Tüm satırlarda yalnızca bir değere sahip sütunları bulmaya ve mümkünse kaldırmaya çalışalım (sonucu hiçbir şekilde etkilemezler):

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

Artık kendimizi ve projemizin başarısını yinelenen satırlardan (mevcut satırlardan biriyle aynı bilgiyi aynı sırada içeren satırlar) koruyoruz:

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

Veri setini biri niteliksel, diğeri niceliksel olmak üzere ikiye ayırıyoruz.

Burada küçük bir açıklama yapmamız gerekiyor: niteliksel ve niceliksel verilerdeki eksik veri içeren satırlar birbiriyle çok ilişkili değilse, o zaman neyi feda edeceğimize karar vermemiz gerekecek - eksik veri içeren tüm satırlar, yalnızca bir kısmı, veya belirli sütunlar. Eğer çizgiler birbiriyle ilişkiliyse veri setini ikiye bölme hakkımız vardır. Aksi takdirde öncelikle eksik verileri niteliksel ve niceliksel olarak ilişkilendirmeyen satırlarla uğraşmanız ve ancak daha sonra veri setini ikiye ayırmanız gerekecektir.

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

Bunu, bu iki farklı veri türünü işlememizi kolaylaştırmak için yapıyoruz - bunun hayatımızı ne kadar kolaylaştırdığını daha sonra anlayacağız.

Niceliksel verilerle çalışıyoruz

İlk yapmamız gereken niceliksel verilerde “casus sütunları” olup olmadığını tespit etmek. Bu sütunlara bu adı vermemizin nedeni kendilerini niceliksel veri olarak sunmalarına karşın niteliksel veri görevi görmeleridir.

Onları nasıl tanımlayabiliriz? Tabii ki, bunların hepsi analiz ettiğiniz verilerin doğasına bağlıdır, ancak genel olarak bu tür sütunlar çok az benzersiz veriye (3-10 benzersiz değer civarında) sahip olabilir.

print(df_numerical.nunique())

Casus sütunları belirledikten sonra bunları niceliksel verilerden niteliksel verilere taşıyacağız:

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

Son olarak niceliksel verileri niteliksel verilerden tamamen ayırdık ve artık onlarla doğru şekilde çalışabiliyoruz. İlk yapmamız gereken boş değerlerimizin nerede olduğunu anlamaktır (NaN ve bazı durumlarda 0 boş değer olarak kabul edilecektir).

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

Bu noktada sıfırların hangi sütunlarda eksik değerleri gösterebileceğini anlamak önemlidir: Bunun nedeni verilerin toplanma şekli midir? Yoksa veri değerleriyle ilgili olabilir mi? Bu soruların duruma göre cevaplanması gerekir.

Dolayısıyla, yine de sıfırların olduğu yerde verinin eksik olduğuna karar verirsek, daha sonra bu kayıp verilerle çalışmayı kolaylaştırmak için sıfırları NaN ile değiştirmeliyiz:

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

Şimdi verinin nerede eksik olduğunu görelim:

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

Hızlı Veri ön işleme için not defteri kopya kağıdı

Burada sütunların içindeki eksik olan değerler sarı renkle işaretlenmelidir. Ve şimdi eğlence başlıyor; bu değerlerle nasıl başa çıkılır? Bu değerlere sahip satırları veya sütunları silmeli miyim? Yoksa bu boş değerleri başka değerlerle mi dolduracaksınız?

Prensip olarak boş değerlerle ne yapılabileceğine karar vermenize yardımcı olabilecek yaklaşık bir diyagramı burada bulabilirsiniz:

Hızlı Veri ön işleme için not defteri kopya kağıdı

0. Gereksiz sütunları kaldırın

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

1. Bu sütundaki boş değerlerin sayısı %50'den büyük mü?

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

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

2. Boş değerleri olan satırları silin

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

3.1. Rastgele bir değer ekleme

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

3.2. Sabit bir değer ekleme

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. Ortalama veya en sık değeri girin

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şka bir model tarafından hesaplanan değeri girin

Bazen değerler, sklearn kütüphanesindeki veya diğer benzer kütüphanelerdeki modeller kullanılarak regresyon modelleri kullanılarak hesaplanabilir. Ekibimiz yakın gelecekte bunun nasıl yapılabileceğine dair ayrı bir makale ayıracak.

Dolayısıyla, şimdilik niceliksel verilerle ilgili anlatım kesintiye uğrayacak çünkü farklı görevler için veri hazırlama ve ön işlemenin nasıl daha iyi yapılacağına dair birçok nüans var ve niceliksel verilere ilişkin temel şeyler bu makalede dikkate alınmıştır. şimdi niceliksel verilerden birkaç adım geride ayırdığımız niteliksel verilere dönmenin zamanı geldi. Verilerin ön işlenmesinin çok hızlı gerçekleşmesi için bu not defterini farklı görevlere uyarlayarak dilediğiniz gibi değiştirebilirsiniz!

Niteliksel veriler

Temel olarak, nitel veriler için, onu bir dizeden (veya nesneden) bir sayıya biçimlendirmek amacıyla Tek-sıcak-kodlama yöntemi kullanılır. Bu noktaya geçmeden önce boş değerlerle uğraşmak için yukarıdaki diyagramı ve kodu kullanalım.

df_categorical.nunique()

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

Hızlı Veri ön işleme için not defteri kopya kağıdı

0. Gereksiz sütunları kaldırın

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

1. Bu sütundaki boş değerlerin sayısı %50'den büyük mü?

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

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

2. Boş değerleri olan satırları silin

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

3.1. Rastgele bir değer ekleme

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

3.2. Sabit bir değer ekleme

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)

Böylece nihayet niteliksel verilerdeki sıfır değerleri üzerinde anlaşabildik. Artık veritabanınızdaki değerler üzerinde tek-sıcak kodlama gerçekleştirmenin zamanı geldi. Bu yöntem, algoritmanızın yüksek kaliteli verilerden öğrenebilmesini sağlamak için sıklıkla kullanılır.

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

Böylece, ayrı niteliksel ve niceliksel verileri işlemeyi nihayet tamamladık; bunları tekrar birleştirme zamanı geldi

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

Veri kümelerini bir araya getirdikten sonra nihayet sklearn kütüphanesindeki MinMaxScaler'ı kullanarak veri dönüştürmeyi kullanabiliriz. Bu, değerlerimizi 0 ile 1 arasında yapacak ve gelecekte modeli eğitirken yardımcı olacaktır.

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

Bu veriler artık her şeye hazır: sinir ağları, standart makine öğrenimi algoritmaları vb.!

Bu makalede zaman serisi verileriyle çalışmayı dikkate almadık çünkü bu tür veriler için görevinize bağlı olarak biraz farklı işleme teknikleri kullanmanız gerekir. Gelecekte ekibimiz bu konuya ayrı bir makale ayıracak ve bunun tıpkı bunun gibi hayatınıza ilginç, yeni ve faydalı bir şey getirebileceğini umuyoruz.

Kaynak: habr.com

Yorum ekle