def test_explain_catboost_catboost(boston_train): xs, ys, feature_names = boston_train catb = CatBoost().fit(xs, ys) res = explain_weights(catb) for expl in format_as_all(res, catb): assert '12' in expl res = explain_weights(catb, feature_names=feature_names) for expl in format_as_all(res, catb): assert 'LSTAT' in expl
def test_explain_xgboost_regressor(boston_train): xs, ys, feature_names = boston_train reg = XGBRegressor() reg.fit(xs, ys) res = explain_weights(reg) for expl in format_as_all(res, reg): assert 'f12' in expl res = explain_weights(reg, feature_names=feature_names) for expl in format_as_all(res, reg): assert 'LSTAT' in expl
def test_explain_xgboost_booster(boston_train): xs, ys, feature_names = boston_train booster = xgboost.train( params={'objective': 'reg:linear', 'silent': True}, dtrain=xgboost.DMatrix(xs, label=ys), ) res = explain_weights(booster) for expl in format_as_all(res, booster): assert 'f12' in expl res = explain_weights(booster, feature_names=feature_names) for expl in format_as_all(res, booster): assert 'LSTAT' in expl
def test_explain_weights_feature_names_pandas(boston_train): pd = pytest.importorskip('pandas') X, y, feature_names = boston_train df = pd.DataFrame(X, columns=feature_names) reg = XGBRegressor().fit(df, y) # it shoud pick up feature names from DataFrame columns res = explain_weights(reg) for expl in format_as_all(res, reg): assert 'PTRATIO' in expl # it is possible to override DataFrame feature names numeric_feature_names = ["zz%s" % idx for idx in range(len(feature_names))] res = explain_weights(reg, feature_names=numeric_feature_names) for expl in format_as_all(res, reg): assert 'zz12' in expl
def explain_weights_pipeline(estimator, feature_names=None, **kwargs): last_estimator = estimator.steps[-1][1] transform_pipeline = Pipeline(estimator.steps[:-1]) if 'vec' in kwargs: feature_names = get_feature_names(feature_names, vec=kwargs.pop('vec')) feature_names = transform_feature_names(transform_pipeline, feature_names) out = explain_weights(last_estimator, feature_names=feature_names, **kwargs) out.estimator = repr(estimator) return out
def test_explain_catboost_catboost_wrong_importance_type( iris_train, importance_type): x, y, feature_names, target = iris_train train = Pool(x, y) catb = CatBoostClassifier(iterations=10, learning_rate=1, depth=2, loss_function='MultiClass') catb.fit(train) with pytest.raises(ValueError): res = explain_weights(catb, importance_type=importance_type, pool=train)
def test_explain_catboost_classifier(iris_train, importance_type): x, y, feature_names, target = iris_train train = Pool(x, y) catb = CatBoostClassifier(iterations=10, learning_rate=1, depth=2, loss_function='MultiClass') catb.fit(train) res = explain_weights(catb, importance_type=importance_type, pool=train) for expl in format_as_all(res, catb): assert '3' in expl res = explain_weights(catb, feature_names=feature_names, importance_type=importance_type, pool=train) for expl in format_as_all(res, catb): assert 'petal width (cm)' in expl if (importance_type == 'LossFunctionChange'): with pytest.raises(ValueError): res = explain_weights(catb, feature_names=feature_names, importance_type=importance_type, pool=[x, y])