Ciri Transformasi untuk Pembelajaran Mesin, Panduan Pemula

Apabila mula mula belajar bagaimana mengoptimumkan model pembelajaran mesin, saya akan sering mencari, setelah sampai ke tahap pembinaan model, saya harus terus kembali untuk mengkaji semula data untuk menangani lebih baik jenis ciri yang terdapat dalam dataset. Dari masa ke masa saya dapati bahawa salah satu daripada langkah pertama yang diambil sebelum membina model adalah dengan mengkaji dengan teliti jenis-jenis pembolehubah yang terdapat di dalam data, dan cuba menentukan proses transformasi terbaik di depan untuk mencapai prestasi model yang optimum.

Dalam jawatan berikut saya akan menerangkan proses yang saya ambil untuk mengenal pasti, dan mengubah empat jenis pemboleh ubah biasa. Saya akan menggunakan dataset yang diambil dari persaingan "mesin pembelajaran dengan hati" yang dihoskan di https://www.drivendata.org/ laman web. Dataset penuh boleh dimuat turun di sini https://www.drivendata.org/competitions/54/machine-learning-with-a-heart/data/. DrivenData menjadi tuan rumah cabaran dalam talian yang berasaskan penyelesaian masalah sosial. Saya baru-baru ini mula terlibat dalam beberapa pertandingan ini dalam usaha untuk menggunakan beberapa kemahiran saya untuk tujuan yang baik, dan juga untuk mendapatkan pengalaman dengan set data dan masalah yang saya tidak biasanya temui dalam hari ke hari saya bekerja.

Mengenal pasti Jenis Variabel

Dalam statistik pembolehubah berangka boleh disifatkan sebagai empat jenis utama. Apabila memulakan projek pembelajaran mesin adalah penting untuk menentukan jenis data yang ada dalam setiap ciri anda kerana ini boleh memberi impak yang ketara ke atas bagaimana model tersebut berfungsi. Saya telah cuba memberikan penjelasan ringkas mengenai empat jenis di bawah ini.

  • Pemboleh ubah yang berterusan adalah pembolehubah yang boleh mempunyai bilangan nilai yang mungkin tak terhingga, berbanding pembolehubah diskret yang hanya boleh mempunyai julat nilai tertentu. Contoh pembolehubah yang berterusan adalah bilangan batu yang didorong oleh kereta dalam seumur hidupnya.
  • Pembolehubah nominal adalah nilai-nilai kategori yang mempunyai 2 atau lebih nilai yang mungkin, tetapi di mana urutan nilai tersebut tidak mempunyai makna. Sebagai contoh, kita boleh menggunakan perwakilan berangka untuk mentafsirkan jenis kereta yang mengatakan bahawa padat mempunyai nilai 1, MPV mempunyai nilai 2 dan penukaran mempunyai nilai 3. Walau bagaimanapun, fakta bahawa kereta kompak mempunyai nilai 1 dan yang boleh ditukar mempunyai nilai 2 tidak bermakna secara matematik kumpulan yang boleh ditukar berada dalam keadaan lebih besar daripada MPV. Ini hanya perwakilan berangka kategori.
  • Pembolehubah dikotomi sekali lagi dikategorikan tetapi hanya mempunyai 2 kemungkinan nilai biasanya 0 dan 1. Sebagai contoh, kita mungkin mengkategorikan pemilikan kereta sebagai 1 (bermakna ya) atau 0 (tidak bermakna). Apabila kita menukarkan pembolehubah ke dalam ruang dummy (yang akan kita lakukan kemudian dalam jawatan ini) ciri-ciri baru yang dihasilkan juga menjadi dikotom.
  • Pembolehubah ordinal sama dengan nominal kerana mereka mempunyai 2 atau lebih nilai yang mungkin, perbezaan utama adalah bahawa nilai-nilai ini mempunyai susunan atau pangkat bermakna. Jadi dalam contoh kereta kita ini mungkin sesuatu seperti saiz enjin di mana kategori-kategori ini boleh dipesan dari segi kuasa, 1.2, 1.6, 1.8.

Menyediakan data

