Combinando modelos de bosques al azar en scikit learn.

Tengo dos modelos de RandomForestClassifier, y me gustaría combinarlos en un metamodelo. Ambos fueron entrenados usando datos similares, pero diferentes. ¿Cómo puedo hacer esto?

rf1 #this is my first fitted RandomForestClassifier object, with 250 trees rf2 #this is my second fitted RandomForestClassifier object, also with 250 trees 

Quiero crear big_rf con todos los árboles combinados en un modelo de 500 árboles

Creo que esto es posible modificando los atributos estimators_ y n_estimators en el objeto RandomForestClassifier. Cada árbol en el bosque se almacena como un objeto DecisionTreeClassifier, y la lista de estos árboles se almacena en el atributo estimators_ . Para asegurarse de que no haya discontinuidad, también tiene sentido cambiar el número de estimadores en n_estimators .

La ventaja de este método es que puede construir un montón de pequeños bosques en paralelo en varias máquinas y combinarlas.

Aquí hay un ejemplo usando el conjunto de datos del iris:

 from sklearn.ensemble import RandomForestClassifier from sklearn.cross_validation import train_test_split from sklearn.datasets import load_iris def generate_rf(X_train, y_train, X_test, y_test): rf = RandomForestClassifier(n_estimators=5, min_samples_leaf=3) rf.fit(X_train, y_train) print "rf score ", rf.score(X_test, y_test) return rf def combine_rfs(rf_a, rf_b): rf_a.estimators_ += rf_b.estimators_ rf_a.n_estimators = len(rf_a.estimators_) return rf_a iris = load_iris() X, y = iris.data[:, [0,1,2]], iris.target X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.33) # in the line below, we create 10 random forest classifier models rfs = [generate_rf(X_train, y_train, X_test, y_test) for i in xrange(10)] # in this step below, we combine the list of random forest models into one giant model rf_combined = reduce(combine_rfs, rfs) # the combined model scores better than *most* of the component models print "rf combined score", rf_combined.score(X_test, y_test) 

Además de la solución @mgoldwasser, una alternativa es hacer uso de warm_start al entrenar su bosque. En Scikit-Learn 0.16-dev, ahora puede hacer lo siguiente:

 # First build 100 trees on X1, y1 clf = RandomForestClassifier(n_estimators=100, warm_start=True) clf.fit(X1, y1) # Build 100 additional trees on X2, y2 clf.set_params(n_estimators=200) clf.fit(X2, y2)