首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >组合随机森林树时的意外异常

组合随机森林树时的意外异常
EN

Stack Overflow用户
提问于 2015-07-10 17:54:37
回答 1查看 431关注 0票数 3

使用这个问题Combining random forest models in scikit learn中描述的信息,我尝试使用python2.7.10和sklearn 0.16.1将几个随机森林分类器组合成一个单一的分类器,但在某些情况下得到这个异常:

代码语言:javascript
复制
    Traceback (most recent call last):
      File "sktest.py", line 50, in <module>
        predict(rf)
      File "sktest.py", line 46, in predict
        Y = rf.predict(X)
      File "/python-2.7.10/lib/python2.7/site-packages/sklearn/ensemble/forest.py", line 462, in predict
        proba = self.predict_proba(X)
      File "/python-2.7.10/lib/python2.7/site-packages/sklearn/ensemble/forest.py", line 520, in predict_proba
        proba += all_proba[j]
    ValueError: non-broadcastable output operand with shape (39,1) doesn't match the broadcast shape (39,2)

该应用程序将在多个处理器上创建多个随机森林分类器,并将这些对象组合成一个可供所有处理器使用的单一分类器。

产生此异常的测试代码如下所示,它创建了5个分类器,并具有10个特性的随机数组。如果将yfrac更改为0.5,代码将不会出现异常。这是一种组合分类器对象的有效方法吗?此外,当使用warm_start向现有的RandomForestClassifier添加树时,当n_estimators增加并通过fit添加数据时,也会创建同样的异常。

代码语言:javascript
复制
from sklearn.ensemble import RandomForestClassifier
from sklearn.cross_validation import train_test_split
from numpy import zeros,random,logical_or,where,array

random.seed(1) 

def generate_rf(X_train, y_train, X_test, y_test, numTrees=50):
  rf = RandomForestClassifier(n_estimators=numTrees, n_jobs=-1)
  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

def make_data(ndata, yfrac=0.5):
  nx = int(random.uniform(10,100))

  X = zeros((nx,ndata))
  Y = zeros(nx)

  for n in range(ndata):
    rnA = random.random()*10**(random.random()*5)
    X[:,n] = random.uniform(-rnA,rnA, nx)
    Y = logical_or(Y,where(X[:,n] > yfrac*rnA, 1.,0.))

  return X, Y

def train(ntrain=5, ndata=10, test_frac=0.2, yfrac=0.5):
  rfs = []
  for u in range(ntrain):
    X, Y = make_data(ndata, yfrac=yfrac)

    X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=test_frac)

    #Train the random forest and add to list
    rfs.append(generate_rf(X_train, Y_train, X_test, Y_test))

  # Combine the block classifiers into a single classifier
  return reduce(combine_rfs, rfs)

def predict(rf, ndata=10):
  X, Y = make_data(ndata)
  Y = rf.predict(X)

if __name__ == "__main__":
  rf = train(yfrac = 0.42)
  predict(rf)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-13 13:41:37

您的第一个RandomForest只得到肯定的情况,而其他的RandomForests则得到这两种情况。因此,它们的DecisionTree结果是不兼容的。使用以下替换的train()函数运行您的代码:

代码语言:javascript
复制
def train(ntrain=5, ndata=10, test_frac=0.2, yfrac=0.5):
  rfs = []
  for u in range(ntrain):
    X, Y = make_data(ndata, yfrac=yfrac)

    X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=test_frac)

    assert Y_train.sum() != 0
    assert Y_train.sum() != len( Y_train )
    #Train the random forest and add to list
    rfs.append(generate_rf(X_train, Y_train, X_test, Y_test))

  # Combine the block classifiers into a single classifier
  return reduce(combine_rfs, rfs)

使用StratifiedShuffleSplit交叉验证生成器而不是train_test_split,并检查以确保每个RF都获得培训集中的两个(所有)类。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31347273

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档