Notepad-cheat sheet pikeun preprocessing Data gancang

Mindeng jalma asup kana widang Data Élmu gaduh kirang ti ekspektasi realistis naon awaits aranjeunna. Seueur jalma mikir yén ayeuna aranjeunna bakal nyerat jaringan saraf anu saé, nyiptakeun asisten sora ti Iron Man, atanapi ngéléhkeun sadayana di pasar finansial.
Tapi gawé data Élmuwan didorong ku data, sareng salah sahiji aspék anu paling penting sareng nyéépkeun waktos nyaéta ngolah data sateuacan dilebetkeun kana jaringan saraf atanapi nganalisa ku cara anu tangtu.

Dina tulisan ieu, tim kami bakal ngajelaskeun kumaha anjeun tiasa ngolah data gancang sareng gampang kalayan petunjuk sareng kode léngkah-léngkah. Kami nyobian ngadamel kodeu rada fleksibel sareng tiasa dianggo pikeun set data anu béda.

Seueur profésional moal mendakan anu luar biasa dina tulisan ieu, tapi pamula bakal tiasa diajar anu énggal, sareng saha waé anu parantos lami ngimpi ngadamel notebook anu misah pikeun ngolah data anu gancang sareng terstruktur tiasa nyalin kodeu sareng pormatna pikeun dirina, atanapi undeur notebook rengse ti Github.

Kami nampi set data. Naon anu kudu dipigawé salajengna?

Janten, standar: urang kedah ngartos naon anu urang urus, gambaran umum. Jang ngalampahkeun ieu, kami nganggo panda pikeun ngan ukur nangtukeun jinis data anu béda.

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

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

Notepad-cheat sheet pikeun preprocessing Data gancang

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

Notepad-cheat sheet pikeun preprocessing Data gancang

Hayu urang nempo nilai kolom:

  1. Naha jumlah garis dina unggal kolom pakait sareng jumlah total garis?
  2. Naon hakekat data dina unggal kolom?
  3. Kolom mana anu urang hoyong targétkeun pikeun ngaramalkeun éta?

Waleran kana patarosan ieu bakal ngamungkinkeun anjeun nganalisa set data sareng ngagambar rencana pikeun tindakan salajengna anjeun.

Ogé, pikeun katingal langkung jero dina nilai dina unggal kolom, urang tiasa nganggo fungsi pandas describe (). Sanajan kitu, disadvantage tina fungsi ieu téh nya éta teu nyadiakeun informasi ngeunaan kolom kalawan nilai string. Urang bakal nungkulan aranjeunna engké.

df.describe()

Notepad-cheat sheet pikeun preprocessing Data gancang

Visualisasi magic

Hayu urang tingali dimana urang teu gaduh nilai pisan:

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

Notepad-cheat sheet pikeun preprocessing Data gancang

Ieu katingal pondok ti luhur, ayeuna urang ngaléngkah ka hal leuwih metot

Hayu urang cobian milarian sareng, upami mungkin, cabut kolom anu ngan ukur hiji nilai dina sadaya barisan (aranjeunna moal mangaruhan hasil ku cara naon waé):

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

Ayeuna urang ngajaga diri sareng kasuksésan proyék urang tina duplikat garis (garis anu ngandung inpormasi anu sami dina urutan anu sami sareng salah sahiji jalur anu tos aya):

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

Urang ngabagi dataset jadi dua: hiji kalawan nilai kualitatif, sarta séjén kalawan leuwih kuantitatif

Di dieu urang kudu nyieun klarifikasi leutik: lamun garis kalawan data leungit dina data kualitatif jeung kuantitatif teu pisan correlated saling, lajeng urang kudu mutuskeun naon urang kurban - sakabéh garis kalawan data leungit, ngan bagian tina aranjeunna. atawa kolom tangtu. Upami garis-garisna aya hubunganana, maka urang gaduh hak pikeun ngabagi set data jadi dua. Upami teu kitu, anjeun mimitina kudu nungkulan garis nu teu correlate data leungit dina kualitatif jeung kuantitatif, sarta ngan lajeng ngabagi dataset kana dua.

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

Kami ngalakukeun ieu pikeun ngagampangkeun urang ngolah dua jinis data ieu - engké urang bakal ngartos kumaha langkung gampangna ieu ngajantenkeun kahirupan urang.

Kami damel sareng data kuantitatif

Hal kahiji anu kedah urang laksanakeun nyaéta nangtukeun naha aya "kolom spionase" dina data kuantitatif. Urang nelepon kolom ieu sabab nampilkeun diri salaku data kuantitatif, tapi meta salaku data kualitatif.

Kumaha urang nangtukeun aranjeunna? Tangtosna, éta sadayana gumantung kana sifat data anu anjeun analisa, tapi sacara umum kolom sapertos kitu tiasa gaduh sakedik data unik (di daérah 3-10 nilai unik).

print(df_numerical.nunique())

Sakali kami geus ngaidentipikasi kolom nenjo, urang bakal mindahkeun tina data kuantitatif kana data kualitatif:

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

