Scikit-learn: Menerapkan Koefisien Kesamaan Gower

Dibuat pada 19 Nov 2015  ·  51Komentar  ·  Sumber: scikit-learn/scikit-learn

Seperti yang disarankan oleh @lesshaste

Makalah - http://cbio.ensmp.fr/~jvert/svn/bibli/local/Gower1971general.pdf

Saya dapat menerapkan ini jika ada minat yang cukup?

@jnothman @amueller @agramfort

New Feature

Komentar yang paling membantu

Hai,

Untuk berkontribusi entah bagaimana, saya menerapkan fungsi Gower, menurut makalah asli, dan penyesuaian masing-masing yang diperlukan dalam modul pdist, karena secara internal pdist membuat beberapa transformasi numerik yang akan gagal jika Anda menggunakan matriks dengan data campuran.

Hasil yang saya peroleh sejauh ini sama dari fungsi daisy R´s.

Kode sumber tersedia di notebook jupyter ini: https://sourceforge.net/projects/gower-distance-4python/files/

Jangan ragu untuk menggunakannya

Semua 51 komentar

Terima kasih.

Dokumentasi untuk daisy dari R ini mungkin relevan juga https://stat.ethz.ch/R-manual/R-devel/library/cluster/html/daisy.html karena ini adalah kasus penggunaan yang populer untuk koefisien Gower.

menyarankan di mana? dalam konteks apa?

@agramfort saya menyarankannya di gitter. Kepentingan utama untuk koefisien ini adalah ketika variabel memiliki tipe campuran (yaitu kategorikal, numerik, ordinal) . Satu kasus penggunaan yang populer adalah dalam paket R daisy() disebutkan sebelumnya ketika mengelompokkan data dengan tipe campuran (lihat halaman 27 dari https://cran.r-project.org/web/packages/cluster/cluster.pdf ) . Secara lebih umum http://www.clustan.talktalk.net/gower_similarity.html mengklaim "Koefisien Kesamaan Umum Gower adalah salah satu ukuran kedekatan yang paling populer untuk tipe data campuran." yang tampaknya seperti klaim yang masuk akal.

apakah ada patokan atau contoh meyakinkan yang akan memotivasi ini?

@agramfort Saya pikir ini lebih karena kami tidak memiliki cara lain untuk menghitung koefisien ketidaksamaan untuk tipe data campuran saat ini dan ini tampaknya menjadi yang standar. Saya dapat menemukan banyak contoh dan pertanyaan/jawaban online di mana orang menjelaskan apa itu koefisien Gower atau menyarankan penggunaannya untuk tipe data campuran tetapi belum ada yang bisa saya sebut sebagai patokan. Makalah asli telah dikutip 2298 kali menurut sarjana Google.

oke saya yakin :)

@agramfort Hebat! Perubahan ini akan melengkapi https://github.com/scikit-learn/scikit-learn/pull/4899 dengan baik yang memperkenalkan dukungan variabel kategorikal asli untuk pohon.

Karena itu, saya sekarang menyadari bahwa scikit-learn tidak memiliki dukungan asli untuk ordinal sama sekali saat ini sehingga bagian dari saran saya ini akan sedikit lebih maju dari waktunya. Saya kira orang dapat menganggapnya secara positif sebagai langkah pertama dalam mendukung fitur ordinal.

@amueller Untuk ditandai dengan [New Feature] ...

Hai,

Untuk berkontribusi entah bagaimana, saya menerapkan fungsi Gower, menurut makalah asli, dan penyesuaian masing-masing yang diperlukan dalam modul pdist, karena secara internal pdist membuat beberapa transformasi numerik yang akan gagal jika Anda menggunakan matriks dengan data campuran.

Hasil yang saya peroleh sejauh ini sama dari fungsi daisy R´s.

Kode sumber tersedia di notebook jupyter ini: https://sourceforge.net/projects/gower-distance-4python/files/

Jangan ragu untuk menggunakannya

Saya hanya ingin tahu apakah ada pembaruan tentang ini? Plus, apakah masalah yang dicatat oleh @marcelobeckmann masih relevan?

@ashimb9 sepertinya kita membutuhkan seseorang untuk mengintegrasikan kode dari @marcelobeckmann

