Bagaimana saya bisa secara dinamis membedakan antara data kategorikal dan data numerik?

12

Saya kenal seseorang yang mengerjakan proyek yang melibatkan menelan file data tanpa memperhatikan kolom atau tipe data. Tugasnya adalah mengambil file dengan sejumlah kolom dan berbagai tipe data serta statistik ringkasan keluaran pada data numerik.

Namun, ia tidak yakin bagaimana cara menetapkan tipe data secara dinamis untuk data berbasis angka tertentu. Sebagai contoh:

    CITY
    Albuquerque
    Boston
    Chicago

Ini jelas bukan data numerik dan akan disimpan sebagai teks. Namun,

    ZIP
    80221
    60653
    25525

tidak ditandai dengan jelas sebagai kategori. Perangkat lunaknya akan menetapkan kode ZIP sebagai statistik ringkasan numerik dan output untuknya, yang tidak masuk akal untuk data semacam itu.


Beberapa ide yang kami miliki adalah:

  1. Jika sebuah kolom adalah semua bilangan bulat, beri label sebagai kategori. Ini jelas tidak akan berhasil, tapi itu ide.
  2. Jika kolom memiliki kurang dari n nilai unik dan numerik, beri label kategori. Ini mungkin lebih dekat, tetapi mungkin masih ada masalah dengan data numerik yang gagal.
  3. Menyimpan daftar data numerik umum yang seharusnya benar-benar kategorikal dan membandingkan header kolom dengan daftar ini untuk kecocokan. Misalnya, apa pun dengan "ZIP" di dalamnya akan bersifat kategoris.

Naluri saya memberi tahu saya bahwa tidak ada cara untuk secara akurat menetapkan data numerik sebagai kategorikal atau numerik, tetapi mengharapkan saran. Setiap wawasan yang Anda miliki sangat dihargai.

Ikan Poisson
sumber
Bukan bukti penuh tetapi jika dimulai dengan 0 biasanya tidak numerik
paparazzo
Anda mungkin juga harus bertanya pada diri sendiri apa konsekuensi dari kesalahan itu? Itu harus menentukan berapa banyak upaya yang perlu Anda lakukan dalam proses. Apakah Anda ingin 90% akurat, atau 99% akurat, atau 99,9999% akurat?
Spacedman
Saya akan mengambil semua heuristik yang disarankan dalam jawaban sebagai fitur dan melatih classifier biner.
Emre
Lihat stats.stackexchange.com/a/106400/17230 . Sebenarnya tidak ada kebenaran mendasar di sini.
Scortchi

Jawaban:

7

Saya tidak mengetahui cara yang sangat mudah untuk melakukan ini. Berikut ini satu ide dari kepala saya:

  1. Perlakukan nilai sebagai kategori secara default.
  2. Periksa berbagai atribut data yang akan menyiratkan data tersebut benar-benar berkelanjutan. Bobot atribut ini berdasarkan pada seberapa besar kemungkinan mereka berkorelasi dengan data kontinu. Berikut beberapa contoh yang mungkin:
    • Nilai adalah bilangan bulat: +.7
    • Nilai mengapung: +.8
    • Nilai didistribusikan secara normal: +.3
    • Nilai mengandung sejumlah nilai unik yang relatif kecil: +.3
    • Nilai tidak semuanya jumlah karakter yang sama: +.1
    • Nilai tidak mengandung angka nol di depan: +.1
  3. Perlakukan kolom mana saja yang jumlahnya lebih dari 1 sebagai angka. Sesuaikan faktor dan bobot berdasarkan pengujian terhadap set data yang berbeda sesuai dengan kebutuhan Anda. Anda bahkan dapat membangun dan melatih algoritma pembelajaran mesin yang terpisah hanya untuk melakukan ini.
jncraton
sumber
Jawaban ini menarik. Alih-alih memberikan jawaban lain, saya ingin menyarankan modifikasi untuk yang ini. Bagaimana dengan memperlakukan masalah ini sebagai masalah klasifikasi biasa? Anda dapat mendefinisikan serangkaian fitur untuk setiap kolom, berdasarkan pada atribut dalam jawaban ini (integer, float, terdistribusi normal, jumlah relatif dari nilai unik, dll.) Setelah itu, hanya masalah menggunakan algoritma klasifikasi.
Pablo Suau
@PabloSuau, saya suka ide itu. Algoritma klasifikasi mungkin merupakan metode yang hebat di sini. Terima kasih kepada jncraton untuk melihat beberapa karakteristik.
Poisson Fish
4