Saya akan menggunakan pembelajaran mesin kami dengan dataset jantung untuk berjalan melalui proses mengenal pasti dan mengubah jenis pembolehubah. Saya telah memuat turun dan membaca fail csv ke dalam Notebook Jupiter. Seterusnya saya menjalankan fungsi berikut untuk mendapatkan gambaran komposisi data.

mengimport panda sebagai pd
def quick_analysis (df):
 cetak ("Jenis Data:")
 cetak (df.dtypes)
 cetak ("Baris dan Lajur:")
 cetak (df.shape)
 cetak ("Nama Lajur:")
 cetak (df.columns)
 cetak ("Nilai Null:")
 cetak (df.apply (lambda x: sum (x.isnull ()) / len (df)))
quick_analysis (kereta api)

Ini menghasilkan output berikut.

Ini memberitahu saya bahawa saya mempunyai dataset kecil hanya 180 baris dan terdapat 15 tiang. Salah satu ciri adalah bukan angka, dan oleh itu perlu diubah sebelum memohon kebanyakan perpustakaan pembelajaran mesin. Tiada nilai nol jadi saya tidak perlu bimbang untuk merawatnya. Sebelum memproses dataset saya juga melepaskan lajur "patient_id" buat masa sekarang kerana itu bukan angka dan tidak akan digunakan dalam mana-mana peringkat latihan atau ramalan.

Saya kemudian menjalankan pandas menerangkan fungsi untuk menghasilkan beberapa statistik deskriptif cepat.

train.describe ()

Untuk mengkategorikan jenis pemboleh ubah dalam dataset saya menjalankan kod berikut yang menghasilkan histogram semua ciri berangka. Anda boleh melihat dari output yang dihasilkan yang ciri-ciri berterusan dan dikotom. Ciri-ciri yang berterusan memaparkan corak pengedaran berterusan, sementara ciri-ciri dikotom hanya mempunyai dua bar. Pemboleh ubah nominal dan ordinal kadang-kadang lebih rumit untuk menentukan, dan mungkin memerlukan pengetahuan lanjut mengenai dataset atau pengetahuan domain tertentu. Dalam kes pertandingan belajar mesin seperti ini, saya akan mencadangkan merujuk kepada mana-mana kamus data yang mungkin dibekalkan, jika tidak ada satu (seperti mana di sini) maka gabungan intuisi dan percubaan dan kesilapan mungkin diperlukan.

import matplotlib.pyplot sebagai plt
kereta api [train.dtypes [(train.dtypes == "float64") | (train.dtypes == "int64")]
                        .index.values] .hist (figsize = [11,11])

Saya telah mencirikan ciri-ciri ke dalam empat jenis dalam jadual di bawah. Saya kini boleh membuat beberapa keputusan tentang langkah-langkah transformasi yang saya akan ambil untuk menyediakan data untuk latihan dan ramalan.

Pembolehubah Dummy

Seperti yang dinyatakan sebelum ini dalam catatan ini, sebarang nilai bukan berangka perlu ditukar kepada bilangan bulat atau terapung untuk digunakan dalam kebanyakan perpustakaan pembelajaran mesin. Untuk pemboleh ubah kardinal yang rendah, pendekatan terbaik biasanya untuk menjadikan ciri itu menjadi satu lajur bagi setiap nilai unik, dengan 0 di mana nilai tidak ada dan 1 di mana ia berada. Ini dirujuk sebagai pembolehubah dummy.

Teknik ini juga biasanya digunakan paling baik untuk pembolehubah nominal. Kerana ini tidak mempunyai perintah intrinsik, jika kita tidak menggunakannya terlebih dahulu, algoritma pembelajaran mesin mungkin salah mencari hubungan dalam susunan nilai-nilai ini.

Pandas mempunyai fungsi yang bagus untuk mendapatkan get_dummies ini (). Dalam kod di bawah ini saya telah menggunakannya untuk menukarkan semua ciri nominal dan bukan angka ke dalam lajur baru. Anda dapat melihat dari output bahawa beberapa lajur baru telah dibuat dan lajur asal telah dijatuhkan.

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_exercise_st_segment']
kereta = pd.get_dummies (kereta api, lajur = dummy_cols)

Ciri penskalaan

