class_docstr: A parent class for T-learner classifier classes.
class_docstr_tok: ["A","parent","class","for","T-learner","classifier","classes","."]
docstr: Predict treatment effects.
  
  Args:
      X (np.matrix or np.array or pd.Dataframe): a feature matrix
      treatment (np.array or pd.Series, optional): a treatment vector
      y (np.array or pd.Series, optional): an outcome vector
      verbose (bool, optional): whether to output progress logs
  Returns:
      (numpy.ndarray): Predictions of treatment effects.
docstr_tok: ["Predict","treatment","effects",".","Args",":","X","(","np.matrix","or","np.array","or","pd.Dataframe",")",":","a","feature","matrix","treatment","(","np.array","or","pd.Series",",","optional",")",":","a","treatment","vector","y","(","np.array","or","pd.Series",",","optional",")",":","an","outcome","vector","verbose","(","bool",",","optional",")",":","whether","to","output","progress","logs","Returns",":","(","numpy.ndarray",")",":","Predictions","of","treatment","effects","."]
code: def predict(
      self,
      X,
      treatment=None,
      y=None,
      p=None,
      return_components=False,
      verbose=True,
  ):
      """Predict treatment effects.
  
      Args:
          X (np.matrix or np.array or pd.Dataframe): a feature matrix
          treatment (np.array or pd.Series, optional): a treatment vector
          y (np.array or pd.Series, optional): an outcome vector
          verbose (bool, optional): whether to output progress logs
      Returns:
          (numpy.ndarray): Predictions of treatment effects.
      """
      yhat_cs = {}
      yhat_ts = {}
  
      for group in self.t_groups:
          model_c = self.models_c[group]
          model_t = self.models_t[group]
          yhat_cs[group] = model_c.predict_proba(X)[:, 1]
          yhat_ts[group] = model_t.predict_proba(X)[:, 1]
  
          if (y is not None) and (treatment is not None) and verbose:
              mask = (treatment == group) | (
                  treatment == self.control_name
              )
              treatment_filt = treatment[mask]
              y_filt = y[mask]
              w = (treatment_filt == group).astype(int)
  
              yhat = np.zeros_like(y_filt, dtype=float)
              yhat[w == 0] = yhat_cs[group][mask][w == 0]
              yhat[w == 1] = yhat_ts[group][mask][w == 1]
  
              logger.info("Error metrics for group {}".format(group))
              classification_metrics(y_filt, yhat, w)
  
      te = np.zeros((X.shape[0], self.t_groups.shape[0]))
      for i, group in enumerate(self.t_groups):
          te[:, i] = yhat_ts[group] - yhat_cs[group]
  
      if not return_components:
          return te
      else:
          return te, yhat_cs, yhat_ts
  
imports: from copy import deepcopy
  import logging
  import numpy
  from packaging import version
  from scipy.stats import norm
  import sklearn
  from sklearn.exceptions import ConvergenceWarning
  from sklearn.neural_network import MLPRegressor
  from tqdm import tqdm
  from xgboost import XGBRegressor
  from causalml.inference.meta.base import BaseLearner
  from causalml.inference.meta.utils import check_treatment_vector, convert_pd_to_np
  from causalml.metrics import regression_metrics, classification_metrics
label_desc: Use image node_id 2 for calling the BaseTClassifier obj's underlying member method code with example usage: obj.predict(X, treatment, y, p, return_components, verbose) and returns: te, te,  yhat_cs,  yhat_ts