Comparison of classification quality of 4 classic gradient boosting models and their after bagging versions (BaggingClassifier)

180520202025

This is the first of the third part of research related to improving models. the bagging method can be used for all types of classification models. I still have to work on bagging in neural networks. In the meantime, I invite you to read. As usual, the picture is designed to raise the drama of research.

obraz.png

In [1]:
# Classification Assessment
def Classification_Assessment(model ,Xtrain, ytrain, Xtest, ytest):
    import numpy as np
    import matplotlib.pyplot as plt
    from sklearn import metrics
    from sklearn.metrics import classification_report, confusion_matrix
    from sklearn.metrics import confusion_matrix, log_loss, auc, roc_curve, roc_auc_score, recall_score, precision_recall_curve
    from sklearn.metrics import make_scorer, precision_score, fbeta_score, f1_score, classification_report
    from sklearn.metrics import accuracy_score
    
    import scikitplot as skplt
    from plot_metric.functions import BinaryClassification
    from sklearn.metrics import precision_recall_curve

       
    print("Recall Training data:     ", np.round(recall_score(ytrain, model.predict(Xtrain)), decimals=4))
    print("Precision Training data:  ", np.round(precision_score(ytrain, model.predict(Xtrain)), decimals=4))
    print("----------------------------------------------------------------------")
    print("Recall Test data:         ", np.round(recall_score(ytest, model.predict(Xtest)), decimals=4)) 
    print("Precision Test data:      ", np.round(precision_score(ytest, model.predict(Xtest)), decimals=4))
    print("----------------------------------------------------------------------")
    print("Confusion Matrix Test data")
    print(confusion_matrix(ytest, model.predict(Xtest)))
    print("----------------------------------------------------------------------")
    print('Valuation for test data only:')
    print(classification_report(ytest, model.predict(Xtest)))
    
    ## ----------AUC-----------------------------------------
     
    print('---------------------') 
    AUC_train_1 = metrics.roc_auc_score(ytrain,model.predict_proba(Xtrain)[:,1])
    print('AUC_train: %.3f' % AUC_train_1)
    AUC_test_1 = metrics.roc_auc_score(ytest,model.predict_proba(Xtest)[:,1])
    print('AUC_test:  %.3f' % AUC_test_1)
    print('---------------------')    
    
    print("Accuracy Training data:     ", np.round(accuracy_score(ytrain, model.predict(Xtrain)), decimals=4))
    print("Accuracy Test data:         ", np.round(accuracy_score(ytest, model.predict(Xtest)), decimals=4)) 
    print("----------------------------------------------------------------------")
    print('Valuation for test data only:')

    y_probas1 = model.predict_proba(Xtest)[:,1]
    y_probas2 = model.predict_proba(Xtest)

### ---plot_roc_curve--------------------------------------------------------
    plt.figure(figsize=(13,4))

    plt.subplot(1, 2, 1)
    bc = BinaryClassification(ytest, y_probas1, labels=["Class 1", "Class 2"])
    bc.plot_roc_curve() 


### --------precision_recall_curve------------------------------------------

    plt.subplot(1, 2, 2)
    precision, recall, thresholds = precision_recall_curve(ytest, y_probas1)

    plt.plot(recall, precision, marker='.', label=model)
    plt.title('Precision recall curve')
    plt.xlabel('Recall')
    plt.ylabel('Precision')
    plt.legend(loc=(-0.30, -0.8))
    plt.show()

