예제 #1
0
 def test_compute_features_import(self, mock_compute_features_import):
     """
     Unit test compute features import
     """
     state = SmartState()
     state.compute_features_import(Mock())
     mock_compute_features_import.assert_called()
예제 #2
0
 def test_compute_grouped_contributions(self, mock_group_contributions):
     """
     Unit test compute features groups contributions
     """
     state = SmartState()
     state.compute_grouped_contributions(Mock(), {})
     mock_group_contributions.assert_called()
예제 #3
0
 def test_assign_contributions_2(self):
     """
     Unit test assign contributions 2
     """
     state = SmartState()
     ranked = [1, 2]
     with self.assertRaises(ValueError):
         state.assign_contributions(ranked)
예제 #4
0
 def test_assign_contributions_1(self):
     """
     Unit test assign contributions 1
     """
     state = SmartState()
     output = state.assign_contributions([1, 2, 3])
     expected = {'contrib_sorted': 1, 'x_sorted': 2, 'var_dict': 3}
     self.assertDictEqual(output, expected)
예제 #5
0
 def test_check_contributions_1(self):
     """
     Unit test check contributions 1
     """
     state = SmartState()
     contributions = pd.DataFrame([[-0.2, 0.1], [0.8, -0.4], [0.5, -0.7]], )
     x_pred = pd.DataFrame([[1, 2], [3, 4]], )
     assert not state.check_contributions(contributions, x_pred)
예제 #6
0
 def test_check_contributions_2(self):
     """
     Unit test check contributions 2
     """
     state = SmartState()
     contributions = pd.DataFrame([[-0.2, 0.1], [0.8, -0.4]],
                                  index=['row_1', 'row_2'])
     x_pred = pd.DataFrame([[1, 2], [3, 4]])
     assert not state.check_contributions(contributions, x_pred)
예제 #7
0
 def test_inverse_transform_contributions(self, mock_inverse_transform_contributions):
     """
     Unit test inverse transform contributions
     Parameters
     ----------
     mock_inverse_transform_contributions : [type]
         [description]
     """
     state = SmartState()
     state.inverse_transform_contributions(Mock(), Mock())
     mock_inverse_transform_contributions.assert_called()
예제 #8
0
 def test_compute_features_import(self, mock_compute_features_import):
     """
     Unit test compute features import
     Parameters
     ----------
     mock_compute_features_import : [type]
         [description]
     """
     state = SmartState()
     state.compute_features_import(Mock())
     mock_compute_features_import.assert_called()
예제 #9
0
 def test_init_mask(self, mock_init_mask):
     """
     Unit test init mask
     Parameters
     ----------
     mock_init_mask : [type]
         [description]
     """
     state = SmartState()
     state.init_mask(Mock())
     mock_init_mask.assert_called()
예제 #10
0
 def test_compute_masked_contributions(self, mock_compute_masked_contributions):
     """
     Unit test compute masked contributions
     Parameters
     ----------
     mock_compute_masked_contributions : [type]
         [description]
     """
     state = SmartState()
     state.compute_masked_contributions(Mock(), Mock())
     mock_compute_masked_contributions.assert_called()
예제 #11
0
 def test_combine_masks(self, mock_combine_masks):
     """
     Unit test combine masks
     Parameters
     ----------
     mock_combine_masks : [type]
         [description]
     """
     state = SmartState()
     state.combine_masks(Mock())
     mock_combine_masks.assert_called()
예제 #12
0
 def test_sign_contributions(self, mock_sign_contributions):
     """
     Unit test sign contributions
     Parameters
     ----------
     mock_sign_contributions : [type]
         [description]
     """
     state = SmartState()
     state.sign_contributions(Mock(), Mock())
     mock_sign_contributions.assert_called()
예제 #13
0
 def test_check_contributions_3(self):
     """
     Unit test check contributions 3
     """
     state = SmartState()
     contributions = pd.DataFrame(
         [[-0.2, 0.1], [0.8, -0.4]],
         columns=['col_1', 'col_2'],
     )
     x_pred = pd.DataFrame([[1, 2], [3, 4]], )
     assert not state.check_contributions(contributions, x_pred)
예제 #14
0
 def test_validate_contributions_2(self):
     """
     Unit test validate contributions 2
     """
     state = SmartState()
     contributions = np.array([[2, 1], [8, 4]])
     x_pred = pd.DataFrame([[1, 2], [3, 4]],
                           columns=['Col1', 'Col2'],
                           index=['Id1', 'Id2'])
     expected_output = pd.DataFrame([[2, 1], [8, 4]],
                                    columns=['Col1', 'Col2'],
                                    index=['Id1', 'Id2'])
     output = state.validate_contributions(contributions, x_pred)
     assert not pd.testing.assert_frame_equal(expected_output, output)