Jika Anda memiliki, misalnya, jumlah anak dalam satu keluarga (yang dapat berkisar, misalnya, antara 0 dan 5), apakah itu variabel kategorikal atau numerik? Sebenarnya itu tergantung pada masalah Anda dan bagaimana Anda bermaksud untuk menyelesaikannya. Dalam pengertian ini, Anda dapat melakukan hal berikut:

  • Hitung jumlah nilai unik kolom itu
  • Bagilah angka ini dengan jumlah baris
  • Jika rasio ini di bawah ambang tertentu (misalnya, 20%), Anda menganggapnya kategori.

Dalam hal nilai diskrit, satu tes tambahan bisa berupa: menggunakan model regresi untuk memperkirakan beberapa parameter dan memeriksa apakah nilai estimasi terkandung dalam set nilai asli. Jika ini tidak benar, Anda mungkin berurusan dengan data kategorikal (seperti halnya ZIP).

Itu bekerja relatif baik untuk saya di masa lalu ...

Bernardo Aflalo
sumber
2

Karena pertanyaan ini telah diposkan silang, komentar awal oleh @nickcox di Cross Validated sangat relevan dan benar. Pandangan saya sedikit berbeda. Sebagai contoh, saya akan mengulangi pertanyaan itu, menguraikannya menjadi dua bagian: pertama, ada masalah bagaimana seseorang akan mengklasifikasikan aliran informasi yang tidak diketahui menurut tipe data dan, kedua, tingkat kesalahan klasifikasi seperti apa yang dapat diharapkan. Kedua pertanyaan tersebut segera dapat dijawab, jika seseorang ingin meluangkan waktu untuk melakukannya.

Masalah pertama berjumlah mengembangkan sistem pakar berbasis aturan sepanjang apa yang telah diusulkan sebelumnya dalam komentar dan jawaban di utas ini menggunakan sampel data dunia nyata yang tersedia.

Kedua, mengingat bahwa data dunia nyata ini berisi tipe data yang dikenal, pembandingan kesalahan klasifikasi.

Langkah ketiga akan melibatkan pembaruan aturan secara iteratif untuk mencerminkan informasi yang sedang dilalui secara lebih akurat - sejauh memungkinkan.

Dalam pikiran saya, walaupun membosankan, proyek semacam itu tidak akan melibatkan banyak pekerjaan.

---- Komentar tambahan ----

Diskusi yang bagus tentang ekstraksi fitur yang terkait dengan proses pembuatan data muncul di CV di sini:

/stats/191935/what-does-the-process-that-generates-the-data-mean-and-how-does-feature-selec

Ekstraksi fitur, seleksi dan DGP adalah titik awal yang sangat baik untuk mengembangkan sistem pakar.

DJohnson
sumber
Saya telah menghapus pertanyaan pada Cross Validated. Untuk referensi, @NickCox menyatakan: "Ini lebih buruk daripada yang Anda pikirkan, bahkan jika Anda berpikir itu lebih buruk daripada yang Anda pikirkan. Poin desimal dapat bersembunyi di dalam variabel kategori, sebagai bagian dari klasifikasi kode, misalnya industri atau penyakit. Bilangan bulat kecil dapat berarti lebih banyak dihitung daripada dari kategori: 3, artinya 3 mobil atau kucing, tidak sama dengan 3, yang berarti "orang memiliki mobil" atau "orang dimiliki oleh kucing". Pengukuran bisa saja bilangan bulat dengan konvensi, misalnya ketinggian orang mungkin saja dilaporkan sebagai integer cm atau inci, tekanan darah sebagai integer mm Hg. "
Poisson Fish
@NickCox komentar kedua: "Jumlah nilai yang berbeda (istilah yang lebih baik daripada" unik ", yang masih memiliki makna utama terjadi sekali saja) nilai juga bukan panduan yang baik. Jumlah ketinggian orang yang berbeda yang mungkin dalam sampel sedang adalah mungkin jauh lebih sedikit daripada jumlah afiliasi agama atau asal etnis yang berbeda. "
Poisson Fish