نحوه پیش پردازش داده در پایتون — ۷ مرحله اصلی

پیش پردازش داده در پایتون

برای استخراج دانش و بینش از داده‌ها، حوزه علوم داده «Data Science» تحلیل آماری «Statistical Analysis»، یادگیری ماشین «Machine Learning» و برنامه‌نویسی کامپیوتری را با هم ترکیب می‌کند. این فرآیند شامل جمع‌آوری، پاک‌سازی و تبدیل داده‌های ساختارنیافته به شکلی است که قابل تحلیل و تصویرسازی باشد. دانشمندان داده از روش‌ها و ابزارهای مختلفی مانند مدل‌های آماری، الگوریتم‌های یادگیری ماشین و نرم‌افزارهای بصری‌سازی داده برای پردازش و تحلیل داده‌ها استفاده می‌کنند. هدف علم داده کشف الگوهایی در داده‌ها است که می‌تواند به تصمیم‌گیری، بهبود فرآیندها و ایجاد فرصت‌های جدید کمک کند. این رشته میان‌رشته‌ای شامل حوزه‌هایی مانند کسب‌وکار، مهندسی و علوم اجتماعی است.

پیش پردازش داده ها

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

مراحل پردازش داده

لزوم نیاز به پیش‌پردازش داده‌ها

برای دستیابی به نتایج بهتر از مدل‌های اعمال‌شده در پروژه‌های یادگیری ماشین، داده‌ها باید به فرمت مناسب تبدیل شوند. برخی از مدل‌های مشخص یادگیری ماشین به اطلاعات در فرمت خاصی نیاز دارند. به‌عنوان‌مثال، الگوریتم جنگل تصادفی (Random Forest) مقادیر تهی (Null) را پشتیبانی نمی‌کند، بنابراین برای اجرای این الگوریتم، باید مقادیر تهی از مجموعه داده‌های خام اصلی مدیریت شوند.

جنبه دیگر این است که مجموعه داده باید به گونه‌ای قالب‌بندی شود که بتوان بیش از یک الگوریتم یادگیری ماشین یا یادگیری عمیق را روی آن اجرا کرد و بهترین الگوریتم از بین آن‌ها انتخاب شود.

مراحل پیش پردازش داده در پایتون

پیش‌پردازش داده یکی از مهم‌ترین مراحل در تحلیل داده و یادگیری ماشین است. این مراحل به بهبود کیفیت داده‌ها و آماده‌سازی آنها برای تحلیل یا مدل‌سازی کمک می‌کنند. در پایتون، با استفاده از کتابخانه‌های پایتون مانند NumPy، Pandas، و Scikit-learn می‌توان به راحتی عملیات پیش‌پردازش را انجام داد. مراحل معمول پیش‌پردازش داده به شرح زیر است:

مرحله ۱: وارد کردن کتابخانه‌های لازم

# importing libraries
import pandas as pd
import scipy
import numpy as np
from sklearn.preprocessing import MinMaxScaler
import seaborn as sns
import matplotlib.pyplot as plt

مرحله ۲: بارگذاری مجموعه داده

برای بارگذاری مجموعه داده، ابتدا فایل داده را از لینک Diabetes Database دانلود کنید. پس از اطمینان از اینکه فایل در مسیر مناسب ذخیره شده است، می‌توانید از کتابخانه Pandas برای خواندن داده‌ها استفاده کنید.

# Load the dataset
df = pd.read_csv('programstore/DataSets/diabetes.csv')
print(df.head())

خروجی:

      Pregnancies  Glucose  BloodPressure  SkinThickness  Insulin   BMI   
۰            ۶      ۱۴۸             ۷۲             ۳۵        ۰     ۳۳.۶  
۱            ۱       ۸۵             ۶۶             ۲۹        ۰     ۲۶.۶   
۲            ۸      ۱۸۳             ۶۴              ۰        ۰     ۲۳.۳   
۳            ۱       ۸۹             ۶۶             ۲۳       ۹۴     ۲۸.۱   
۴            ۰      ۱۳۷             ۴۰             ۳۵      ۱۶۸     ۴۳.۱   

    DiabetesPedigreeFunction  Age  Outcome  
