class_docstr: Random Forest classifier. Uses a collection of classification trees that
  trains on random subsets of the data using a random subsets of the features.
  
  Parameters:
  -----------
  n_estimators: int
      The number of classification trees that are used.
  max_features: int
      The maximum number of features that the classification trees are allowed to
      use.
  min_samples_split: int
      The minimum number of samples needed to make a split when building a tree.
  min_gain: float
      The minimum impurity required to split the tree further. 
  max_depth: int
      The maximum depth of a tree.
code: def fit(self, X, y):
      n_features = np.shape(X)[1]
      # If max_features have not been defined => select it as
      # sqrt(n_features)
      if not self.max_features:
          self.max_features = int(math.sqrt(n_features))
  
      # Choose one random subset of the data for each tree
      subsets = get_random_subsets(X, y, self.n_estimators)
  
      for i in self.progressbar(range(self.n_estimators)):
          X_subset, y_subset = subsets[i]
          # Feature bagging (select random subsets of the features)
          idx = np.random.choice(
              range(n_features), size=self.max_features, replace=True
          )
          # Save the indices of the features for prediction
          self.trees[i].feature_indices = idx
          # Choose the features corresponding to the indices
          X_subset = X_subset[:, idx]
          # Fit the tree to the data
          self.trees[i].fit(X_subset, y_subset)
  
file_path: ML-From-Scratch/mlfromscratch/supervised_learning/random_forest.py
imports: from __future__ import division, print_function
  import numpy
  import math
  import progressbar
  from mlfromscratch.utils import divide_on_feature, train_test_split, get_random_subsets, normalize
  from mlfromscratch.utils import accuracy_score, calculate_entropy
  from mlfromscratch.unsupervised_learning import PCA
  from mlfromscratch.supervised_learning import ClassificationTree
  from mlfromscratch.utils.misc import bar_widgets
  from mlfromscratch.utils import Plot
label_desc: Use image node_id 2 for calling the RandomForest obj's underlying member method code with example usage: obj.fit(X, y) without return types