我正在尝试使用LDA缩小数据集。我希望在减少数据集时,我的准确度会降低。但是,根据我随机播种的种子,有时减少的版本会给我更高的准确度。
X, y = make_classification(1000, 50, n_informative=10, n_classes=20)
X1, X2, y1, y2 = train_test_split(X, y)
lda = LDA()
lda.fit(X1, y1)
predicted = lda.predict(X2)
full_accuracy = accuracy_score(y2, predicted)
reduction = LDA(n_components=5)
X1red = reduction.fit_transform(X1, y1)
X2red = reduction.transform(X2)
lda.fit(X1red, y1)
predicted = lda.predict(X2red)
reduced_accuracy = accuracy_score(predicted, y2)
print full_accuracy, reduced_accuracy, reduced_accuracy/full_accuracy
# prints 0.132 0.16 1.21212121212
你知道为什么在降维后我有更高的准确度吗?
答案 0 :(得分:1)
没有保证之类的东西,降低维度会更好或更差。您正在分别应用两个弱模型,有时您可以获得幸运,它们实际上会消除漏洞,并且比直接应用的弱模型稍微好一些。一般而言,维度降低不应该增加维度,因为您有足够的数据,而您所适合的模型强。 LDA不是一个强大的模型(它非常天真),因此你可能会得到各种结果。
对于更直观的一些,让我们来看一个非常简单的例子
X = 0 900
1 1000
2 123
3 123124
4 1251251
y = 0 1 0 1 0
我的模型是一个函数f(x|theta) = sum(x) % theta
,我在那里学习theta
。如果我直接将其应用于我的数据,我将能够学习,因为
f(X) = 900 % theta
1001 % theta
125 % theta
123127 % theta
1251255 % theta
最佳theta为theta=2
,然后我得到预测0 1 1 1 1
,准确率为60%。现在让我们应用降维技术,这在我的情况下非常简单,它是g(x) = x[0]
,因此
g(X) = 0
1
2
3
4
如果我现在撰写f o g
(将我的模型应用于简化数据),我将再次了解theta=2
,但这次我的预测为0 1 0 1 0
,准确度为100%!< / p>
与此同时,我可以选择不同的尺度减少,例如g(x)=x[1]
,而不是0 0 1 0 1
,这只是20%的准确度!因此比原来更糟糕。
正如你所看到的,你总能得到两者 - 无论好坏。由于尺度减少技术应用而不知道接下来的知识,它可以做任意的好/坏事情。没有保证。