예제 #15
0
 def test_summarize_1(self):
     """
     Unit test summarize 1
     """
     state = SmartState()
     contrib_sorted = pd.DataFrame(
         [[0.32230754, 0.1550689, 0.10183475, 0.05471339],
          [-0.58547512, -0.37050409, -0.07249285, 0.00171975],
          [-0.48666675, 0.25507156, -0.16968889, 0.0757443]],
         columns=[
             'contribution_0', 'contribution_1', 'contribution_2',
             'contribution_3'
         ],
         index=[0, 1, 2])
     var_dict = pd.DataFrame(
         [[1, 0, 2, 3], [1, 0, 3, 2], [1, 0, 2, 3]],
         columns=['feature_0', 'feature_1', 'feature_2', 'feature_3'],
         index=[0, 1, 2])
     x_sorted = pd.DataFrame(
         [[1., 3., 22., 1.], [2., 1., 2., 38.], [2., 3., 26., 1.]],
         columns=['feature_0', 'feature_1', 'feature_2', 'feature_3'],
         index=[0, 1, 2])
     mask = pd.DataFrame(
         [[True, True, False, False], [True, True, False, False],
          [True, True, False, False]],
         columns=[
             'contribution_0', 'contribution_1', 'contribution_2',
             'contribution_3'
         ],
         index=[0, 1, 2])
     columns_dict = {0: 'Pclass', 1: 'Sex', 2: 'Age', 3: 'Embarked'}
     features_dict = {
         'Pclass': 'Pclass',
         'Sex': 'Sex',
         'Age': 'Age',
         'Embarked': 'Embarked'
     }
     output = state.summarize(contrib_sorted, var_dict, x_sorted, mask,
                              columns_dict, features_dict)
     expected = pd.DataFrame(
         [['Sex', 1.0, 0.32230754, 'Pclass', 3.0, 0.1550689],
          ['Sex', 2.0, -0.58547512, 'Pclass', 1.0, -0.37050409],
          ['Sex', 2.0, -0.48666675, 'Pclass', 3.0, 0.25507156]],
         columns=[
             'feature_1', 'value_1', 'contribution_1', 'feature_2',
             'value_2', 'contribution_2'
         ],
         index=[0, 1, 2],
         dtype=object)
     assert not pd.testing.assert_frame_equal(expected, output)
예제 #16
0
    def test_validate_contributions_1(self, choose_state):
        """
        Unit test validate contributions 1
        """
        choose_state.return_value = MultiDecorator(SmartState())

        predictor_1 = self.predictor_1

        contributions = [
            np.array([[2, 1], [8, 4]]),
            np.array([[5, 5], [0, 0]])
        ]
        predictor_1.state = predictor_1.choose_state(contributions)
        predictor_1.data = {"x": None, "ypred": None, "contributions": None}
        predictor_1.data["x_preprocessed"] = pd.DataFrame(
            [[1, 2], [3, 4]], columns=['Col1', 'Col2'], index=['Id1', 'Id2'])
        expected_output = [
            pd.DataFrame([[2, 1], [8, 4]],
                         columns=['Col1', 'Col2'],
                         index=['Id1', 'Id2']),
            pd.DataFrame([[5, 5], [0, 0]],
                         columns=['Col1', 'Col2'],
                         index=['Id1', 'Id2'])
        ]
        output = predictor_1.validate_contributions(contributions)
        assert len(expected_output) == len(output)
        test_list = [
            pd.testing.assert_frame_equal(e, m)
            for e, m in zip(expected_output, output)
        ]
        assert all(x is None for x in test_list)
예제 #17
0
 def test_validate_contributions_1(self):
     """
     Unit test validate contributions
     Parameters
     ----------
     unittest : [type]
         [description]
     """
     state = SmartState()
     x_pred = Mock()
     contributions = pd.DataFrame([[2, 1], [8, 4]],
                                  columns=['Col1', 'Col2'],
                                  index=['Id1', 'Id2'])
     expected_output = contributions
     output = state.validate_contributions(contributions, x_pred)
     assert not pd.testing.assert_frame_equal(expected_output, output)
