5 algoritma pengambilan sampel utama


Bekerja dengan data - bekerja dengan algoritma pemrosesan data.


Dan saya harus bekerja dengan yang paling beragam setiap hari, jadi saya memutuskan untuk membuat daftar yang paling populer dalam serangkaian publikasi.


Artikel ini berfokus pada teknik pengambilan sampel yang paling umum untuk bekerja dengan data.





Pengambilan sampel acak sederhana


Misalkan jika Anda ingin membuat pilihan di mana setiap elemen memiliki probabilitas yang sama untuk dipilih.


Di bawah ini kami memilih 100 elemen seperti itu dari dataset.


sample_df = df.sample(100) 



Pengambilan sampel bertingkat



Misalkan kita perlu memperkirakan jumlah suara rata-rata untuk setiap kandidat dalam pemilihan. Voting berlangsung di tiga kota:


1 juta pekerja tinggal di kota A


2 juta seniman tinggal di kota B


3 juta warga senior tinggal di kota C


Jika kita mencoba mengambil sampel yang sama-sama berpeluang 60 orang di antara seluruh populasi, maka sampel itu pasti tidak seimbang dibandingkan dengan kota yang berbeda, dan karena itu bias, yang akan mengarah pada kesalahan serius dalam prediksi.


Jika kami secara khusus membuat sampel masing-masing 10, 20 dan 30 orang dari kota A , B dan C , maka kesalahannya akan minimal.


Dengan Python, ini bisa dilakukan seperti ini:


 from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y, test_size=0.25) 



Pengambilan sampel reservoir



Saya suka rumusan masalah ini:


Misalkan Anda memiliki aliran elemen dengan ukuran besar yang tidak diketahui yang dapat Anda ulangi sekali saja.


Buat algoritma yang secara acak memilih elemen dari aliran seolah-olah elemen apa pun dapat dipilih dengan probabilitas yang sama.


Bagaimana cara melakukannya?


Misalkan kita perlu memilih 5 objek dari aliran yang tidak terbatas, sehingga setiap elemen dalam aliran dapat dipilih dengan kemungkinan yang sama.


 import random def generator(max): number = 1 while number < max: number += 1 yield number #    stream = generator(10000) #    k=5 reservoir = [] for i, element in enumerate(stream): if i+1<= k: reservoir.append(element) else: probability = k/(i+1) if random.random() < probability: #    ,    reservoir[random.choice(range(0,k))] = element print(reservoir) ------------------------------------ [1369, 4108, 9986, 828, 5589] 

Secara matematis dimungkinkan untuk membuktikan bahwa setiap elemen dapat dipilih dengan kemungkinan yang sama.


Bagaimana?


Ketika datang ke matematika, yang terbaik adalah mencoba memulai solusi dengan kasus khusus kecil.


Jadi mari kita lihat aliran yang terdiri dari 3 elemen, di mana kita hanya perlu memilih 2.


Kami melihat elemen pertama, simpan di daftar, karena masih ada ruang di dalam tangki. Kita melihat elemen kedua, simpan dalam daftar, karena masih ada ruang di dalam tangki.


Kami melihat elemen ketiga. Ini menjadi lebih menarik di sini. Kami akan menyimpan elemen ketiga dengan probabilitas 2/3.


Sekarang mari kita lihat probabilitas akhir dari elemen pertama yang disimpan:


Probabilitas perpindahan elemen pertama dari reservoir adalah sama dengan probabilitas elemen ketiga yang akan dipilih, dikalikan dengan probabilitas bahwa itu adalah elemen pertama dari dua elemen yang akan dipilih untuk perpindahan. Itu adalah:


2/3 * 1/2 = 1/3


Artinya, probabilitas akhir dari elemen pertama yang akan diselamatkan:


1 - 1/3 = 2/3


Benar-benar logika yang sama dapat diterapkan pada elemen kedua, memperluasnya di masa depan ke sejumlah besar elemen dengan peningkatan reservoir.


Artinya, setiap elemen akan disimpan dengan probabilitas 2/3 atau dalam kasus umum k / n .




Undersampling dan oversampling acak


Sumber

Terlalu sering dalam hidup ada set data yang tidak seimbang.


Metode yang banyak digunakan dalam kasus ini disebut resampling (kadang-kadang mereka mengatakan "resampling" dalam terjemahan Rusia - sekitar Terjemahan.) . Esensinya terletak pada menghilangkan elemen dari set yang terlalu besar (undersampling) dan / atau menambahkan lebih banyak elemen ke set yang tidak cukup besar (oversampling).


Mari kita mulai dengan membuat beberapa set yang tidak seimbang.


 from sklearn.datasets import make_classification X, y = make_classification( n_classes=2, class_sep=1.5, weights=[0.9, 0.1], n_informative=3, n_redundant=1, flip_y=0, n_features=20, n_clusters_per_class=1, n_samples=100, random_state=10 ) X = pd.DataFrame(X) X['target'] = y 

Sekarang kita dapat melakukan undersampling acak dan oversampling seperti ini:


 num_0 = len(X[X['target']==0]) num_1 = len(X[X['target']==1]) print(num_0,num_1) #   undersampled_data = pd.concat([ X[X['target']==0].sample(num_1) , X[X['target']==1] ]) print(len(undersampled_data)) #   oversampled_data = pd.concat([ X[X['target']==0] , X[X['target']==1].sample(num_0, replace=True) ]) print(len(oversampled_data)) ------------------------------------------------------------ OUTPUT: 90 10 20 180 



Andersampling dan oversampling menggunakan tidak seimbang-belajar


ketidakseimbangan-belajar (imblearn) adalah pustaka python untuk menangani masalah dataset tidak seimbang.


Ini berisi beberapa metode berbeda untuk resampling.


a. Andersampling menggunakan Tomek Links:


Salah satu metode yang disediakan disebut Tomek Links. "Tautan" dalam hal ini adalah pasangan elemen dari kelas yang berbeda di sekitarnya.


Dengan menggunakan algoritma, kita akhirnya akan menghapus elemen pasangan dari set yang lebih besar, yang akan memungkinkan classifier bekerja lebih baik.


Sumber


 from imblearn.under_sampling import TomekLinks tl = TomekLinks(return_indices=True, ratio='majority') X_tl, y_tl, id_tl = tl.fit_sample(X, y) 

b. Oversampling dengan SMOTE:


Dalam SMOTE (Sintesis Minority Oversampling Method), kami membuat elemen yang dekat dengan yang sudah ada dalam kumpulan yang lebih kecil.


Sumber
 from imblearn.over_sampling import SMOTE smote = SMOTE(ratio='minority') X_sm, y_sm = smote.fit_sample(X, y) 

Tetapi di imblearn ada cara lain undersampling (Cluster Centroids, NearMiss, dll.) Dan oversampling (ADASYN dan bSMOTE), yang juga bisa berguna.




Kesimpulan


Algoritma adalah darah ilmu data.


Pengambilan sampel adalah salah satu bidang terpenting dalam bekerja dengan data, dan hanya gambaran umum yang diberikan di atas.


Strategi pengambilan sampel yang dipilih dengan baik dapat menarik seluruh proyek. Dipilih dengan buruk menyebabkan hasil yang salah. Karena itu, pilihan harus dibuat dengan bijak.

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


All Articles