【问题标题】:Sequentially fitting Random Forest sklearn顺序拟合随机森林sklearn
【发布时间】:2017-04-28 13:53:48
【问题描述】:

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

我的一个想法是在连续的小批量数据集上训练分类器,因此最终训练整个事物,但每次都提高分类器的拟合度。这是一个可行的想法吗?每次运行时拟合是否会覆盖上次拟合?

【问题讨论】:

  • 您是否尝试将图像大小调整为较低的分辨率,即大幅减少每张图像的像素数?
  • 是的,我正在将图像从原始分辨率降低到 100x100 像素。
  • 我研究了一个类似的问题,即 RF 作用于图像补丁(大量图像)。我在所有图像补丁的引导样本上分别构建了树(基本上我可以放入内存+空间来创建模型)。安装好后,我腌制了每棵树。我有一个只适合一棵树的脚本,以便释放内存(不适合单个脚本中的所有循环)。拟合所有树后,我通过手动加载树构建了 RF 模型。
  • @ChesterVonWinchester 确实看起来很耗时,但听起来像是一个很好的解决方法

标签: python machine-learning scikit-learn


【解决方案1】:

您可以使用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)

【讨论】:

  • 这很有帮助!如果我使用 warm_start,我可以设置 n_jobs=-1 来并行化拟合和预测吗?
  • 在一些文档中它指出:“将 warm_start 构造参数设置为 True 会禁用对并行集成的支持,但对于在训练期间跟踪 OOB 错误轨迹是必要的。”
猜你喜欢
  • 2017-05-14
  • 2016-03-01
  • 2021-02-08
  • 2020-03-26
  • 2016-07-23
  • 2017-08-11
  • 2019-04-11
  • 2014-09-04
  • 2019-03-14
相关资源
最近更新 更多