۰                     ۰.۶۲۷   ۵۰        ۱  
۱                     ۰.۳۵۱   ۳۱        ۰  
۲                     ۰.۶۷۲   ۳۲        ۱  
۳                     ۰.۱۶۷   ۲۱        ۰  
۴                     ۲.۲۸۸   ۳۳        ۱

برای بررسی اطلاعات مجموعه داده، از متد info() در کتابخانه Pandas استفاده می‌کنیم. این متد اطلاعاتی درباره ستون‌ها، تعداد مقادیر غیرتهی، نوع داده‌ها و اندازه حافظه ارائه می‌دهد.

df.info()

خروجی:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 768 entries, 0 to 767
Data columns (total 9 columns):
 #   Column                    Non-Null Count  Dtype  
---  ------                    --------------  -----  
 ۰   Pregnancies               768 non-null    int64  
 ۱   Glucose                   768 non-null    int64  
 ۲   BloodPressure             768 non-null    int64  
 ۳   SkinThickness             768 non-null    int64  
 ۴   Insulin                   768 non-null    int64  
 ۵   BMI                       768 non-null    float64
 ۶   DiabetesPedigreeFunction  768 non-null    float64
 ۷   Age                       768 non-null    int64  
 ۸   Outcome                   768 non-null    int64  
dtypes: float64(2), int64(7)
memory usage: 54.1 KB

همان‌طور که از اطلاعات بالا مشخص است، مجموعه داده دارای ۹ ستون و ۷۶۸ مقدار در هر ستون است و هیچ مقدار تهی (Null) در داده‌ها وجود ندارد. برای تأیید، می‌توان از متد ()isnull استفاده کرد که مقادیر تهی را در مجموعه داده شناسایی می‌کند.

df.isnull().sum()

خروجی:

Pregnancies                 0
Glucose                     0
BloodPressure               0
SkinThickness               0
Insulin                     0
BMI                         0
DiabetesPedigreeFunction    0
Age                         0
Outcome                     0
dtype: int64

مرحله ۳: تحلیل آماری

برای انجام تحلیل آماری، می‌توان از متد describe در Pandas استفاده کرد. این متد یک نمای کلی از ویژگی‌های آماری مجموعه داده ارائه می‌دهد، از جمله مقادیر میانگین، میانه، انحراف معیار، کمینه و بیشینه برای ستون‌های عددی.

df.describe()

خروجی:

تحلیل آماری

جدول بالا تعداد، میانگین، انحراف معیار، کمینه، ۲۵٪، ۵۰٪، ۷۵٪ و بیشینه مقادیر را برای هر ستون نشان می‌دهد. زمانی که با دقت به جدول نگاه کنیم، متوجه می‌شویم که ستون‌های Insulin، Pregnancies، BMI و BloodPressure دارای مقادیر پرت هستند. برای درک بهتر، نمودار Boxplot را برای هر ستون رسم می‌کنیم.

مرحله ۴: بررسی مقادیر پرت

# Box Plots
fig, axs = plt.subplots(9,1,dpi=95, figsize=(7,17))
i = 0
for col in df.columns:
 axs[i].boxplot(df[col], vert=False)
 axs[i].set_ylabel(col)
 i+=1
plt.show()

خروجی:

نمودار Boxplots

از نمودار Boxplot بالا، به وضوح می‌توان مشاهده کرد که تقریباً هر ستون مقداری مقادیر پرت (Outliers) دارد.

# Identify the quartiles
q1, q3 = np.percentile(df['Insulin'], [25, 75])
# Calculate the interquartile range
iqr = q3 - q1
# Calculate the lower and upper bounds
lower_bound = q1 - (1.5 * iqr)
upper_bound = q3 + (1.5 * iqr)
# Drop the outliers
clean_data = df[(df['Insulin'] >= lower_bound) 
    & (df['Insulin'] <= upper_bound)]


# Identify the quartiles
q1, q3 = np.percentile(clean_data['Pregnancies'], [25, 75])
# Calculate the interquartile range
iqr = q3 - q1
# Calculate the lower and upper bounds
lower_bound = q1 - (1.5 * iqr)
upper_bound = q3 + (1.5 * iqr)
# Drop the outliers
clean_data = clean_data[(clean_data['Pregnancies'] >= lower_bound) 
      & (clean_data['Pregnancies'] <= upper_bound)]


