Maşın Öyrənmə Xüsusiyyətinin Çevrilməsi, Başlanğıc Bələdçisi

Maşın öyrənmə modellərini necə optimallaşdırmağı öyrənməyə başladığımda, modelləşdirmə mərhələsinə çatdıqdan sonra, məlumat dəstində mövcud xüsusiyyətlərin növlərini daha yaxşı idarə etmək üçün tez-tez məlumatları yenidən nəzərdən keçirməli idim. Zamanla modelləri qurmadan əvvəl ilk addımlardan birinin məlumatlarda mövcud olan dəyişənlərin növlərini diqqətlə nəzərdən keçirmək və ən yaxşı model performansını əldə etmək üçün əvvəlcədən ən yaxşı çevrilmə müddətini müəyyənləşdirmək olduğunu gördüm.

Növbəti yazıda dörd ümumi dəyişkən növünü müəyyənləşdirmək və dəyişdirmək üçün keçdiyim prosesi təsvir edəcəyəm. Https://www.drivendata.org/ saytında təşkil olunan Ürəklə Maşın Öyrənmə istiləşmə müsabiqəsindən bir məlumat dəsti istifadə edəcəyəm. Tam verilənlər bazasını buradan yükləyə bilərsiniz: https://www.drivendata.org/competitions/54/machine-learning-with-a-heart/data/. DrivenData mütəmadi olaraq sosial problemlərin həllinə əsaslanan onlayn problemlərə ev sahibliyi edir. Bu yaxınlarda bəzi bacarıqlarımı yaxşı istifadə etmək və gündəlik işimdə rast gəlmədiyim məlumat dəstləri və məsələlərlə təcrübə qazanmaq üçün bu yarışların bəzilərində yarışmağa başladım.

Dəyişən tipləri müəyyənləşdirin

Statistikada ədədi dəyişənləri dörd əsas növə bölmək olar. Bir maşın öyrənmə layihəsinə başlayarkən, modellərin performansına əhəmiyyətli dərəcədə təsir göstərə biləcəyi üçün hər bir xüsusiyyətinizdə olan məlumat növünü təyin etmək vacibdir. Aşağıdakı dörd növə sadə bir təsvir verməyə çalışdım.

  • Davamlı dəyişənlər, yalnız müəyyən bir dəyər aralığına sahib ola bilən ayrı-ayrı dəyişənlərdən fərqli olaraq sonsuz sayda mümkün dəyərə sahib ola bilən dəyişənlərdir. Davamlı bir dəyişənə nümunə olaraq bir avtomobilin ömrü boyu keçdiyi məsafələrin sayı göstərilə bilər.
  • Nominal dəyişənlər 2 və ya daha çox mümkün qiymətə malik kategorik dəyərlərdir, lakin sıraları əhəmiyyətsizdir. Məsələn, kompakt dəyəri 1, MPV 2, kabrioletin 3 dəyəri var deyən avtomobil növlərini şərh etmək üçün ədədi təsvirdən istifadə edə bilərik. Dəyəri 2 olan konvertasiya konvertasiya olunan qrupun riyazi mənasını vermir bəzi yollarla MPV-dən daha böyükdür. Sadəcə kateqoriyanın ədədi təsviridir.
  • Dichotomous dəyişənlər yenidən kategorikdir, lakin ümumiyyətlə yalnız 2 və 0 və 1 dəyərləri var. Məsələn, avtomobil sahibliyini 1 (bəli deməkdir) və ya 0 (yox deməkdir) kimi təsnif edə bilərik. Dəyişənləri saxtakar sütunlara çevirsək (bunu bu yazıda daha sonra edəcəyik), yeni xüsusiyyətlər də ikitərəfli olur.
  • Sıra dəyişənləri 2 və ya daha çox mümkün dəyərə sahib olduqları üçün nominal olaraq oxşardırlar. Əsas fərq bu dəyərlərin mənalı bir sıraya və ya dərəcəyə sahib olmasıdır. Bir avtomobil üçün nümunəmizdə, bu, bu kateqoriyaların gücünə görə sıralana biləcəyi bir mühərrik ölçüsü ola bilər, 1.2, 1.6, 1.8.

Məlumat hazırlayın

Dəyişənlərin növlərinin müəyyənləşdirilməsi və dəyişdirilməsi prosesindən keçmək üçün maşın məlumatlarını ürək məlumatları dəsti ilə istifadə edəcəyəm. CSV sənədlərini Jupyter dəftərinə yüklədim və oxudum. Sonra, məlumatların tərkibinin anlıq görüntüsünü almaq üçün aşağıdakı funksiyanı işə salacağam.