@agramfort Hmm, kalau begitu saya akan pergi ketika saya punya waktu luang. Omong-omong, apakah Anda mengetahui sesuatu tentang status masalah saat ini yang disebutkan di atas: "dalam modul pdist, karena secara internal pdist membuat beberapa transformasi numerik yang akan gagal jika Anda menggunakan matriks dengan data campuran"

Hai, ada beberapa fungsi pribadi (misalnya, _convert_to_double, _copy_array_if_base_present) di pdist yang menganggap data yang mendasarinya sepenuhnya numerik, yang tidak benar ketika Anda memiliki Dataframe dengan data kategorikal.

Saya secara sukarela mengintegrasikan kode ini dan membuatnya tersedia dalam fork, Anda dapat memberikan tiket ini kepada saya.

Fitur penetapan github hanya berfungsi untuk anggota tim

Pada 17 Juli 2017 19:32, "marcelobeckmann" [email protected] menulis:

Hai, ada beberapa fungsi pribadi (misalnya, _convert_to_double,
_copy_array_if_base_present) di pdist yang menganggap data dasarnya adalah
sepenuhnya numerik, yang tidak benar ketika Anda memiliki Dataframe dengan
Kategori data.

Saya secara sukarela mengintegrasikan kode ini dan membuatnya tersedia di garpu, Anda
dapat memberikan tiket ini kepada saya.


Anda menerima ini karena Anda disebutkan.
Balas email ini secara langsung, lihat di GitHub
https://github.com/scikit-learn/scikit-learn/issues/5884#issuecomment-315707830 ,
atau matikan utasnya
https://github.com/notifications/unsubscribe-auth/AAEz62L3HHzGsSerW5G3n-Z8rrNoV6mwks5sOyoTgaJpZM4Glm0p
.

Jangan khawatir, saya akan membayarnya dan Anda bisa mendapatkan kode getnya nanti. Bagi saya yang penting adalah berkontribusi. Saya akan memberi tahu Anda jika sudah selesai.

Terima kasih @marcelobeckmann untuk mengambil ini. Saat Anda melakukannya (dan apakah itu layak untuk Anda), saya bertanya-tanya apakah Anda akan mempertimbangkan untuk menambahkan dukungan untuk perhitungan gower pada data dengan nilai NaN juga, seperti yang diterapkan dalam paket daisy di R (yang juga telah Anda rujuk di atas) ?

Saya menyelesaikan integrasi Gower ke sklearn.metrics.pairwise (juga mengamati perlakuan nilai NaN). Saya akan menyiapkan beberapa unit test sebelum mengirimkan kode bercabang saya.

@marcelobeckmann Hebat! Terima kasih banyak, terutama karena menyertakan dukungan NaN! :)

PS: Jika saya boleh menyarankan, Anda mungkin ingin mempertimbangkan untuk memulai permintaan tarik sehingga pengulas dapat mulai melihat kode Anda saat Anda mengerjakan unit test dan sebagainya.

Saya membuat permintaan tarik beberapa hari yang lalu, b5884.

Ya, sedang dalam antrean untuk ditinjau.

Pada tanggal 17 Agustus 2017 23:40, Marcelo Beckmann [email protected]
menulis:

Saya membuat permintaan tarik beberapa hari yang lalu, b5884.


Anda menerima ini karena Anda disebutkan.
Balas email ini secara langsung, lihat di GitHub
https://github.com/scikit-learn/scikit-learn/issues/5884#issuecomment-323076581 ,
atau matikan utasnya
https://github.com/notifications/unsubscribe-auth/AAEz69uMu0XsoAUfvwWikkadjGCk5yvKks5sZELKgaJpZM4Glm0p
.

Saya membuat perubahan yang diperlukan oleh CI, dan semua pemeriksaan telah berlalu.

@marcelobeckmann kerja bagus! anda mungkin ingin mengubah baris 659 menjadi sesuatu seperti:
ranges_of_numeric[col] = (1 - min / max, 0)[max == 0] if (max!=0) else 0.0

Saya mendapatkan pembagian dengan peringatan nol dalam kasus uji kedua Anda sebaliknya.