# Identify the quartiles
q1, q3 = np.percentile(clean_data['Age'], [25, 75])
# Calculate the interquartile range
iqr = q3 - q1
# Calculate the lower and upper bounds
lower_bound = q1 - (1.5 * iqr)
upper_bound = q3 + (1.5 * iqr)
# Drop the outliers
clean_data = clean_data[(clean_data['Age'] >= lower_bound) 
      & (clean_data['Age'] <= upper_bound)]


# Identify the quartiles
q1, q3 = np.percentile(clean_data['Glucose'], [25, 75])
# Calculate the interquartile range
iqr = q3 - q1
# Calculate the lower and upper bounds
lower_bound = q1 - (1.5 * iqr)
upper_bound = q3 + (1.5 * iqr)
# Drop the outliers
clean_data = clean_data[(clean_data['Glucose'] >= lower_bound) 
      & (clean_data['Glucose'] <= upper_bound)]


# Identify the quartiles
q1, q3 = np.percentile(clean_data['BloodPressure'], [25, 75])
# Calculate the interquartile range
iqr = q3 - q1
# Calculate the lower and upper bounds
lower_bound = q1 - (0.75 * iqr)
upper_bound = q3 + (0.75 * iqr)
# Drop the outliers
clean_data = clean_data[(clean_data['BloodPressure'] >= lower_bound) 
      & (clean_data['BloodPressure'] <= upper_bound)]


# Identify the quartiles
q1, q3 = np.percentile(clean_data['BMI'], [25, 75])
# Calculate the interquartile range
iqr = q3 - q1
# Calculate the lower and upper bounds
lower_bound = q1 - (1.5 * iqr)
upper_bound = q3 + (1.5 * iqr)
# Drop the outliers
clean_data = clean_data[(clean_data['BMI'] >= lower_bound) 
      & (clean_data['BMI'] <= upper_bound)]


# Identify the quartiles
q1, q3 = np.percentile(clean_data['DiabetesPedigreeFunction'], [25, 75])
# Calculate the interquartile range
iqr = q3 - q1
# Calculate the lower and upper bounds
lower_bound = q1 - (1.5 * iqr)
upper_bound = q3 + (1.5 * iqr)

# Drop the outliers
clean_data = clean_data[(clean_data['DiabetesPedigreeFunction'] >= lower_bound) 
      & (clean_data['DiabetesPedigreeFunction'] <= upper_bound)]

مرحله ۵: همبستگی (Correlation)

#correlation
corr = df.corr()

plt.figure(dpi=130)
sns.heatmap(df.corr(), annot=True, fmt= '.2f')
plt.show()

خروجی:

نمایش نمودار همبستگی داده در پایتون

ما همچنین می‌توانیم مقایسه را بر اساس یک ستون به صورت نزولی انجام دهیم.

corr['Outcome'].sort_values(ascending = False)

خروجی:

Outcome                     1.000000
Glucose                     0.466581
BMI                         0.292695
Age                         0.238356
Pregnancies                 0.221898
DiabetesPedigreeFunction    0.173844
Insulin                     0.130548
SkinThickness               0.074752
BloodPressure               0.0

بررسی تناسب نتایج

plt.pie(df.Outcome.value_counts(), 
  labels= ['Diabetes', 'Not Diabetes'], 
  autopct='%.f', shadow=True)
plt.title('Outcome Proportionality')
plt.show()

خروجی:

Outcome Proportionality

مرحله ۶: جداسازی ویژگی‌های مستقل و متغیرهای هدف

# separate array into input and output components
X = df.drop(columns =['Outcome'])
Y = df.Outcome

مرحله ۷: نرمال‌سازی یا استانداردسازی

نرمال سازی:

  • MinMaxScaler داده‌ها را طوری مقیاس‌بندی می‌کند که هر ویژگی در بازه [۰، ۱] قرار گیرد.
  • این روش زمانی خوب عمل می‌کند که ویژگی‌ها مقیاس‌های متفاوتی داشته باشند و الگوریتم مورد استفاده به مقیاس ویژگی‌ها حساس باشد، مانند k-nearest neighbors یا شبکه‌های عصبی.
  • داده‌های خود را با استفاده از scikit-learn و ابزار MinMaxScaler مقیاس‌بندی کنید.
# initialising the MinMaxScaler
scaler = MinMaxScaler(feature_range=(0, 1))
 
