2015-08-13 15 views
4

我有一套數據,我正在使用額外的樹分類器開發一個預測模型,如下面的代碼所示,在最初的一組代碼中顯示et_scores相當令人失望,我跑步看到下面更進一步,看起來更好,然後我做了一個學習圖表,事情看起來不太熱。總之很混亂。 初始代碼:解釋Scikit-Learn模型輸出,額外的樹分類器不同的措施

from sklearn.ensemble import ExtraTreesClassifier 
from sklearn.cross_validation import cross_val_score 
#split the dataset for train and test 
combnum['is_train'] = np.random.uniform(0, 1, len(combnum)) <= .75 
train, test = combnum[combnum['is_train']==True], combnum[combnum['is_train']==False] 

et = ExtraTreesClassifier(n_estimators=200, max_depth=None, min_samples_split=10, random_state=0) 

labels = train[list(label_columns)].values 
tlabels = test[list(label_columns)].values 

features = train[list(columns)].values 
tfeatures = test[list(columns)].values 

et_score = cross_val_score(et, features, labels.ravel(), n_jobs=-1) 
print("{0} -> ET: {1})".format(label_columns, et_score)) 

給我:

['Campaign_Response'] -> ET: [ 0.58746427 0.31725003 0.43522521]) 

沒有這麼熱! 然後我伸出數據:

et.fit(features,labels.ravel()) 
et.score(tfeatures,tlabels.ravel()) 
Out[16]:0.7434136771300448 

沒那麼糟 然後在訓練數據:

et.score(features,labels.ravel()) 
Out[17]:0.85246473144769563 

再次,不錯,但沒有關係,早期的比分? 然後運行:

from sklearn.learning_curve import validation_curve 


def plot_validation_curve(estimator, X, y, param_name, param_range, 
         ylim=(0, 1.1), cv=5, n_jobs=-1, scoring=None): 
    estimator_name = type(estimator).__name__ 
    plt.title("Validation curves for %s on %s" 
      % (param_name, estimator_name)) 
    plt.ylim(*ylim); plt.grid() 
    plt.xlim(min(param_range), max(param_range)) 
    plt.xlabel(param_name) 
    plt.ylabel("Score") 

    train_scores, test_scores = validation_curve(
     estimator, X, y, param_name, param_range, 
     cv=cv, n_jobs=n_jobs, scoring=scoring) 

    train_scores_mean = np.mean(train_scores, axis=1) 
    test_scores_mean = np.mean(test_scores, axis=1) 
    plt.semilogx(param_range, train_scores_mean, 'o-', color="r", 
      label="Training score") 
    plt.semilogx(param_range, test_scores_mean, 'o-', color="g", 
      label="Cross-validation score") 
    plt.legend(loc="best") 
    print("Best test score: {:.4f}".format(test_scores_mean[-1])) 

依次爲:

clf = ExtraTreesClassifier(max_depth=8) 
param_name = 'max_depth' 
param_range = [1, 2, 4, 8, 16, 32] 

plot_validation_curve(clf, features,labels.ravel(), 
        param_name, param_range, scoring='roc_auc') 

給我一個圖表和傳說似乎並不反映之前的信息:

Best test score: 0.3592 

Learning curve

和最後sklearn指標給我

Accuracy:0.737 

Classification report 
      precision recall f1-score support 

      0  0.76  0.79  0.78  8311 
      1  0.70  0.66  0.68  6134 

avg/total  0.74  0.74  0.74  14445 

在我看來,我應該能夠更好地解釋這個東西任何人都可以幫忙嗎?

回答

3

您在這裏體驗到的是不同的交叉驗證方法和分類器參數導致不同的分數。

在您的第一個實驗中,您將cross_val_score方法的結果與您自己的75%/ 25%隨機拆分進行比較。 cross_val_score方法使用K爲3的StratifiedKFold方法來確定摺疊。 StratifiedKFold或多或少地保留了數據的順序,而隨機分割則通過隨機採樣來去除數據中的任何自然順序。這可能解釋分數的差異,特別是當你的數據對自然順序有一定的依賴性時。例如,如果您的數據按時間戳排序,則數據的特徵可能隨時間而改變。當列車和測試集來自不同的時間段時,這會導致較差的分數,StratifiedKFold抽樣會出現這種情況。

在第二個實驗中,您使用分類器的默認參數和5倍的交叉驗證,這又導致了不同的結果。例如,默認情況下,ExtraTreeClassifier使用10個估計器,但在第一個實驗中,您使用了200個估計器 - 並且您改變了max_depth參數。對於解釋,max_depth參數決定了樹的複雜性,只有10棵樹被訓練,大量葉子會導致過度擬合,這正是您在驗證圖表中看到的效果。最好的測試分數實際上是0.6而不是0.315,你應該取最高分數而不是最後分數。

我希望這可以幫助解釋分數和理解差異。接下來的步驟我會檢查數據的順序,如果是暫時的,我會通過可視化對其進行調查。如果您希望最終還是希望預測的數據出現這種偏差,則不應使用隨機抽樣 - 如果您確信自己的訓練集反映了所有變化,則可以在測試之前對數據進行洗牌或設置將StratifiedKFold的參數洗牌爲true。對於分類器,我寧願從簡單的RandomForestClassifier開始,並在查看ExtraTrees之前將n_estimators設置爲100。

+0

非常有幫助,謝謝 – dartdog