2014-09-18 23 views
8

Ana soru: Python ve scikit-learn'deki farklı randomForestleri nasıl birleştiririm?scikit-learn kullanarak rasgele ormanların paralel üretimi

Halihazırda, esnek harita azaltma özelliğini kullanarak rastgele en hızlı nesneler oluşturmak için R içindeki randomForest paketini kullanıyorum. Bu bir sınıflandırma problemini ele almaktır.

Giriş verilerim bir makinede belleğe sığamayacak kadar büyük olduğundan, verileri daha küçük veri kümelerine örnekleyerek daha küçük bir ağaç kümesi içeren rasgele orman nesnesi oluşturuyorum. Sonra yeni bir rasgele orman nesnesi oluşturmak için değiştirilmiş bir birleştirme işlevi kullanarak farklı ağaçları birleştiririm. Bu rastgele orman nesnesi, özellik önemini ve ağaçların son kümesini içerir. Bu, oob hataları veya ağaçların oylarını içermez.

Bu, R'de iyi bir performans gösterirken, scikit-learn kullanarak Python'da da aynı şeyi yapmak istiyorum. Farklı rastgele orman nesneleri oluşturabilirim, ancak yeni bir nesne oluşturmak için bunları birleştirmenin bir yolu yok. Herkes beni ormanları birleştirebilecek bir işleve işaret edebilir mi? Bu scikit-learn kullanarak mümkün mü?

Bu işlemde, R: Combining random forests built with different training sets in R numaralı makalede anlatılan bir soruyu içeren bir bağlantı bulunmaktadır.

Düzenleme: Oluşan rasgele orman nesnesi, tahmin için kullanılabilecek ağaçları ve ayrıca özelliği önemle içermelidir.

Herhangi bir yardım için teşekkür ederiz.

+1

ise o zaman hiçbir zorunluluk yoktur Farklı modelleri birleştirmek için. Ayrı modellerle ön denetim yapabilir ve daha sonra sonuçları birleştirebilirsiniz. – DrDom

+0

@DrDom ile katılıyorum, modellerin bir araya getirilmesinin birçok yolu vardır. Nasıl yapmak istediğinize dair detaylar oldukça önemlidir. – David

+0

@DrDom Sadece tahminler olsaydı sonuçları birleştirebileceğimi kabul ediyorum. Ancak, sadece tahminler değil, aynı zamanda özelliklerin değişken önemi ile ilgileniyorum. – reddy

cevap

8

Emin pyrallel bu pasajı durumuna bakalım örneği için, sadece, bütün ağaçları bir araya toplar: Amaç tahmindir

def combine(all_ensembles): 
    """Combine the sub-estimators of a group of ensembles 

     >>> from sklearn.datasets import load_iris 
     >>> from sklearn.ensemble import ExtraTreesClassifier 
     >>> iris = load_iris() 
     >>> X, y = iris.data, iris.target 

     >>> all_ensembles = [ExtraTreesClassifier(n_estimators=4).fit(X, y) 
     ...     for i in range(3)] 
     >>> big = combine(all_ensembles) 
     >>> len(big.estimators_) 
     12 
     >>> big.n_estimators 
     12 
     >>> big.score(X, y) 
     1.0 

    """ 
    final_ensemble = copy(all_ensembles[0]) 
    final_ensemble.estimators_ = [] 

    for ensemble in all_ensembles: 
     final_ensemble.estimators_ += ensemble.estimators_ 

    # Required in old versions of sklearn 
    final_ensemble.n_estimators = len(final_ensemble.estimators_) 

    return final_ensemble 
+0

Bilgi için teşekkürler. Bunu deneyeceğim. Bu arada, final_ensemble rasgele bir orman nesnesi olacak (bu durumda) ve bu süreçte feature_importances_ özniteliği nasıl ele alınacaktır. – reddy

+0

Bu bir Python özelliğidir: erişimden sonra otomatik olarak yeniden hesaplanacaktır: https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/ensemble/forest.py#L277 – ogrisel

+0

Harika. Teşekkürler, istediğim bu. – reddy

2

Düzenlemenize dayanarak, yalnızca özellik öneminin nasıl çıkarılacağını ve rasgele bir ormanda kullanılan ağaçlara nasıl bakılacağını soruyorsunuz gibi geliyor. Eğer öyleyse, her ikisi de rasgele orman modelinizin "feature_importances_" ve "estimators_" adındaki özellikleridir. Bu gösteren bir örnek aşağıda bulabilirsiniz:

>>> from sklearn.ensemble import RandomForestClassifier 
>>> from sklearn.datasets import make_blobs 
>>> X, y = make_blobs(n_samples=10000, n_features=10, centers=100,random_state=0) 
>>> clf = RandomForestClassifier(n_estimators=5, max_depth=None, min_samples_split=1, random_state=0) 
>>> clf.fit(X,y) 
RandomForestClassifier(bootstrap=True, compute_importances=None, 
      criterion='gini', max_depth=None, max_features='auto', 
      min_density=None, min_samples_leaf=1, min_samples_split=1, 
      n_estimators=5, n_jobs=1, oob_score=False, random_state=0, 
      verbose=0) 
>>> clf.feature_importances_ 
array([ 0.09396245, 0.07052027, 0.09951226, 0.09095071, 0.08926362, 
     0.112209 , 0.09137607, 0.11771107, 0.11297425, 0.1215203 ]) 
>>> clf.estimators_ 
[DecisionTreeClassifier(compute_importances=None, criterion='gini', 
      max_depth=None, max_features='auto', min_density=None, 
      min_samples_leaf=1, min_samples_split=1, 
      random_state=<mtrand.RandomState object at 0x2b6f62d9b408>, 
      splitter='best'), DecisionTreeClassifier(compute_importances=None, criterion='gini', 
      max_depth=None, max_features='auto', min_density=None, 
      min_samples_leaf=1, min_samples_split=1, 
      random_state=<mtrand.RandomState object at 0x2b6f62d9b3f0>, 
      splitter='best'), DecisionTreeClassifier(compute_importances=None, criterion='gini', 
      max_depth=None, max_features='auto', min_density=None, 
      min_samples_leaf=1, min_samples_split=1, 
      random_state=<mtrand.RandomState object at 0x2b6f62d9b420>, 
      splitter='best'), DecisionTreeClassifier(compute_importances=None, criterion='gini', 
      max_depth=None, max_features='auto', min_density=None, 
      min_samples_leaf=1, min_samples_split=1, 
      random_state=<mtrand.RandomState object at 0x2b6f62d9b438>, 
      splitter='best'), DecisionTreeClassifier(compute_importances=None, criterion='gini', 
      max_depth=None, max_features='auto', min_density=None, 
      min_samples_leaf=1, min_samples_split=1, 
      random_state=<mtrand.RandomState object at 0x2b6f62d9b450>, 
      splitter='best')]