2016-12-12 70 views
1

我使用梯度提升決策樹作爲分類器實現了一個模型,並繪製了訓練集和測試集的學習曲線,以決定下一步該做什麼以便改進我的模型。 結果是作爲圖像:(Y軸是精度正確預測的(百分比),而x軸是樣品我使用訓練模型的數量)學習曲線(高偏差/高方差)爲什麼測試學習曲線變得平坦

enter image description here

據我所知,間隙訓練和測試之間的分數可能是由於高方差(過度擬合)。但圖片還顯示,測試分數(綠線)增加很少,而樣本數量從2000增加到3000.測試分數曲線變得平緩。即使有更多的樣本,模型也沒有變好。

我的理解是平坦的學習曲線通常表示高偏差(不足)。這種模型中是否有可能發生不足配合和過度配合?還是有平坦曲線的另一種解釋?

任何幫助,將不勝感激。提前致謝。

=====================================

我使用的代碼是如下。基本我使用相同的代碼示例sklearn document

def plot_learning_curve(estimator, title, X, y, ylim=None, cv=None, 
        n_jobs=1, train_sizes=np.linspace(.1, 1.0, 5)): 
    plt.figure() 
    plt.title(title) 
    if ylim is not None: 
     plt.ylim(*ylim) 
    plt.xlabel("Training examples") 
    plt.ylabel("Score") 
    train_sizes, train_scores, test_scores = learning_curve(
     estimator, X, y, cv=cv, n_jobs=n_jobs, train_sizes=train_sizes) 
    train_scores_mean = np.mean(train_scores, axis=1) 
    train_scores_std = np.std(train_scores, axis=1) 
    test_scores_mean = np.mean(test_scores, axis=1) 
    test_scores_std = np.std(test_scores, axis=1) 
    plt.grid() 

    plt.fill_between(train_sizes, train_scores_mean - train_scores_std, 
        train_scores_mean + train_scores_std, alpha=0.1, 
        color="r") 
    plt.fill_between(train_sizes, test_scores_mean - test_scores_std, 
        test_scores_mean + test_scores_std, alpha=0.1, color="g") 
    plt.plot(train_sizes, train_scores_mean, 'o-', color="r", 
      label="Training score") 
    plt.plot(train_sizes, test_scores_mean, 'o-', color="g", 
      label="Cross-validation score") 

    plt.legend(loc="best") 
    return plt 

title = "Learning Curves (GBDT)" 
# Cross validation with 100 iterations to get smoother mean test and train 
# score curves, each time with 20% data randomly selected as a validation set. 
cv = ShuffleSplit(n_splits=100, test_size=0.2, random_state=0) 

estimator = GradientBoostingClassifier(n_estimators=450) 
X,y= features, target #features and target are already loaded 
plot_learning_curve(estimator, title, X, y, ylim=(0.6, 1.01), cv=cv, n_jobs=4) 

plt.show() 

回答

-1

你應該更加註意你的訓練精度。如果在訓練過程中發生故障,你做了一些非常錯誤的事情。再次檢查數據的正確性(標籤是否正確?)和您的模型。

通常情況下,火車和測試的準確性應該會提高,但測試的準確性在後面。

+0

在學習曲線中(x軸是提供的訓練數樣品),預計精度隨着更多的樣品而下降。 –

+0

這傢伙從一開始就有100%左右的準確率,隨着樣本數量從500增加到1K,這個數字下降了。如果這是預期的 - 我不知道該說些什麼...... –

+0

沒錯。對於學習曲線,任何不以100%準確度開始並且下降的事件表明存在問題 –

0

首先,當您添加更多示例時,您的訓練精度會降低很多。所以這仍然可能是高差異。但是,我懷疑這是差距似乎太大的唯一解釋。

培訓準確性和測試準確性之間存在差距的原因可能是培訓樣本和測試樣本的不同分佈。然而,通過交叉驗證,不應該發生這種情況(您是否進行了k次交叉驗證,您在哪裏重新訓練了每次k次摺疊?)

+0

我使用了shufflesplit交叉驗證(testsize = 0.2)作爲我剛添加的代碼。如果您能指出該方法是否存在錯誤,我將非常感激 –