Hai, saya mengubah kode untuk menghindari peringatan seperti yang diusulkan oleh Pierre Wessman, dan CI berwarna hijau. Saya membutuhkan seseorang untuk meninjau kode saya.

@marcelobeckmann dan kemungkinan lainnya.

Hai Marcelo (atau mungkin yang lain), dapatkan beberapa pertanyaan singkat sehubungan dengan penerapan koefisien gower Anda yang telah Anda tempatkan di sini: https://sourceforge.net/projects/gower-distance-4python/files/.

  1. Apakah saya memerlukan dataFrame panda untuk memasukkan data asli ke dalam fungsi atau dapatkah saya menggunakan array numpy juga?

  2. Saya mengimpor data saya ke dalam array numpy. Semua kolom adalah bilangan real numerik selain dari kolom pertama yang merupakan ID unik. Saya mendapatkan dua masalah,

  • pertama, ketika saya menjalankan fungsinya, ia mengembalikan Peringatan Konversi Data yang mengatakan bahwa dtype U7 telah dikonversi menjadi objek !!. Saya berasumsi itu karena entri array untuk beberapa alasan muncul dalam tanda kutip dan karenanya adalah string. Jadi saya memasukkan jenis entri array ke int32 misalnya dan masih memberikan kesalahan konversi yang mengatakan int32 telah dikonversi ke objek

  • Kedua, dan mungkin terkait dengan di atas, setiap kali saya menjalankan fungsi dan memplot hasilnya, saya menerima visualisasi yang berbeda (penyebaran poin yang berbeda).

Bisakah Anda memberi saya saran tentang hal di atas?

Terima kasih banyak

Hai Ali,

Terima kasih atas minat Anda pada penerapan jarak Gower ini.

Sementara kode yang saya buat permintaan tarik tidak disetujui oleh scikit learn commiters (CI berwarna hijau dan hanya menunggu ulasan), saya mendorong implementasi terbaru dan stabil ini ke: https://sourceforge.net/projects/gower-distance -4python/files/gower_function-v3.ipynb/download

Mari kita pergi untuk pertanyaan Anda:

  1. Apakah saya memerlukan Panda DataFrame untuk memasukkan data asli ke dalam fungsi atau dapatkah saya menggunakan array numpy juga?

Jawaban: Anda dapat menggunakan DataFrame atau Numpy di versi baru ini 3. Matriks jarang juga didukung.

  1. . Saya mengimpor data saya ke dalam array numpy. Semua kolom adalah bilangan real numerik selain dari kolom pertama yang merupakan ID unik. Saya mendapatkan dua masalah,
  • pertama, ketika saya menjalankan fungsinya, ia mengembalikan Peringatan Konversi Data yang mengatakan bahwa dtype U7 telah dikonversi menjadi objek !!. Saya berasumsi itu karena entri array untuk beberapa alasan muncul dalam tanda kutip dan karenanya adalah string. Jadi saya memasukkan jenis entri array ke int32 misalnya dan masih memberikan kesalahan konversi yang mengatakan int32 telah dikonversi ke objek

Jawaban: Versi baru ini mendukung atribut kategorikal numerik, ada parameter tambahan categorical_features, yang dapat Anda atur array dengan false (untuk atribut numerik) atau true (untuk yang kategoris)

  • Kedua, dan mungkin terkait dengan di atas, setiap kali saya menjalankan fungsi dan memplot hasilnya, saya menerima visualisasi yang berbeda (penyebaran poin yang berbeda).

Jawaban: Versi baru yang saya dorong memecahkan masalah ini.

perhatikan bahwa saya berniat untuk meninjau PR ini, tetapi tidak terlalu tinggi
atm prioritas

Hai Ali,

  1. Yang terbaru adalah gower_function-v3.ipynb, dan ya itu berhubungan dengan nan
    perambatan

  2. Anda dapat menggunakan gower_distance(X) saja, jika atribut kategorikal Anda tidak
    numerik, atau gower_distance(X, categorical_features=[Salah, Benar,
    Salah,...]), jika attr kucing Anda direpresentasikan sebagai numerik.

