Biến cộng tuyến trong đào tạo LDA Multiclass


16

Tôi đang đào tạo một trình phân loại LDA nhiều lớp với 8 lớp dữ liệu.

Trong khi thực hiện đào tạo, tôi nhận được một cảnh báo: " Biến là cộng tuyến "

Tôi đang nhận được độ chính xác đào tạo hơn 90% .

Tôi đang sử dụng thư viện scikits-learn trong Python để đào tạo và kiểm tra dữ liệu Nhiều lớp.

Tôi cũng nhận được độ chính xác kiểm tra khá (khoảng 85% -95% ).

Tôi không hiểu ý nghĩa của lỗi / cảnh báo. Hãy giúp tôi ra.

Câu trả lời:


29

Đa sắc có nghĩa là các yếu tố dự đoán của bạn có mối tương quan. Tại sao điều này là xấu?

Bởi vì LDA, giống như các kỹ thuật hồi quy liên quan đến việc tính toán nghịch đảo ma trận, điều này không chính xác nếu hệ số xác định gần bằng 0 ( tức là hai hoặc nhiều biến gần như là một tổ hợp tuyến tính của nhau).

Quan trọng hơn, nó làm cho các hệ số ước tính không thể giải thích. Nếu sự gia tăng , chẳng hạn, có liên quan đến giảm X 2 và cả hai đều tăng biến Y , mọi thay đổi trong X 1 sẽ được bù đắp bằng một sự thay đổi trong X 2 và bạn sẽ đánh giá thấp ảnh hưởng của X 1 trên Y . Trong LDA, bạn sẽ đánh giá thấp hiệu quả của X 1X1X2YX1X2X1YX1 đến phân loại.

Nếu tất cả những gì bạn quan tâm là phân loại theo từng se và sau khi đào tạo mô hình của bạn trên một nửa dữ liệu và kiểm tra nó trên nửa còn lại, bạn sẽ nhận được độ chính xác 85-95% tôi sẽ nói là ổn.


Vì vậy, tôi có thể giải thích điều này như, một tính năng X1 trong vectơ tính năng không phải là một lựa chọn tốt trong trường hợp độ chính xác kiểm tra thấp?
garak

1
Tôi đoán rằng nếu kiểm tra độ chính xác thấp thì không có lựa chọn tốt.
gui11aume

Điều thú vị là tôi gặp vấn đề này với LDA nhưng không phải khi tôi sử dụng QDA. Tôi tự hỏi có gì khác nhau trong đó?
garak

1
+1 cho câu trả lời, nhưng "tính toán đảo ngược ma trận" có thể không chính xác. Chúng tôi không bao giờ sử dụng máy tính một cách rõ ràng, các phương pháp trực tiếp như LU, QR hoặc phương pháp lặp, được sử dụng.
Haitao Du

@ hxd1011 Đúng! Đối với bản ghi, bạn có thể cho một vài từ về những gì xảy ra trong LU / QR, v.v. khi ma trận "gần như là số ít", hoặc có thể chỉ vào một tài liệu giải thích nó?
gui11aume

12

Như tôi nghĩ rằng gui11aume đã cho bạn một câu trả lời tuyệt vời, tôi muốn đưa ra một ví dụ từ một góc độ hơi khác có thể được chiếu sáng. Hãy xem xét rằng một đồng biến trong hàm phân biệt đối xử của bạn trông như sau:

. X1=5X2+3X3X4

Giả sử LDA tốt nhất có ranh giới tuyến tính sau:

X1+2X2+X32X4=5

Sau đó, chúng ta có thể thay cho X 1 n phương trình biên LDA, vì vậy: 5X2+3X3X4X1

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

hoặc là

7X2+4X33X4=5

1,2,1,2 for X1, X2, X3, and X4 respectively, while the other has coefficients 0,7,3,1.

So the coefficient are quite different but the two equations give the same boundary and identical prediction rule. If one form is good the other is also. But now you can see why gui11ame says the coefficients are uninterpretable.

There are several other ways to express this boundary as well by substituting for X2 to give it the 0 coefficient and the same could be done for X3 or X4. But in practice the collinearity is approximate. This makes things worse because the noise allows for a unique answer. Very slight perturbations of the data will cause the coefficients to change drastically. But for prediction you are okay because each equation defines almost the same boundary and so LDA will result in nearly identical predictions.


1

While the answer that was marked here is correct, I think you were looking for a different explanation to find out what happened in your code. I had the exact same issue running through a model.

Here's whats going on: You're training your model with the predicted variable as part of your data set. Here's an example of what was occurring to me without even noticing it:

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

In this code, I want to predict the value of 'COL3'... but, if you look at train_X, I'm telling it to retrieve every column except the last one, so its inputting COL1 COL2 and COL3, not COL4, and trying to predict COL3 which is part of train_X.

I corrected this by just moving the columns, manually moved COL3 in Excel to be the last column in my data set (now taking place of COL4), and then:

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

If you don't want to move it in Excel, and want to just do it by code then:

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

Note now how I declared train_X, to include all columns except COL3, which is part of train_Y.

I hope that helps.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.