2015-05-21 23 views
9

20 sütunlu bir matrisim var. Son sütun 0/1 etiketlerdir.sklearn.cross_validation içinde train_test_split ve cross_val_score kullanımı arasındaki fark

Veriler, here numaralı bağlantıdır.

Veri kümesinde çapraz doğrulama kullanarak rasgele ormanı çalıştırmaya çalışıyorum. Ben farklı sonuçlar alıyorum sklearn.cross_validation.train_test_split

kullanılarak sklearn.cross_validation.cross_val_score

  • kullanılarak

    1. Ben hemen hemen aynı kesin bir şey olduğunu düşünüyorum ne zaman: Ben Bunu yapmanın iki yöntem kullanabilirsiniz. Örnek vermek gerekirse, yukarıdaki kodda olduğu gibi yukarıdaki iki yöntemi kullanarak iki kat çapraz doğrulama yapıyorum.

      import csv 
      import numpy as np 
      import pandas as pd 
      from sklearn import ensemble 
      from sklearn.metrics import roc_auc_score 
      from sklearn.cross_validation import train_test_split 
      from sklearn.cross_validation import cross_val_score 
      
      #read in the data 
      data = pd.read_csv('data_so.csv', header=None) 
      X = data.iloc[:,0:18] 
      y = data.iloc[:,19] 
      
      depth = 5 
      maxFeat = 3 
      
      result = cross_val_score(ensemble.RandomForestClassifier(n_estimators=1000, max_depth=depth, max_features=maxFeat, oob_score=False), X, y, scoring='roc_auc', cv=2) 
      
      result 
      # result is now something like array([ 0.66773295, 0.58824739]) 
      
      xtrain, xtest, ytrain, ytest = train_test_split(X, y, test_size=0.50) 
      
      RFModel = ensemble.RandomForestClassifier(n_estimators=1000, max_depth=depth, max_features=maxFeat, oob_score=False) 
      RFModel.fit(xtrain,ytrain) 
      prediction = RFModel.predict_proba(xtest) 
      auc = roc_auc_score(ytest, prediction[:,1:2]) 
      print auc #something like 0.83 
      
      RFModel.fit(xtest,ytest) 
      prediction = RFModel.predict_proba(xtrain) 
      auc = roc_auc_score(ytrain, prediction[:,1:2]) 
      print auc #also something like 0.83 
      

      Sorum şu:

      neden ben train_test_split kullandığınızda yani, neden daha yüksek AUC (metrik kullanıyorum) olduğu, farklı sonuçlar alıyorum?

      Not: Daha kıvrımlar kullanırken (10 kıvrımlar diyelim), ilk hesaplama bana her zaman en yüksek AUC vererek, benim sonuçlarında desen çeşit olduğu görülmektedir. Yukarıdaki örnekte iki katlı çapraz doğrulamanın durumunda, ilk AUC her zaman ikinci olandan daha yüksektir; Her zaman 0.70 ve 0.58 gibi bir şey.

      Yardımlarınız için teşekkürler!

  • +0

    , başlangıçta verilerinizi randomize edilir mi? Doğru hatırlamıyorsam, iki yöntemden biri veya her ikisi de verileri rastgele ayırma olmaksızın ayırmaya yarar. Bahsettiğiniz "örüntüyü" açıklayabilir, ancak muhtemelen ilk genel sonuçla daha zayıf olan sonuçları açıklayamasa da (başlangıçta) – KCzar

    +0

    Hayır, veriler başlangıçta randomize edilmez. Sonuçların, cross_val_score'da neden aynı kalıbı sergilemesinin iyi bir açıklaması gibi görünmektedir. Benim durumumdaki cross_val_score'un tek rastgele parçası sanırım rastgeleForestClassifier'ın ağaçlarındaki özellikleri seçmek için algoritmasında bazı rastgeleliklere sahip olması.Bunun dışında, sadece ilk siparişe göre verileri n katına bölerse, belki de sorun budur. Uyandığımda birkaç saat içinde kontrol edeceğim, buradaki gecenin ortası! – evianpring

    +0

    yüzden, evet, bu görev: p = np.random.permutation (len (y)) Sonuç = cross_val_score (ensemble.RandomForestClassifier (n_estimators = 1000, MAX_DEPTH = 5, max_features = 3, oob_score = False), X- [p], y [p], puanlama = 'roc_auc', cv = 2) – evianpring

    cevap

    12

    cross_val_score kullanırken, sık sık bir KFolds veya StratifiedKFolds yineleyici kullanmak isteyeceksiniz:

    http://scikit-learn.org/0.10/modules/cross_validation.html#computing-cross-validated-metrics

    Varsayılan olarak

    http://scikit-learn.org/0.10/modules/generated/sklearn.cross_validation.KFold.html#sklearn.cross_validation.KFold

    , cross_val_score garip sonuçlar üretebilir, hangi veri rastgele olmaz Eğer böyle bir veri ile başlamak için rastgele değilse. Eğer tanımladığı gibi

    http://scikit-learn.org/stable/modules/generated/sklearn.cross_validation.train_test_split.html

    Desenler genellikle sonucudur:

    http://scikit-learn.org/stable/modules/generated/sklearn.cross_validation.KFold.html

    Yani yapar train_test_split, varsayılan olarak rastgele kapsamaz:

    KFolds yineleyici rastgele devlet parametresi vardır Tren/test setindeki rastlantısallık eksikliğinden.

    +0

    ** tren_test_split ** ile ilgili bir sorum var. Yukarıdaki kodda xtrain, xtest, ytrain, ytest = train_test_split (X, y, test_size = 0.50) ', algoritma, xtrain, xtest gibi parametrelere hangi değerin girilmesi gerektiğini bilir? Xtrain'in, veri kümesinin bağımsız değişkenlerini _training sonucunu içermesi gerektiğini ve xtest'e benzer olduğunu nereden biliyor. Değişkenin 'tren' veya 'test' içerdiğini düşünmüyorum. Bu mu? Yardım ettiğin için teşekkür ederim. –