Tungtungna, kami parantos misahkeun data kuantitatif tina data kualitatif sareng ayeuna urang tiasa dianggo kalayan leres. Hal kahiji nyaéta ngartos dimana urang gaduh nilai kosong (NaN, sareng dina sababaraha kasus 0 bakal ditarima salaku nilai kosong).

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

Dina titik ieu, hal anu penting pikeun ngarti nu kolom enol bisa nunjukkeun nilai leungit: naha ieu alatan kumaha data dikumpulkeun? Atanapi tiasa aya hubunganana sareng nilai data? Patarosan ieu kedah dijawab dumasar kana kasus-ka-kasus.

Janten, upami urang masih mutuskeun yén urang tiasa leungit data dimana aya nol, urang kedah ngagentos nol sareng NaN supados langkung gampang damel sareng data anu leungit ieu engké:

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

Ayeuna hayu urang tingali dimana urang leungit data:

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

Notepad-cheat sheet pikeun preprocessing Data gancang

Di dieu nilai-nilai dina kolom anu leungit kedah ditandaan konéng. Tur ayeuna fun dimimitian - kumaha carana nungkulan nilai ieu? Naha kuring kedah ngahapus baris kalayan nilai atanapi kolom ieu? Atanapi eusian nilai kosong ieu sareng sababaraha anu sanés?

Ieu perkiraan diagram anu tiasa ngabantosan anjeun mutuskeun naon anu tiasa, prinsipna, dilakukeun ku nilai kosong:

Notepad-cheat sheet pikeun preprocessing Data gancang

0. Cabut kolom anu teu perlu

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

1. Naha jumlah nilai kosong dina kolom ieu langkung ageung tibatan 50%?

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

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

2. Pupus garis kalawan nilai kosong

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

3.1. Nyelapkeun nilai acak

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

3.2. Inserting nilai konstan

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. Selapkeun nilai rata atawa paling sering

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. Selapkeun nilai diitung ku model sejen

Kadang-kadang nilai tiasa diitung nganggo modél régrési nganggo modél ti perpustakaan sklearn atanapi perpustakaan anu sami. Tim kami bakal bakti hiji artikel misah ngeunaan kumaha ieu bisa dipigawé dina mangsa nu bakal datang.

Janten, pikeun ayeuna, narasi ngeunaan data kuantitatif bakal diganggu, sabab aya seueur nuansa sanés ngeunaan kumaha carana langkung saé ngalakukeun persiapan data sareng preprocessing pikeun tugas anu béda, sareng hal dasar pikeun data kuantitatif parantos dipertimbangkeun dina tulisan ieu, sareng Ayeuna waktuna pikeun balik deui ka data kualitatif, anu urang misahkeun sababaraha léngkah deui tina kuantitatif. Anjeun tiasa ngarobih buku catetan ieu sakumaha anu anjeun pikahoyong, nyaluyukeun kana tugas anu béda-béda, supados preprocessing data gancang pisan!

Data kualitatif

Dasarna, pikeun data kualitatif, métode One-hot-encoding dipaké pikeun pormat tina string (atawa objék) kana angka. Sateuacan ngaléngkah ka titik ieu, hayu urang nganggo diagram sareng kode di luhur pikeun nganyahokeun nilai kosong.

df_categorical.nunique()

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

Notepad-cheat sheet pikeun preprocessing Data gancang

0. Cabut kolom anu teu perlu

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

1. Naha jumlah nilai kosong dina kolom ieu langkung ageung tibatan 50%?

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

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

2. Pupus garis kalawan nilai kosong

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

3.1. Nyelapkeun nilai acak

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

3.2. Inserting nilai konstan

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)

Janten, kami tungtungna ngagaduhan cecekelan dina nulls dina data kualitatif. Ayeuna waktuna pikeun ngalakukeun hiji-panas-encoding dina nilai-nilai anu aya dina database anjeun. Metoda ieu sering pisan dianggo pikeun mastikeun yén algoritma anjeun tiasa diajar tina data kualitas luhur.

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

Janten, kami parantos réngsé ngolah data kualitatif sareng kuantitatif anu misah - waktosna pikeun ngagabungkeun deui

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

Saatos urang ngahijikeun susunan data jadi hiji, tungtungna urang tiasa nganggo transformasi data nganggo MinMaxScaler ti perpustakaan sklearn. Ieu bakal ngajantenkeun nilai urang antara 0 sareng 1, anu bakal ngabantosan nalika ngalatih modél di hareup.

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

Data ieu ayeuna siap pikeun naon waé - jaringan saraf, algoritma ML standar, jsb.

Dina tulisan ieu, urang henteu nganggap damel sareng data séri waktos, sabab pikeun data sapertos kitu anjeun kedah nganggo téknik ngolah anu rada béda, gumantung kana tugas anjeun. Dina mangsa nu bakal datang, tim kami bakal bakti artikel misah pikeun topik ieu, sarta kami miharep éta bakal bisa mawa hal metot, anyar jeung mangpaat dina kahirupan anjeun, kawas ieu.

sumber: www.habr.com

Tambahkeun komentar