
Pengarang: Muttineni Sai Rohith
Awalnya diterbitkan di Towards AI the World’s Leading AI and Technology News and Media Company. Jika Anda sedang membangun produk atau layanan terkait AI, kami mengundang Anda untuk mempertimbangkan untuk menjadi sponsor AI. Di Towards AI, kami membantu menskalakan AI dan startup teknologi. Biarkan kami membantu Anda melepaskan teknologi Anda kepada massa.
Cara Menangani Ketidakseimbangan Data dalam Klasifikasi ML menggunakan Python
Pada artikel ini, kita akan membahas apa itu Data Ketidakseimbangan, Metrik yang harus kita gunakan untuk mengevaluasi model dengan Data Ketidakseimbangan, dan Teknik yang Digunakan untuk Menangani Data Ketidakseimbangan.
Saat melakukan klasifikasi biner, hampir setiap ilmuwan data mungkin mengalami masalah dalam menangani Data yang Tidak Seimbang. Umumnya ketidakseimbangan data terjadi ketika dataset terdistribusi tidak merata yaitu ketika frekuensi titik data atau jumlah baris dalam satu kelas lebih banyak daripada di kelas lain, maka data tidak seimbang.
Misal kita punya Dataset covid, dan kelas target kita ada yang terkena covid atau tidak, jika rasio positif 10% di kelas kita dan rasio negatif 90%, maka kita bisa mengatakan bahwa Data kita adalah tidak seimbang.
Gambar Oleh Penulis
Masalah dengan Data yang Tidak Seimbang
Sebagian besar algoritme pembelajaran mesin dirancang untuk meningkatkan akurasi dan mengurangi kesalahan. Dalam proses ini, mereka tidak mempertimbangkan distribusi kelas. Selain itu, algoritme pembelajaran mesin standar seperti Pohon keputusan dan Regresi Logistik memiliki bias terhadap kelas Mayoritas dan cenderung mengabaikan kelas minoritas. Jadi dalam hal ini, walaupun model memiliki akurasi 95%, tidak dapat dikatakan sebagai model yang sempurna karena frekuensi jumlah kelas dalam data pengujian mungkin 95%, dan 5% data yang salah diprediksi harus berasal dari kelas minoritas. .
perangkap akurasi
Sebelum menyelami penanganan Kumpulan Data yang Tidak Seimbang, Mari kita pahami metrik yang harus kita gunakan saat mengevaluasi model. Umumnya, akurasi_score dihitung sebagai rasio jumlah prediksi yang benar dengan jumlah total prediksi.
Akurasi = Jumlah Prediksi yang Benar / Jumlah Total Prediksi.
Jadi kita dapat melihat bahwa akurasi_score tidak akan mempertimbangkan distribusi kelas. Ini hanya berfokus pada Jumlah Prediksi yang Benar. Jadi Meskipun kita mendapatkan akurasi 95+, seperti yang ditunjukkan pada contoh di atas, kita tidak dapat menjamin kinerja model dan prediksi kelas minoritas.
Jadi untuk teknik klasifikasi, daripada akurasi_score, disarankan untuk menggunakan Confusion Matrix, precision_score, recall_score, dan Area di bawah Kurva ROC(AUC) sebagai Metrik Evaluasi.
Menangani Ketidakseimbangan Data
Teknik yang banyak digunakan saat menangani data yang tidak seimbang adalah Sampling. Ada dua jenis Pengambilan Sampel —
Di Bawah Pengambilan Sampel Di Atas Pengambilan Sampel
Di Under Sampling, sampel dihapus dari kelas mayoritas, sedangkan di Over Sampling, sampel ditambahkan ke kelas minoritas.
Untuk mendemonstrasikan penggunaan teknik di atas, pada awalnya, kami akan mempertimbangkan contoh tanpa Penanganan Data yang Tidak Seimbang. Dataset yang digunakan dapat ditemukan di sini.
Mengimpor Perpustakaan
# impor modul yang diperlukan impor panda sebagai pd
impor matplotlib.pyplot sebagai plt
impor numpy sebagai np
dari sklearn.linear_model impor LogisticRegression
dari sklearn.preprocessing impor StandardScaler
dari sklearn.metrics impor confusion_matrix, akurasi_score, precision_score, recall_score, f1_score
Memuat Data
df = pd.read_csv(“/content/drive/MyDrive/creditcard.csv”)
Menyiapkan Data
# normalkan kolom jumlah df[‘normAmount’] = StandardScaler().fit_transform(np.array( df[‘Amount’]).reshape(-1, 1)) # jatuhkan kolom Waktu dan Jumlah karena tidak relevan untuk tujuan prediksi
data = df.drop([‘Time’, ‘Amount’]axis = 1) # seperti yang Anda lihat ada 492 transaksi penipuan.
data[‘Class’].nilai_jumlah()
Keluaran X = data.drop([‘Class’]sumbu = 1)
y = tanggal[“Class”]
Memisahkan data uji kereta
dari sklearn.model_selection import train_test_split # dibagi menjadi rasio 70:30
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state = 0) # menjelaskan info tentang train dan test set print(“Jumlah transaksi X_train dataset: “, X_train.shape)
print(“Jumlah transaksi y_train dataset: “, y_train.shape)
print(“Jumlah transaksi X_test dataset: “, X_test.shape)
print(“Jumlah transaksi y_test dataset: “, y_test.shape)
Keluaran
Klasifikasi
# objek regresi logistik
lr = LogisticRegression() # melatih model pada set kereta
lr.fit(X_train, y_train.ravel())
prediksi = lr.predict(X_test) # cetak laporan klasifikasi
print(“Skor akurasi adalah: “,accuracy_score(y_test, prediksi))
print(“Skor ingat adalah: “,recall_score(y_test, prediksi))
print(“Skor presisi adalah: “,precision_score(y_test, prediksi))
print(“Matriks Kebingungan: n”,matriks_kebingungan(uji_y, prediksi))
Keluaran
Seperti yang bisa kita lihat, meskipun Accuracy score 99,9%, kita bisa melihat bahwa Recall score 61,9% yang tergolong rendah, dan Precision score 88,3%.
Ini karena dataset tidak seimbang, dan sekarang kami akan mencoba meningkatkan skor ini menggunakan teknik yang disebutkan di atas.
Penanganan Data Ketidakseimbangan menggunakan Under Sampling
Under Sampling melibatkan penghapusan catatan dari kelas mayoritas untuk menyeimbangkan dengan kelas minoritas.
Teknik paling sederhana yang terlibat dalam under-sampling adalah Random under-sampling. Teknik ini melibatkan penghapusan catatan acak dari kelas mayoritas. Tetapi akan ada kehilangan informasi penting jika kita menghapus baris secara acak. Jadi berbagai teknik diterapkan untuk undersampling data. Salah satu teknik impor tersebut adalah NearMiss Undersampling.
NearMiss Undersampling
Dalam teknik ini, titik data dipilih berdasarkan jarak antara kelas mayoritas dan minoritas. Ini memiliki 3 versi yang berbeda, dan setiap versi mempertimbangkan titik data yang berbeda dari kelas mayoritas.
Versi 1 — Ini memilih titik data dari kelas mayoritas yang jarak rata-ratanya ke K instance terdekat dari kelas minoritas adalah yang terkecil. Versi 2 — Ini memilih titik data dari kelas mayoritas yang jarak rata-ratanya ke K instance terjauh dari kelas minoritas adalah yang terkecil Versi 3 — Ini bekerja dalam 2 langkah. Pertama, untuk setiap instance kelas minoritas, tetangga terdekat M mereka akan disimpan. Kemudian akhirnya, instance kelas mayoritas dipilih yang jarak rata-ratanya ke N tetangga terdekat adalah yang terbesar.
Singkatnya, Versi 3 adalah versi yang lebih akurat karena akan menghapus tautan tomek dan mempermudah proses klasifikasi karena membentuk batas keputusan.
NearMiss Undersampling # apply near miss
from imblearn.under_sampling import NearMiss nr = NearMiss() X_train_miss, y_train_miss = nr.fit_resample(X_train, y_train.ravel()) print(‘After Undersampling, bentuk train_X: {}’.format(X_train_miss.shape)) (‘After Undersampling, bentuk train_y: {} n’.format(y_train_miss.shape)) print(“After Undersampling, jumlah label ‘1’: {}”.format(sum(y_train_miss == 1)) ) print(“Setelah Undersampling, jumlah label ‘0’: {}”.format(sum(y_train_miss == 0)))
Keluaran
Kami telah mengurangi sampel kelas mayoritas — 0dan menyeimbangkannya dengan kelas minoritas — 1. Sekarang mari kita latih dan evaluasi data.
lr2 = LogisticRegression() lr2.fit(X_train_miss, y_train_miss) prediksi = lr2.predict(X_test) # cetak evaluasi metrik
print(“Skor akurasi adalah: “,accuracy_score(y_test, prediksi))
print(“Skor ingat adalah: “,recall_score(y_test, prediksi))
print(“Skor presisi adalah: “,precision_score(y_test, prediksi))
print(“Matriks Kebingungan: n”,matriks_kebingungan(uji_y, prediksi))
Keluaran
Jadi meskipun skor recall lebih banyak, kita bisa melihat akurasi yang kurang. Tetapi berdasarkan pengamatan kami, ketika prediksi kelas minoritas menjadi prioritas, kami dapat menggunakan teknik ini.
Penanganan Data Ketidakseimbangan menggunakan Over Sampling
Tidak seperti undersampling, di mana kami menghapus catatan dari kelas mayoritas, Dalam pengambilan sampel berlebih, kami akan menambahkan catatan di kelas minoritas. Under-Sampling dapat digunakan ketika kita memiliki banyak Data, sedangkan Oversampling dapat digunakan ketika kita memiliki lebih sedikit Data.
Pengambilan sampel berlebih
Teknik paling sederhana yang terlibat dalam over-sampling adalah Random Over Sampling, di mana kita secara acak menambahkan lebih banyak salinan ke kelas minoritas untuk menyeimbangkan dengan kelas mayoritas, tetapi kelemahan Over Sampling adalah menyebabkan overfitting dan generalisasi data, sehingga mengurangi ketepatan. Jadi untuk tujuan ini, kami menggunakan teknik SMOTE.
SMOTE (Teknik Oversampling Minoritas Sintetis)
Teknik SMOTE bekerja dengan secara acak memilih titik data dari kelas minoritas dan menghitung K-Nearest Neighbor dari titik itu, dan menambahkan titik acak antara titik yang dipilih ini dan tetangganya.
SMOTE
Algoritma SMOTE bekerja dalam 4 Langkah —
Pilih kelas minoritas sebagai vektor input. Cari K-Nearest Neighbors dengan menggunakan jarak Euclidean. Pilih salah satu dari Tetangga ini dan tambahkan titik sintetis antara titik yang dipilih dan Tetangganya. Ulangi langkah tersebut sampai seimbang. dari imblearn.over_sampling import SMOTE sm = SMOTE(random_state = 2) X_train_res, y_train_res = sm.fit_resample(X_train, y_train.ravel()) print(‘After OverSampling, bentuk train_X: {}’.format(X_train_res.shape ))
print(‘Setelah OverSampling, bentuk train_y: {} n’.format(y_train_res.shape))
print(“Setelah OverSampling, jumlah label ‘1’: {}”.format(sum(y_train_res == 1)))
print(“Setelah OverSampling, jumlah label ‘0’: {}”.format(sum(y_train_res == 0)))
Keluaran
Kami telah melakukan oversampling kelas minoritas — 1 dan menyeimbangkannya dengan kelas mayoritas — 0. Mari kita latih dan evaluasi data.
lr1 = LogistikRegresi()
lr1.fit(X_train_res, y_train_res.ravel()) prediksi = lr1.predict(X_test) # print Evaluasi Metrik print(“Skor akurasi adalah: “,accuracy_score(y_test, prediksi))
print(“Skor ingat adalah: “,recall_score(y_test, prediksi))
print(“Skor presisi adalah: “,precision_score(y_test, prediksi))
print(“Matriks Kebingungan: n”,matriks_kebingungan(uji_y, prediksi))
Keluaran
Seperti yang dapat kita lihat dengan penurunan Akurasi yang minimal, recall_score telah meningkat secara signifikan jika dibandingkan dengan statistik aslinya.
Membandingkan kinerja model
Di bawah ini adalah perbandingan model tanpa menangani data yang tidak seimbang, dengan undersampling dan dengan oversampling —
Gambar Oleh Penulis
Dengan metrik di atas, orang dapat memahami bahwa teknik SMOTE memiliki hasil yang baik.
Kesimpulan
Pada artikel ini, kita telah membahas bagaimana menangani data yang tidak seimbang menggunakan teknik yang berbeda. Kami telah menggunakan regresi Logistik dalam contoh di atas, kami dapat mencoba berbagai algoritma dan meningkatkan kinerja model.
Saya harap ini bermanfaat…. Selamat Coding…..
Teknik Penting untuk Menangani Data yang Tidak Seimbang dalam Pembelajaran Mesin Python awalnya diterbitkan di Towards AI on Medium, di mana orang-orang melanjutkan percakapan dengan menyoroti dan menanggapi cerita ini.
Diterbitkan melalui Menuju AI