'Build a forest of trees from the training set (X, y).
Parameters
X : array-like or sparse matrix of shape = [n_samples, n_features]
The training input samples. Internally, its dtype will be converted to
``dtype=np.float32``. If a sparse matrix is provided, it will be
converted into a sparse ``csc_matrix``.
y : array-like, shape = [n_samples] or [n_samples, n_outputs]
The target values (class labels in classification, real numbers in
regression).
sample_weight : array-like, shape = [n_samples] or None
Sample weights. If None, then samples are equally weighted. Splits
that would create child nodes with net zero or negative weight are
ignored while searching for a split in each node. In the case of
classification, splits are also ignored if they would result in any
single class carrying a negative weight in either child node.
Returns
self : object
Returns self.'

def fit(self, X, y, sample_weight=None):

    X = check_array(X, accept_sparse='csc', dtype=DTYPE)
    y = check_array(y, accept_sparse='csc', ensure_2d=False, dtype=None)
    if (sample_weight is not None):
        sample_weight = check_array(sample_weight, ensure_2d=False)
    if issparse(X):
        X.sort_indices()
    (n_samples, self.n_features_) = X.shape
    y = np.atleast_1d(y)
    if ((y.ndim == 2) and (y.shape[1] == 1)):
        warn('A    column-vector    y    was    passed    when    a    1d    array    was    expected.    Please    change    the    shape    of    y    to    (n_samples,),    for    example    using    ravel().', DataConversionWarning, stacklevel=2)
    if (y.ndim == 1):
        y = np.reshape(y, ((-1), 1))
    self.n_outputs_ = y.shape[1]
    (y, expanded_class_weight) = self._validate_y_class_weight(y)
    if ((getattr(y, 'dtype', None) != DOUBLE) or (not y.flags.contiguous)):
        y = np.ascontiguousarray(y, dtype=DOUBLE)
    if (expanded_class_weight is not None):
        if (sample_weight is not None):
            sample_weight = (sample_weight * expanded_class_weight)
        else:
            sample_weight = expanded_class_weight
    self._validate_estimator()
    if ((not self.bootstrap) and self.oob_score):
        raise ValueError('Out    of    bag    estimation    only    available    if    bootstrap=True')
    random_state = check_random_state(self.random_state)
    if ((not self.warm_start) or (not hasattr(self, 'estimators_'))):
        self.estimators_ = []
    n_more_estimators = (self.n_estimators - len(self.estimators_))
    if (n_more_estimators < 0):
        raise ValueError(('n_estimators=%d    must    be    larger    or    equal    to    len(estimators_)=%d    when    warm_start==True' % (self.n_estimators, len(self.estimators_))))
    elif (n_more_estimators == 0):
        warn('Warm-start    fitting    without    increasing    n_estimators    does    not    fit    new    trees.')
    else:
        if (self.warm_start and (len(self.estimators_) > 0)):
            random_state.randint(MAX_INT, size=len(self.estimators_))
        trees = []
        for i in range(n_more_estimators):
            tree = self._make_estimator(append=False, random_state=random_state)
            trees.append(tree)
        trees = Parallel(n_jobs=self.n_jobs, verbose=self.verbose, backend='threading')((delayed(_parallel_build_trees)(t, self, X, y, sample_weight, i, len(trees), verbose=self.verbose, class_weight=self.class_weight) for (i, t) in enumerate(trees)))
        self.estimators_.extend(trees)
    if self.oob_score:
        self._set_oob_score(X, y)
    if (hasattr(self, 'classes_') and (self.n_outputs_ == 1)):
        self.n_classes_ = self.n_classes_[0]
        self.classes_ = self.classes_[0]
    return self
