छिटो डाटा प्रिप्रोसेसिङको लागि नोटप्याड-धोखा पाना

प्रायः डेटा विज्ञानको क्षेत्रमा प्रवेश गर्ने व्यक्तिहरूले उनीहरूलाई के पर्खिरहेका छन् भन्ने यथार्थवादी अपेक्षाहरू भन्दा कम हुन्छन्। धेरै मानिसहरू सोच्छन् कि अब उनीहरूले राम्रो न्यूरल नेटवर्कहरू लेख्नेछन्, आइरन म्यानबाट आवाज सहायक सिर्जना गर्नेछन्, वा वित्तीय बजारमा सबैलाई हराउनुहुनेछ।
तर काम तथ्याङ्क वैज्ञानिक डेटा-संचालित हो, र सबैभन्दा महत्त्वपूर्ण र समय-उपभोग गर्ने पक्षहरू मध्ये एक भनेको डाटालाई न्यूरल नेटवर्कमा फिड गर्नु अघि वा निश्चित तरिकामा विश्लेषण गर्नु अघि प्रशोधन गर्नु हो।

यस लेखमा, हाम्रो टोलीले तपाइँ कसरी चरण-दर-चरण निर्देशनहरू र कोडको साथ छिटो र सजिलैसँग डेटा प्रक्रिया गर्न सक्नुहुन्छ भनेर वर्णन गर्नेछ। हामीले कोडलाई धेरै लचिलो बनाउन प्रयास गर्यौं र विभिन्न डेटासेटहरूको लागि प्रयोग गर्न सकिन्छ।

धेरै पेशेवरहरूले यस लेखमा असाधारण केही नभेट्न सक्छन्, तर शुरुवातकर्ताहरूले केहि नयाँ सिक्न सक्षम हुनेछन्, र छिटो र संरचित डेटा प्रशोधनका लागि छुट्टै नोटबुक बनाउने सपना देखेका जो कोहीले कोड प्रतिलिपि गर्न र यसलाई आफैंको लागि ढाँचा गर्न सक्छन्, वा Github बाट समाप्त नोटबुक डाउनलोड गर्नुहोस्।

हामीले डाटासेट प्राप्त गर्यौं। अब के गर्ने?

त्यसोभए, मानक: हामीले बुझ्नु आवश्यक छ कि हामी केसँग व्यवहार गरिरहेका छौं, समग्र चित्र। यो गर्नको लागि, हामी पाण्डाहरू प्रयोग गर्छौं केवल विभिन्न डेटा प्रकारहरू परिभाषित गर्न।

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

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

छिटो डाटा प्रिप्रोसेसिङको लागि नोटप्याड-धोखा पाना

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

छिटो डाटा प्रिप्रोसेसिङको लागि नोटप्याड-धोखा पाना

स्तम्भ मानहरू हेरौं:

  1. के प्रत्येक स्तम्भमा रेखाहरूको संख्या रेखाहरूको कुल संख्यासँग मेल खान्छ?
  2. प्रत्येक स्तम्भमा डाटाको सार के हो?
  3. यसको लागि भविष्यवाणी गर्नको लागि हामी कुन स्तम्भलाई लक्षित गर्न चाहन्छौं?

यी प्रश्नहरूको जवाफले तपाइँलाई डेटासेटको विश्लेषण गर्न र तपाइँको आगामी कार्यहरूको लागि योजना बनाउन अनुमति दिनेछ।

साथै, प्रत्येक स्तम्भमा मानहरू गहिरो रूपमा हेर्नको लागि, हामी pandas describe() प्रकार्य प्रयोग गर्न सक्छौं। यद्यपि, यस प्रकार्यको हानि यो हो कि यसले स्ट्रिङ मानहरूसँग स्तम्भहरूको बारेमा जानकारी प्रदान गर्दैन। हामी तिनीहरूलाई पछि व्यवहार गर्नेछौं।

df.describe()

छिटो डाटा प्रिप्रोसेसिङको लागि नोटप्याड-धोखा पाना

जादुई दृश्य

हेरौं जहाँ हामीसँग कुनै मूल्य छैन:

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

छिटो डाटा प्रिप्रोसेसिङको लागि नोटप्याड-धोखा पाना

यो माथिबाट छोटो रूप थियो, अब हामी थप रोचक कुराहरूमा जान्छौं

खोज्ने प्रयास गरौं र, सम्भव भएमा, सबै पङ्क्तिहरूमा एक मात्र मान भएका स्तम्भहरू हटाउनुहोस् (तिनीहरूले परिणामलाई कुनै पनि हिसाबले असर गर्दैन):

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

अब हामी आफैलाई र हाम्रो परियोजनाको सफलतालाई डुप्लिकेट लाइनहरूबाट जोगाउँछौं (पङ्क्तिहरू जुन अवस्थित लाइनहरू मध्ये एकको रूपमा एउटै क्रममा समान जानकारी समावेश गर्दछ):

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

हामी डेटासेटलाई दुई भागमा विभाजन गर्छौं: एउटा गुणात्मक मानको साथ, र अर्को मात्रात्मक मानहरूसँग।

