Belgeya notepad-cheat ji bo pêşdibistanên daneya bilez

Bi gelemperî mirovên ku dikevin qada Zanistiya Daneyê ji hêviyên rastîn ên ku li benda wan in kêmtir in. Pir kes difikirin ku naha ew ê torên neuralî yên xweş binivîsin, ji Iron Man arîkarek deng çêbikin, an jî li bazarên darayî her kesî bişkînin.
Lê kar Jimare Zanyar bi daneyê ve girêdayî ye, û yek ji wan aliyên herî girîng û demdirêj ev e ku daneyan berî ku ew bikeve nav tora neuralî an jî bi rengek diyarkirî analîz bike, pêvajoyê dike.

Di vê gotarê de, tîmê me dê diyar bike ka hûn çawa dikarin daneyan zû û bi hêsanî bi rêwerz û koda gav-gav bişopînin. Me hewl da ku kodê pir maqûl bikin û ji bo daneyên cihêreng were bikar anîn.

Dibe ku gelek pispor di vê gotarê de tiştek awarte nebînin, lê destpêk dê karibin tiştek nû fêr bibin, û her kesê ku ji mêj ve xewna çêkirina defterek veqetandî ye ji bo hilberandina daneya bilez û birêkûpêk dikare kodê kopî bike û ji xwe re format bike, an deftera qediyayî ji Github dakêşin.

Me danezan wergirt. Paşê çi bikin?

Ji ber vê yekê, standard: divê em fêm bikin ka em bi çi re mijûl dibin, wêneya giştî. Ji bo vê yekê, em pandayan bikar tînin ku bi tenê celebên daneyên cûda diyar bikin.

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

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

Belgeya notepad-cheat ji bo pêşdibistanên daneya bilez

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

Belgeya notepad-cheat ji bo pêşdibistanên daneya bilez

Ka em li nirxên stûnê binêrin:

  1. Hejmara rêzikên her stûnê bi tevaya rêzan re têkildar e?
  2. Di her stûnê de cewhera daneyan çi ye?
  3. Em dixwazin kîjan stûnê bikin hedef da ku ji bo wê pêşbîniyan bikin?

Bersivên van pirsan dê bihêle ku hûn danehevê analîz bikin û bi giranî ji bo kiryarên xwe yên pêşeroj plansaziyek xêz bikin.

Di heman demê de, ji bo nihêrînek kûr a li nirxên di her stûnê de, em dikarin fonksiyona pandas describe() bikar bînin. Lêbelê, kêmasiya vê fonksiyonê ev e ku ew agahdariya li ser stûnên bi nirxên rêzikê peyda nake. Em ê paşê bi wan re mijûl bibin.

df.describe()

Belgeya notepad-cheat ji bo pêşdibistanên daneya bilez

Visualization Magic

Ka em binihêrin li ku derê qet nirxa me tune:

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

Belgeya notepad-cheat ji bo pêşdibistanên daneya bilez

Ev ji jor ve awirek kurt bû, niha em ê derbasî tiştên balkêştir bibin

Ka em hewl bidin ku bibînin û, heke gengaz be, stûnên ku di hemî rêzan de tenê yek nirx hene (ew ê bi tu awayî bandorê li encamê nekin) jê bikin:

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

Naha em xwe û serkeftina projeya xwe ji rêzikên dubare (xêzên ku heman agahdarî di rêza yek ji rêzikên heyî de vedihewînin) diparêzin:

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

Em databasê du parçe dikin: yek bi nirxên kalîteyî, û ya din bi yên hejmarî.

Li vir pêdivî ye ku em zelaliyek piçûk bikin: heke xêzên bi daneya wenda di daneyên kalîte û mîqdar de pir bi hevûdu re ne girêdayî ne, wê hingê divê em biryar bidin ka em çi dikin qurban - hemî rêzikên bi daneya wenda, tenê beşek ji wan, an stûnên hin. Ger xêz bi hev ve girêdayî bin, wê hingê mafê me heye ku em daneyê li du parçe bikin. Wekî din, hûn ê pêşî hewce bikin ku bi xêzên ku daneyên wenda di qalîte û hejmarî de bi hev re nagirin re mijûl bibin, û tenê dûv re databasê li du parçe bikin.

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

Em vê yekê dikin ku ji me re hêsantir bikin ku em van her du celeb daneyên cûda hilînin - paşê em ê fêm bikin ka ev jiyana me çiqas hêsantir dike.

Em bi daneyên mîqdar dixebitin

Yekem tiştê ku divê em bikin ev e ku diyar bikin ka di daneyên mîqdar de "stûnên sîxur" hene. Em ji van stûnan re dibêjin ji ber ku ew xwe wekî daneyên mîqdar nîşan didin, lê wekî daneyên kalîteyî tevdigerin.

Em wan çawa pênase dikin? Bê guman, ew hemî bi cewhera daneyên ku hûn analîz dikin ve girêdayî ye, lê bi gelemperî stûnên weha dikarin daneyên piçûk ên bêhempa (li devera 3-10 nirxên bêhempa) hebin.

print(df_numerical.nunique())

Dema ku me stûnên sîxuriyê nas kirin, em ê wan ji daneyên mîqdar berbi daneyên kalîteyî ve bibin:

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

