7

Mam dwa modele RandomForestClassifier i chciałbym połączyć je w jeden model meta. Oboje przeszli szkolenie z wykorzystaniem podobnych, ale różnych danych. Jak mogę to zrobić?Łączenie losowych modeli lasu w scikit nauczyć się

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

Chcę utworzyć big_rf ze wszystkich drzew połączone w jeden model 500 drzew

Odpowiedz

14

wierzę, jest to możliwe poprzez modyfikację estimators_ i n_estimators atrybutów obiektu RandomForestClassifier. Każde drzewo w lesie jest przechowywane jako obiekt DecisionTreeClassifier, a lista tych drzew jest przechowywana w atrybucie estimators_. Aby upewnić się, że nie ma przerwy, należy zmienić liczbę estymatorów w n_estimators.

Zaletą tej metody jest to, że można zbudować kilka małych lasów równolegle na wielu maszynach i połączyć je.

Oto przykład wykorzystując dane tęczówki Zestaw:

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) 
+0

Czy istnieje sposób uogólnić to do korzystania z innych modeli - regresji logistycznej, Guasian NB, SVM – Merlin

+0

@mgoldwasser hi, ja po prostu czytać cię odpowiedź i mam bardziej ogólne pytanie. Czy mogę korzystać z funkcji, które nie mają tej samej długości? Czy na przykład jedna może mieć 300 próbek, a druga 200? Przykro nam z tego tematu, ale czytając odpowiedź, myślę, aby zbudować las dla każdej funkcji. – DimKoim

+0

@DimKoim Myślę, że to zadziała – mgoldwasser

4

Oprócz @mgoldwasser rozwiązanie jest alternatywą do korzystania z warm_start podczas treningu las. W scikit-learn 0,16-dev, można wykonać następujące czynności:

# 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) 
+2

warm_start nie wydaje się działać, gdy dwa zestawy danych mają różne numery etykiet. Na przykład, jeśli masz (x1, y1), gdzie y1 może przyjmować 3 etykiety, a następnie (x2, y2), gdzie y2 może przyjmować dodatkową etykietę, trening z funkcją warm_start kończy się niepowodzeniem. Zamiana kolejności wokół nadal powoduje błąd. – user929404