class_docstr: The `InformationFilter` transformer uses a variant of the
  [Gram-Schmidt process](https://en.wikipedia.org/wiki/Gram%E2%80%93Schmidt_process) to filter information out of the
  dataset.
  
  This can be useful if you want to filter information out of a dataset because of fairness.
  
  To explain how it works: given a training matrix $X$ that contains columns $x_1, ..., x_k$.
  If we assume columns $x_1$ and $x_2$ to be the _sensitive_ columns then the information-filter will remove
  information by applying these transformations:
  
  $$\begin{split}
     v_1 & = x_1 \\
     v_2 & = x_2 - \frac{x_2 v_1}{v_1 v_1} \\
     v_3 & = x_3 - \frac{x_k v_1}{v_1 v_1} - \frac{x_2 v_2}{v_2 v_2} \\
         & ... \\
     v_k & = x_k - \frac{x_k v_1}{v_1 v_1} - \frac{x_2 v_2}{v_2 v_2}
     \end{split}$$
  
  Concatenating our vectors (but removing the sensitive ones) gives us a new training matrix
  
  $$X_{fair} = [v_3, ..., v_k]$$
  
  Parameters
  ----------
  columns : int | str | Sequence[int] | Sequence[str]
      The columns to filter out. This can be a sequence of either int (in the case of numpy) or string
      (in the case of pandas).
  alpha : float, default=1.0
      Parameter to control how much to filter:
  
      - `alpha=1` we filter out all information.
      - `alpha=0` we don't apply any filtering.
  
      Should be between 0 and 1.
  
  Attributes
  ----------
  projection_ : array-like of shape (n_features, n_features)
      The projection matrix that can be used to filter information out of a dataset.
  col_ids_ : List[int] of length `len(columns)`
      The list of column ids of the sensitive columns.
docstr: Make the v vectors that we will use to filter out information.
docstr_tok: ["Make","the","v","vectors","that","we","will","use","to","filter","out","information","."]
code: def _make_v_vectors(self, X, col_ids):
      """Make the v vectors that we will use to filter out information."""
      vs = np.zeros((X.shape[0], len(col_ids)))
      for i, c in enumerate(col_ids):
          vs[:, i] = X[:, col_ids[i]]
          for j in range(0, i):
              vs[:, i] = vs[:, i] - vector_projection(
                  vs[:, i], vs[:, j]
              )
      return vs
  
imports: import numpy
  import pandas
  from sklearn.base import BaseEstimator, TransformerMixin
  from sklearn.utils import check_array
  from sklearn.utils.validation import check_is_fitted
  from sklego.common import as_list
label_desc: Use image node_id 4 for calling the InformationFilter obj's underlying member method code with example usage: obj._make_v_vectors(X, col_ids) and returns: vs