EDA dari sudut yang berbeda

gambar

Kami tidak akan berbicara tentang makanan, tetapi tentang analisis data eksplorasi (EDA ), yang merupakan awal dari setiap ML yang keras.

Sejujurnya, prosesnya agak membosankan, dan untuk mendapatkan setidaknya beberapa wawasan yang berarti tentang data kami, Anda perlu menghabiskan cukup waktu secara aktif menggunakan perpustakaan visualisasi favorit Anda.

Sekarang bayangkan kita cukup malas (tapi penasaran) dan akan mengikuti postulat ini di seluruh artikel ini.

Berdasarkan ini, kami bertanya pada diri sendiri pertanyaan berikut: apakah ada alat rumit di alam yang hanya memungkinkan menekan CTRL + ENTER di IDE favorit Anda dan menampilkan pada satu layar (tanpa menggulir ke bawah dan aspek mikroskopis yang tak terhitung jumlahnya) gambar lengkap dengan informasi yang berguna tentang dataset kami?

Pada saat yang sama, kami mengingat pemikiran yang berbeda - jika instrumen seperti itu ada, itu tidak akan menggantikan EDA klasik, tetapi itu akan sangat membantu bagi kami dalam kasus-kasus ketika Anda tidak harus menghabiskan berjam-jam pada visualisasi untuk dengan cepat menekankan pola utama dalam data kami.

Struktur artikel ini:

  1. Preprocessing kecil
  2. Visualisasi prediktor
  3. Diskritisasi variabel
  4. Corelationfunnel
  5. Peringkat Lintas Korelasi
  6. easyalluvial

Kami selesai dengan pengantar dan mengambil sebagai contoh praktis sebagai dasar.

Contoh Pendekatan
Awalnya, saya ingin mengambil semacam array data yang tidak jelas, tetapi pada akhirnya saya menyadari bahwa sebagai contoh itu tidak akan terlalu baik - pola yang ditemukan mungkin tampak tidak jelas dan karena itu kontroversial, tetapi tujuan kami adalah menyiapkan array dengan algoritma yang tidak memiliki informasi apriori dan akan menunjukkan kepada kita apa kita sudah tahu, dengan demikian menegaskan kelangsungan hidup kita.


Bagi saya, Titanic adalah yang paling nyaman sebagai contoh, ukurannya tidak terlalu kecil seperti Iris, ia memiliki variabel yang tidak informatif, dipelajari dengan baik dan memiliki prediktor yang jelas dan, yang penting, merupakan dasar historis.

Selain itu, saya menemukan sebuah artikel tentang Habrรฉ di mana penulis melakukan EDA yang agak teliti dari kumpulan data ini dan berdasarkan pada gambar-gambar yang saya perlihatkan temuannya. Ini akan menjadi semacam Baseline kami.

Tautkan ke artikel dengan nama besar untuk "Baseline_EDA" kami:
Titanic on Kaggle: Anda tidak akan membaca posting ini sampai akhir .

Agar tidak repot mengunduh / membaca csv dari jaringan, kami segera menangkap set data asli dari CRAN

install.packages("titanic") data("titanic_train",package="titanic") 

Preprocessing singkat