예제 #18
0
 def test_to_pandas_1(self):
     """
     Unit test to pandas 1
     """
     xpl = SmartExplainer()
     xpl.state = SmartState()
     data = {}
     data['contrib_sorted'] = pd.DataFrame(
         [[0.32230754, 0.1550689, 0.10183475, 0.05471339],
          [-0.58547512, -0.37050409, -0.07249285, 0.00171975],
          [-0.48666675, 0.25507156, -0.16968889, 0.0757443]],
         columns=[
             'contribution_0', 'contribution_1', 'contribution_2',
             'contribution_3'
         ],
         index=[0, 1, 2])
     data['var_dict'] = pd.DataFrame(
         [[1, 0, 2, 3], [1, 0, 3, 2], [1, 0, 2, 3]],
         columns=['feature_0', 'feature_1', 'feature_2', 'feature_3'],
         index=[0, 1, 2])
     data['x_sorted'] = pd.DataFrame(
         [[1., 3., 22., 1.], [2., 1., 2., 38.], [2., 3., 26., 1.]],
         columns=['feature_0', 'feature_1', 'feature_2', 'feature_3'],
         index=[0, 1, 2])
     xpl.data = data
     xpl.columns_dict = {0: 'Pclass', 1: 'Sex', 2: 'Age', 3: 'Embarked'}
     xpl.features_dict = {
         'Pclass': 'Pclass',
         'Sex': 'Sex',
         'Age': 'Age',
         'Embarked': 'Embarked'
     }
     xpl.x = pd.DataFrame(
         [[3., 1., 22., 1.], [1., 2., 38., 2.], [3., 2., 26., 1.]],
         columns=['Pclass', 'Sex', 'Age', 'Embarked'],
         index=[0, 1, 2])
     xpl.x_pred = xpl.x
     xpl.contributions = data['contrib_sorted']
     xpl.y_pred = pd.DataFrame([1, 2, 3], columns=['pred'], index=[0, 1, 2])
     model = lambda: None
     model.predict = types.MethodType(self.predict, model)
     xpl.model = model
     xpl._case, xpl._classes = xpl.check_model()
     xpl.state = xpl.choose_state(xpl.contributions)
     output = xpl.to_pandas(max_contrib=2)
     expected = pd.DataFrame(
         [[1, 'Sex', 1.0, 0.32230754, 'Pclass', 3.0, 0.1550689],
          [2, 'Sex', 2.0, -0.58547512, 'Pclass', 1.0, -0.37050409],
          [3, 'Sex', 2.0, -0.48666675, 'Pclass', 3.0, 0.25507156]],
         columns=[
             'pred', 'feature_1', 'value_1', 'contribution_1', 'feature_2',
             'value_2', 'contribution_2'
         ],
         index=[0, 1, 2],
         dtype=object)
     expected['pred'] = expected['pred'].astype(int)
     assert not pd.testing.assert_frame_equal(expected, output)
예제 #19
0
 def test_filter_7(self):
     """
     Unit test filter 7
     """
     xpl = SmartExplainer()
     contributions = [
         pd.DataFrame(
             data=[[0.5, 0.4, 0.3], [0.9, 0.8, 0.7]],
             columns=['Col1', 'Col2', 'Col3']
         ),
         pd.DataFrame(
             data=[[0.3, 0.2, 0.1], [0.6, 0.5, 0.4]],
             columns=['Col1', 'Col2', 'Col3']
         )
     ]
     xpl.data = {'var_dict': 1, 'contrib_sorted': contributions, 'x_sorted': 3}
     xpl.state = MultiDecorator(SmartState())
     xpl.filter(threshold=0.5, max_contrib=2)
     expected_mask = [
         pd.DataFrame(
             data=[[True, False, False], [True, True, False]],
             columns=['contrib_1', 'contrib_2', 'contrib_3']
         ),
         pd.DataFrame(
             data=[[False, False, False], [True, True, False]],
             columns=['contrib_1', 'contrib_2', 'contrib_3']
         )
     ]
     assert len(expected_mask) == len(xpl.mask)
     test_list = [pd.testing.assert_frame_equal(e, m) for e, m in zip(expected_mask, xpl.mask)]
     assert all(x is None for x in test_list)
     expected_masked_contributions = [
         pd.DataFrame(
             data=[[0.0, 0.7], [0.0, 0.7]],
             columns=['masked_neg', 'masked_pos']
         ),
         pd.DataFrame(
             data=[[0.0, 0.6], [0.0, 0.4]],
             columns=['masked_neg', 'masked_pos']
         )
     ]
     assert len(expected_masked_contributions) == len(xpl.masked_contributions)
     test_list = [pd.testing.assert_frame_equal(e, m) for e, m in
                  zip(expected_masked_contributions, xpl.masked_contributions)]
     assert all(x is None for x in test_list)
     expected_param_dict = {
         'features_to_hide': None,
         'threshold': 0.5,
         'positive': None,
         'max_contrib': 2
     }
     self.assertDictEqual(expected_param_dict, xpl.mask_params)
예제 #20
0
    def test_check_contributions(self, choose_state):
        """
        Unit test check_shape_contributions 1
        """
        choose_state.return_value = MultiDecorator(SmartState())

        shap_values = self.clf_2.get_feature_importance(Pool(
            self.df_encoded_2),
                                                        type="ShapValues")

        predictor_1 = self.predictor_2

        predictor_1.data = {
            "x": None,
            "ypred": None,
            "contributions": None,
            "x_preprocessed": None
        }
        predictor_1.data["x"] = self.df_2[["x1", "x2"]]
        predictor_1.data["x_preprocessed"] = self.df_2[["x1", "x2"]]
        predictor_1.data["ypred"] = self.df_2["y"]

        adapt_contrib = [
            np.array([[-0.04395604, 0.13186813], [-0.04395604, 0.13186813],
                      [-0.0021978, 0.01318681], [-0.0021978, 0.01318681],
                      [-0.04395604, 0.13186813]]),
            np.array([[0.04395604, -0.13186813], [0.04395604, -0.13186813],
                      [0.0021978, -0.01318681], [0.0021978, -0.01318681],
                      [0.04395604, -0.13186813]])
        ]
        contributions = list()
        for element in adapt_contrib:
            contributions.append(pd.DataFrame(element, columns=["x1", "x2"]))

        predictor_1.state = predictor_1.choose_state(adapt_contrib)
        predictor_1.check_contributions(contributions)

        with self.assertRaises(ValueError):
            predictor_1.check_contributions(shap_values[:, :-1])