Bagaimana cara membakukan array jika standar deviasi nol?

8

Saya mencoba untuk membakukan kolom dataset untuk regresi linier.

Salah satu kolom memiliki standar deviasi = 0.

def standardize(X):
    return (X - mean(X)) / std(X) 

Jadi kode ini tidak berfungsi.

Apakah ada trik untuk menyelesaikan masalah ini? Saya sudah mencoba dua hal

  1. Lempar kolom dengan standar deviasi 0 karena itu adalah parameter yang tidak berguna.
  2. Tambahkan beberapa noise yang sangat kecil seperti ke salah satu elemen kolom sehingga fungsinya bekerja.1010standardize

Terima kasih!

Pratik Deoghare
sumber
Anda melakukannya dengan benar. Sebagai opsi kedua akan lebih baik untuk menambahkan noise acak yang terdistribusi normal dengan standar deviasi kecil untuk setiap nilai dalam kolom. Tetapi karena opsi pertama lebih sederhana, itu lebih disukai.
O_Devinyak
17
Jika standar deviasi adalah nol, maka kolom diisi oleh satu nilai. Jadi, jika tujuan Anda adalah menyiapkan data untuk regresi, Anda dapat membuang kolom, karena itu tidak akan berkontribusi apa pun pada regresi. Menambahkan noise kecil hanya akan memberi Anda lebih banyak masalah.
mpiktas
4
(Dengan peringatan bahwa @mpiktas secara implisit mengasumsikan bahwa regresi akan berisi suku konstanta, yang biasanya demikian.) Perhatikan bahwa menambahkan derau kecil akan menyebabkan kolom ini dan konstanta menjadi sangat paralel, berpotensi menciptakan semua jenis kekacauan dalam numerik solusi karena multikolinearitas tinggi. Tapi mengapa membakukan kolom pada awalnya? Ini akan terjadi secara otomatis, menggunakan hampir semua metode solusi yang baik.
whuber
5
@Ratik, saya tidak berpikir ada cara untuk mengubah variabel dengan nol varians menjadi satu dengan rata-rata 0 dan varians 1. Jika Anda melakukan opsi (2) di atas, Anda secara efektif hanya mengganti variabel Anda dengan angka acak standar.
Makro

Jawaban:

7

Situasi yang Anda gambarkan akan muncul sebagai hasil dari salah satu dari dua skenario ini:

  1. Kolom yang Anda maksud adalah kolom 1 yang ditambahkan ke matriks kovariat Anda sehingga regresi linier Anda memiliki istilah intersep .
  2. Kolom adalah kolom yang berbeda dari kolom yang disebutkan sebelumnya, memberikan Anda dua kolom konstanta [****].

Untuk Skenario 1 : lewati kolom itu, standarisasi semua kolom lainnya, dan kemudian jalankan regresi seperti biasa.

Namun, untuk Skenario 2 , Anda harus menyingkirkan kolom konstanta tambahan itu seluruhnya. Bahkan, terlepas dari pertanyaan Standardisasi , Anda tidak akan pernah dapat menjalankan regresi dengan dua kolom konstan sejak saat itu Anda akan memiliki collinearity yang sempurna . Hasilnya adalah bahwa bahkan jika Anda mencoba menjalankan regresi, program komputer akan mengeluarkan pesan kesalahan dan berhenti di tengah jalan [Catatan: ini karena regresi OLS memerlukan matriks X'X menjadi non-singular untuk hal-hal yang berhasil benar].

Bagaimanapun, semoga berhasil dengan, um, kemunduran Anda!

[****] Hanya untuk memperjelas: Yang saya maksud dengan "dua kolom konstanta" adalah bahwa Anda memiliki satu kolom di mana setiap elemen adalah '1' dan kolom kedua di mana setiap elemen adalah beberapa 'k' konstan .. .

Steve S
sumber
2

Cara yang benar adalah dengan menghapus kolom fitur dari data. Tetapi sebagai peretasan sementara -

Anda bisa mengganti 0 std ke 1 untuk fitur itu. Ini pada dasarnya akan berarti bahwa nilai skala akan menjadi nol untuk semua poin data untuk fitur itu. Ini masuk akal karena ini menyiratkan bahwa nilai-nilai fitur tidak menyimpang bahkan sedikit dari rata-rata (karena nilainya konstan, konstan adalah rata-rata.)

FYI- Inilah yang dilakukan sklearn! https://github.com/scikit-learn/scikit-learn/blob/7389dbac82d362f296dc2746f10e43ffa1615660/sklearn/preprocessing/data.py#L70

PankajKabra
sumber
Deviasi standar menjadi 0 berarti fitur tersebut konstan dan karenanya tidak berguna untuk prediksi. Mengubah deviasi standar untuk konstanta tidak masuk akal.
Michael R. Chernick
Ya itu tidak masuk akal dari perspektif pemodelan, saya hanya menyarankan itu sebagai hack untuk tidak melalui masalah menghapus kolom setiap kali fitur konstan datang dalam kumpulan data.
PankajKabra
0

Fitur yang memiliki nol varians tidak berguna, hapus saja.

Pertimbangkan ini, jika ini adalah satu - satunya fitur, Anda tidak akan belajar apa pun tentang respons terhadap fitur ini dari data. Dalam kasus multivariat, dibutuhkan aljabar linier untuk sampai pada kesimpulan yang sama, tetapi idenya sama.

Aksakal
sumber