我正在用8 类数据训练一个多类 LDA 分类器。
在进行训练时,我收到以下警告:“变量是共线的”
我的训练准确率超过90%。
我在Python中使用scikits-learn库来训练和测试多类数据。
我也得到了不错的测试准确度(大约85%-95%)。
我不明白错误/警告的含义。请帮帮我。
我正在用8 类数据训练一个多类 LDA 分类器。
在进行训练时,我收到以下警告:“变量是共线的”
我的训练准确率超过90%。
我在Python中使用scikits-learn库来训练和测试多类数据。
我也得到了不错的测试准确度(大约85%-95%)。
我不明白错误/警告的含义。请帮帮我。
多重共线性意味着您的预测变量是相关的。为什么这很糟糕?
因为 LDA 与回归技术一样涉及计算矩阵求逆,如果行列式接近 0(即两个或多个变量几乎是彼此的线性组合),则该矩阵求逆是不准确的。
更重要的是,它使估计的系数无法解释。如果增加,比如说,与减少他们都增加了变量, 每一个变化将通过改变来补偿你会低估在. 在 LDA 中,您会低估关于分类。
如果您只关心分类本身,并且在一半数据上训练您的模型并在另一半数据上进行测试之后,您将获得 85-95% 的准确率,我会说这很好。
我似乎认为 gui11aume 给了你一个很好的答案,我想从一个稍微不同的角度举一个例子,这可能会很有启发性。考虑判别函数中的协变量如下所示:
.
假设最佳 LDA 具有以下线性边界:
然后我们可以替换为了n LDA 边界方程,所以:
或者
.
这两个边界是相同的,但第一个具有系数为了,,, 和分别,而另一个有系数.
所以系数完全不同,但两个方程给出了相同的边界和相同的预测规则。如果一种形式很好,另一种形式也很好。但是现在您可以看到为什么 gui11ame 说这些系数是无法解释的。
还有其他几种方式来表达这个边界,也可以通过替换给它系数,同样可以为或者. 但在实践中,共线性是近似的。这使事情变得更糟,因为噪音允许一个独特的答案。数据的非常轻微的扰动将导致系数急剧变化。但是对于预测,你没问题,因为每个方程定义了几乎相同的边界,因此 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 的一部分。
我希望这会有所帮助。