ตัวแปร Collinear ในการฝึกอบรม LDA หลายระดับ


16

ฉันฝึกอบรมลักษณนามหลายระดับ LDA กับ8 ชั้นเรียนของข้อมูล

ขณะทำการฝึกซ้อมฉันได้รับคำเตือนว่า: " Variables are collinear "

ฉันได้รับการฝึกอบรมมีความถูกต้องมากกว่า90%

ฉันใช้ห้องสมุดscikits-LearnในPythonทำการฝึกอบรมและทดสอบข้อมูลหลายคลาส

ฉันได้รับความแม่นยำในการทดสอบที่ดีเช่นกัน (ประมาณ85% -95% )

ฉันไม่เข้าใจว่าข้อผิดพลาด / คำเตือนหมายถึงอะไร กรุณาช่วยฉันออกไป.

คำตอบ:


29

Multicollinearityหมายความว่าตัวทำนายของคุณมีความสัมพันธ์ ทำไมสิ่งนี้ถึงไม่ดี?

เนื่องจาก LDA เช่นเดียวกับเทคนิคการถดถอยเกี่ยวข้องกับการคำนวณเมทริกซ์ผกผันซึ่งไม่ถูกต้องหากดีเทอร์มีแนนต์ใกล้กับ 0 ( เช่นตัวแปรสองตัวหรือมากกว่า

ที่สำคัญกว่านั้นทำให้ค่าสัมประสิทธิ์โดยประมาณเป็นไปไม่ได้ที่จะตีความ หากการเพิ่มขึ้นในการพูด, การเชื่อมโยงกับการลดลงของX 2และพวกเขาทั้งสองเพิ่มขึ้นตัวแปรY , การเปลี่ยนแปลงในทุกX 1จะได้รับการชดเชยจากการเปลี่ยนแปลงในX 2และคุณจะประมาทผลกระทบของX 1ในY ใน LDA คุณจะดูถูกดูแคลนผลของX 1ในการจำแนกประเภทX1X2YX1X2X1YX1

หากสิ่งที่คุณสนใจคือการจำแนกต่อและหลังจากการฝึกอบรมแบบจำลองของคุณในครึ่งหนึ่งของข้อมูลและทดสอบในอีกครึ่งหนึ่งคุณจะได้ความแม่นยำ 85-95% ฉันจะบอกว่ามันดี


ดังนั้นฉันจะตีความได้ไหมว่าคุณลักษณะ X1 ในเวกเตอร์คุณลักษณะไม่ใช่ตัวเลือกที่ดีในกรณีที่ความแม่นยำในการทดสอบต่ำ
garak

1
ฉันเดาว่าถ้าความแม่นยำในการทดสอบต่ำก็ไม่มีทางเลือกที่ดี
gui11aume

สิ่งที่น่าสนใจคือฉันมีปัญหานี้กับ LDA แต่ไม่ใช่เมื่อฉันใช้ QDA ฉันสงสัยว่ามีอะไรแตกต่างกันในนั้น
garak

1
+1 สำหรับคำตอบ แต่ "การคำนวณเมทริกซ์ผกผัน" อาจไม่ถูกต้อง เราไม่เคยใช้คอมพิวเตอร์อย่างชัดเจนใช้วิธีการโดยตรงเช่น LU, QR หรือวิธีการวนซ้ำ
Haitao Du

@ hxd1011 ถูกต้อง! สำหรับบันทึกคุณสามารถให้คำสองสามคำเกี่ยวกับสิ่งที่เกิดขึ้นใน LU / QR ฯลฯ เมื่อเมทริกซ์นั้น "เกือบเป็นเอกพจน์" หรืออาจชี้ไปที่เอกสารที่อธิบาย
gui11aume

12

As I seem to think gui11aume has given you a great answer, I want to give an example from a slightly different angle that might be illuminating. Consider that a covariate in your discriminant function looks as follows:

X1=5X2+3X3X4.

Suppose the best LDA has the following linear boundary:

X1+2X2+X32X4=5

Then we can substitute 5X2+3X3X4 for X1 n the LDA boundary equation, so:

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

or

7X2+4X33X4=5.

These two boundaries are identical but the first one has coefficients 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.

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.