# learning the statistical parameters for each of the data and transforming
rescaledX = scaler.fit_transform(X)
rescaledX[:5]

خروجی:

array([[0.353, 0.744, 0.59 , 0.354, 0.   , 0.501, 0.234, 0.483],
       [۰.۰۵۹, ۰.۴۲۷, ۰.۵۴۱, ۰.۲۹۳, ۰.   , ۰.۳۹۶, ۰.۱۱۷, ۰.۱۶۷],
       [۰.۴۷۱, ۰.۹۲ , ۰.۵۲۵, ۰.   , ۰.   , ۰.۳۴۷, ۰.۲۵۴, ۰.۱۸۳],
       [۰.۰۵۹, ۰.۴۴۷, ۰.۵۴۱, ۰.۲۳۲, ۰.۱۱۱, ۰.۴۱۹, ۰.۰۳۸, ۰.   ],
       [۰.   , ۰.۶۸۸, ۰.۳۲۸, ۰.۳۵۴, ۰.۱۹۹, ۰.۶۴۲, ۰.۹۴۴, ۰.۲  ]])

استانداردسازی

  • استانداردسازی یک تکنیک مفید است برای تبدیل ویژگی‌هایی که توزیع گاوسی دارند و میانگین‌ها و انحراف معیارهای متفاوتی دارند، به یک توزیع گاوسی استاندارد با میانگین ۰ و انحراف معیار ۱.
  • ما می‌توانیم داده‌ها را با استفاده از کلاس StandardScaler در scikit-learn استانداردسازی کنیم.
  • این روش زمانی خوب عمل می‌کند که ویژگی‌ها توزیع نرمال داشته باشند یا زمانی که الگوریتم مورد استفاده به مقیاس ویژگی‌ها حساس نباشد.
from sklearn.preprocessing import StandardScaler
 
scaler = StandardScaler().fit(X)
rescaledX = scaler.transform(X)
rescaledX[:5]

خروجی:

array([[ 0.64 ,  0.848,  0.15 ,  0.907, -0.693,  0.204,  0.468,  1.426],
       [-۰.۸۴۵, -۱.۱۲۳, -۰.۱۶۱,  ۰.۵۳۱, -۰.۶۹۳, -۰.۶۸۴, -۰.۳۶۵, -۰.۱۹۱],
       [ ۱.۲۳۴,  ۱.۹۴۴, -۰.۲۶۴, -۱.۲۸۸, -۰.۶۹۳, -۱.۱۰۳,  ۰.۶۰۴, -۰.۱۰۶],
       [-۰.۸۴۵, -۰.۹۹۸, -۰.۱۶۱,  ۰.۱۵۵,  ۰.۱۲۳, -۰.۴۹۴, -۰.۹۲۱, -۱.۰۴۲],
       [-۱.۱۴۲,  ۰.۵۰۴, -۱.۵۰۵,  ۰.۹۰۷,  ۰.۷۶۶,  ۱.۴۱ ,  ۵.۴۸۵,

نتیجه گیری

در این مقاله مراحل و نحوه پیش پردازش داده در پایتون را بررسی کردیم و اقدامات مختلفی را برای آماده‌سازی داده‌ها انجام دادیم. ابتدا داده‌ها را بارگذاری و اطلاعات اولیه را بررسی کردیم که نشان داد هیچ مقدار تهی (Null) در داده‌ها وجود ندارد. سپس با استفاده از تحلیل آماری، توصیفاتی از ویژگی‌های مختلف داده‌ها به دست آوردیم در نهایت، برای بررسی روابط بین ویژگی‌ها، ماتریس همبستگی را محاسبه کردیم که به ما کمک کرد تا ارتباطات مختلف بین ویژگی‌ها را درک کنیم. این مراحل برای آماده‌سازی داده‌ها به منظور اعمال مدل‌های یادگیری ماشین و بهبود دقت پیش‌بینی‌ها بسیار مهم هستند.

میزان رضایتمندی
لطفاً میزان رضایت خودتان را از این مطلب با دادن امتیاز اعلام کنید.
[ امتیاز میانگین 5 از 1 نفر ]
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.

دیدگاه‌ خود را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *



برچسب‌ها:
پایتون یادگیری ماشین


پیمایش به بالا