Saya memiliki masalah klasifikasi pembelajaran mesin dengan 80% variabel kategori. Haruskah saya menggunakan satu pengkodean panas jika saya ingin menggunakan beberapa classifier untuk klasifikasi? Bisakah saya meneruskan data ke pengklasifikasi tanpa pengkodean?
Saya mencoba melakukan hal berikut untuk pemilihan fitur:
Saya membaca file kereta:
num_rows_to_read = 10000 train_small = pd.read_csv("../../dataset/train.csv", nrows=num_rows_to_read)
Saya mengubah jenis fitur kategorikal menjadi 'kategori':
non_categorial_features = ['orig_destination_distance', 'srch_adults_cnt', 'srch_children_cnt', 'srch_rm_cnt', 'cnt'] for categorical_feature in list(train_small.columns): if categorical_feature not in non_categorial_features: train_small[categorical_feature] = train_small[categorical_feature].astype('category')
Saya menggunakan satu pengodean panas:
train_small_with_dummies = pd.get_dummies(train_small, sparse=True)
Masalahnya adalah bagian 3 sering macet, meskipun saya menggunakan mesin yang kuat.
Jadi, tanpa satu pengkodean panas saya tidak dapat melakukan pemilihan fitur, untuk menentukan pentingnya fitur.
Apa yang kamu sarankan?
drop_first=True
denganget_dummies
menghilangkan kebutuhan untuk menjatuhkan kolom asli secara terpisahJauh lebih mudah untuk menggunakan Panda untuk penyandian dasar satu panas. Jika Anda mencari lebih banyak opsi yang dapat Anda gunakan
scikit-learn
.Untuk pengodean satu-panas dasar dengan Pandas Anda cukup meneruskan frame data Anda ke fungsi get_dummies .
Misalnya, jika saya memiliki kerangka data bernama imdb_movies :
... dan saya ingin sekali-panas menyandikan kolom Nilai, saya cukup lakukan ini:
Ini mengembalikan yang baru
dataframe
dengan kolom untuk setiap " level " peringkat yang ada, bersama dengan 1 atau 0 yang menentukan keberadaan peringkat itu untuk pengamatan yang diberikan.Biasanya, kami ingin ini menjadi bagian dari aslinya
dataframe
. Dalam hal ini, kami cukup menempelkan bingkai kode boneka baru kami ke bingkai asli menggunakan " pengikat kolom .Kita dapat mengikat kolom dengan menggunakan fungsi concat Pandas :
Kita sekarang dapat menjalankan analisis secara penuh
dataframe
.FUNGSI UTILITAS SEDERHANA
Saya akan merekomendasikan menjadikan diri Anda fungsi utilitas untuk melakukan ini dengan cepat:
Penggunaan :
Hasil :
Juga, sesuai komentar @pmalbu, jika Anda ingin fungsi untuk menghapus feature_to_encode asli maka gunakan versi ini:
Anda dapat menyandikan beberapa fitur sekaligus sebagai berikut:
sumber
Anda dapat melakukannya dengan
numpy.eye
dan menggunakan mekanisme pemilihan elemen array:Nilai kembalian dari
indices_to_one_hot(nb_classes, data)
sekarangAda di
.reshape(-1)
sana untuk memastikan Anda memiliki format label yang tepat (Anda mungkin juga punya[[2], [3], [4], [0]]
).sumber
Pertama, cara termudah untuk satu encode panas: gunakan Sklearn.
http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html
Kedua, saya tidak berpikir menggunakan panda ke satu kode panas adalah sesederhana itu (belum dikonfirmasi)
Membuat variabel dummy dalam panda untuk python
Terakhir, apakah perlu bagi Anda untuk satu encode panas? Satu pengkodean panas secara eksponensial meningkatkan jumlah fitur, secara drastis meningkatkan waktu berjalan dari setiap classifier atau apa pun yang akan Anda jalankan. Terutama ketika setiap fitur kategorikal memiliki banyak tingkatan. Sebagai gantinya Anda dapat melakukan pengkodean dummy.
Menggunakan penyandian dummy biasanya bekerja dengan baik, untuk waktu dan kerumitan yang jauh lebih sedikit. Seorang profesor yang bijak pernah mengatakan kepada saya, 'Less is More'.
Ini kode untuk fungsi penyandian khusus saya jika Anda mau.
EDIT: Perbandingan menjadi lebih jelas:
Pengkodean satu-panas: mengonversi n level ke n-1 kolom.
Anda dapat melihat bagaimana ini akan meledak memori Anda jika Anda memiliki banyak jenis (atau level) yang berbeda dalam fitur kategorikal Anda. Perlu diingat, ini hanya SATU kolom.
Pengodean Dummy:
Konversi ke representasi numerik saja. Sangat menghemat ruang fitur, dengan biaya sedikit akurasi.
sumber
mouse > cat > dog
tetapi ini tidak terjadi.get_dummies
adalah cara paling mudah untuk mentransfer variabel kategori ke dalam data model yang ramah dari pengalaman saya (walaupun sangat terbatas)Satu penyandian panas dengan panda sangat mudah:
EDIT:
Cara lain untuk one_hot menggunakan sklearn's
LabelBinarizer
:sumber
Anda dapat menggunakan fungsi numpy.eye.
Hasil
sumber
panda sebagai memiliki fungsi inbuilt "get_dummies" untuk mendapatkan satu pengkodean panas dari kolom / s tertentu.
satu kode baris untuk satu-hot-encoding:
sumber
Berikut adalah solusi menggunakan
DictVectorizer
danDataFrame.to_dict('records')
metode Pandas .sumber
Pengkodean satu-panas memerlukan sedikit lebih banyak daripada mengonversi nilai ke variabel indikator. Biasanya proses ML mengharuskan Anda untuk menerapkan pengkodean ini beberapa kali untuk validasi atau menguji kumpulan data dan menerapkan model yang Anda buat untuk data yang diamati secara waktu nyata. Anda harus menyimpan pemetaan (transformasi) yang digunakan untuk membangun model. Solusi yang baik akan menggunakan
DictVectorizer
atauLabelEncoder
(diikuti olehget_dummies
. Berikut adalah fungsi yang dapat Anda gunakan:Ini bekerja pada bingkai data panda dan untuk setiap kolom dari kerangka data yang dibuatnya dan mengembalikan pemetaan kembali. Jadi Anda akan menyebutnya seperti ini:
Kemudian pada data uji, panggilan dilakukan dengan melewati kamus yang dikembalikan dari pelatihan:
Metode yang setara adalah menggunakan
DictVectorizer
. Posting terkait juga ada di blog saya. Saya menyebutkannya di sini karena memberikan beberapa alasan di balik pendekatan ini daripada hanya menggunakan posting get_dummies (pengungkapan: ini adalah blog saya sendiri).sumber
Anda dapat meneruskan data ke penglasifikasi catboost tanpa penyandian. Catboost menangani variabel kategorikal itu sendiri dengan melakukan pengkodean rata-rata satu-panas dan perluasan target.
sumber
Anda dapat melakukan hal berikut juga. Catatan untuk di bawah ini Anda tidak harus menggunakan
pd.concat
.Anda juga dapat mengubah kolom eksplisit menjadi kategorikal. Sebagai contoh, di sini saya mengubah
Color
danGroup
sumber
Saya tahu saya terlambat ke pesta ini, tetapi cara paling sederhana untuk memanaskan kode data secara otomatis adalah dengan menggunakan fungsi ini:
sumber
Saya menggunakan ini dalam model akustik saya: mungkin ini membantu dalam model Anda.
sumber
Untuk menambah pertanyaan lain, izinkan saya memberikan bagaimana saya melakukannya dengan fungsi Python 2.0 menggunakan Numpy:
Jalur ini
n_values = np.max(y_) + 1
bisa berupa kode keras bagi Anda untuk menggunakan jumlah neuron yang baik jika Anda menggunakan mini-batch misalnya.Demo proyek / tutorial di mana fungsi ini telah digunakan: https://github.com/guillaume-chevalier/LSTM-Human-Activity-Recognition
sumber
Ini bekerja untuk saya:
Keluaran:
sumber
Itu bisa dan harus semudah:
Penggunaan:
sumber
Memperluas jawaban @Martin Thoma
sumber
Jawaban singkat
Berikut adalah fungsi untuk melakukan satu-hot-encoding tanpa menggunakan numpy, panda, atau paket lainnya. Dibutuhkan daftar bilangan bulat, boolean, atau string (dan mungkin tipe lainnya juga).
Contoh:
Panjang (er) Jawaban
Saya tahu sudah ada banyak jawaban untuk pertanyaan ini, tetapi saya memperhatikan dua hal. Pertama, sebagian besar jawaban menggunakan paket seperti numpy dan / atau panda. Dan ini adalah hal yang baik. Jika Anda menulis kode produksi, Anda mungkin harus menggunakan algoritma yang kuat dan cepat seperti yang disediakan dalam paket numpy / panda. Tetapi, demi pendidikan, saya pikir seseorang harus memberikan jawaban yang memiliki algoritma transparan dan bukan hanya implementasi algoritma orang lain. Kedua, saya perhatikan bahwa banyak jawaban tidak memberikan implementasi yang kuat dari pengodean satu-panas karena tidak memenuhi salah satu persyaratan di bawah ini. Berikut adalah beberapa persyaratan (seperti yang saya lihat) untuk fungsi pengkodean satu panas yang bermanfaat, akurat, dan kuat:
Fungsi pengkodean satu-panas harus:
Saya menguji banyak jawaban untuk pertanyaan ini dan kebanyakan dari mereka gagal pada salah satu persyaratan di atas.
sumber
Coba ini:
df_encoded.head ()
Kerangka data yang dihasilkan
df_train_encoded
sama dengan aslinya, tetapi fitur kategorikal sekarang diganti dengan versi satu-panas-disandikan.Informasi lebih lanjut di
category_encoders
sini .sumber
Di sini saya mencoba dengan pendekatan ini:
sumber