code: def test_explain(self):
      params = [
          "tenantCol",
          "userCol",
          "resCol",
          "likelihoodCol",
          "outputCol",
          "rankParam",
          "maxIter",
          "regParam",
          "numBlocks",
          "separateTenants",
          "lowValue",
          "highValue",
          "applyImplicitCf",
          "alphaParam",
          "complementsetFactor",
          "negScore",
          "historyAccessDf",
      ]
  
      types = [str, int, float, None]
  
      def counts(c: int, tt: Type):
          return tt not in types or c > 0
  
      self.check_explain(
          AccessAnomaly(
              tenantCol=AccessAnomalyConfig.default_tenant_col
          ),
          params,
          counts,
      )
  
imports: import os
  import tempfile
  import unittest
  from typing import Dict, Optional, Set, Type, Union
  from pandas.testing import assert_frame_equal
  from pyspark.sql import DataFrame, types, functions
  from synapse.ml.cyber.feature import indexers
  from synapse.ml.cyber import DataFactory
  from synapse.ml.cyber.anomaly.collaborative_filtering import AccessAnomaly, AccessAnomalyModel, AccessAnomalyConfig, ConnectedComponents, ModelNormalizeTransformer, _UserResourceFeatureVectorMapping
  from synapsemltest.cyber.explain_tester import ExplainTester
  from synapsemltest.spark import *
label_desc: Use image node_id 1 for calling the TestAccessAnomalyExplain obj's underlying member method code with example usage: obj.test_explain() and returns: unknown