Taflen dwyllo Notepad ar gyfer rhagbrosesu Data cyflym

Yn aml mae gan bobl sy'n mynd i faes Gwyddor Data ddisgwyliadau llai na realistig o'r hyn sy'n eu disgwyl. Mae llawer o bobl yn meddwl y byddant nawr yn ysgrifennu rhwydweithiau niwral cŵl, yn creu cynorthwyydd llais o Iron Man, neu'n curo pawb yn y marchnadoedd ariannol.
Ond gwaith Dyddiad Mae gwyddonydd yn cael ei yrru gan ddata, ac un o'r agweddau pwysicaf a mwyaf llafurus yw prosesu'r data cyn ei fwydo i rwydwaith niwral neu ei ddadansoddi mewn ffordd benodol.

Yn yr erthygl hon, bydd ein tîm yn disgrifio sut y gallwch brosesu data yn gyflym ac yn hawdd gyda chyfarwyddiadau cam wrth gam a chod. Fe wnaethom geisio gwneud y cod yn eithaf hyblyg a gellid ei ddefnyddio ar gyfer gwahanol setiau data.

Efallai na fydd llawer o weithwyr proffesiynol yn dod o hyd i unrhyw beth rhyfeddol yn yr erthygl hon, ond bydd dechreuwyr yn gallu dysgu rhywbeth newydd, a gall unrhyw un sydd wedi breuddwydio ers amser maith am wneud llyfr nodiadau ar wahân ar gyfer prosesu data cyflym a strwythuredig gopïo'r cod a'i fformatio drostynt eu hunain, neu lawrlwythwch y llyfr nodiadau gorffenedig o Github.

Cawsom y set ddata. Beth i'w wneud nesaf?

Felly, y safon: mae angen inni ddeall yr hyn yr ydym yn delio ag ef, y darlun cyffredinol. I wneud hyn, rydym yn defnyddio pandas i ddiffinio gwahanol fathau o ddata yn unig.

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

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

Taflen dwyllo Notepad ar gyfer rhagbrosesu Data cyflym

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

Taflen dwyllo Notepad ar gyfer rhagbrosesu Data cyflym

Edrychwn ar werthoedd y golofn:

  1. Ydy nifer y llinellau ym mhob colofn yn cyfateb i gyfanswm nifer y llinellau?
  2. Beth yw hanfod y data ym mhob colofn?
  3. Pa golofn ydyn ni am ei thargedu er mwyn gwneud rhagfynegiadau ar ei chyfer?

Bydd yr atebion i'r cwestiynau hyn yn caniatáu ichi ddadansoddi'r set ddata a llunio cynllun yn fras ar gyfer eich camau nesaf.

Hefyd, i gael golwg ddyfnach ar y gwerthoedd ym mhob colofn, gallwn ddefnyddio'r swyddogaeth disgrifio () pandas. Fodd bynnag, anfantais y swyddogaeth hon yw nad yw'n darparu gwybodaeth am golofnau â gwerthoedd llinynnol. Byddwn yn delio â nhw yn nes ymlaen.

df.describe()

Taflen dwyllo Notepad ar gyfer rhagbrosesu Data cyflym

Delweddu hud

Gadewch i ni edrych ar lle nad oes gennym unrhyw werthoedd o gwbl:

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

Taflen dwyllo Notepad ar gyfer rhagbrosesu Data cyflym

Golwg fer oedd hwn oddi uchod, nawr byddwn yn symud ymlaen at bethau mwy diddorol

Gadewch i ni geisio darganfod ac, os yn bosibl, dileu colofnau sydd ag un gwerth yn unig ym mhob rhes (ni fyddant yn effeithio ar y canlyniad mewn unrhyw ffordd):

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

Nawr rydym yn amddiffyn ein hunain a llwyddiant ein prosiect rhag llinellau dyblyg (llinellau sy'n cynnwys yr un wybodaeth yn yr un drefn ag un o'r llinellau presennol):

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

Rydyn ni'n rhannu'r set ddata yn ddwy: un â gwerthoedd ansoddol, a'r llall â rhai meintiol

Yma mae angen i ni wneud eglurhad bach: os nad yw'r llinellau â data coll mewn data ansoddol a meintiol yn cydberthyn iawn â'i gilydd, yna bydd angen i ni benderfynu beth rydyn ni'n ei aberthu - yr holl linellau â data coll, dim ond rhan ohonyn nhw, neu golofnau penodol. Os yw'r llinellau'n cydberthyn, yna mae gennym bob hawl i rannu'r set ddata yn ddwy. Fel arall, yn gyntaf bydd angen i chi ymdrin â'r llinellau nad ydynt yn cyfateb y data coll yn ansoddol a meintiol, a dim ond wedyn rhannu'r set ddata yn ddwy.

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

Rydyn ni'n gwneud hyn i'w gwneud hi'n haws i ni brosesu'r ddau fath gwahanol hyn o ddata - yn nes ymlaen byddwn ni'n deall pa mor haws mae hyn yn ei wneud i'n bywyd.

Rydym yn gweithio gyda data meintiol

Y peth cyntaf y dylem ei wneud yw penderfynu a oes “colofnau ysbïo” yn y data meintiol. Rydym yn galw'r colofnau hyn oherwydd eu bod yn cyflwyno eu hunain fel data meintiol, ond yn gweithredu fel data ansoddol.

Sut gallwn ni eu hadnabod? Wrth gwrs, mae'r cyfan yn dibynnu ar natur y data rydych chi'n ei ddadansoddi, ond yn gyffredinol efallai mai ychydig o ddata unigryw sydd gan golofnau o'r fath (oddeutu 3-10 o werthoedd unigryw).

print(df_numerical.nunique())

