برگه Notepad-cheat برای پیش پردازش سریع داده ها

اغلب افرادی که وارد حوزه علوم داده می شوند انتظارات واقعی کمتری از آنچه در انتظارشان است دارند. بسیاری از مردم فکر می کنند که اکنون شبکه های عصبی جالبی می نویسند، یک دستیار صوتی از Iron Man ایجاد می کنند، یا همه را در بازارهای مالی شکست می دهند.
اما کار کن داده ها دانشمند داده محور است و یکی از مهم ترین و زمان برترین جنبه ها، پردازش داده ها قبل از وارد کردن آنها به شبکه عصبی یا تجزیه و تحلیل آنها به روشی خاص است.

در این مقاله، تیم ما نحوه پردازش سریع و آسان داده ها را با دستورالعمل ها و کدهای گام به گام شرح می دهد. ما سعی کردیم کد را کاملاً منعطف کنیم و بتوان از آن برای مجموعه داده‌های مختلف استفاده کرد.

ممکن است بسیاری از متخصصان در این مقاله چیز خارق‌العاده‌ای پیدا نکنند، اما مبتدیان می‌توانند چیز جدیدی بیاموزند و هر کسی که مدت‌ها آرزوی ساخت یک دفترچه یادداشت جداگانه برای پردازش سریع و ساختار یافته داده‌ها را داشته است، می‌تواند کد را کپی کرده و برای خود قالب‌بندی کند. نوت بوک تمام شده را از Github دانلود کنید.

مجموعه داده را دریافت کردیم. کار بعدی چیه؟

بنابراین، استاندارد: ما باید بفهمیم که با چه چیزی سر و کار داریم، تصویر کلی. برای انجام این کار، ما از پانداها برای تعریف انواع داده های مختلف استفاده می کنیم.

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 برای پیش پردازش سریع داده ها

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

برگه Notepad-cheat برای پیش پردازش سریع داده ها

بیایید به مقادیر ستون نگاه کنیم:

  1. آیا تعداد خطوط هر ستون با تعداد کل خطوط مطابقت دارد؟
  2. ماهیت داده ها در هر ستون چیست؟
  3. کدام ستون را می خواهیم هدف قرار دهیم تا بتوانیم برای آن پیش بینی کنیم؟

پاسخ به این سوالات به شما این امکان را می دهد که مجموعه داده را تجزیه و تحلیل کنید و تقریباً یک برنامه برای اقدامات بعدی خود ترسیم کنید.

همچنین، برای نگاه عمیق تر به مقادیر در هر ستون، می توانیم از تابع ()pandas describe استفاده کنیم. با این حال، عیب این تابع این است که اطلاعاتی در مورد ستون های دارای مقادیر رشته ای ارائه نمی دهد. بعدا باهاشون برخورد میکنیم

df.describe()

برگه Notepad-cheat برای پیش پردازش سریع داده ها

تجسم جادویی

بیایید به جایی که اصلاً ارزشی نداریم نگاه کنیم:

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

برگه Notepad-cheat برای پیش پردازش سریع داده ها

این یک نگاه کوتاه از بالا بود، حالا به چیزهای جالب تری می رویم

بیایید سعی کنیم ستون هایی را که در همه ردیف ها فقط یک مقدار دارند را پیدا کرده و در صورت امکان حذف کنیم (به هیچ وجه بر نتیجه تأثیر نمی گذارند):

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

برگه Notepad-cheat برای پیش پردازش سریع داده ها

در اینجا مقادیری که در داخل ستون ها وجود ندارد باید با رنگ زرد مشخص شوند. و اکنون سرگرمی شروع می شود - چگونه با این ارزش ها برخورد کنیم؟ آیا باید ردیف هایی با این مقادیر یا ستون ها را حذف کنم؟ یا این مقادیر خالی را با مقادیر دیگری پر کنید؟

در اینجا یک نمودار تقریبی وجود دارد که می تواند به شما کمک کند تصمیم بگیرید که اصولاً چه کاری را می توان با مقادیر خالی انجام داد:

برگه Notepad-cheat برای پیش پردازش سریع داده ها

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

3.1. درج یک مقدار تصادفی

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

3.2. درج یک مقدار ثابت

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. مقدار متوسط ​​یا متداول را درج کنید

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. مقدار محاسبه شده توسط مدل دیگر را درج کنید

گاهی اوقات می توان مقادیر را با استفاده از مدل های رگرسیون با استفاده از مدل هایی از کتابخانه sklearn یا سایر کتابخانه های مشابه محاسبه کرد. تیم ما مقاله جداگانه ای را در مورد چگونگی انجام این کار در آینده نزدیک اختصاص خواهد داد.

بنابراین، در حال حاضر، روایت در مورد داده های کمی قطع خواهد شد، زیرا بسیاری از نکات ظریف دیگر در مورد چگونگی انجام بهتر آماده سازی و پیش پردازش داده ها برای وظایف مختلف وجود دارد، و موارد اساسی برای داده های کمی در این مقاله در نظر گرفته شده است. اکنون زمان بازگشت به داده های کیفی است که چندین قدم از داده های کمی جدا کردیم. شما می توانید این نوت بوک را هر طور که دوست دارید تغییر دهید و آن را با وظایف مختلف تطبیق دهید تا پیش پردازش داده ها خیلی سریع انجام شود!

داده های کیفی

اساساً برای داده های کیفی از روش One-hot-encoding به منظور قالب بندی آن از رشته (یا شی) به عدد استفاده می شود. قبل از حرکت به این نقطه، بیایید از نمودار و کد بالا برای مقابله با مقادیر خالی استفاده کنیم.

df_categorical.nunique()

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

برگه Notepad-cheat برای پیش پردازش سریع داده ها

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

3.1. درج یک مقدار تصادفی

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

3.2. درج یک مقدار ثابت

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)

پس از اینکه مجموعه داده ها را با هم در یک واحد ترکیب کردیم، در نهایت می توانیم از تبدیل داده ها با استفاده از MinMaxScaler از کتابخانه sklearn استفاده کنیم. این باعث می شود مقادیر ما بین 0 و 1 باشد، که در آموزش مدل در آینده کمک خواهد کرد.

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

این داده ها اکنون برای هر چیزی آماده هستند - شبکه های عصبی، الگوریتم های استاندارد ML و غیره!

در این مقاله، کار با داده های سری زمانی را در نظر نگرفتیم، زیرا برای چنین داده هایی باید بسته به وظیفه خود از تکنیک های پردازش کمی متفاوت استفاده کنید. در آینده، تیم ما مقاله جداگانه ای را به این موضوع اختصاص خواهد داد و امیدواریم که بتواند چیز جالب، جدید و مفیدی را مانند این مقاله به زندگی شما بیاورد.

منبع: www.habr.com

اضافه کردن نظر