Beri tahu saya secara pribadi jika Anda memiliki masalah, karena implementasi ini
Saya mendorong ke internet seharusnya tidak menjadi perhatian scikit belajar, mereka memiliki
banyak yang harus dilakukan, dan di sini bukan tempat terbaik untuk membahas ini.

Pada 30 Nov 2017 11:51, "Ali-ry" [email protected] menulis:

@marcelobeckmann https://github.com/marcelobeckmann

Hai Marcelo (atau mungkin yang lain), ada pertanyaan singkat terkait dengan Anda
implementasi koefisien gower yang telah Anda tempatkan di sini:
https://sourceforge.net/projects/gower-distance-4python/files/

1.

Apakah gower_single_function-v2.ipynb versi final dan berhubungan dengan
NaN juga?
2.

yang lebih penting, apakah implementasi ini memungkinkan Anda untuk mendapatkan
kesamaan dalam satu data sampel tunggal? karena dalam banyak kasus apa yang Anda
perlu mendapatkan jarak gower antara setiap pasangan pengamatan dalam
satu sampel data tunggal sebagai lawan membandingkan dua data sampel yang berbeda.

Terima kasih banyak


Anda menerima ini karena Anda disebutkan.
Balas email ini secara langsung, lihat di GitHub
https://github.com/scikit-learn/scikit-learn/issues/5884#issuecomment-348166596 ,
atau matikan utasnya
https://github.com/notifications/unsubscribe-auth/AA3G79jWVbpBNdAFOAim7wJS92-QGl0dks5s7pa8gaJpZM4Glm0p
.

Hai Ali,

  1. Yang terbaru adalah gower_function-v3.ipynb, dan ini adalah salinan dari yang saya dorong untuk belajar scikit, dan ya, ini berhubungan dengan propagasi nan

  2. Anda dapat menggunakan gower_distance(X) saja, jika atribut kategorikal Anda bukan numerik, atau gower_distance(X, categorical_features=[False, True, False,...]), jika atribut kategorikal Anda direpresentasikan sebagai numerik.

Tolong beri tahu saya secara pribadi jika Anda memiliki masalah, karena implementasi yang saya dorong ke internet ini seharusnya tidak menjadi perhatian scikit belajar, mereka memiliki banyak hal untuk dilakukan, dan di sini bukan tempat terbaik untuk membahas sesuatu yang berada di luar scikit belajar proyek.

@marcelobeckmann Halo Marcelo,
Haruskah nilai parameter categorical_features menjadi True atau False jika kita memiliki variabel kategori yang dikodekan ke dalam format numerik?

Saya juga mendapatkan kesalahan berikut:
ValueError: Ditemukan array dengan 0 sampel (shape=(0, 0)) sementara minimal 1 diperlukan oleh check_pairwise_arrays.

Ini berhasil berhasil dalam data yang sama sebelumnya, tetapi sekarang memberikan kesalahan seperti itu. Kenapa bisa?

Hai @bendiste ,

Jika Anda mewakili Benar dan Salah sebagai 1 dan 0 Anda akan mendapatkan hasil yang sama.

Apakah Anda menggunakan notebook terbaru gower_function-v6.4.ipynb di
https://sourceforge.net/projects/gower-distance-4python/files/
?

Saya sedang menyelesaikan menulis artikel, mudah-mudahan bulan ini saya akan membuat perubahan yang diminta untuk membuat implementasi saya diterima di master scikit-learn.

Hai @marcelobeckmann , terima kasih atas balasan Anda. Dan ya, saya menggunakan versi terbaru yang Anda sebutkan. Ketika saya mengunduh ulang, itu berhasil. Saya ingin menanyakan beberapa hal karena saya seorang pemula dalam Pembelajaran Mesin:
1- Dapatkah saya menggunakan KPCA untuk mengurangi dimensi sebagai input ke algoritma pengelompokan hierarkis?
2- Atau apakah saya harus menggunakan seluruh dataset dengan dimensi tinggi sebagai input untuk pengelompokan hierarkis?

Hai @marcelobeckmann ,
terima kasih atas implementasi ini!

Saya telah mencoba versi gower_function-v6.4.
Saya dapat melihat bahwa jarak dalam pengujian unit Anda sama, tidak peduli apakah Anda menentukan kolom kategoris atau tidak. Saya juga sudah mencoba dengan data saya sendiri, di mana itu juga tidak mempengaruhi hasilnya.