## ----------plot_roc-----------------------------------------

    skplt.metrics.plot_roc(ytest, y_probas2)
    
    f1_score_macro = np.round(metrics.f1_score(ytest, model.predict(Xtest), average='macro'), decimals=3)
    print("f1 score macro           ",f1_score_macro)
    
    f1_score_micro = np.round(metrics.f1_score(ytest, model.predict(Xtest), average='micro'), decimals=3)
    print("f1 score micro           ",f1_score_micro) 
    

    print('-----------------------------------------------------------------------------')
   
    if f1_score_macro > f1_score_micro:
        print("1 (minority) is better classified than 0 (majority) - macro > micro") 
    else:     
        print('0 (majority) is better classified than 1 (minority)- micro > macro')  

    print('Same holds true for AUC')
    print('-----------------------------------------------------------------------------')
    cal_1 = np.round((sum(ytest == 1)/(sum(ytest == 0)+sum(ytest == 1))),decimals=2)*100
    cal_0 = np.round((sum(ytest == 0)/(sum(ytest == 0)+sum(ytest == 1))),decimals=2)*100
    print('1 proportion:',cal_1 )
    print('0 proportion:',cal_0 )
In [2]:
def oversampling(ytrain, Xtrain):
    import matplotlib.pyplot as plt
    
    global Xtrain_OV
    global ytrain_OV

    calss1 = np.round((sum(ytrain == 1)/(sum(ytrain == 0)+sum(ytrain == 1))),decimals=2)*100
    calss0 = np.round((sum(ytrain == 0)/(sum(ytrain == 0)+sum(ytrain == 1))),decimals=2)*100
    
    print("y = 0: ", sum(ytrain == 0),'-------',calss0,'%')
    print("y = 1: ", sum(ytrain == 1),'-------',calss1,'%')
    print('--------------------------------------------------------')
    
    ytrain.value_counts(dropna = False, normalize=True).plot(kind='pie',title='Before oversampling')
    plt.show
    print()
    
    Proporcja = sum(ytrain == 0) / sum(ytrain == 1)
    Proporcja = np.round(Proporcja, decimals=0)
    Proporcja = Proporcja.astype(int)
       
    ytrain_OV = pd.concat([ytrain[ytrain==1]] * Proporcja, axis = 0) 
    Xtrain_OV = pd.concat([Xtrain.loc[ytrain==1, :]] * Proporcja, axis = 0)
    
    ytrain_OV = pd.concat([ytrain, ytrain_OV], axis = 0).reset_index(drop = True)
    Xtrain_OV = pd.concat([Xtrain, Xtrain_OV], axis = 0).reset_index(drop = True)
    
    Xtrain_OV = pd.DataFrame(Xtrain_OV)
    ytrain_OV = pd.DataFrame(ytrain_OV)
    

    
    print("Before oversampling Xtrain:     ", Xtrain.shape)
    print("Before oversampling ytrain:     ", ytrain.shape)
    print('--------------------------------------------------------')
    print("After oversampling Xtrain_OV:  ", Xtrain_OV.shape)
    print("After oversampling ytrain_OV:  ", ytrain_OV.shape)
    print('--------------------------------------------------------')
    
    
    ax = plt.subplot(1, 2, 1)
    ytrain.value_counts(dropna = False, normalize=True).plot(kind='pie',title='Before oversampling')
    plt.show
    
       
    kot = pd.concat([ytrain[ytrain==1]] * Proporcja, axis = 0)
    kot = pd.concat([ytrain, kot], axis = 0).reset_index(drop = True)
    ax = plt.subplot(1, 2, 2)
    kot.value_counts(dropna = False, normalize=True).plot(kind='pie',title='After oversampling')
    plt.show
In [3]:
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import warnings 
from sklearn.ensemble import BaggingClassifier

warnings.filterwarnings("ignore")

%matplotlib inline

df= pd.read_csv('/home/wojciech/Pulpit/1/Stroke_Prediction.csv')
print(df.shape)
print()
print(df.columns)
df.head(3)
(43400, 12)

Index(['ID', 'Gender', 'Age_In_Days', 'Hypertension', 'Heart_Disease',
       'Ever_Married', 'Type_Of_Work', 'Residence', 'Avg_Glucose', 'BMI',
       'Smoking_Status', 'Stroke'],
      dtype='object')
