2016-12-13 108 views
3

我正在Python中使用sklearn在图像数据的语料库上训练随机森林分类器。因为我正在执行图像分割,所以我必须存储每个像素的数据,最终形成一个巨大的矩阵,例如100,000,000个长的数据点矩阵,因此当在该矩阵上运行RF分类器时,我的计算机出现内存溢出错误,并永远运行。顺序拟合随机森林sklearn

我的一个想法是在序列小批量数据集上训练分类器,因此最终要对整体进行训练,但每次都要改进分类器的匹配度。这是一个可以工作的想法吗?每次运行时,配合是否会覆盖最后一个配合?

+0

你尝试调整图像以较低的分辨率即大幅减少每个图像的像素数? – miranido

+0

是的,我正在将我的图像从原始分辨率降低到100x100像素。 –

+0

我工作过一个类似的问题,即射频对图像补丁(包含很多图像)起作用。我在所有图像补丁的引导样本上分别构建了这些树(基本上我可以将它们放入内存+创建模型的空间中)。装上后,我腌制每棵树。我有一个只适合单个树的脚本,以便释放内存(并不是所有内容都放在单个脚本的循环中)。通过手动加载树来装配我构建RF模型的所有树后。 –

回答

2

您可以使用warm_start为了预先计算树:

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

或者

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 

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.33) 
# Create 'n' random forests classifiers 
rf_clf = [generate_rf(X_train, y_train, X_test, y_test) for i in range(n)] 
# combine classifiers 
rf_clf_combined = reduce(combine_rfs, rfs) 
+0

这是有帮助的!如果我使用warm_start,我可以设置n_jobs = -1来平行拟合和预测吗? –

+0

在某些文档中指出:“将'warm_start'构造参数设置为'True'将禁用对并行集成的支持,但对于在训练过程中跟踪OOB错误轨迹是必需的。” –

+0

是的,谢谢你,你的回应是有帮助的! –