Apakah ini benar?

Terima kasih!

Hai @annelaura ,

Maaf atas keterlambatan membalas. Ya itu benar, tes itu hanya untuk memeriksa apakah parameter categorical_features=[0, 1] tidak akan mempengaruhi hasil, jika kolom non numerik juga dapat diidentifikasi sebagai objek. Data inputnya sama, jadi, hasilnya harus sama.

Setelah saya menyelesaikan beberapa makalah, saya kembali bekerja untuk akhirnya mengusulkan implementasi saya ke cabang master scikit! :)

@marcelobeckmann ada berita tentang ini? :)

Hai Alex, Saya telah menyelesaikan semua modifikasi yang diminta pengulas sejauh ini dalam permintaan tarik, dan CI berwarna hijau. Saya juga melakukan ping kepada pengulas untuk memeriksa apakah mereka senang, lalu kami dapat menutup permintaan tarik ini dan mendorong ini untuk dirilis.

Ada pembaruan? @marcelobeckmann

Pekerjaan sedang berlangsung setelah peninjauan.

Apakah PR sudah disetujui? @marcelobeckmann

Belum, pekerjaan sedang berlangsung setelah beberapa tinjauan kode baru-baru ini.

Sayang sekali saya membutuhkannya.

Apakah hanya fungsi yang tersedia di suatu tempat? Jadi saya bisa menggunakannya sendiri (untuk tujuan penelitian)

Terima kasih

Anda dapat mengambil komit terbaru dari fungsi ini di PR ini:
https://github.com/scikit-learn/scikit-learn/pull/9555

Saya berhasil membuatnya bekerja secara lokal. Terima kasih!

Hanya +1 cepat pada tiket ini! Terima kasih untuk semua pekerjaan ini.

Menabrak. Ini akan menjadi tambahan yang bagus. Saya tidak percaya butuh 4 tahun untuk perhitungan yang relatif sederhana untuk membuatnya menjadi sklearn!!

Atau Anda bisa mengatakan: terima kasih atas dedikasi Anda selama empat tahun
usaha sukarela!

Atau Anda bisa mengatakan: terima kasih atas dedikasi Anda selama empat tahun upaya sukarela!

Anda benar, maaf. Saya tidak bermaksud untuk tampil kasar. Saya sangat menghargai usahanya. Saya telah menggunakan ini secara lokal untuk sementara waktu sekarang, dan akan sangat bagus untuk melihatnya ditambahkan. Ini satu-satunya metrik jarak yang saya ketahui untuk tipe data campuran.

Selain dari upaya sukarela, dan yang belum dipertimbangkan oleh para pengembang inti
urgen ini, memang ada tantangan seputar bagaimana menangani tipe campuran,
dan seputar cara melakukan penskalaan dalam penyiapan uji-latihan.

Menantikannya di sklearn.

Seseorang yang mengaku telah " meminjam ide " dari utas ini telah merilis paket di github untuk menghitung jarak Gower (kesamaan, secara teknis). Soal jarak dan kesamaan, contohnya identik dengan yang dari @marcelobeckmann. Saya hanya melihat kodenya sejauh ini, tapi ini sekilas:

Dari buku catatan @marcelobeckmann :

    # This is to normalize the numeric values between 0 and 1.
    X_num = np.divide(X_num ,max_of_numeric,out=np.zeros_like(X_num), where=max_of_numeric!=0)

Dari "Michael Yan":

    # This is to normalize the numeric values between 0 and 1.
    Z_num = np.divide(Z_num ,num_max,out=np.zeros_like(Z_num), where=num_max!=0)

Hi guys, terima kasih untuk mengawasi ini.

Saya senang orang-orang mengambil kode dan mencoba memperbaikinya, itulah tujuan menjadi open source, meskipun beberapa kredit dihargai.

Semoga kode ini menjadi bagian dari scikit-learn, jika PR #9555 ini diterima.

Salam,

Marcelo Beckmann

Selamat berproses!!

Apakah halaman ini membantu?
0 / 5 - 0 peringkat