Out[3]:
ID Gender Age_In_Days Hypertension Heart_Disease Ever_Married Type_Of_Work Residence Avg_Glucose BMI Smoking_Status Stroke
0 31153 Male 1104.0 0 0 No children Rural 95.12 18.0 NaN 0
1 30650 Male 21204.0 1 0 Yes Private Urban 87.96 39.2 never smoked 0
2 17412 Female 2928.0 0 0 No Private Urban 110.89 17.6 NaN 0
In [4]:
### Narzędzie do automatycznego kodowania zmiennych dyskretnych (własnej roboty)
In [5]:
a,b = df.shape     #<- ile mamy kolumn
b

print('DISCRETE FUNCTIONS CODED')
print('------------------------')
for i in range(1,b):
    i = df.columns[i]
    f = df[i].dtypes
    if f == np.object:
        print(i,"---",f)   
    
        if f == np.object:
        
            df[i] = pd.Categorical(df[i]).codes
        
            continue
DISCRETE FUNCTIONS CODED
------------------------
Gender --- object
Ever_Married --- object
Type_Of_Work --- object
Residence --- object
Smoking_Status --- object
In [6]:
df.fillna(7777, inplace=True)
In [7]:
X = df.drop('Stroke', axis=1) 
y = df['Stroke']  

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, random_state=123,stratify=y)
In [8]:
oversampling(y_train, X_train)
y = 0:  34094 ------- 98.0 %
y = 1:  626 ------- 2.0 %
--------------------------------------------------------

Before oversampling Xtrain:      (34720, 11)
Before oversampling ytrain:      (34720,)
--------------------------------------------------------
After oversampling Xtrain_OV:   (68524, 11)
After oversampling ytrain_OV:   (68524, 1)
--------------------------------------------------------
In [9]:
X_test = X_test.values
y_test = y_test.values
Xtrain_OV = Xtrain_OV.values
ytrain_OV = ytrain_OV.values

GradientBoostingRegressor in scikit-learn

obraz.png

In [10]:
from numpy import mean
from numpy import std
from sklearn.datasets import make_classification
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import RepeatedStratifiedKFold
from matplotlib import pyplot

GBC = GradientBoostingClassifier()
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)

n_scores = cross_val_score(GBC, Xtrain_OV, ytrain_OV, scoring=’accuracy’, cv=cv, n_jobs=-1, error_score=’raise’)

In [11]:
GBC = GradientBoostingClassifier()
bagging_GBC = BaggingClassifier(base_estimator=GBC, n_estimators=10, max_samples=0.8, max_features=0.8)

clf_list = [GBC, bagging_GBC]

from simple_colors import *

for k in clf_list:        
       print()
       print(red('==================================================================='))
       print()
       print(red(k, 'bold'))
       print()
       k.fit(Xtrain_OV, ytrain_OV)
       Classification_Assessment(k , Xtrain_OV, ytrain_OV, X_test, y_test)   
===================================================================

GradientBoostingClassifier(ccp_alpha=0.0, criterion='friedman_mse', init=None,
                           learning_rate=0.1, loss='deviance', max_depth=3,
                           max_features=None, max_leaf_nodes=None,
                           min_impurity_decrease=0.0, min_impurity_split=None,
                           min_samples_leaf=1, min_samples_split=2,
                           min_weight_fraction_leaf=0.0, n_estimators=100,
                           n_iter_no_change=None, presort='deprecated',
                           random_state=None, subsample=1.0, tol=0.0001,
                           validation_fraction=0.1, verbose=0,
                           warm_start=False)

Recall Training data:      0.8722
Precision Training data:   0.8
----------------------------------------------------------------------
Recall Test data:          0.7707
Precision Test data:       0.0597
----------------------------------------------------------------------
Confusion Matrix Test data
[[6618 1905]
 [  36  121]]
----------------------------------------------------------------------
Valuation for test data only:
              precision    recall  f1-score   support

           0       0.99      0.78      0.87      8523
           1       0.06      0.77      0.11       157

    accuracy                           0.78      8680
   macro avg       0.53      0.77      0.49      8680