pandaları pd olaraq idxal edin
def quick_analysis (df): çap ("Məlumat növləri:") çap (df.dtypes) çap ("Sətirlər və sütunlar:") çap (df.shape) çap ("Sütun adları:") çap (df.columns) çap (" Sıfır dəyərlər: ") çap (df.apply (Lambda x: sum (x.isnull ()) / len (df))
Sürətli analiz (qatar)

Bu, aşağıdakı nəticəni verir.

Bu mənə yalnız 180 satırdan ibarət kiçik bir məlumat dəstimin olduğunu və 15 sütunun olduğunu söyləyir. Funksiyalardan biri ədədi deyil, buna görə də maşın öyrənmə kitabxanalarının çoxunu tətbiq etməzdən əvvəl onu dəyişdirmək lazımdır. Heç bir sıfır dəyər yoxdur, buna görə bunları müalicə etməkdən narahat olmayacağam. Məlumat dəstini işlətmədən əvvəl ədədi olmadığı və heç bir təlim və ya proqnozlaşdırma səviyyəsində istifadə edilmədiyi üçün əvvəlcə "xəstə_id" sütununu da silirəm.

Daha sonra bəzi sürətli təsviri statistika etmək üçün Pandas Təsvir funksiyasını işə saldım.

train.describe ()

Məlumat dəstindəki dəyişkən tipləri təsnif etmək üçün bütün ədədi xüsusiyyətlərin histoqramlarını yaradan aşağıdakı kodu işlədirəm. Nəticədə çıxan məhsuldan hansı xüsusiyyətlərin davamlı və ikili olduğunu asanlıqla görə bilərsiniz. Davamlı xüsusiyyətlər davamlı bir paylama nümunəsini göstərir, ikili xüsusiyyətlər yalnız iki çubuqdadır. Nominal və sıra dəyişənlərin müəyyənləşdirilməsi bəzən daha çətin ola bilər və daha çox məlumat dəsti və ya xüsusi domen bilikləri tələb oluna bilər. Belə bir maşın öyrənmə yarışması vəziyyətində, daxil edilə bilən bir məlumat lüğətinə istinad etməyi təklif edərdim. Məlumat lüğəti yoxdursa (burada olduğu kimi) intuisiya və sınaq və səhv birləşməsi tələb oluna bilər.

plt qatar kimi matplotlib.pyplot idxal [train.dtypes [(train.dtypes == "float64") | (train.dtypes == "int64")] .index.values] .hist (figsize = [11,11])

Aşağıdakı cədvəldəki funksiyaları dörd növə ayırdım. İndi məlumatları təlim və proqnozlaşdırma üçün hazırlamaq üçün hansı dönüşüm addımlarını atacağım barədə bəzi qərarlar verə bilərəm.

Kukla dəyişənlər

Daha əvvəl də qeyd edildiyi kimi, əksər maşın öyrənmə kitabxanalarında istifadə olunmaq üçün bütün ədədi olmayan dəyərlər tam və ya üzən nöqtə nömrələrinə çevrilməlidir. Aşağı kardinal dəyişkənlər üçün ən yaxşı yanaşma xüsusiyyətin unikal dəyər başına bir sütuna çevrilməsidir, burada dəyər yoxdursa 0 və 1 olur. Bunlara kukla dəyişənlər deyilir.

Bu texnika ümumiyyətlə nominal dəyişənlərə də tətbiq olunur. Bunların daxili düzeni olmadığından, maşın öyrənmə alqoritmi əvvəlcə tətbiq etməsək, yalan olaraq bu dəyərlər sırası ilə bir əlaqə axtara bilər.

Pandaların bunun üçün get_dummies () adlı gözəl bir funksiyası var. Aşağıdakı kodda bundan bütün nominal və ədədi olmayan xüsusiyyətləri yeni sütunlara çevirmək üçün istifadə etdim. Çıxışdan bir neçə yeni sütunun yaradıldığını və orijinal sütunların silindiyini görə bilərsiniz.

dummy_cols = ['thal', 'chest_pain_type', 'num_major_vessels', 'exercise_induced_angina', 'fasting_blood_sugar_gt_120_mg_per_dl', 'resting_ekg_results', 'slope_of_peak_d.exercise_

Funksional miqyaslandırma

Məlumat dəstimizdəki davamlı dəyişənlər fərqli şəkildə ölçülür. Məsələn, yuxarıdakı histoqramlara qayıtsanız, "oldpeak_eq_st_depression" dəyişəninin 0-6 aralığında olduğunu, "max_heart_rate_achieved" məlumat nöqtələri arasında son proqnozları vermək üçün 100 ilə 200 aralığında olduğunu görə bilərsiniz. Bütün davamlı dəyişənlərin ölçüsünün standartlaşdırılması tez-tez maşın öyrənmə modellərinin performansını yaxşılaşdırır.

Python-da xüsusiyyət miqyaslandırma üçün bir sıra metodlar mövcuddur. Tercih etdiyim metod Sci-Kit Learn MinMaxScaler xüsusiyyətindən istifadə etməkdir. Xüsusiyyətlərdəki bütün dəyərlər 0-dan 1-ə qədər dəyişən miqyaslı dəyişir. Bunu edən aşağıda kod daxil etdim.

sklearn idxal ön emalından
n_test = qatar [[ 'serum_cholesterol_mg_per_dl' max_heart_rate_achieved "," oldpeak_eq_st_depression "," resting_blood_pressure ']] cols_to_norm = [' serum_cholesterol_mg_per_dl 'resting_bodeplo "," _ pressiedeplo'] "_ heart_rate_rate_dl ',' max_heart_rate_rate_dl", "max_heart_rate_rate_dl", "max_heart_rate_rate_dl", "max_heart_rate_rate_dl", "max_heart_rate_rate_dl", "max_heart_rate_rate_dl ',' max_heart_rate_dl"
x = n_test.values ​​min_max_scaler = preprocessing.MinMaxScaler () x_scaled = min_max_scaler.fit_transform (x) n_test = pd.DataFrame (x_scaled, sütunlar = cols_to_norm) l_test = train_dol__dol ',' old_,'_ , 'resting_blood_pressure'], ox = 1) train = pd.concat ([n_test, l_test], axis = 1) train.columns

Binning

Yuxarıdakı koddan xüsusiyyət şkalası çevrilməsinə davamlı dəyişən "yaş" daxil etmədiyimi görəcəksiniz. Bunun səbəbi yaşın ayrı bir dəyişənə çevrilməkdən faydalana bilən bir növ xüsusiyyət nümunəsidir. Bu nümunədə, xüsusiyyəti mənalı kateqoriyalar siyahısına çevirmək üçün çömçə və ya yığma istifadə edə bilərik.

Aşağıdakı kodda, məlumatdakı paylanmaya əsaslanan intuitiv kateqoriyalar təqdim etdim. Zibil qutularının, qrup adlarının və məlumat çərçivələrinin siyahısını yazan pandas kəsmə funksiyasından istifadə olunur. Bu funksiya orijinal məlumat çərçivəsini yeni "age_categories" funksiyası ilə qaytarır. Bu sütun daha əvvəl təsvir edilmiş metoddan istifadə edərək bir sıra saxta sütunlara çevrilə bilər.

Konteyner = [30, 40, 50, 60, 70, 80]
group_names = ['30 -39 ', '40 -49', '50 -59 ', '60 -69', '70 -79 ']
age_categories = pd.cut (train ['age'], konteyner, etiketlər = group_names) train ['age_categories'] = pd.cut (train ['age'], bins, labels = group_names) age_categories
pd.value_counts (qatar ['age_categories'])

İndi əlimizdə olan bütün sütunların ədədi olmadığı bir qeyddir. Bir neçə yeni xüsusiyyət yaratdıq və mövcud xüsusiyyətləri indi istifadə etdiyimiz bütün maşın öyrənmə modellərinin performansını yaxşılaşdırmağa kömək etmək üçün hazırlanmış formata çevirdik. Xüsusiyyət çevrilməsi maşın öyrənmə prosesində vacib bir ilk addımdır. Çox vaxt bu, model performansına əhəmiyyətli dərəcədə təsir göstərə bilər. Müxtəlif dəyişənlərin necə idarə olunacağını məntiqi düşünmək üçün bu müddətdə atacağım ilk addımları qeyd etdim. Model qurma mərhələsində, demək olar ki, həmişə geri qayıdıram və modellərin dəqiqliyini artırmaq üçün müxtəlif metodlardan istifadə edərək məlumatları optimallaşdırıram. Bununla birlikdə, bu addımları əvvəldən təqib etsəm, çevrilmə mərhələsinə qayıtmağa sərf etdiyim vaxtın tez-tez azaldığını görürəm.