class_docstr: Boosting method that uses a number of weak classifiers in 
  ensemble to make a strong classifier. This implementation uses decision
  stumps, which is a one level Decision Tree. 
  
  Parameters:
  -----------
  n_clf: int
      The number of weak classifiers that will be used. 
code: def predict(self, X):
      n_samples = np.shape(X)[0]
      y_pred = np.zeros((n_samples, 1))
      # For each classifier => label the samples
      for clf in self.clfs:
          # Set all predictions to '1' initially
          predictions = np.ones(np.shape(y_pred))
          # The indexes where the sample values are below threshold
          negative_idx = (
              clf.polarity * X[:, clf.feature_index]
              < clf.polarity * clf.threshold
          )
          # Label those as '-1'
          predictions[negative_idx] = -1
          # Add predictions weighted by the classifiers alpha
          # (alpha indicative of classifier's proficiency)
          y_pred += clf.alpha * predictions
  
      # Return sign of prediction sum
      y_pred = np.sign(y_pred).flatten()
  
      return y_pred
  
file_path: ML-From-Scratch/mlfromscratch/supervised_learning/adaboost.py
imports: from __future__ import division, print_function
  import numpy
  import math
  from sklearn import datasets
  import matplotlib.pyplot
  import pandas
  from mlfromscratch.utils import train_test_split, accuracy_score, Plot
label_desc: Use image node_id 3 for calling the Adaboost obj's underlying member method code with example usage: obj.predict(X) and returns: y_pred