Verilənlərin təhlilə hazırlanması, bir layihəyə başlamaq üçün alətlərinizi təşkil etməyə bənzəyir. Əksər hallarda, hər şeyin təmiz, sıralanmış və asan əldə edilə bilən olması lazımdır ki, işinizi səmərəli şəkildə görəsiniz. Özəl bir emal boru xətti, verilənlərinizi düzgün hazırlamaq üçün əla bir yoldur. Lakin, kiçik layihələr üçün mükəmməl olan kiçik bir alət qutusu, böyük və mürəkkəb tapşırıqlar üçün mübarizə aparır; kiçik verilənlər üçün hazırlanmış boru xətləri böyük verilənlərin miqyası və mürəkkəbliyi ilə başa çıxmaqda çətinlik çəkə bilər.
Bu məqalədə, özəl verilənlər emalı boru xəttinin güclü və zəif tərəflərini araşdıracağıq və Python əsaslı bir nümunəyə nəzər salacağıq. Həmçinin, bu yanaşmanın kiçik və orta verilənlər üçün niyə daha uyğun olduğunu və böyüklər üçün daha ölçülə bilən hala gətirilməsi üçün hansı düzəlişlərin edilə biləcəyini müzakirə edəcəyik. Bu boru xəttində istifadə olunan kodun daha dərindən izahı üçün, ətraflı Kaggle məqaləmə baxa bilərsiniz. Məqalə, prosesin hər bir addımını əhatə edir, kod və bütün prosesin necə birləşdiyini əlavə izahlarla təqdim edir.
Özəl Verilənlər Emalı Boru Xətti
DataProcessor
sinfi, verilənlər emalı ilə bağlı geniş bir sıra vəzifələri yerinə yetirmək üçün özəl olaraq hazırlanmış bir alətdir. Bu sinifin işləri arasında:
-
Itkisiz dəyərlərin doldurulması,
-
Kategorik dəyişənlərin kodlaşdırılması,
-
Sayısal xüsusiyyətlərin miqyaslandırılması,
-
Çıxıntıların idarə edilməsi,
-
Və daha çoxu.
class DataProcessor:
def __init__(self, dataframe, target_column):
self.df = dataframe.copy()
self.target_column = target_column
Bu sinfə bir verilənlər dəsti verildikdə və hansı sütunun hədəf olduğunu bildirdikdə, işə başlamağa hazırdır. O, çirkli verilənləri təmizləməkdən tutmuş, onları təlim və test dəstlərinə ayırmağa qədər hər şeyi edir.
Bu Boru Xətti Necə İşləyir?
Gəlin bu boru xəttindəki bəzi əsas metodlara və onların necə işlədiyinə nəzər salaq.
-
Boşluqların doldurulması: İtkili Dəyərlərin İdarə Edilməsi
Reallıqda verilənlər dəstləri nadir hallarda mükəmməl olur. Onlar tez-tez itkili dəyərlərə malikdir və bu boru xətti onları sistematik şəkildə idarə edir:
def handle_missing_values(self):
for col in self.df.columns:
na_ratio = self.df[col].isna().mean()
if na_ratio > 0.4:
self.df.drop(columns=[col], inplace=True)
elif self.df[col].dtype == 'object': # Kategorik? Ən çox təkrarlanan dəyər ilə doldur.
self.df[col].fillna(self.df[col].mode()[0], inplace=True)
else: # Sayısal? Ortalamayla doldur.
self.df[col].fillna(self.df[col].mean(), inplace=True)
Kiçik verilənlər üçün bu, gözəl işləyir. Bu, verilənlərinizi tam təmin edir və sisteminizi yükləmir. Lakin, böyük verilənlər üçün bütün sütunları yaddaşa yükləmək, prosesi yavaşladır və resursları artırır.
-
Kodlaşdırmanın Şifrə açılması: Kategorik Verilərin İdarə Edilməsi
Kategorik verilənlər, maşın öyrənmə modelləri üçün sayısal formata çevrilməlidir. Bu boru xətti, bir süni intellekt modelindən (Google Gemini) istifadə edir və bir sütunun kateqoriyalarının ordinal (mənalı sıralama var) və ya nominal (sıralama yoxdur) olub-olmamasını soruşur:
response = self.gen_model.generate_content(
f"Are the categories in column '{column}' ordinal or nominal?"
)
Əgər ordinaldırsa, boru xətti LabelEncoder
istifadə edir. Əgər nominaldırsa, bir-birini yalnızca bir-şəkil kodlaşdırma tətbiq edir. Kiçik verilənlərdə, bu, interaktiv işləyir və API cavabları gözləmək üçün vaxtınız olduğunda mükəmməldir. Lakin, yüzlərlə sütun və sıra varsa, bu çox vaxt alar və API zənglərinə görə böyük xərc yaradar.
-
Sayısal Verilərin Miqyaslandırılması:
StandardScaler
vəMinMaxScaler
Sayısal xüsusiyyətlərlə işləyərkən, miqyaslandırma, dəyərlərin həddindən artıq fərqli olmamasını təmin edir. Boru xətti, hər bir sütunun nə qədər “kırılgan” (disbalanslı) olduğuna əsaslanaraq miqyaslama üsulunu seçir:
def apply_scaling(self):
for column in numerical_cols:
if self.X_train[column].skew() > 1 or self.X_train[column].skew() < -1:
scaler = StandardScaler() # Kırılgan verilənləri normallaşdır.
else:
scaler = MinMaxScaler() # Dəyərləri 0-1 aralığında miqyaslandır.
self.X_train[column] = scaler.fit_transform(self.X_train[[column]])
Bu, kiçik verilənlər üçün yaxşı işləyir, amma sətirlər çoxaldıqca bu prosesin sürəti azala bilər. Hər bir sütun tək-tək işlənir, bu da böyük verilənlər üçün daha az effektivdir.
Kiçik Verilənlər Üçün Niyə Əla İşləyir?
Bu boru xətti, verilənlər dəstiniz çox böyük olmadıqda çox yaxşı işləyir:
-
Anlaşılması Asan: Hər bir addım modulardır və aydın şəkildə təşkil olunmuşdur, bu da səhvləri düzəltmək və ya tədris üçün əla edir.
-
Sürətli və Əlverişli: Fərqli verilənlər dəstlərinə çox çətinlik çəkmədən uyğunlaşa bilər.
-
Prototipləşdirmə üçün İdeal: Verilənlər dəstiniz 100k sətirdən azdırsa, bu boru xətti, xam verilənlərdən təhlil üçün hazır vəziyyətə sürətlə gətirə bilər.
Böyük Verilənlərlə Niyə Çətinlik Çəkir?
Böyük verilənlərlə işləyərkən bu boru xətti öz məhdudiyyətlərini göstərir:
-
Yaddaş Yükü:
pd.concat
vəisna()
kimi əməliyyatlar, verilənlər dəstinizin tamamilə yaddaşa sığacağını fərz edir, amma böyük fayllar üçün bu mümkün olmur. -
Yavaş Proses: Dövr və ardıcıl sütun işləmələri, milyonlarla sətir olduğunda yaxşı miqyaslanmır.
-
Bahalı Asılılıqlar: Xarici bir modelə (məsələn, ordinal və nominal kodlaşdırma qərarları üçün) əsaslanmaq gecikmə və xərc yaradır.
Bu Boru Xəttini Böyük Verilənlər Üçün Necə Ölçüləndirmək olar?
Böyük verilənlərlə işləmək üçün bəzi tövsiyələr:
-
Paylanmış Hesablama istifadə edin:
Dask
və yaSpark
kimi çərçivələrdən istifadə edərək, verilənləri birdən yükləmək əvəzinə hissə-hissə işləyə bilərsiniz. -
Vektorlaşdırılmış Əməliyyatlardan istifadə edin: Dövr əvəzinə vektorlaşdırılmış əməliyyatlar ilə paralel işləməyi təmin edin.
-
Qaydalı Kodlaşdırma İstifadə edin: Süni intellekt modelinə soruşmaq əvəzinə, əvvəlcədən müəyyən edilmiş qaydalara əsaslanın.
-
Nümunə Seçimi istifadə edin: Miqyaslandırma və kodlaşdırma kimi qərarları nümunə seçimi ilə işləyin, sonra bu transformasiyaları bütün verilənlər dəstinə tətbiq edin.
Bu Boru Xəttini Nə Zaman İstifadə Etməlisiniz?
Bu boru xətti hər kəs və hər verilənlər dəsti üçün uyğun deyil. O, ən yaxşı şəkildə işləyir:
-
Prototipləşdirmə: Kiçik verilənlər dəstlərində ideyaları tez test etmək.
-
Tədris məqsədli: Emalın əsaslarını öyrənmək və tədris etmək.
-
İdarə edilə bilən verilənlər ölçüləri: Yaddaşa rahat yerləşən, 1 milyon sətirdən az verilənlər dəstləri üçün.
Böyük verilənlər üçün daha möhkəm və ölçülə bilən bir həllə ehtiyacınız olacaq.