Pemboleh ubah berterusan dalam dataset kami adalah pada skala yang berbeza-beza. Contohnya jika anda merujuk kembali kepada histogram di atas, anda dapat melihat bahawa "oldpeak_eq_st_depression" berubah daripada 0 hingga 6, manakala "max_heart_rate_achieved" berkisar antara 100 hingga 200. Ini menimbulkan masalah untuk banyak algoritma pembelajaran mesin popular yang sering menggunakan jarak Euclidian antara titik data untuk membuat ramalan akhir. Standardisasi skala untuk semua pemboleh ubah yang berterusan boleh menyebabkan peningkatan dalam prestasi model pembelajaran mesin.

Terdapat beberapa kaedah untuk melaksanakan ciri pitchthon dalam python. Kaedah yang saya suka adalah menggunakan fungsi Sci-Kit Learn MinMaxScaler. Yang mengubah skala supaya semua nilai dalam ciri berkisar antara 0 hingga 1. Saya telah memasukkan beberapa kod yang melakukan ini di bawah.

dari sklearn import preprocessing
n_test = melatih [['serum_cholesterol_mg_per_dl', 'max_heart_rate_achieved',
                'oldpeak_eq_st_depression', 'resting_blood_pressure']]
cols_to_norm = ['serum_cholesterol_mg_per_dl', 'max_heart_rate_achieved',
                'oldpeak_eq_st_depression', 'resting_blood_pressure']
x = n_test.values
min_max_scaler = preprocessing.MinMaxScaler ()
x_scaled = min_max_scaler.fit_transform (x)
n_test = pd.DataFrame (x_scaled, lajur = cols_to_norm)
l_test = train.drop (['serum_cholesterol_mg_per_dl', 'max_heart_rate_achieved',
                'oldpeak_eq_st_depression', 'resting_blood_pressure'], paksi = 1)
kereta = pd.concat ([n_test, l_test], paksi = 1)
kereta api.columns

Binning

Anda akan melihat dari kod di atas bahawa saya tidak memasukkan "umur" pembolehubah yang berterusan dalam transformasi skala ciri. Alasannya ialah usia adalah contoh jenis ciri yang mungkin mendapat manfaat daripada transformasi menjadi pemboleh ubah diskret. Dalam contoh ini kita boleh menggunakan baldi atau binning untuk mengubah ciri ke dalam senarai kategori yang bermakna.

Dalam kod di bawah ini saya telah menyatakan kategori intuitif berdasarkan pengagihan dalam data. Ini menggunakan fungsi memotong panda yang mengambil dalam senarai tong, kumpulan_names dan bingkai data. Fungsi ini mengembalikan bingkai data asal dengan ciri "age_categories" baru. Lajur ini kemudiannya boleh diubah menjadi beberapa lajur dummy menggunakan kaedah yang telah diterangkan sebelumnya.

tong = [30, 40, 50, 60, 70, 80]
group_names = ['30 -39 ', '40 -49', '50 -59 ', '60 -69', '70 -79 ']
age_categories = pd.cut (kereta api ['umur'], tong, label = group_names)
kereta api ['age_categories'] = pd.cut (kereta ['umur'], tong, label = group_names)
age_categories
pd.value_counts (train ['age_categories'])

Apa yang kita miliki sekarang adalah dataset di mana semua lajur tidak berangka. Kami telah mencipta beberapa ciri baru, dan mengubah ciri-ciri sedia ada menjadi format yang harus membantu untuk meningkatkan prestasi mana-mana model pembelajaran mesin yang kini boleh digunakan. Transformasi ciri merupakan langkah pertama yang penting dalam proses pembelajaran mesin dan ini selalunya mempunyai kesan yang signifikan terhadap prestasi model. Saya telah menggariskan di sini langkah-langkah pertama yang saya akan ambil dalam proses untuk secara logik berfikir tentang bagaimana untuk merawat pembolehubah yang berbeza saya ada. Sekali dalam fasa pembinaan model saya akan hampir selalu kembali dan tweak data menggunakan kaedah yang berbeza untuk cuba meningkatkan ketepatan model. Walau bagaimanapun, saya mendapati bahawa dengan mengikuti langkah-langkah ini pada mulanya ini sering mengurangkan masa saya habiskan untuk kembali ke peringkat transformasi.