def test_mape_time_series_model(): obj = MAPE() s1_actual = np.array([0, 0, 1, 1, 1, 1, 2, 0, 2]) s1_predicted = np.array([0, 1, 0, 1, 1, 2, 1, 2, 0]) s2_actual = np.array([-1, -2, 1, 3]) s2_predicted = np.array([1, 2, -1, -3]) s3_actual = np.array([1, 2, 4, 2, 1, 2]) s3_predicted = np.array([0, 2, 2, 1, 3, 2]) with pytest.raises( ValueError, match= "Mean Absolute Percentage Error cannot be used when targets contain the value 0." ): obj.score(s1_actual, s1_predicted) assert obj.score(s2_actual, s2_predicted) == pytest.approx(8 / 4 * 100) assert obj.score(s3_actual, s3_predicted) == pytest.approx(4 / 6 * 100) assert obj.score(pd.Series(s3_actual, index=range(-12, -6)), s3_predicted) == pytest.approx(4 / 6 * 100) assert obj.score(pd.Series(s2_actual, index=range(10, 14)), pd.Series(s2_predicted, index=range(20, 24))) == pytest.approx(8 / 4 * 100)
y = pd.Series([2, 3, 0, 1, 1]) invalid_targets_check = InvalidTargetDataCheck(problem_type="regression", objective=objective) assert invalid_targets_check.validate(X, y) == { "warnings": [], "errors": [DataCheckError( message=f"Target has non-positive values which is not supported for {objective}", data_check_name=invalid_targets_data_check_name, message_code=DataCheckMessageCode.TARGET_INCOMPATIBLE_OBJECTIVE, details={"Count of offending values": sum(val <= 0 for val in y.values.flatten())}).to_dict()], "actions": [] } @pytest.mark.parametrize("objective", [RootMeanSquaredLogError(), MeanSquaredLogError(), MAPE()]) def test_invalid_target_data_check_invalid_labels_for_nonnegative_objective_instances(objective): X = pd.DataFrame({'column_one': [100, 200, 100, 200, 200, 100, 200, 100] * 25}) y = pd.Series([2, 2, 3, 3, -1, -1, 1, 1] * 25) data_checks = DataChecks([InvalidTargetDataCheck], {"InvalidTargetDataCheck": {"problem_type": "multiclass", "objective": objective}}) assert data_checks.validate(X, y) == { "warnings": [], "errors": [DataCheckError( message=f"Target has non-positive values which is not supported for {objective.name}", data_check_name=invalid_targets_data_check_name, message_code=DataCheckMessageCode.TARGET_INCOMPATIBLE_OBJECTIVE, details={"Count of offending values": sum(val <= 0 for val in y.values.flatten())}).to_dict()], "actions": []
f"Target has non-positive values which is not supported for {objective}", data_check_name=invalid_targets_data_check_name, message_code=DataCheckMessageCode. TARGET_INCOMPATIBLE_OBJECTIVE, details={ "Count of offending values": sum(val <= 0 for val in y.values.flatten()) }).to_dict() ] } @pytest.mark.parametrize( "objective", [RootMeanSquaredLogError(), MeanSquaredLogError(), MAPE()]) def test_invalid_target_data_check_invalid_labels_for_nonnegative_objective_instances( objective): X = pd.DataFrame( {'column_one': [100, 200, 100, 200, 200, 100, 200, 100] * 25}) y = pd.Series([2, 2, 3, 3, -1, -1, 1, 1] * 25) data_checks = DataChecks( [InvalidTargetDataCheck], { "InvalidTargetDataCheck": { "problem_type": "multiclass", "objective": objective } }) assert data_checks.validate(X, y) == {