Unwaith y byddwn wedi adnabod y colofnau ysbïwr, byddwn yn eu symud o ddata meintiol i ddata ansoddol:

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

Yn olaf, rydym wedi gwahanu data meintiol yn llwyr oddi wrth ddata ansoddol a nawr gallwn weithio gydag ef yn iawn. Y peth cyntaf yw deall lle mae gennym werthoedd gwag (NaN, ac mewn rhai achosion bydd 0 yn cael ei dderbyn fel gwerthoedd gwag).

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

Ar y pwynt hwn, mae'n bwysig deall ym mha golofnau y gall seroau ddangos gwerthoedd coll: ai sut y casglwyd y data y rheswm am hyn? Neu a allai fod yn gysylltiedig â gwerthoedd y data? Rhaid ateb y cwestiynau hyn fesul achos.

Felly, os byddwn yn dal i benderfynu y gallem fod yn colli data lle mae sero, dylem ddisodli'r sero â NaN i'w gwneud yn haws gweithio gyda'r data coll hwn yn ddiweddarach:

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

Nawr, gadewch i ni weld lle rydym yn colli data:

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

Taflen dwyllo Notepad ar gyfer rhagbrosesu Data cyflym

Yma dylid marcio'r gwerthoedd hynny y tu mewn i'r colofnau sydd ar goll mewn melyn. Ac yn awr mae'r hwyl yn dechrau - sut i ddelio â'r gwerthoedd hyn? A ddylwn i ddileu rhesi gyda'r gwerthoedd neu'r colofnau hyn? Neu lenwi'r gwerthoedd gwag hyn gyda rhai eraill?

Dyma ddiagram bras a all eich helpu i benderfynu beth y gellir, mewn egwyddor, ei wneud gyda gwerthoedd gwag:

Taflen dwyllo Notepad ar gyfer rhagbrosesu Data cyflym

0. Dileu colofnau diangen

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

1. A yw nifer y gwerthoedd gwag yn y golofn hon yn fwy na 50%?

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

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

2. Dileu llinellau gyda gwerthoedd gwag

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

3.1. Yn mewnosod gwerth ar hap

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

3.2. Mewnosod gwerth cyson

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. Rhowch y gwerth cyfartalog neu fwyaf aml

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. Mewnosodwch y gwerth a gyfrifwyd gan fodel arall

Weithiau gellir cyfrifo gwerthoedd gan ddefnyddio modelau atchweliad gan ddefnyddio modelau o'r llyfrgell sklearn neu lyfrgelloedd tebyg eraill. Bydd ein tîm yn neilltuo erthygl ar wahân ar sut y gellir gwneud hyn yn y dyfodol agos.

Felly, am y tro, bydd y naratif am ddata meintiol yn cael ei dorri, oherwydd mae yna lawer o arlliwiau eraill ynglŷn â sut i baratoi data a rhagbrosesu ymlaen llaw yn well ar gyfer gwahanol dasgau, ac mae'r pethau sylfaenol ar gyfer data meintiol wedi'u hystyried yn yr erthygl hon, a nawr yw'r amser i ddychwelyd at ddata ansoddol, gan wahanu sawl cam yn ôl oddi wrth y rhai meintiol. Gallwch chi newid y llyfr nodiadau hwn fel y dymunwch, gan ei addasu i wahanol dasgau, fel bod rhagbrosesu data yn mynd yn gyflym iawn!

Data ansoddol

Yn y bôn, ar gyfer data ansoddol, defnyddir y dull Un-hot-encoding er mwyn ei fformatio o linyn (neu wrthrych) i rif. Cyn symud ymlaen at y pwynt hwn, gadewch i ni ddefnyddio'r diagram a'r cod uchod i ddelio â gwerthoedd gwag.

df_categorical.nunique()

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

Taflen dwyllo Notepad ar gyfer rhagbrosesu Data cyflym

0. Dileu colofnau diangen

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

1. A yw nifer y gwerthoedd gwag yn y golofn hon yn fwy na 50%?

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

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

2. Dileu llinellau gyda gwerthoedd gwag

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

3.1. Yn mewnosod gwerth ar hap

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

3.2. Mewnosod gwerth cyson

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)

Felly, o'r diwedd mae gennym ni afael ar nulls mewn data ansoddol. Nawr mae'n bryd perfformio amgodio un-poeth ar y gwerthoedd sydd yn eich cronfa ddata. Defnyddir y dull hwn yn aml iawn i sicrhau y gall eich algorithm ddysgu o ddata o ansawdd uchel.

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

Felly, rydym o'r diwedd wedi gorffen prosesu data ansoddol a meintiol ar wahân - amser i'w cyfuno'n ôl

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

Ar ôl i ni gyfuno'r setiau data gyda'i gilydd yn un, gallwn o'r diwedd ddefnyddio trawsnewid data gan ddefnyddio MinMaxScaler o'r llyfrgell sklearn. Bydd hyn yn gwneud ein gwerthoedd rhwng 0 ac 1, a fydd yn helpu wrth hyfforddi'r model yn y dyfodol.

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

Mae'r data hwn bellach yn barod ar gyfer unrhyw beth - rhwydweithiau niwral, algorithmau ML safonol, ac ati!

Yn yr erthygl hon, ni wnaethom ystyried gweithio gyda data cyfres amser, oherwydd ar gyfer data o'r fath dylech ddefnyddio technegau prosesu ychydig yn wahanol, yn dibynnu ar eich tasg. Yn y dyfodol, bydd ein tîm yn neilltuo erthygl ar wahân i'r pwnc hwn, a gobeithiwn y bydd yn gallu dod â rhywbeth diddorol, newydd a defnyddiol i'ch bywyd, yn union fel yr un hon.

Ffynhonnell: hab.com

Ychwanegu sylw