यहाँ हामीले एउटा सानो स्पष्टीकरण गर्न आवश्यक छ: यदि गुणात्मक र मात्रात्मक डेटामा हराइरहेको डाटाका साथ लाइनहरू एकअर्कासँग धेरै सहसंबद्ध छैनन् भने, हामीले के बलिदान गर्छौं भन्ने निर्णय गर्न आवश्यक छ - हराएको डाटा भएका सबै रेखाहरू, तिनीहरूको मात्र अंश, वा निश्चित स्तम्भहरू। यदि रेखाहरू सहसम्बन्धित छन् भने, हामीसँग डेटासेटलाई दुई भागमा विभाजन गर्ने अधिकार छ। अन्यथा, तपाईंले पहिले हराइरहेको डाटालाई गुणात्मक र मात्रात्मकमा सहसंबद्ध नगर्ने लाइनहरूसँग व्यवहार गर्न आवश्यक छ, र त्यसपछि मात्र डाटासेटलाई दुई भागमा विभाजन गर्नुहोस्।

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

हामीले यी दुई फरक प्रकारका डाटालाई प्रशोधन गर्न सजिलो बनाउनको लागि यो गर्छौं - पछि हामी बुझ्नेछौं कि यसले हाम्रो जीवनलाई कति सजिलो बनाउँछ।

हामी परिमाणात्मक डेटा संग काम गर्छौं

हामीले गर्नु पर्ने पहिलो कुरा मात्रात्मक डेटामा "जासूस स्तम्भहरू" छन् कि छैनन् भनेर निर्धारण गर्नु हो। हामी यी स्तम्भहरूलाई बोलाउँछौं किनभने तिनीहरू आफैंलाई मात्रात्मक डेटाको रूपमा प्रस्तुत गर्छन्, तर गुणात्मक डेटाको रूपमा कार्य गर्छन्।

हामी तिनीहरूलाई कसरी परिभाषित गर्छौं? निस्सन्देह, यो सबै तपाईले विश्लेषण गरिरहनु भएको डेटाको प्रकृतिमा निर्भर गर्दछ, तर सामान्यतया त्यस्ता स्तम्भहरूमा थोरै अद्वितीय डेटा हुन सक्छ (3-10 अद्वितीय मानहरूको क्षेत्रमा)।

print(df_numerical.nunique())

एकपटक हामीले जासूस स्तम्भहरू पहिचान गरिसकेपछि, हामी तिनीहरूलाई मात्रात्मक डेटाबाट गुणात्मक डेटामा सार्नेछौं:

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

अन्तमा, हामीले गुणात्मक डाटाबाट मात्रात्मक डाटालाई पूर्ण रूपमा अलग गरेका छौँ र अब हामी त्यससँग राम्ररी काम गर्न सक्छौँ। पहिलो कुरा हामी कहाँ खाली मानहरू छन् भनेर बुझ्नु हो (NaN, र केहि अवस्थामा 0 लाई खाली मानहरूको रूपमा स्वीकार गरिनेछ)।

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

यस बिन्दुमा, कुन स्तम्भहरूमा शून्यले छुटेका मानहरूलाई संकेत गर्न सक्छ भनेर बुझ्न महत्त्वपूर्ण छ: के यो डाटा कसरी सङ्कलन गरिएको थियो? वा यो डेटा मानहरूसँग सम्बन्धित हुन सक्छ? यी प्रश्नहरूको उत्तर केस-दर-केस आधारमा हुनुपर्छ।

त्यसोभए, यदि हामीले अझै पनि यो निर्णय गर्छौं कि हामीले शून्य भएका ठाउँमा डेटा हराएको हुन सक्छौं भने, पछि यो हराएको डाटासँग काम गर्न सजिलो बनाउन हामीले शून्यलाई NaN ले बदल्नुपर्छ:

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

अब हामी कहाँ डाटा हराइरहेको छ हेरौं:

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

छिटो डाटा प्रिप्रोसेसिङको लागि नोटप्याड-धोखा पाना

यहाँ ती स्तम्भहरू भित्रका मानहरू जो हराइरहेका छन् पहेंलोमा चिन्ह लगाइनुपर्छ। र अब रमाईलो सुरु हुन्छ - यी मानहरूसँग कसरी व्यवहार गर्ने? के मैले यी मान वा स्तम्भहरूसँग पङ्क्तिहरू मेटाउन पर्छ? वा यी खाली मानहरू अरूसँग भर्नुहोस्?

यहाँ एउटा अनुमानित रेखाचित्र छ जसले तपाईंलाई सिद्धान्तमा, खाली मानहरूसँग के गर्न सकिन्छ भनेर निर्णय गर्न मद्दत गर्न सक्छ:

छिटो डाटा प्रिप्रोसेसिङको लागि नोटप्याड-धोखा पाना

0. अनावश्यक स्तम्भहरू हटाउनुहोस्

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

1. यो स्तम्भमा खाली मानहरूको संख्या 50% भन्दा बढी छ?

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

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

