जलद डेटा प्रीप्रोसेसिंगसाठी नोटबुक चीट शीट

अनेकदा डेटा सायन्सच्या क्षेत्रात प्रवेश करणार्‍या लोकांना त्यांच्यासाठी काय वाटेल याची वास्तववादी अपेक्षा असते. बर्‍याच लोकांना वाटते की आता ते मस्त न्यूरल नेटवर्क लिहितील, आयर्न मॅनकडून व्हॉइस असिस्टंट तयार करतील किंवा आर्थिक बाजारपेठेतील प्रत्येकाला हरवतील.
पण काम डेटा शास्त्रज्ञ हा डेटा-चालित आहे आणि सर्वात महत्वाचा आणि वेळ घेणारा पैलू म्हणजे डेटाला न्यूरल नेटवर्कमध्ये फीड करण्यापूर्वी किंवा त्याचे विशिष्ट प्रकारे विश्लेषण करण्यापूर्वी त्यावर प्रक्रिया करणे.

या लेखात, आमचा कार्यसंघ आपण चरण-दर-चरण सूचना आणि कोडसह डेटावर जलद आणि सहज प्रक्रिया कशी करू शकता याचे वर्णन करेल. आम्ही कोड खूप लवचिक बनवण्याचा प्रयत्न केला आणि वेगवेगळ्या डेटासेटसाठी वापरला जाऊ शकतो.

बर्‍याच व्यावसायिकांना या लेखात असामान्य काहीही सापडणार नाही, परंतु नवशिक्यांना काहीतरी नवीन शिकण्यास सक्षम असेल आणि जलद आणि संरचित डेटा प्रक्रियेसाठी स्वतंत्र नोटबुक बनवण्याचे स्वप्न पाहिलेले कोणीही कोड कॉपी करू शकतात आणि ते स्वतःसाठी स्वरूपित करू शकतात किंवा 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) #Убираем колонки со старыми значениями

३.४. दुसर्‍या मॉडेलद्वारे मोजलेले मूल्य घाला

कधीकधी स्केलेर्न लायब्ररी किंवा इतर तत्सम लायब्ररीतील मॉडेल्स वापरून रिग्रेशन मॉडेल्स वापरून मूल्यांची गणना केली जाऊ शकते. आमची टीम नजीकच्या भविष्यात हे कसे करता येईल यावर एक स्वतंत्र लेख समर्पित करेल.

त्यामुळे, आत्तासाठी, परिमाणवाचक डेटाबद्दलच्या कथनात व्यत्यय येईल, कारण विविध कामांसाठी डेटा तयार करणे आणि पूर्व-प्रक्रिया करणे अधिक चांगले कसे करावे याबद्दल इतर अनेक बारकावे आहेत आणि परिमाणात्मक डेटासाठी मूलभूत गोष्टी या लेखात विचारात घेतल्या आहेत, आणि आता गुणात्मक डेटाकडे परत जाण्याची वेळ आली आहे. जे आम्ही परिमाणवाचक डेटापासून अनेक पावले मागे वेगळे केले. तुम्ही हे नोटबुक तुमच्या इच्छेनुसार बदलू शकता, वेगवेगळ्या कामांसाठी ते बदलू शकता, जेणेकरून डेटा प्रीप्रोसेसिंग खूप लवकर होईल!

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

मूलभूतपणे, गुणात्मक डेटासाठी, स्ट्रिंग (किंवा ऑब्जेक्ट) वरून नंबरवर फॉरमॅट करण्यासाठी वन-हॉट-एनकोडिंग पद्धत वापरली जाते. या बिंदूवर जाण्यापूर्वी, रिक्त मूल्ये हाताळण्यासाठी वरील आकृती आणि कोड वापरू.

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)

हा डेटा आता कोणत्याही गोष्टीसाठी तयार आहे - न्यूरल नेटवर्क, मानक एमएल अल्गोरिदम इ.!

या लेखात, आम्ही वेळ मालिकेतील डेटासह कार्य करताना विचारात घेतले नाही, कारण अशा डेटासाठी आपण आपल्या कार्यावर अवलंबून, थोड्या वेगळ्या प्रक्रिया तंत्रांचा वापर केला पाहिजे. भविष्यात, आमचा कार्यसंघ या विषयावर एक स्वतंत्र लेख समर्पित करेल आणि आम्हाला आशा आहे की ते याप्रमाणेच आपल्या जीवनात काहीतरी मनोरंजक, नवीन आणि उपयुक्त आणण्यास सक्षम असेल.

स्त्रोत: www.habr.com

एक टिप्पणी जोडा