weighted avg       0.98      0.78      0.86      8680

---------------------
AUC_train: 0.906
AUC_test:  0.858
---------------------
Accuracy Training data:      0.8262
Accuracy Test data:          0.7764
----------------------------------------------------------------------
Valuation for test data only:
f1 score macro            0.491
f1 score micro            0.776
-----------------------------------------------------------------------------
0 (majority) is better classified than 1 (minority)- micro > macro
Same holds true for AUC
-----------------------------------------------------------------------------
1 proportion: 2.0
0 proportion: 98.0

===================================================================

BaggingClassifier(base_estimator=GradientBoostingClassifier(ccp_alpha=0.0,
                                                            criterion='friedman_mse',
                                                            init=None,
                                                            learning_rate=0.1,
                                                            loss='deviance',
                                                            max_depth=3,
                                                            max_features=None,
                                                            max_leaf_nodes=None,
                                                            min_impurity_decrease=0.0,
                                                            min_impurity_split=None,
                                                            min_samples_leaf=1,
                                                            min_samples_split=2,
                                                            min_weight_fraction_leaf=0.0,
                                                            n_estimators=100,
                                                            n_iter_no_change=None,
                                                            presort='deprecated',
                                                            random_state=None,
                                                            subsample=1.0,
                                                            tol=0.0001,
                                                            validation_fraction=0.1,
                                                            verbose=0,
                                                            warm_start=False),
                  bootstrap=True, bootstrap_features=False, max_features=0.8,
                  max_samples=0.8, n_estimators=10, n_jobs=None,
                  oob_score=False, random_state=None, verbose=0,
                  warm_start=False)

Recall Training data:      0.8882
Precision Training data:   0.7943
----------------------------------------------------------------------
Recall Test data:          0.8089
Precision Test data:       0.0598
----------------------------------------------------------------------
Confusion Matrix Test data
[[6528 1995]
 [  30  127]]
----------------------------------------------------------------------
Valuation for test data only:
              precision    recall  f1-score   support

           0       1.00      0.77      0.87      8523
           1       0.06      0.81      0.11       157

    accuracy                           0.77      8680
   macro avg       0.53      0.79      0.49      8680
weighted avg       0.98      0.77      0.85      8680

---------------------
AUC_train: 0.909
AUC_test:  0.857
---------------------
Accuracy Training data:      0.8283
Accuracy Test data:          0.7667
----------------------------------------------------------------------
Valuation for test data only:
f1 score macro            0.489
f1 score micro            0.767
-----------------------------------------------------------------------------
0 (majority) is better classified than 1 (minority)- micro > macro
Same holds true for AUC
-----------------------------------------------------------------------------
1 proportion: 2.0
0 proportion: 98.0

XGBoost – Extreme Gradient Boosting !

obraz.png

In [12]:
from numpy import asarray
from numpy import mean
from numpy import std
from sklearn.datasets import make_classification
from xgboost import XGBClassifier
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import RepeatedStratifiedKFold
from matplotlib import pyplot
In [13]:
XGB = XGBClassifier()
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
#n_scores = cross_val_score(XGB, Xtrain_OV, ytrain_OV, scoring='accuracy', cv=cv, n_jobs=-1, error_score='raise')
In [14]:
bagging_XGB = BaggingClassifier(base_estimator=XGB, n_estimators=10, max_samples=0.8, max_features=0.8)

clf_list = [XGB, bagging_XGB]

from simple_colors import *

for k in clf_list:        
       print()
       print(red('==================================================================='))
       print()
       print(red(k, 'bold'))
       print()
       k.fit(Xtrain_OV, ytrain_OV)
       Classification_Assessment(k , Xtrain_OV, ytrain_OV, X_test, y_test) 
===================================================================

