【问题标题】:Check if my data are linearly separable [closed]检查我的数据是否线性可分[关闭]
【发布时间】:2017-07-11 18:43:08
【问题描述】:

这个帖子后面跟着下面的帖子:

https://cs.stackexchange.com/questions/70395/what-is-the-effect-of-hidden-layer-size

我想知道我的数据是否线性可分。根据我在上面链接的帖子中收到的评论,我决定对我的数据运行硬 SVM 以查看分类结果。

我的输入数据,X 是 (10000, 128) 的矩阵,输出/目标/类是 (10000, 10)。我有 10 个班级,范围从 1 到 10。

使用以下代码,我尝试了 LogisticRegression()、svm.LinearSVC(C=1, loss='hinge') 和 svm.SVC(kernel='linear', C=1):

dataframe = read_csv('data.txt')
array = dataframe.values

X = array[:, 0:128]
y = array[:,-1]

plt.hist(y, bins='auto')  # plt.hist passes it's arguments to np.histogram
plt.title("Histogram with 'auto' bins")
plt.show()

models = []
models.append(('LR', LogisticRegression() ))
models.append(('LSVM', svm.LinearSVC(C=1, loss='hinge') ))
models.append(('LSVM2', svm.SVC(kernel='linear', C=1) ))

results=[]
names=[]
scoring = 'accuracy'
for name, model in models:
    kfold = KFold(n_splits=10, random_state=7)
    cv_results = cross_val_score(model, X, y, cv=kfold, scoring=scoring)
    results.append(cv_results)
    names.append(name)
    msg = "%s: %f (%f)" % (name, cv_results.mean(), cv_results.std())
    print(msg)

结果如下:

LR: 0.613360 (0.019632)
LSVM: 0.307829 (0.020123)
LSVM2: 1.000000 (0.000000)

我有两个问题:

(1) 我的数据是线性可分的吗?

(2) LSVM2的结果是不是很奇怪? 为此我进一步使用了

models.append(('RBFSVM', svm.SVC(kernel='rbf', gamma=0.7, C=1) ))
models.append(('POLYSVM', svm.SVC(kernel='poly', degree=3, C=1) ))

并收到以下信息:

RBFSVM: 0.797680(.015187)
POLYSVM: 0.100011(0.008113)

你能帮我获得更多的直觉吗?

谢谢,

【问题讨论】:

  • 如果您可以发布单独的问题而不是将您的问题合并为一个问题,则最好。这样,它可以帮助回答您的问题的人以及其他寻找您的至少一个问题的人。

标签: machine-learning classification svm


【解决方案1】:

一般说明 - 线性可分性的概念适用于二进制数据集,而不是 10 类。如果您有超过 2 个类,则没有线性可分之类的东西,因为您可以通过多种方式定义它。为了回答的其余部分,我假设我们正在谈论“成对线性可分离”,这意味着如果您选择任何两个类,它们可以彼此线性分离(请注意,这与拥有一个-vs-all 线性可分性,因为有些数据集是一对一线性可分的,而不是一对一线性可分的)。

首先检查数据是否线性可分不要使用交叉验证。只需将您的模型拟合到整个数据并检查错误,无需训练/验证/测试拆分,对所有内容进行训练 - 对所有内容进行测试。事实上,进行交叉验证会导致 错误,因为您可以在没有线性可分性的情况下获得 100%(只要您足够幸运地以每个测试子集线性可分的方式拆分数据)。

其次关闭正则化。 SVM 中的“C”使其“不难”,hard SVM 等价于 C=infinity 的 SVM,因此设置 C=100000 至少有一些不错的分离概率。这同样适用于 sklearn 中的逻辑回归,它也有一个超参数 C,将其设置为 1000000(基本上是任何 HUGE),然后重新训练。

【讨论】:

  • 感谢您的回答@lejlot。给你一个简单的问题(或者可能是一个愚蠢的问题,因为我不是这方面的专家):为什么我的数据是一维的?我有 128 个特征输入。会在我的数据维度上考虑吗?
  • 我更正了输入特征的大小,X 报错:“X 是 (10000, 128) 的矩阵,输出/目标/类是 (10000, 10)... “这会改变你的答案吗?
  • 这只改变了最后一点,没有别的(我现在删除了,因为在你更新后它不再适用)。
  • 感谢您的更新。将 C 参数更改为 1000000000 在这里我得到 [1] LogisticRegression(C=C) [2] svm.LinearSVC(C=C , loss='hinge') 和 [3] svm.SVC(kernel='linear ', C=C ) 分别为: [1] 均方误差:0.40 和方差得分:0.67 [2] 均方误差:3.5 和方差得分:0.34 [3] 均方误差:0 和方差得分:1.00。你如何解释结果?我怀疑 [3] 是否可靠!
  • 这毫无意义。这是分类,没有“均方误差”或方差。您应该检查准确性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 2013-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多