Skip to content

Commit

Permalink
fix errors related to string labels (#501)
Browse files Browse the repository at this point in the history
* v0

* linting

* better_transform

* linting

* added_tests

* added_tests

* renames

* renames
  • Loading branch information
JKL98ISR committed Jan 5, 2022
1 parent f834aee commit 421d332
Show file tree
Hide file tree
Showing 5 changed files with 46 additions and 6 deletions.
2 changes: 1 addition & 1 deletion deepchecks/checks/performance/calibration_score.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ def _calibration_score(self, dataset: Dataset, model):
briers_scores = {}

if len(dataset.classes) == 2:
briers_scores[0] = brier_score_loss(ds_y, y_pred[:, 1])
briers_scores[0] = brier_score_loss(ds_y, y_pred[:, 1], pos_label=dataset.classes[1])
else:
for class_index, class_name in enumerate(dataset.classes):
prob_pos = y_pred[:, class_index]
Expand Down
11 changes: 8 additions & 3 deletions deepchecks/checks/performance/model_error_analysis.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
from sklearn.metrics import r2_score
from sklearn.pipeline import Pipeline
from sklearn.tree import DecisionTreeRegressor
from sklearn import preprocessing

from deepchecks import Dataset, CheckResult, TrainTestBaseCheck, ConditionResult, ConditionCategory
from deepchecks.errors import DeepchecksProcessError
Expand Down Expand Up @@ -147,11 +148,15 @@ def run(self, train_dataset: Dataset, test_dataset: Dataset, model=None) -> Chec

# Create scoring function, used to calculate the per sample model error
if task_type == ModelType.REGRESSION:
def scoring_func(dataset):
def scoring_func(dataset: Dataset):
return per_sample_mse(dataset.label_col, model.predict(dataset.features_columns))
else:
def scoring_func(dataset):
return per_sample_binary_cross_entropy(dataset.label_col,
le = preprocessing.LabelEncoder()
le.fit(train_dataset.classes)

def scoring_func(dataset: Dataset):
encoded_label = le.transform(dataset.label_col)
return per_sample_binary_cross_entropy(encoded_label,
model.predict_proba(dataset.features_columns))

train_scores = scoring_func(train_dataset)
Expand Down
16 changes: 14 additions & 2 deletions tests/checks/performance/calibration_score_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -65,15 +65,27 @@ def test_model_info_object(iris_labeled_dataset, iris_adaboost):
2: close_to(0.28, 0.05)
}))


def test_binary_model_info_object(iris_dataset_single_class_labeled, iris_random_forest_single_class):
# Arrange
check = CalibrationScore()
# Act X
result = check.run(iris_dataset_single_class_labeled, iris_random_forest_single_class).value
# Assert
assert len(result) == 1 # iris has 3 targets
assert len(result) == 1

assert_that(result, has_entries({
0: close_to(0.0002, 0.0005)
}))

def test_binary_string_model_info_object(iris_binary_string_split_dataset_and_model):
# Arrange
_, test_ds, clf = iris_binary_string_split_dataset_and_model
check = CalibrationScore()
# Act X
result = check.run(test_ds, clf).value
# Assert
assert len(result) == 1

assert_that(result, has_entries({
0: close_to(0.04, 0.001)
}))
9 changes: 9 additions & 0 deletions tests/checks/performance/model_error_analysis_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,15 @@ def test_model_error_analysis_classification(iris_labeled_dataset, iris_adaboost
assert_that(result_value['feature_segments']['petal length (cm)'], has_length(2))


def test_binary_string_model_info_object(iris_binary_string_split_dataset_and_model):
# Arrange
train_ds, test_ds, clf = iris_binary_string_split_dataset_and_model
check = ModelErrorAnalysis()
# Act X
result_value = check.run(train_ds, test_ds, clf).value
# Assert
assert_that(result_value['feature_segments']['petal length (cm)'], has_length(2))

def test_condition_fail(iris_labeled_dataset, iris_adaboost):
# Act
check_result = ModelErrorAnalysis().add_condition_segments_performance_relative_difference_not_greater_than(
Expand Down
14 changes: 14 additions & 0 deletions tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,20 @@ def iris_split_dataset_and_model_rf(iris) -> Tuple[Dataset, Dataset, RandomFores
return train_ds, val_ds, clf


@pytest.fixture
def iris_binary_string_split_dataset_and_model(iris) -> Tuple[Dataset, Dataset, DecisionTreeClassifier]:
"""Return Iris train and test datasets and trained DecisionTreeClassifier model."""
iris = iris.copy()
iris.loc[iris['target'] != 2, 'target'] = 'a'
iris.loc[iris['target'] == 2, 'target'] = 'b'
train, test = train_test_split(iris, test_size=0.33, random_state=42)
train_ds = Dataset(train, label='target')
test_ds = Dataset(test, label='target')
clf = DecisionTreeClassifier(random_state=0)
clf.fit(train_ds.features_columns, train_ds.label_col)
return train_ds, test_ds, clf


# NaN dataframes:
@pytest.fixture(scope='session')
def df_with_nan_row():
Expand Down

0 comments on commit 421d332

Please sign in to comment.