2014-09-18 14 views
8

Domanda principale: Come combinare diversi randomPerest in python e scikit-learn?generazione parallela di foreste casuali utilizzando scikit-learn

Attualmente sto usando il pacchetto randomForest in R per generare oggetti randomforest utilizzando la riduzione della mappa elastica. Questo è per affrontare un problema di classificazione.

Poiché i dati di input sono troppo grandi per adattarsi alla memoria su una macchina, campionamento dei dati in serie di dati più piccoli e generazione di oggetti foresta casuali contenenti un insieme più piccolo di alberi. Quindi combinare insieme i diversi alberi utilizzando una funzione combinata modificata per creare un nuovo oggetto foresta casuale. Questo oggetto foresta casuale contiene l'importanza della funzione e il set finale di alberi. Questo non include gli errori oob o voti degli alberi.

Mentre questo funziona bene in R, voglio fare la stessa cosa in Python usando scikit-learn. Posso creare diversi oggetti foresta casuali, ma non ho modo di combinarli insieme per formare un nuovo oggetto. Qualcuno può indicarmi una funzione in grado di combinare le foreste? È possibile usare scikit-learn?

Ecco il collegamento a una domanda su come questo processo in R: Combining random forests built with different training sets in R.

Modifica: l'oggetto foresta casuale risultante deve contenere gli alberi che possono essere utilizzati per la previsione e anche l'importanza della funzione.

Qualsiasi aiuto sarebbe apprezzato.

+1

Se l'obiettivo è la previsione, allora non v'è alcuna necessità combinare diversi modelli. È possibile effettuare prediсtion da modelli separati e quindi combinare solo i risultati. – DrDom

+0

D'accordo con @DrDom, ci sono molti modi per creare modelli. I dettagli su come vuoi farlo sono piuttosto importanti. – David

+0

@DrDom Sono d'accordo che se si trattasse solo di previsioni, posso combinare i risultati. Ma mi interessano non solo le previsioni ma anche l'importanza variabile delle caratteristiche. – reddy

risposta

8

Certo, basta aggregare tutti gli alberi, per esempio hanno un'occhiata a questo frammento da pyrallel:

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

Grazie per le informazioni. Ci proverò. Tra l'altro, l'insieme finale sarà un oggetto foresta casuale (in questo caso) e come verrà gestito l'attributo feature_importances_ in questo processo. – reddy

+0

Questa è una proprietà Python: sarà automaticamente ricalcolata all'accesso: https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/ensemble/forest.py#L277 – ogrisel

+0

Grande. Grazie, questo è quello che volevo. – reddy

2

In base alla modifica, sembra che tu stia solo chiedendo come estrarre l'importanza della funzionalità e osservare i singoli alberi utilizzati in una foresta casuale. In tal caso, entrambi sono attributi rispettivamente del modello di foresta casuale denominato "feature_importances_" e "estimators_". Un esempio che illustra questo può essere trovata qui sotto:

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