2017-02-21 31 views
0

這篇文章是跟隨以下職位:檢查如果我的數據是線性可分

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) 

我有2個問題:

(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) 

可以請你幫我獲得更多的直覺?

感謝,

回答

2

一般說明 - 線性可分的概念適用於二進制數據集,而不是10類。如果你有兩個以上的類,那麼就不存在線性可分性,因爲你可以用很多方式來定義它。爲了答案的其餘部分,我將假定我們正在談論「成對線性可分」,這意味着如果您選擇任何兩個類別,它們可以線性地彼此分開(請注意,這與有一個 - 與所有線性可分性,因爲有一對一線性可分的數據集,而不是一對一線性可分的)。

首先檢查數據是否線性可分不要使用交叉驗證。只需將您的模型適用於整個數據並檢查錯誤,不需要進行火車/驗證/測試拆分,對所有內容進行訓練 - 對所有內容進行測試。事實上,交叉驗證使得它的錯誤錯誤,因爲你可以得到100%沒有線性可分性(只要你足夠幸運地以每個測試子集線性可分的方式分割數據)。

二是全部關閉正規化。 SVM中的「C」使其「不難」,硬SVM等同於C =無窮大的SVM,因此將C = 100000設置爲至少具有相當的分離概率。這同樣適用於sklearn中的邏輯迴歸,它也有一個超參數C,將其設置爲1000000(基本上任何值都是巨大的),然後重新訓練。

+0

感謝您的回答@lejlot。對你來說一個簡短的問題(或者因爲我不是這方面的專家,可能是一個愚蠢的問題):爲什麼我的數據是一維的?我有128個功能輸入。會在我的數據維度中考慮嗎? – tafteh

+0

我校正的輸入要素的大小,X將其錯誤地報告: 「X是(10000,128)的矩陣和輸出/目標/類是(10000,10)...」 這對子級變更回答與否? – tafteh

+0

這隻會改變最後一點,沒有別的(現在我已經刪除,因爲更新後它不再適用)。 – lejlot

相關問題