Di dawiyê de, me daneyên mîqdar bi tevahî ji daneyên kalîteyê veqetandiye û naha em dikarin bi rêkûpêk bi wan re bixebitin. Ya yekem ev e ku meriv fêm bike ku li ku derê me nirxên vala hene (NaN, û di hin rewşan de 0 dê wekî nirxên vala were pejirandin).

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

Di vê nuqteyê de, girîng e ku meriv fêm bike ku di kîjan stûnan de sifir dibe ku nirxên wenda nîşan bidin: gelo ev ji ber çawaniya berhevkirina daneyê ye? An jî dibe ku ew bi nirxên daneyê re têkildar be? Ev pirs divê li ser bingehê doz bi-case bên bersivandin.

Ji ber vê yekê, heke em hîn jî biryar bidin ku dibe ku em daneyan winda bikin li ku derê sifir hene, divê em sifiran bi NaN-ê veguherînin da ku paşê hêsantir bi vê daneya winda re bixebitin:

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

Naha em bibînin ka em li ku derê dane winda ne:

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

Belgeya notepad-cheat ji bo pêşdibistanên daneya bilez

Li vir ew nirxên di hundurê stûnan de ku winda ne divê bi zer bêne nîşankirin. Û naha kêf dest pê dike - meriv çawa bi van nirxan re mijûl dibe? Ma ez rêzikên bi van nirx an stûnan jêbikim? An jî van nirxên vala bi hinên din dagirtin?

Li vir diyagramek nêzîk heye ku dikare ji we re bibe alîkar ku hûn biryar bidin ka di prensîbê de çi dikare bi nirxên vala were kirin:

Belgeya notepad-cheat ji bo pêşdibistanên daneya bilez

0. Stûnên nepêwîst rakin

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

1. Ma hejmara nirxên vala di vê stûnê de ji% 50 mezintir e?

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

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

2. Rêzên bi nirxên vala jêbirin

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

3.1. Têxistina nirxek rasthatî

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

3.2. Têxistina nirxek domdar

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. Nirxa navîn an herî pir caran têxe

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. Nirxa ku ji hêla modelek din ve hatî hesibandin têxe

Carinan nirx dikarin bi karanîna modelên regresyonê bi karanîna modelên ji pirtûkxaneya sklearn an pirtûkxaneyên din ên mîna wan têne hesibandin. Tîma me dê gotarek cihêreng vebêje ka meriv çawa dikare di pêşerojek nêzîk de were kirin.

Ji ber vê yekê, heya niha, vegotina di derheqê daneyên mîqdar de dê were qut kirin, ji ber ku gelek nuansên din hene ku meriv çawa çêtir amadekirina daneyan û pêşdibistanê ji bo karên cihêreng dike, û tiştên bingehîn ên daneyên mîqdar di vê gotarê de hatine girtin, û niha dema vegera li daneyên kalîteyî ye ku me çend gavan ji yên jimareyî veqetand. Hûn dikarin li gorî ku hûn bixwazin vê notebookê biguhezînin, wê li gorî karên cihêreng biguhezînin, da ku pêşdibistanên daneyê pir zû bimeşin!

Daneyên kalîteyê

Di bingeh de, ji bo daneyên kalîteyî, rêbaza şîfrekirina Yek-germ tê bikar anîn da ku wê ji rêzek (an jî tiştek) berbi hejmarekê ve bibe. Berî ku em biçin ser vê xalê, werin em diagram û koda jorîn bikar bînin da ku bi nirxên vala re mijûl bibin.

df_categorical.nunique()

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

Belgeya notepad-cheat ji bo pêşdibistanên daneya bilez

0. Stûnên nepêwîst rakin

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

1. Ma hejmara nirxên vala di vê stûnê de ji% 50 mezintir e?

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

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

2. Rêzên bi nirxên vala jêbirin

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

3.1. Têxistina nirxek rasthatî

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

3.2. Têxistina nirxek domdar

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)

Ji ber vê yekê, me di dawiyê de di daneyên kalîteyê de li ser nullan destek girt. Naha ew dem e ku hûn li ser nirxên ku di databasa we de ne kodkirina yek-germ bikin. Ev rêbaz pir caran tête bikar anîn da ku pê ewle bibe ku algorîtmaya we dikare ji daneyên kalîteya bilind fêr bibe.

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

Ji ber vê yekê, me di dawiyê de hilberandina daneyên jêhatî û mîqdar ên cihêreng qedand - dem e ku em wan paşde bidin hev

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

Piştî ku me danehevan li hev kirin yek, em dikarin di dawiyê de veguherîna daneyê bi karanîna MinMaxScaler ji pirtûkxaneya sklearn bikar bînin. Ev ê nirxên me di navbera 0 û 1-ê de çêbike, ku dê di pêşerojê de di perwerdehiya modelê de bibe alîkar.

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

Ev dane niha ji bo her tiştî amade ye - torên neuralî, algorîtmayên standard ML, hwd.!

Di vê gotarê de, me xebata bi daneyên rêzikên demê re hesab nekiriye, ji ber ku ji bo daneya weha divê hûn li gorî peywira xwe teknîkên pêvajoyê hinekî cûda bikar bînin. Di pêşerojê de, tîmê me dê gotarek cûda veqetîne vê mijarê, û em hêvî dikin ku ew ê karibe tiştek balkêş, nû û kêrhatî bîne nav jiyana we, mîna vê yekê.

Source: www.habr.com

Add a comment