XGBClassifier(base_score=None, booster=None, colsample_bylevel=None,
              colsample_bynode=None, colsample_bytree=None, gamma=None,
              gpu_id=None, importance_type='gain', interaction_constraints=None,
              learning_rate=None, max_delta_step=None, max_depth=None,
              min_child_weight=None, missing=nan, monotone_constraints=None,
              n_estimators=100, n_jobs=None, num_parallel_tree=None,
              objective='binary:logistic', random_state=None, reg_alpha=None,
              reg_lambda=None, scale_pos_weight=None, subsample=None,
              tree_method=None, validate_parameters=False, verbosity=None)

Recall Training data:      1.0
Precision Training data:   0.968
----------------------------------------------------------------------
Recall Test data:          0.2548
Precision Test data:       0.0839
----------------------------------------------------------------------
Confusion Matrix Test data
[[8086  437]
 [ 117   40]]
----------------------------------------------------------------------
Valuation for test data only:
              precision    recall  f1-score   support

           0       0.99      0.95      0.97      8523
           1       0.08      0.25      0.13       157

    accuracy                           0.94      8680
   macro avg       0.53      0.60      0.55      8680
weighted avg       0.97      0.94      0.95      8680

---------------------
AUC_train: 0.999
AUC_test:  0.816
---------------------
Accuracy Training data:      0.9834
Accuracy Test data:          0.9362
----------------------------------------------------------------------
Valuation for test data only:
f1 score macro            0.547
f1 score micro            0.936
-----------------------------------------------------------------------------
0 (majority) is better classified than 1 (minority)- micro > macro
Same holds true for AUC
-----------------------------------------------------------------------------
1 proportion: 2.0
0 proportion: 98.0

===================================================================

BaggingClassifier(base_estimator=XGBClassifier(base_score=0.5, booster=None,
                                               colsample_bylevel=1,
                                               colsample_bynode=1,
                                               colsample_bytree=1, gamma=0,
                                               gpu_id=-1,
                                               importance_type='gain',
                                               interaction_constraints=None,
                                               learning_rate=0.300000012,
                                               max_delta_step=0, max_depth=6,
                                               min_child_weight=1, missing=nan,
                                               monotone_constraints=None,
                                               n_estimators=100, n_jobs=0,
                                               num_parallel_tree=1,
                                               objective='binary:logistic',
                                               random_state=0, reg_alpha=0,
                                               reg_lambda=1, scale_pos_weight=1,
                                               subsample=1, tree_method=None,
                                               validate_parameters=False,
                                               verbosity=None),
                  bootstrap=True, bootstrap_features=False, max_features=0.8,
                  max_samples=0.8, n_estimators=10, n_jobs=None,
                  oob_score=False, random_state=None, verbose=0,
                  warm_start=False)

Recall Training data:      1.0
Precision Training data:   0.9728
----------------------------------------------------------------------
Recall Test data:          0.1656
Precision Test data:       0.067
----------------------------------------------------------------------
Confusion Matrix Test data
[[8161  362]
 [ 131   26]]
----------------------------------------------------------------------
Valuation for test data only:
              precision    recall  f1-score   support

           0       0.98      0.96      0.97      8523
           1       0.07      0.17      0.10       157

    accuracy                           0.94      8680
   macro avg       0.53      0.56      0.53      8680
weighted avg       0.97      0.94      0.95      8680

---------------------
AUC_train: 1.000
AUC_test:  0.836
---------------------
Accuracy Training data:      0.986
Accuracy Test data:          0.9432
----------------------------------------------------------------------
Valuation for test data only:
f1 score macro            0.533
f1 score micro            0.943
-----------------------------------------------------------------------------
0 (majority) is better classified than 1 (minority)- micro > macro
Same holds true for AUC
-----------------------------------------------------------------------------
1 proportion: 2.0
0 proportion: 98.0

LightGBM – Light Gradient Boosted Machine

