class_docstr: Check if new LOO PPM computed using closed form formulas is the same as
  computing the values manually.
docstr: Check if partial predictions for the identity representation are
  correct. Note that we need to center original X first
code: def test_partial_predictions_ridge(self):
      """
      Check if partial predictions for the identity representation are
      correct. Note that we need to center original X first
      """
      ridge_ppm = RidgeRegressorPPM(loo=True, alpha_grid=[1])
      ridge = Ridge(alpha=1, fit_intercept=True)
      blocked_data = IdentityTransformer().fit_transform(self.X)
      ridge_ppm.fit(blocked_data.get_all_data(), self.y)
      for k in range(self.p):
          gmdi_pps = ridge_ppm.predict_partial_k(
              blocked_data, k, mode="keep_k"
          )
          manual_params, manual_intercepts = self.manual_LOO_coefs(
              ridge, return_intercepts=True, center=True
          )
          manual_pps = (
              self.X[:, k] - self.X[:, k].mean()
          ) * manual_params[:, k] + manual_intercepts
          assert_array_equal(manual_pps, gmdi_pps)
  
imports: import copy
  import numpy
  import random
  import scipy
  from sklearn.linear_model import Ridge, LinearRegression
  from sklearn.tree import DecisionTreeRegressor
  from sklearn.ensemble import RandomForestRegressor, RandomForestClassifier
  from sklearn.metrics import r2_score, log_loss, roc_auc_score, mean_squared_error
  from imodels.importance.block_transformers import IdentityTransformer, TreeTransformer, CompositeTransformer, MDIPlusDefaultTransformer
  from imodels.importance.ppms import RidgeRegressorPPM, LogisticClassifierPPM, RobustRegressorPPM
  from imodels.importance.mdi_plus import TreeMDIPlus, ForestMDIPlus
  from imodels.importance.rf_plus import RandomForestPlusClassifier
label_desc: Use image node_id 5 for calling the TestLOOParams obj's underlying member method code with example usage: obj.test_partial_predictions_ridge() without return types