Closed. This question needs to be more focused。它当前不接受答案。
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            想改善这个问题吗?更新问题,使其仅通过editing this post专注于一个问题。
                        
                        6个月前关闭。
                                                                                            
                
        
该帖子之后是以下帖子:

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

我想找出我的数据是否可以线性分离。在上面的链接中收到我的评论后,我决定对数据运行hard-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)


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

谢谢,

最佳答案

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

首先要检查数据是否线性可分离,请不要使用交叉验证。只需将您的模型拟合到整个数据并检查错误,就无需进行训练/验证/测试拆分,对所有内容进行训练-对所有内容进行测试。实际上,进行交叉验证会出错,因为您可以获得100%的线性分离性(只要您有幸以每个测试子集都可以线性分离的方式拆分数据)。

首先关闭正则化。 SVM中的“ C”表示“不难”,硬SVM等效于C = infinity的SVM,因此将C = 100000设置为至少具有一定的分离概率。 sklearn中的逻辑回归也是如此,它也有一个超参数C,将其设置为1000000(基本上是HUGE),然后重新训练。

关于machine-learning - 检查我的数据是否可以线性分离,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42379251/

10-12 23:49