2. खाली मानहरू भएका रेखाहरू मेटाउनुहोस्

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

३.१। अनियमित मान सम्मिलित गर्दै

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

३.२। एक स्थिर मान सम्मिलित गर्दै

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) #Убираем колонки со старыми значениями

३.३। औसत वा धेरै बारम्बार मान घुसाउनुहोस्

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) #Убираем колонки со старыми значениями

३.४। अर्को मोडेल द्वारा गणना गरिएको मान घुसाउनुहोस्

कहिलेकाहीँ मानहरू sklearn पुस्तकालय वा अन्य समान पुस्तकालयहरूबाट मोडेलहरू प्रयोग गरेर रिग्रेसन मोडेलहरू प्रयोग गरेर गणना गर्न सकिन्छ। हाम्रो टोलीले निकट भविष्यमा यो कसरी गर्न सकिन्छ भनेर छुट्टै लेख समर्पित गर्नेछ।

त्यसोभए, अहिलेको लागि, मात्रात्मक डेटाको बारेमा कथन अवरुद्ध हुनेछ, किनकि त्यहाँ विभिन्न कार्यहरूको लागि डेटा तयारी र पूर्व-प्रक्रिया कसरी गर्ने भन्ने बारे धेरै अन्य सूक्ष्मताहरू छन्, र मात्रात्मक डेटाका लागि आधारभूत कुराहरूलाई यस लेखमा ध्यानमा राखिएको छ, र। अब गुणात्मक डेटामा फर्कने समय हो। जुन हामीले मात्रात्मक डेटाबाट धेरै कदम पछाडि अलग गर्यौं। तपाईले यो नोटबुकलाई आफ्नो इच्छा अनुसार परिवर्तन गर्न सक्नुहुन्छ, यसलाई विभिन्न कार्यहरूमा छाँटकाँट गर्दै, ताकि डेटा प्रिप्रोसेसिङ धेरै छिटो हुन्छ!

गुणात्मक डाटा

सामान्यतया, गुणात्मक डेटाको लागि, यसलाई स्ट्रिङ (वा वस्तु) बाट नम्बरमा ढाँचा गर्नको लागि वन-हट-इन्कोडिङ विधि प्रयोग गरिन्छ। यस बिन्दुमा जानु अघि, खाली मानहरूसँग व्यवहार गर्न माथिको रेखाचित्र र कोड प्रयोग गरौं।

df_categorical.nunique()

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

छिटो डाटा प्रिप्रोसेसिङको लागि नोटप्याड-धोखा पाना

0. अनावश्यक स्तम्भहरू हटाउनुहोस्

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

1. यो स्तम्भमा खाली मानहरूको संख्या 50% भन्दा बढी छ?

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

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

2. खाली मानहरू भएका रेखाहरू मेटाउनुहोस्

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

३.१। अनियमित मान सम्मिलित गर्दै

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

३.२। एक स्थिर मान सम्मिलित गर्दै

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)

त्यसोभए, हामीले अन्ततः गुणात्मक डेटामा नलहरूमा ह्यान्डल पाएका छौं। अब यो तपाईको डाटाबेसमा भएका मानहरूमा एक-हट-इन्कोडिङ प्रदर्शन गर्ने समय हो। यो विधि प्रायः तपाईको एल्गोरिदमले उच्च गुणस्तरको डेटाबाट सिक्न सक्छ भनी सुनिश्चित गर्न प्रयोग गरिन्छ।

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

त्यसोभए, हामीले अन्ततः फरक गुणात्मक र मात्रात्मक डेटा प्रशोधन समाप्त गरेका छौं - तिनीहरूलाई फिर्ता संयोजन गर्ने समय

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

हामीले डेटासेटहरूलाई एकसाथ जोडिसकेपछि, हामी अन्ततः sklearn पुस्तकालयबाट MinMaxScaler प्रयोग गरेर डेटा रूपान्तरण प्रयोग गर्न सक्छौं। यसले हाम्रो मानहरू 0 र 1 को बीचमा बनाउनेछ, जसले भविष्यमा मोडेललाई प्रशिक्षण दिंदा मद्दत गर्नेछ।

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

यो डाटा अब कुनै पनि चीजको लागि तयार छ - न्यूरल नेटवर्कहरू, मानक ML एल्गोरिदमहरू, आदि।

यस लेखमा, हामीले समय शृङ्खला डेटासँग काम गर्ने कुरालाई ध्यानमा राखेका छैनौं, किनकि त्यस्ता डेटाको लागि तपाईंले आफ्नो कार्यमा निर्भर गर्दै, अलि फरक प्रशोधन प्रविधिहरू प्रयोग गर्नुपर्छ। भविष्यमा, हाम्रो टोलीले यस विषयमा छुट्टै लेख समर्पित गर्नेछ, र हामी आशा गर्छौं कि यसले तपाईंको जीवनमा यस्तै रोचक, नयाँ र उपयोगी कुरा ल्याउन सक्षम हुनेछ।

स्रोत: www.habr.com

एक टिप्पणी थप्न