2016-09-19 61 views
-2

我有一個數據集,其中包含1000個點,每個點有2個輸入和1個輸出。它已被分爲80%的培訓和20%的測試目的。我正在使用sklearn支持向量迴歸器來訓練它。訓練集的準確率達到了100%,但測試集的結果並不理想。我認爲這可能是因爲過度配合。請你能建議我解決問題。Sklearn過度擬合

+0

是否有任何理由SVR的選擇呢? – LouisBBBB

+0

這是因爲它有各種數量的內核,可以用來適當地適應非線性數據。 –

+0

機器學習算法背後的主要思想是創建非線性模型。 SVR收斂速度很慢。 SVR有很多內核,每一個都有不同的參數,這使得它更慢(因爲你沒有真正的選擇,只能做一個網格搜索,測試所有參數組合)。這就是爲什麼我問你這個選擇背後的想法。 – LouisBBBB

回答

2

您可能是對的:如果您的模型在訓練數據上得分非常高,但對測試數據表現不佳,通常是過度擬合的症狀。你需要在不同的情況下重新訓練你的模型。我假設你正在使用sklearn提供的train_test_split,或者類似的機制來保證你的分裂是公平和隨機的。因此,您需要調整SVR的超參數並創建多個模型,並查看哪個模型在您的測試數據上表現最佳。

如果您看一下SVR文檔,您會發現它可以使用多個輸入參數啓動,每個輸入參數可以設置爲多個不同的值。爲簡單起見,讓我們假設你只處理兩個你想要調整的參數:'kernel'和'C',同時保持第三個參數'degree'爲4.你正在考慮'rbf'和'linear'內核和0.1,1,10 C.一個簡單的解決辦法是這樣的:

for kernel in ('rbf', 'linear'): 
    for c in (0.1, 1, 10): 
     svr = SVR(kernel=kernel, C=c, degree=4) 
     svr.fit(train_features, train_target) 
     score = svr.score(test_features, test_target) 
     print kernel, c, score 

這樣一來,就可以產生6款車型,看看哪些參數導致的最好成績,這將是選擇的最佳模式,給出這些參數。

更簡單的方法是讓sklearn做大部分的工作適合你的,使用GridSearchCV(或RandomizedSearchCV):

parameters = {'kernel':('linear', 'rbf'), 'C':(0.1, 1, 10)} 
clf = GridSearchCV(SVC(degree=4), parameters) 
clf.fit(train_features, train_target) 
print clf.best_score_ 
print clf.best_params_ 
model = clf.best_estimator_ # This is your model 

我一個小工具的工作使用sklearn的小項目,以簡化和使其成爲配置yaml文件的一個問題,並讓該工具爲您完成所有工作。它在我的github帳戶中可用。你可能想看一看,看看它是否有幫助。

最後,您的數據可能不是線性的。在這種情況下,您可能想嘗試使用類似PolynomialFeatures的東西來生成基於現有非線性特徵的新非線性特徵,並查看它是否可以提高模型質量。

1

嘗試使用訓練數據拆分Sklearn K-Fold交叉驗證,這將爲您提供公平的數據拆分和更好的模型,儘管以性能爲代價,這對小數據集和優先級應該很重要是準確的。

1

一些提示:

  • 因爲你只有兩個輸入,它會如果你繪製你的數據是巨大的。嘗試使用alpha = 0.3的散點圖或熱圖。
  • 嘗試GridSearchCV,如@shahins所述。
    • 特別是,爲C參數嘗試不同的值。正如在docs中所提到的,如果你有很多噪音觀察,你應該減少它。它對應於更多的預測。
    • 如果時間太長,您也可以嘗試RandomizedSearchCV
    • 作爲@shahins回答(我不允許添加註釋)的一個注意事項,兩種實現方式都不相同。 GridSearchCV更好,因爲它在用於調整超參數的訓練集中執行交叉驗證。不要使用測試集來調整超參數!
  • 不要忘了擴展您的數據