多类 LDA 训练中的共线变量

机器算法验证 机器学习 分类 Python scikit-学习 判别分析
2022-01-25 04:57:46

我正在用8 类数据训练一个多类 LDA 分类器。

在进行训练时,我收到以下警告:“变量是共线的

我的训练准确率超过90%

我在Python中使用scikits-learn库来训练和测试多类数据。

我也得到了不错的测试准确度(大约85%-95%)。

我不明白错误/警告的含义。请帮帮我。

3个回答

多重共线性意味着您的预测变量是相关的。为什么这很糟糕?

因为 LDA 与回归技术一样涉及计算矩阵求逆,如果行列式接近 0(两个或多个变量几乎是彼此的线性组合),则该矩阵求逆是不准确的。

更重要的是,它使估计的系数无法解释。如果增加X1,比如说,与减少X2他们都增加了变量Y, 每一个变化X1将通过改变来补偿X2你会低估X1Y. 在 LDA 中,您会低估X1关于分类。

如果您只关心分类本身,并且在一半数据上训练您的模型并在另一半数据上进行测试之后,您将获得 85-95% 的准确率,我会说这很好。

我似乎认为 gui11aume 给了你一个很好的答案,我想从一个稍微不同的角度举一个例子,这可能会很有启发性。考虑判别函数中的协变量如下所示:

X1=5X2+3X3X4.

假设最佳 LDA 具有以下线性边界:

X1+2X2+X32X4=5

然后我们可以替换5X2+3X3X4为了X1n LDA 边界方程,所以:

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

或者

7X2+4X33X4=5.

这两个边界是相同的,但第一个具有系数1,2,1,2为了X1,X2,X3, 和X4分别,而另一个有系数0,7,3,1.

所以系数完全不同,但两个方程给出了相同的边界和相同的预测规则。如果一种形式很好,另一种形式也很好。但是现在您可以看到为什么 gui11ame 说这些系数是无法解释的。

还有其他几种方式来表达这个边界,也可以通过替换X2给它0系数,同样可以为X3或者X4. 但在实践中,共线性是近似的。这使事情变得更糟,因为噪音允许一个独特的答案。数据的非常轻微的扰动将导致系数急剧变化。但是对于预测,你没问题,因为每个方程定义了几乎相同的边界,因此 LDA 将产生几乎相同的预测。

虽然此处标记的答案是正确的,但我认为您正在寻找不同的解释来找出代码中发生的事情。我在模型中遇到了完全相同的问题。

这是发生了什么:您正在使用预测变量作为数据集的一部分来训练您的模型。这是一个发生在我身上的例子,甚至没有注意到它:

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

在这段代码中,我想预测'COL3'的值......但是,如果你查看train_X,我会告诉它检索除最后一列之外的每一列,所以它输入COL1 COL2和COL3,而不是COL4,并尝试预测属于 train_X 的 COL3。

我通过移动列来纠正这个问题,手动将 Excel 中的 COL3 移动到我的数据集中的最后一列(现在代替 COL4),然后:

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

如果您不想在 Excel 中移动它,而只想通过代码来完成,那么:

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

现在请注意我如何声明 train_X,以包括除 COL3 之外的所有列,它是 train_Y 的一部分。

我希望这会有所帮助。