In [15]:
from numpy import mean
from numpy import std
from sklearn.datasets import make_classification
from lightgbm import LGBMClassifier
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import RepeatedStratifiedKFold
from matplotlib import pyplot
In [16]:
LGBM = LGBMClassifier()
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
#n_scores = cross_val_score(XGB, Xtrain_OV, ytrain_OV, scoring='accuracy', cv=cv, n_jobs=-1, error_score='raise')
In [17]:
bagging_LGBM = BaggingClassifier(base_estimator=LGBM, n_estimators=10, max_samples=0.8, max_features=0.8)

clf_list = [LGBM, bagging_LGBM]

from simple_colors import *

for k in clf_list:        
       print()
       print(red('==================================================================='))
       print()
       print(red(k, 'bold'))
       print()
       k.fit(Xtrain_OV, ytrain_OV)
       Classification_Assessment(k , Xtrain_OV, ytrain_OV, X_test, y_test)
===================================================================

LGBMClassifier(boosting_type='gbdt', class_weight=None, colsample_bytree=1.0,
               importance_type='split', learning_rate=0.1, max_depth=-1,
               min_child_samples=20, min_child_weight=0.001, min_split_gain=0.0,
               n_estimators=100, n_jobs=-1, num_leaves=31, objective=None,
               random_state=None, reg_alpha=0.0, reg_lambda=0.0, silent=True,
               subsample=1.0, subsample_for_bin=200000, subsample_freq=0)

Recall Training data:      0.9952
Precision Training data:   0.8964
----------------------------------------------------------------------
Recall Test data:          0.5605
Precision Test data:       0.0728
----------------------------------------------------------------------
Confusion Matrix Test data
[[7403 1120]
 [  69   88]]
----------------------------------------------------------------------
Valuation for test data only:
              precision    recall  f1-score   support

           0       0.99      0.87      0.93      8523
           1       0.07      0.56      0.13       157

    accuracy                           0.86      8680
   macro avg       0.53      0.71      0.53      8680
weighted avg       0.97      0.86      0.91      8680

---------------------
AUC_train: 0.988
AUC_test:  0.837
---------------------
Accuracy Training data:      0.9398
Accuracy Test data:          0.863
----------------------------------------------------------------------
Valuation for test data only:
f1 score macro            0.527
f1 score micro            0.863
-----------------------------------------------------------------------------
0 (majority) is better classified than 1 (minority)- micro > macro
Same holds true for AUC
-----------------------------------------------------------------------------
1 proportion: 2.0
0 proportion: 98.0

===================================================================

BaggingClassifier(base_estimator=LGBMClassifier(boosting_type='gbdt',
                                                class_weight=None,
                                                colsample_bytree=1.0,
                                                importance_type='split',
                                                learning_rate=0.1, max_depth=-1,
                                                min_child_samples=20,
                                                min_child_weight=0.001,
                                                min_split_gain=0.0,
                                                n_estimators=100, n_jobs=-1,
                                                num_leaves=31, objective=None,
                                                random_state=None,
                                                reg_alpha=0.0, reg_lambda=0.0,
                                                silent=True, subsample=1.0,
                                                subsample_for_bin=200000,
                                                subsample_freq=0),
                  bootstrap=True, bootstrap_features=False, max_features=0.8,
                  max_samples=0.8, n_estimators=10, n_jobs=None,
                  oob_score=False, random_state=None, verbose=0,
                  warm_start=False)

Recall Training data:      0.9968
Precision Training data:   0.9062
----------------------------------------------------------------------
Recall Test data:          0.5032
Precision Test data:       0.0745
----------------------------------------------------------------------
Confusion Matrix Test data
[[7542  981]
 [  78   79]]
----------------------------------------------------------------------
Valuation for test data only:
              precision    recall  f1-score   support

           0       0.99      0.88      0.93      8523
           1       0.07      0.50      0.13       157

    accuracy                           0.88      8680
   macro avg       0.53      0.69      0.53      8680
weighted avg       0.97      0.88      0.92      8680

