7

У меня есть две модели RandomForestClassifier, и я хотел бы объединить их в одну метамоду. Оба они обучались с использованием похожих, но разных данных. Как я могу это сделать?Объединение случайных моделей леса в scikit learn

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

Я хочу создать big_rf со всеми деревьями, объединенных в один 500 дерева модели

ответ

14

Я считаю, что это возможно путем изменения атрибутов estimators_ и n_estimators на объекте RandomForestClassifier. Каждое дерево в лесу хранится как объект DecisionTreeClassifier, а список этих деревьев сохраняется в атрибуте estimators_. Чтобы убедиться, что нет разрыва, также имеет смысл изменить количество оценок в n_estimators.

Преимущество этого метода заключается в том, что вы можете построить кучу небольших лесов параллельно на нескольких машинах и объединить их.

Вот пример, используя данные диафрагмы набора:

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

Есть ли способ обобщить это использовать другие модели - логистическая регрессия, Guasian NB, SVM – Merlin

+0

@mgoldwasser привет, я только что прочитал вас ответ, и у меня есть более общий вопрос. Могу ли я использовать функции, которые не имеют одинаковой длины? Может, например, один из 300 образцов, а другой 200? Извините, вне темы, но, читая ваш ответ, я собираюсь создать лес для каждой функции. – DimKoim

+0

@DimKoim Я думаю, что работала бы – mgoldwasser

4

В дополнении к @mgoldwasser решения, альтернатива является использование в warm_start при обучении леса. В Scikit-Learn 0.16-DEV, теперь вы можете сделать следующее:

# 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, похоже, не работает, когда два набора данных имеют разные количества меток. Например, если у вас есть (x1, y1), где y1 может принимать три метки, а затем (x2, y2), где y2 может взять дополнительную метку, обучение с помощью warm_start не выполняется. При замене порядка все еще приводит к ошибке. – user929404

 Смежные вопросы

  • Нет связанных вопросов^_^