Variabel bertingkat dalam pelatihan LDA Multikelas

16

Saya melatih multi-class LDA classifier dengan 8 kelas data.

Saat melakukan pelatihan, saya mendapat peringatan: " Variabel collinear "

Saya mendapatkan akurasi pelatihan lebih dari 90% .

Saya menggunakan perpustakaan scikits-learn di Python do train dan menguji data multi-kelas.

Saya mendapatkan akurasi pengujian yang layak juga (sekitar 85% -95% ).

Saya tidak mengerti apa arti kesalahan / peringatan itu. Tolong bantu saya.

garak
sumber

Jawaban:

29

Multikolinieritas berarti bahwa prediktor Anda berkorelasi. Mengapa ini buruk?

Karena LDA, seperti teknik regresi melibatkan penghitungan inversi matriks, yang tidak akurat jika determinannya mendekati 0 ( yaitu dua variabel atau lebih hampir merupakan kombinasi linear satu sama lain).

Lebih penting lagi, itu membuat koefisien yang diperkirakan tidak mungkin untuk ditafsirkan. Jika peningkatan , katakanlah, dikaitkan dengan penurunan X 2 dan mereka berdua peningkatan variabel Y , setiap perubahan dalam X 1 akan dikompensasi oleh perubahan X 2 dan Anda akan meremehkan efek dari X 1 pada Y . Di LDA, Anda akan meremehkan efek X 1 pada klasifikasi.X1X2YX1X2X1YX1

Jika semua yang Anda pedulikan adalah klasifikasi itu sendiri , dan setelah melatih model Anda pada setengah dari data dan mengujinya pada setengah lainnya Anda mendapatkan akurasi 85-95% saya akan mengatakan itu baik-baik saja.

gui11aume
sumber
Jadi bisakah saya menafsirkan ini sebagai, fitur X1 dalam vektor fitur bukan pilihan yang baik jika akurasi pengujian rendah?
garak
1
Saya kira jika akurasi pengujian rendah, tidak ada pilihan yang baik.
gui11aume
Yang menarik adalah saya mengalami masalah ini dengan LDA tetapi tidak ketika saya menggunakan QDA. Saya ingin tahu apa yang berbeda di sana?
garak
1
+1 untuk jawabannya, tetapi "menghitung inversi matriks" mungkin tidak akurat. Kami tidak pernah menggunakan komputer secara eksplisit, metode langsung seperti LU, QR atau metode berulang, digunakan.
Haitao Du
@ hxd1011 Benar! Sebagai catatan, dapatkah Anda memberikan beberapa kata tentang apa yang terjadi dalam LU / QR dll ketika matriks "hampir tunggal", atau mungkin menunjuk ke dokumen yang menjelaskannya?
gui11aume
12

Sepertinya saya pikir gui11aume telah memberi Anda jawaban yang bagus, saya ingin memberikan contoh dari sudut yang sedikit berbeda yang mungkin menerangi. Pertimbangkan bahwa kovariat dalam fungsi diskriminan Anda terlihat sebagai berikut:

X1=5X2+3X3X4

Misalkan LDA terbaik memiliki batas linier berikut:

X1+2X2+X32X4=5

5X2+3X3X4X1

5X2+3X3X4+2X2+X32X4=5

atau

7X2+4X33X4=5

1,2,1,2X1 ,X2, X3, dan X4 masing-masing, sementara yang lain memiliki koefisien 0,7,3,-1.

Jadi koefisiennya sangat berbeda tetapi kedua persamaan tersebut memberikan batasan yang sama dan aturan prediksi yang sama. Jika satu bentuk baik, yang lain juga. Tetapi sekarang Anda dapat melihat mengapa gui11ame mengatakan bahwa koefisien tidak dapat diinterpretasikan.

Ada beberapa cara lain untuk mengekspresikan batasan ini juga dengan menggantikannya X2 untuk memberikannya 0 Koefisien dan hal yang sama dapat dilakukan untuk X3 atau X4. Namun dalam praktiknya collinearity adalah perkiraan. Ini memperburuk keadaan karena kebisingan memungkinkan jawaban yang unik. Gangguan data yang sangat sedikit akan menyebabkan koefisien berubah secara drastis. Tetapi untuk prediksi Anda baik-baik saja karena setiap persamaan mendefinisikan batas yang hampir sama dan LDA akan menghasilkan prediksi yang hampir sama.

Michael R. Chernick
sumber
1

Sementara jawaban yang ditandai di sini benar, saya pikir Anda mencari penjelasan berbeda untuk mengetahui apa yang terjadi dalam kode Anda. Saya memiliki masalah yang sama persis berjalan melalui model.

Inilah yang terjadi: Anda sedang melatih model Anda dengan variabel yang diprediksi sebagai bagian dari kumpulan data Anda. Inilah contoh apa yang terjadi pada saya tanpa menyadarinya:

df = pd.read_csv('file.csv')
df.columns = ['COL1','COL2','COL3','COL4']
train_Y = train['COL3']
train_X = train[train.columns[:-1]]

Dalam kode ini, saya ingin memprediksi nilai 'COL3' ... tetapi, jika Anda melihat train_X, saya mengatakannya untuk mengambil setiap kolom kecuali yang terakhir, jadi itu memasukkan COL1 COL2 dan COL3, bukan COL4, dan mencoba memprediksi COL3 yang merupakan bagian dari train_X.

Saya memperbaikinya dengan hanya memindahkan kolom, secara manual memindahkan COL3 di Excel menjadi kolom terakhir dalam kumpulan data saya (sekarang mengambil tempat COL4), dan kemudian:

df = pd.read_csv('file.csv')
df.columns = ['COL1','COL2','COL3','COL4']
train_Y = train['COL4']
train_X = train[train.columns[:-1]]

Jika Anda tidak ingin memindahkannya di Excel, dan ingin melakukannya dengan kode saja:

df = pd.read_csv('file.csv')
df.columns = ['COL1','COL2','COL3','COL4']
train_Y = train['COL3']
train_X = train[train.columns['COL1','COL2','COL4']]

Perhatikan sekarang bagaimana saya menyatakan train_X, untuk memasukkan semua kolom kecuali COL3, yang merupakan bagian dari train_Y.

Saya harap itu membantu.

nukalov
sumber