Коллинеарные переменные в обучении LDA Multiclass


16

Я тренирую многоклассный классификатор LDA с 8 классами данных.

Во время обучения я получаю предупреждение: « Переменные коллинеарны »

Я получаю точность обучения более 90% .

Я использую библиотеку scikits-learn в Python, обучаю и проверяю данные мультикласса .

Я также получаю приличную точность тестирования (около 85% -95% ).

Я не понимаю, что означает ошибка / предупреждение. Пожалуйста, помогите мне.

Ответы:


29

Мультиколлинеарность означает, что ваши предикторы коррелированы. Почему это плохо?

Поскольку LDA, подобно методам регрессии, включает вычисление инверсии матрицы, которая является неточной, если детерминант близок к 0 ( т.е. две или более переменных являются почти линейной комбинацией друг друга).

Что еще более важно, это делает расчетные коэффициенты невозможными для интерпретации. Если увеличение , скажем, связано с уменьшением X 2 и они оба увеличение переменной Y , каждое изменение в X 1 будет компенсировано изменением X 2 , и вы будете недооценивать влияние X 1 на Y . В LDA вы бы недооценили влияние X 1 на классификацию.X1X2YX1X2X1YX1

Если все, что вам нужно, это классификация как таковая , и после тренировки вашей модели на половине данных и проверки ее на другой половине вы получите точность 85-95%, я бы сказал, что это нормально.


Итак, могу ли я интерпретировать это следующим образом, функция X1 в векторе признаков не является хорошим выбором в случае низкой точности тестирования?
Гарак

1
Я полагаю, что если точность тестирования низкая, то выбора нет.
gui11aume

Что интересно, у меня эта проблема с LDA, но не при использовании QDA. Интересно, что там отличается?
Гарак

1
+1 за ответ, но «вычисление обращения матрицы» может быть неточным. Мы никогда не программируем это явно, используются прямые методы, такие как LU, QR или итерационные методы.
Haitao Du

@ hxd1011 Правильно! Для записи: не могли бы вы сказать несколько слов о том, что происходит в LU / QR и т. Д., Когда матрица «почти единственная», или, возможно, указать на документ, который это объясняет?
gui11aume

12

Кажется, я думаю, что gui11aume дал вам отличный ответ, и я хочу привести пример с несколько иной точки зрения, который может быть освещающим. Учтите, что ковариата в вашей дискриминантной функции выглядит следующим образом:

. X1=5X2+3X3X4

Предположим, что лучший LDA имеет следующую линейную границу:

X1+2X2+X32X4=5

Тогда мы можем заменить на X 15X2+3X3X4X1 n граничным уравнением LDA, так:

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

или

7X2+4X33X4=5

1,2,1,2X1X2X3X4 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.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.