2014-09-18 4 views
8

Hauptfrage: Wie kombiniere ich verschiedene randomForest in Python und Scikit-lernen?parallele Generierung von zufälligen Wäldern mit scikit-learn

Ich verwende derzeit das randomForest-Paket in R, um Randomforest-Objekte mithilfe von Elastic Map Reduce zu generieren. Dies soll ein Klassifizierungsproblem beheben.

Da meine Eingabedaten zu groß sind, um in den Speicher auf einer Maschine zu passen, sample ich die Daten in kleinere Datensätze und erzeuge zufällige Gesamtstrukturobjekte, die eine kleinere Gruppe von Bäumen enthalten. Ich kombiniere dann die verschiedenen Bäume miteinander unter Verwendung einer modifizierten Kombinationsfunktion, um ein neues zufälliges Waldobjekt zu erzeugen. Dieses zufällige Gesamtstrukturobjekt enthält die Feature-Wichtigkeit und den endgültigen Satz von Bäumen. Dies beinhaltet nicht die oob Fehler oder Stimmen der Bäume.

Während dies in R gut funktioniert, möchte ich in Python mit scikit-learn dasselbe tun. Ich kann verschiedene zufällige Waldobjekte erstellen, aber ich habe keine Möglichkeit, sie zu einem neuen Objekt zu kombinieren. Kann mir jemand auf eine Funktion hinweisen, die die Wälder kombinieren kann? Ist das mit scikit-learn möglich?

Hier ist der Link zu einer Frage zu diesem Prozess in R: Combining random forests built with different training sets in R.

Bearbeiten: Das resultierende zufällige Gesamtstrukturobjekt sollte die Bäume enthalten, die für die Vorhersage und auch für die Merkmalsbedeutung verwendet werden können.

Jede Hilfe wäre willkommen.

+1

Wenn das Ziel Vorhersage gibt es dann keine Notwendigkeit, verschiedene Modelle kombinieren. Sie können die Vorausberechnung durch separate Modelle vornehmen und dann nur die Ergebnisse kombinieren. – DrDom

+0

Vereinbaren Sie mit @DrDom, es gibt viele Möglichkeiten zum Ensemble-Modelle. Details darüber, wie Sie es tun möchten, sind ziemlich wichtig. – David

+0

@DrDom Ich stimme zu, dass, wenn es nur Vorhersagen waren, ich die Ergebnisse kombinieren kann. Aber ich interessiere mich nicht nur für Vorhersagen, sondern auch für die variable Bedeutung der Features. – reddy

Antwort

8

Sicher, aggregieren einfach alle Bäume, zum Beispiel Blick von pyrallel in diesem Snippet haben: Ein Beispiel dieser Veranschaulichung kann unten gefunden werden

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

Danke für die Info. Ich werde das ausprobieren. Übrigens wird das final_sensemble in diesem Fall ein zufälliges Forest-Objekt sein und wie wird das Attribut feature_importances_ in diesem Prozess behandelt. – reddy

+0

Dies ist eine Python-Eigenschaft: Sie wird beim Zugriff automatisch neu berechnet: https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/ensemble/forest.py#L277 – ogrisel

+0

Großartig. Danke, das ist was ich wollte. – reddy

2

Basierend auf Ihrer Bearbeitung klingt es so, als wollten Sie nur herausfinden, wie Sie die Wichtigkeit eines Features extrahieren und sich die einzelnen Bäume ansehen, die in einer zufälligen Gesamtstruktur verwendet werden. Wenn dies der Fall ist, sind beide Attribute Ihres zufälligen Gesamtstrukturmodells mit dem Namen "feature_importances_" bzw. "estimators_".

>>> 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')]