---------------------
AUC_train: 0.993
AUC_test:  0.835
---------------------
Accuracy Training data:      0.9465
Accuracy Test data:          0.878
----------------------------------------------------------------------
Valuation for test data only:
f1 score macro            0.532
f1 score micro            0.878
-----------------------------------------------------------------------------
0 (majority) is better classified than 1 (minority)- micro > macro
Same holds true for AUC
-----------------------------------------------------------------------------
1 proportion: 2.0
0 proportion: 98.0

CatBoost – Cat Boost Classifier!

obraz.png

In [18]:
from numpy import mean
from numpy import std
from sklearn.datasets import make_classification
from catboost import CatBoostClassifier
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import RepeatedStratifiedKFold
from matplotlib import pyplot
In [19]:
CBC = CatBoostClassifier(verbose=0, n_estimators=100)
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
#n_scores = cross_val_score(XGB, Xtrain_OV, ytrain_OV, scoring='accuracy', cv=cv, n_jobs=-1, error_score='raise')
In [20]:
bagging_CBC = BaggingClassifier(base_estimator=CBC, n_estimators=10, max_samples=0.8, max_features=0.8)

clf_list = [CBC, bagging_CBC]

from simple_colors import *

for k in clf_list:        
       print()
       print(red('==================================================================='))
       print()
       print(red(k, 'bold'))
       print()
       k.fit(Xtrain_OV, ytrain_OV)
       Classification_Assessment(k , Xtrain_OV, ytrain_OV, X_test, y_test)
===================================================================

<catboost.core.CatBoostClassifier object at 0x7f38569ecbd0>

Recall Training data:      0.9984
Precision Training data:   0.9188
----------------------------------------------------------------------
Recall Test data:          0.3631
Precision Test data:       0.062
----------------------------------------------------------------------
Confusion Matrix Test data
[[7660  863]
 [ 100   57]]
----------------------------------------------------------------------
Valuation for test data only:
              precision    recall  f1-score   support

           0       0.99      0.90      0.94      8523
           1       0.06      0.36      0.11       157

    accuracy                           0.89      8680
   macro avg       0.52      0.63      0.52      8680
weighted avg       0.97      0.89      0.93      8680

---------------------
AUC_train: 0.989
AUC_test:  0.814
---------------------
Accuracy Training data:      0.9549
Accuracy Test data:          0.8891
----------------------------------------------------------------------
Valuation for test data only:
f1 score macro            0.523
f1 score micro            0.889
-----------------------------------------------------------------------------
0 (majority) is better classified than 1 (minority)- micro > macro
Same holds true for AUC
-----------------------------------------------------------------------------
1 proportion: 2.0
0 proportion: 98.0

===================================================================

BaggingClassifier(base_estimator=<catboost.core.CatBoostClassifier object at 0x7f38569ecbd0>,
                  bootstrap=True, bootstrap_features=False, max_features=0.8,
                  max_samples=0.8, n_estimators=10, n_jobs=None,
                  oob_score=False, random_state=None, verbose=0,
                  warm_start=False)

Recall Training data:      1.0
Precision Training data:   0.9162
----------------------------------------------------------------------
Recall Test data:          0.4713
Precision Test data:       0.0755
----------------------------------------------------------------------
Confusion Matrix Test data
[[7617  906]
 [  83   74]]
----------------------------------------------------------------------
Valuation for test data only:
              precision    recall  f1-score   support

           0       0.99      0.89      0.94      8523
           1       0.08      0.47      0.13       157

    accuracy                           0.89      8680
   macro avg       0.53      0.68      0.53      8680
weighted avg       0.97      0.89      0.92      8680

---------------------
AUC_train: 0.996
AUC_test:  0.846
---------------------
Accuracy Training data:      0.954
Accuracy Test data:          0.8861
----------------------------------------------------------------------
Valuation for test data only:
f1 score macro            0.535
f1 score micro            0.886
-----------------------------------------------------------------------------
0 (majority) is better classified than 1 (minority)- micro > macro
Same holds true for AUC
-----------------------------------------------------------------------------
1 proportion: 2.0
0 proportion: 98.0