Contoh ini dilingkari dalam jaringan dengan preprocessing atas dan ke bawah sehingga saya tidak akan secara khusus melahap topik ini, saya melakukan hal-hal dasar: Saya mengekstrak nama gonoratora (judul) sebagai prediktor penting dan menggunakannya untuk mengisi kesenjangan usia.

 library(tidyverse) titanic_train %>% str d <- titanic_train %>% as_tibble %>% mutate(title=str_extract(Name,"\\w+\\.") %>% str_replace(fixed("."),"")) %>% mutate(title=case_when(title %in% c('Mlle','Ms')~'Miss', #   title=='Mme'~ 'Mrs', title %in% c('Capt','Don','Major','Sir','Jonkheer', 'Col')~'Sir', title %in% c('Dona', 'Lady', 'Countess')~'Lady', TRUE~title)) %>% mutate(title=as_factor(title), Survived=factor(Survived,levels = c(0,1),labels=c("no","yes")), Sex=as_factor(Sex), Pclass=factor(Pclass,ordered = T)) %>% group_by(title) %>% #  -      mutate(Age=replace_na(Age,replace = median(Age,na.rm = T))) %>% ungroup #             table(d$title,d$Sex) 

judullaki-lakiperempuan
Tuan5170
Ny0126
Nona0185
Tuan400
Pak80
Pdt60
Dr61
Nyonya02

Tidak semua yogurt sama-sama sehat ...


Biasanya, pada awal analisis, saya menyisihkan variabel tidak informatif ke samping (saya menyisihkan dan tidak menghapus secara permanen, karena ketika saya mendapatkan hasil maksimal dari model, rekayasa untuk beberapa variabel yang tertunda memberikan persentase tertentu dari peningkatan kualitas model).

Metrik untuk menilai "utilitas" suatu variabel adalah freqRatio (rasio frekuensi dari nilai paling populer relatif terhadap nilai kedua dalam frekuensi) dan persenUnique (daya atau kardinalitas - proporsi angka unik dari jumlah total nilai)
Bantuan terperinci dapat dilihat dari paket caret
?caret::nearZeroVar

 (feat.scan <- caret::nearZeroVar(x = d,saveMetrics = T) %>% rownames_to_column("featName") %>% as_tibble) 

gambar

Lebih mudah bagi saya untuk memonitor variabel dalam bidang dua dimensi (dengan mencatat kedua sumbu sehingga titik tidak overplotting menjadi satu tumpukan kecil karena titik outlier).
Saya tidak pernah bertanya-tanya apakah langkah ini adalah EDA, tetapi ketika menulis artikel ini saya pikir: kita sekarang sedang melakukan analisis eksplorasi dari beberapa kegunaan prediktor, penilaian visual mereka, jadi mengapa bukan EDA?

 # install.packages("ggrepel") library(ggrepel) ggplot(feat.scan,aes(x=percentUnique,y=freqRatio,label=featName,col=featName))+ geom_point(size=2)+ geom_text_repel(data = feat.scan,size=5)+scale_x_log10()+scale_y_log10()+theme_bw() 

gambar

Kami menganggap prediktor outlier tidak informatif baik dalam hal daya (sumbu X) atau dalam rasio frekuensi (sumbu Y) dan, karenanya, sisihkan:
Penumpang Nama; Tiket Kabin

 useless.feature <- c("PassengerId","Name","Ticket","Cabin") d <- d %>% select_at(vars(-useless.feature)) 

Alam semesta ini terpisah


Untuk memahami bagaimana perpustakaan yang tercantum di bawah ini menyiapkan data - di bagian ini kami menunjukkan dengan contoh kecil apa yang terjadi di perpustakaan ini pada tahap persiapan data.

Pada langkah pertama, perlu untuk membawa semua data ke tipe tunggal - seringkali data dalam satu set dapat bersifat kategoris dan numerik, apalagi, angka dapat memiliki outlier dan data kategorikal dapat berupa kategori langka.

Untuk mengonversi variabel kontinu menjadi variabel kategorikal, kita dapat menguraikan angka-angka kita menjadi nampan dengan periode pengambilan sampel tertentu.

Contoh paling sederhana dari penguraian menjadi 5 bin:

 iris %>% as_tibble %>% mutate_if(is.numeric,.funs = ggplot2::cut_number,n=5) 

gambar

Untuk mendapatkan kekuatan dan directivity dari hubungan masing-masing elemen di antara prediktor, trik kedua digunakan - satu pengkodean panas

 library(recipes) iris %>% as_tibble %>% mutate_if(is.numeric,cut_number,n=5) %>% recipe(x = .) %>% step_dummy(all_nominal(),one_hot = T) %>% prep %>% juice %>% glimpse 

Alih-alih 5 prediktor, kami sekarang memiliki 23 prediksi, tetapi yang biner:

gambar

Secara umum, trik konversi berakhir di sana, tetapi karya 2 dari 3 perpustakaan untuk EDA "non-klasik" kami baru saja dimulai dengan tahapan-tahapan ini.

Berikutnya, saya memperkenalkan fungsionalitas 3 perpustakaan visualisasi:

  1. Correlationfunnel - menunjukkan pengaruh nilai prediktor individual pada target (mis., Anda dapat menyebutnya EDA supervized learning)
  2. Lares - menunjukkan pengaruh nilai-nilai prediktor individual pada nilai-nilai individual lain dari prediktor lain (mis., Anda dapat menyebutnya EDA pembelajaran tanpa pengawasan)
  3. easyalluvial - menunjukkan hubungan kumulatif dari nilai yang dikelompokkan prediktor "X" teratas per target (yaitu, Anda dapat menyebutnya EDA supervized learning)

Jelas bahwa fungsinya berbeda, oleh karena itu, mendemonstrasikan perpustakaan ini, saya akan mengutip kesimpulan penulis dari artikel "Baseline_EDA" kami, tergantung pada fungsionalitas yang dijelaskan di atas dari paket ini. (Misalnya, jika penulis menunjukkan ketergantungan usia pada kelangsungan hidup, maka saya akan memasukkan kutipan seperti itu di Correlationfunnel, jika usia ada di kelas, lalu di Lares, dll.)

Perpustakaan pertama di atas panggung.

saluran korelasi


korelasifunnel adalah untuk mempercepat Analisis Data Eksplorasi (EDA)
gambar

Metodologi ini dijelaskan dengan baik dalam sketsa perpustakaan, saya akan memberikan fragmen menghitung korelasi dengan nilai-nilai biner

gambar

Perpustakaan mengasumsikan keberadaan target (variabel dependen) dalam data kami dan langsung pada satu gambar menunjukkan kekuatan dan arah hubungan dan juga peringkat dalam urutan gaya ini membentuk corong visual (pada kenyataannya, ini adalah asal nama itu).

Fungsi binarisasi yang ada di perpustakaan memungkinkan Anda untuk mengurangi kategori kecil menjadi Lainnya.

Karena perpustakaan tidak berfungsi dengan variabel integer, kami akan mengubahnya menjadi numerik dan kembali ke Titanic kami.

 #install.packages("correlationfunnel") library(correlationfunnel) d <- d %>% mutate_if(is.integer,as.numeric) d %>% binarize(n_bins = 5,thresh_infreq = .02,one_hot = T) %>% #    correlate(target = Survived__yes) %>% plot_correlation_funnel() # "interactive = T" - plotly! 

gambar

Pada sumbu X, kami memiliki kekuatan dan arah korelasi, pada sumbu Y, prediktor kami diberi peringkat dalam urutan menurun. Yang pertama selalu mencerminkan target sebagai ia memiliki korelasi terkuat dengan dirinya sendiri (-1; 1).

Mari kita periksa bagaimana kesimpulan pada grafik ini tumpang tindih dengan kesimpulan dari penulis "Baseline_EDA" kami.
Grafik berikut menegaskan teori bahwa semakin tinggi kelas kabin penumpang, semakin besar peluang untuk bertahan hidup. (Dengan "di atas" "Maksud saya urutan terbalik, karena kelas pertama lebih tinggi dari yang kedua dan, terutama, yang ketiga.)
Corong menunjukkan bahwa kelas adalah prediktor ketiga dalam hal kekuatan korelasi, dan memang, di kelas 3, korelasi terbalik, di kelas 1, positif kuat.
Bandingkan peluang bertahan hidup untuk pria dan wanita. Data mengkonfirmasi teori yang diungkapkan sebelumnya.

(Secara umum, kita dapat mengatakan bahwa faktor utama dari model ini adalah jenis kelamin penumpang)

Corong menunjukkan bahwa jenis kelamin penumpang adalah yang ke-2 menurut tingkat korelasinya, jenis kelamin perempuan berkorelasi dengan kelangsungan hidup, jenis kelamin laki-laki berkorelasi dengan kematian.
Anda juga dapat menguji hipotesis bahwa yang lebih muda bertahan, karena mereka bergerak lebih cepat, berenang lebih baik, dll.

Seperti yang Anda lihat, ketergantungan eksplisit tidak terlihat di sini.

Corong benar-benar berbicara tentang signifikansi lemah dari alat prediksi ini (saya ingat bahwa gonorant / judul berisi usia, itulah sebabnya usia tidak begitu signifikan), tetapi bahkan di sini corong menunjukkan bahwa ada lebih banyak peluang untuk bertahan hidup dalam kategori โ€œminus tak terhingga - 20 tahunโ€ (mis. Anak-anak ) dan 30-38 (orang kaya, mungkin 1 kelas).
Mari kita perkenalkan indikator seperti Persentase Kelangsungan Hidup dan lihat ketergantungannya pada kelompok yang muncul pada tahap sebelumnya

(grup penulis berarti judul).

Funnel sepenuhnya mengkonfirmasi temuan penulis
Sekarang mari kita lihat informasi yang dapat diperoleh dari jumlah kerabat di kapal.

Sangat mungkin bahwa tidak adanya kerabat, serta sejumlah besar, secara negatif mempengaruhi kelangsungan hidup.

SibSP di corong jelas mengatakan hal yang sama.

Dan tentu saja, selain kesimpulan penulis, di sini Anda dapat melihat pola-pola lain, saya akan meninggalkan kesenangan kontemplasi kepada pembaca.

Lares


Temukan Wawasan dengan Korelasi Lintas Peringkat

gambar

Penulis perpustakaan ini melangkah lebih jauh - ia menunjukkan dependensi tidak hanya pada target, tetapi juga pada segalanya.

Peringkat Cross-Correlations tidak hanya menjelaskan hubungan fitur target spesifik dengan yang lain, tetapi hubungan semua nilai dalam data Anda dalam format tabel yang mudah digunakan dan dipahami.

Secara otomatis mengubah kolom kategorikal menjadi numerik dengan satu pengkodean panas (1s dan 0s) dan pengelompokan cerdas lainnya seperti label "lain-lain" untuk nilai yang tidak terlalu sering dan fitur baru yang ketinggalan zaman.


Dengan menggunakan tautan di atas, Anda dapat melihat contoh di mana penulis memasukkan dataset Star Wars ke paketnya dan menunjukkan dependensi yang ditemukan, saya terjebak di halamannya, sangat bagus.

Mari kita coba pada contoh kita.

 # ,     : # devtools::install_github("laresbernardo/lares") library(lares) corr_cross(df = d,top = 30) 

gambar

Selain persimpangan dengan kesimpulan berdasarkan tanda kutip, dalam Correlationfunnell kami menyajikan beberapa kutipan yang dapat kita lihat di sini terlepas dari target:
Pola lain juga dapat ditemukan. Ada korelasi negatif antara usia dan kelas, yang kemungkinan besar disebabkan oleh penumpang yang lebih tua yang bisa lebih sering membeli kabin yang lebih mahal.

Dalam kutipan di atas, penulis menarik kesimpulan seperti itu pada analisis korelasi 2 bidang secara agregat, tetapi dengan One-Hot-Encoding, ini terbukti dari korelasi positif yang kuat antara Age + P_Class_1.
Selain itu, harga tiket dan kelas terkait erat (koefisien korelasi tinggi), yang sangat diharapkan.

Baris ketiga di atas: Tarif + P_Class_1

Selain bersinggungan dengan kesimpulan penulis, di sini orang dapat menekankan hal-hal yang jauh lebih menarik, saya juga akan meninggalkan kesenangan kontemplasi untuk pembaca.

Selain pilihan opsional dari X top insight paling kuat, Anda juga dapat merefleksikan keseluruhan gambar dan tempat dari poin-poin penting ini dalam total massa

 corr_cross(df = d,type=2) 

gambar

easyalluvial


Eksplorasi data dengan plot aluvial

gambar

Di sini, seperti pada 2 paket sebelumnya, penulis melakukan binarisasi variabel numerik pada awalnya, tetapi kemudian jalurnya dengan perpustakaan-perpustakaan itu berbeda: alih-alih {One-HotEncoding + korelasi}, perpustakaan menjabarkan X teratas dari prediktor yang paling menarik (pengguna memutuskan mana yang akan ditransfer. ) berdasarkan nilai, membentuk aliran yang warnanya tergantung pada target, dan lebar aliran pada jumlah pengamatan dalam aliran ini.

Variabel numerik didekomposisi ke dalam kategori HH (Tinggi Tinggi), MH (Sedang Tinggi), M (Sedang), ML (Sedang Rendah), LL (Rendah Rendah)

Pertama, mari kita ambil prediktor paling signifikan berdasarkan grafik dari CorelFunnel:

 cor.feat <- c("title","Sex","Pclass","Fare") 

Selanjutnya kita buat jadwal

 # install.packages("easyalluvial") library(easyalluvial) al <- d %>% select(Survived,cor.feat) %>% alluvial_wide(fill_by = "first_variable") add_marginal_histograms(p = al,data_input = d,keep_labels = F) 

gambar

Untuk kutipan penulis, kami menggambar kembali bagan menggunakan prediksi yang sesuai.

 cor.feat <- c("Sex","Pclass","Age") al <- d %>% select(Survived,cor.feat) %>% alluvial_wide(fill_by = "first_variable") add_marginal_histograms(p = al,data_input = d,keep_labels = F) 

gambar

Sebagai contoh, grafik berikut ini dengan jelas menunjukkan bahwa kelompok penyintas utama adalah perempuan kelas satu dan dua dari semua umur.

Grafik juga menunjukkan bahwa perempuan yang masih hidup dari kelas 3 juga bukan kelompok kecil

Dan di antara laki-laki, semua anak laki-laki di bawah usia 15 bertahan kecuali kelas layanan ketiga dan sebagian kecil pria yang lebih tua dan sebagian besar dari kelas pertama.

Hal tersebut di atas telah dikonfirmasi, tetapi sekali lagi kita melihat arus dari pria kelas 3 yang masih hidup dalam kategori usia LL, ML.

Segala sesuatu di atas adalah tentang paket "easyalluvial", tetapi penulis menulis paket kedua "parcats" yang di atas plotly membuat grafik di atas interaktif (seperti dalam judul bagian ini).
Hal ini memungkinkan tidak hanya untuk melihat konteks tooltip, tetapi juga untuk mengubah arah aliran untuk persepsi visual yang lebih baik. (sayangnya, sementara perpustakaan tidak sangat dioptimalkan dan melambat pada titanic)

 # install.packages("parcats") library(parcats) cor.feat <- c("title","Sex","Pclass","Fare") a <- d %>% select(Survived,cor.feat) %>% alluvial_wide(fill_by = "first_variable") parcats(p = a,marginal_histograms = T,data_input = d) 

gambar

Bonus


Pustaka easyalluvial, selain analisis data eksplorasi, juga dapat digunakan sebagai penerjemah untuk model kotak hitam (model yang menganalisis parameter yang tidak dapat dipahami - dengan logika apa model memberikan jawaban berdasarkan prediksi tertentu).

Tautan ke artikel penulis: Visualisasikan respons model dengan plot aluvial
Dan kekhasannya adalah bahwa dari semua perpustakaan yang saya lihat, maksimum pada satu grafik menjelaskan respons kotak hitam dalam sistem koordinat tidak lebih dari 2 dimensi (satu untuk setiap prediktor), warna menjelaskan respons.

Pustaka easyalluvial memungkinkan Anda melakukan ini pada lebih dari 2 prediktor pada saat yang sama (tentu saja, lebih baik tidak terbawa suasana)

Sebagai contoh, mari kita latih hutan acak pada larik data kami dan mencerminkan penjelasan tentang hutan acak menggunakan 3 prediktor.

 library(ranger) m <- ranger(formula = Survived~.,data = d,mtry = 6,min.node.size = 5, num.trees = 600, importance = "permutation") library(easyalluvial) (imp <- importance(m) %>% as.data.frame %>% easyalluvial::tidy_imp(imp = .,df=d)) #      #  N-     (   .  !)   dspace <- get_data_space(df = d,imp,degree = 3) #     pred = predict(m, data = dspace) alluvial_model_response(pred$predictions, dspace, imp, degree = 3) 

Selain itu, penulis memiliki konektor ke model CARET (Saya tidak tahu seberapa relevan hal ini sekarang mempertimbangkan tidymodels)

 library(caret) trc <- trainControl(method = "none") m <- train(Survived~.,data = d,method="rf",trControl=trc,importance=T) alluvial_model_response_caret(train = m,degree = 4,bins=5,stratum_label_size = 2.8) 

gambar

Kesimpulan


Sekali lagi saya ulangi bahwa saya tidak meminta penggantian EDA klasik, tetapi setuju bahwa itu baik ketika ada alternatif yang menghemat banyak waktu, terutama mengingat bahwa orang secara alami cukup malas, dan ini, seperti yang Anda tahu, adalah mesin kemajuan :)

Source: https://habr.com/ru/post/id480532/


All Articles