Tests to combine results of Poisson GLM, NB GLM with dataset raw features (yearbuilt, sqft, etc) using Poisson XGB when ecy is used as an offset in GLM or base margin in XGB. Classification XGB can not be added in this configuration because it's in a different training dataset.

In [16]:
ModelsDir = '/home/kate/Research/Property/Models/'
ModelName='wc_Poisson_XGB_All_bm_ecy'
UseSavedIfExists = False
DataDir = '/home/kate/Research/Property/Data/'
In [17]:
import sys

sys.path.append('/home/kate/code/Utils/')

from MyFunctions import NormalizedWeightedGini
from MyFunctions import nLogLik_XGBoost
In [18]:
import pandas as pd
import numpy as np
import pickle
import xgboost as xgb
import os
In [19]:
training_dataset = pd.read_csv('%sproperty_wcf_training.csv'%DataDir, error_bad_lines=False, index_col=False)
testing_dataset = pd.read_csv('%sproperty_wcf_testing.csv'%DataDir, error_bad_lines=False, index_col=False)
prediction_dataset = pd.read_csv('%sproperty_wcf_prediction.csv'%DataDir, error_bad_lines=False, index_col=False)
In [20]:
target_column = 'cova_ic_nc_water'
offset_column='log_ecy'
prediction_column_cv='cova_ic_nc_water_cv_pred'
prediction_column_fold='cova_ic_nc_water_pred'
feature_column_pglm='poissonglm_ofst_ecy'
feature_column_nbglm='nbglm_ofst_ecy'
feature_column_cxgb='class_bm_ecy_xgb_fold'
In [21]:
featureset  = [
 'cova_deductible',
 'roofcd_encd',
 'sqft',
 'usagetype_encd',
 'yearbuilt',
 'cova_limit',
 'water_risk_fre_3_blk',
 'water_risk_3_blk',
 'ecy'
]
In [22]:
nrounds=5000
simon_params = {
        'objective': 'count:poisson',
        'eval_metric': 'poisson-nloglik',
        'silent': True,
        'booster': 'gbtree',
        'eta': 0.01, 
        'subsample': 0.8,
        'colsample_bytree': 0.8,
        'min_child_weight': 3,
        'max_depth': 6,
        'gamma': 0,
        'seed': 42}
In [23]:
kfold = 5
In [24]:
training_dataset[prediction_column_cv]=0
for i in range(0,kfold):
    training_dataset['%s_%s'%(prediction_column_fold,i)]=0
#
testing_dataset[prediction_column_cv]=0
for i in range(0,kfold):
    testing_dataset['%s_%s'%(prediction_column_fold,i)]=0
#
prediction_dataset[prediction_column_cv]=0
for i in range(0,kfold):
    prediction_dataset['%s_%s'%(prediction_column_fold,i)]=0
#
Train_Gini_l = list()
Test_Gini_l = list()
Train_LogLik_l = list()
Test_LogLik_l = list()

#-----------------------------------------------------------------------------------------------------------       
#CV-folds modeling
for i in range(0,kfold):
    print(' fold: {}  of  {} : '.format(i+1, kfold))
    training_dataset_fold = training_dataset[training_dataset['fold_%s'%i]>0]
    validation_dataset = training_dataset[training_dataset['fold_%s'%i]==0]
        
    featureset_fold =  featureset +  ['%s_%s'%(feature_column_nbglm,i)]
        #['%s_%s'%(feature_column_pglm,i)] + ['%s_%s'%(feature_column_nbglm,i)] +  ['%s_%s'%(feature_column_cxgb,i)]
    X_train =  training_dataset_fold[featureset_fold].copy()
    X_valid =  validation_dataset[featureset_fold].copy()        
    y_train =  training_dataset_fold[target_column].copy()
    y_valid =  validation_dataset[target_column].copy()       
    offset_train =  training_dataset_fold[offset_column].copy()
    offset_valid =  validation_dataset[offset_column].copy()                 
  
    #preparing for XGB run
    X_train = X_train.values
    X_valid = X_valid.values
    #
    y_pred_train=pd.DataFrame(index=y_train.index)
    y_pred_train[prediction_column_cv]=0
    #
    y_train = y_train.values
    y_valid = y_valid.values
    #
    offset_train = offset_train.values
    offset_valid = offset_valid.values
    #
    d_train = xgb.DMatrix(X_train, y_train)
    d_train.set_base_margin(offset_train)
    #
    d_valid = xgb.DMatrix(X_valid, y_valid)
    d_valid.set_base_margin(offset_valid) 
    #
    X_pred=prediction_dataset[featureset_fold]
    y_pred=prediction_dataset[target_column]
    offset_pred=prediction_dataset[offset_column]
    Dpred = xgb.DMatrix(X_pred.values)
    Dpred.set_base_margin(offset_pred.values)    
    #
    X_test=testing_dataset[featureset_fold]
    y_test=testing_dataset[target_column]
    offset_test=testing_dataset[offset_column]
    Dtest = xgb.DMatrix(X_test.values)
    Dtest.set_base_margin(offset_test.values)
    #
    X=training_dataset[featureset_fold]
    y=training_dataset[target_column]
    offset=training_dataset[offset_column]
    Dtrain = xgb.DMatrix(X.values,y)
    Dtrain.set_base_margin(offset.values)

    #
    watchlist = [(d_train, 'train'), (d_valid, 'valid')]

    #applying XGB
    xgb_model_file='%s%s_%s.model'%(ModelsDir,ModelName,i)
    if (os.path.exists(xgb_model_file) & UseSavedIfExists):
        print('%s file exists. Reading model from the file'%xgb_model_file)
        xgb_model = pickle.load(open(xgb_model_file, 'rb'))
    else:
        print('%s file does not exists. Training model...'%xgb_model_file)
        xgb_model = xgb.train(simon_params, d_train, nrounds, watchlist,   verbose_eval=100, early_stopping_rounds=100)
        pickle.dump(xgb_model, open(xgb_model_file, 'wb'))
            
    pred = xgb_model.predict(Dtrain, ntree_limit=xgb_model.best_ntree_limit+50)
    training_dataset[prediction_column_cv]+=   pred/ (kfold)
    training_dataset['%s_%s'%(prediction_column_fold,i)]=  pred
        
    pred = xgb_model.predict(Dtest, ntree_limit=xgb_model.best_ntree_limit+50)
    testing_dataset[prediction_column_cv] +=   pred/(kfold)  
    testing_dataset['%s_%s'%(prediction_column_fold,i)] =  pred 
    
    pred = xgb_model.predict(Dpred, ntree_limit=xgb_model.best_ntree_limit+50)
    prediction_dataset[prediction_column_cv] +=   pred/(kfold)  
    prediction_dataset['%s_%s'%(prediction_column_fold,i)] =  pred   
    
#Scores cv folds
Train_Gini_l.append(NormalizedWeightedGini(training_dataset[target_column],training_dataset[prediction_column_cv],training_dataset['ecy']))
Test_Gini_l.append(NormalizedWeightedGini(testing_dataset[target_column],testing_dataset[prediction_column_cv],testing_dataset['ecy']))
Train_LogLik_l.append(nLogLik_XGBoost(training_dataset[target_column],training_dataset[prediction_column_cv]))
Test_LogLik_l.append(nLogLik_XGBoost(testing_dataset[target_column],testing_dataset[prediction_column_cv]))
#-----------------------------------------------------------------------------------------------------------
#Saving training
training_dataset.to_csv('%sproperty_wcf_training.csv'%DataDir,header=True,index=False)
testing_dataset.to_csv('%sproperty_wcf_testing.csv'%DataDir,header=True,index=False)
prediction_dataset.to_csv('%sproperty_wcf_prediction.csv'%DataDir,header=True,index=False)
 fold: 1  of  5 : 
/home/kate/Research/Property/Models/wc_Poisson_XGB_All_bm_ecy_0.model file does not exists. Training model...
[0]	train-poisson-nloglik:0.488586	valid-poisson-nloglik:0.487981
Multiple eval metrics have been passed: 'valid-poisson-nloglik' will be used for early stopping.

Will train until valid-poisson-nloglik hasn't improved in 100 rounds.
[100]	train-poisson-nloglik:0.311265	valid-poisson-nloglik:0.310925
[200]	train-poisson-nloglik:0.205543	valid-poisson-nloglik:0.205371
[300]	train-poisson-nloglik:0.143218	valid-poisson-nloglik:0.143161
[400]	train-poisson-nloglik:0.107091	valid-poisson-nloglik:0.107125
[500]	train-poisson-nloglik:0.08661	valid-poisson-nloglik:0.086723
[600]	train-poisson-nloglik:0.07533	valid-poisson-nloglik:0.075521
[700]	train-poisson-nloglik:0.069277	valid-poisson-nloglik:0.069558
[800]	train-poisson-nloglik:0.066118	valid-poisson-nloglik:0.066499
[900]	train-poisson-nloglik:0.064476	valid-poisson-nloglik:0.064965
[1000]	train-poisson-nloglik:0.0636	valid-poisson-nloglik:0.064202
[1100]	train-poisson-nloglik:0.0631	valid-poisson-nloglik:0.063819
[1200]	train-poisson-nloglik:0.062791	valid-poisson-nloglik:0.063625
[1300]	train-poisson-nloglik:0.062578	valid-poisson-nloglik:0.063519
[1400]	train-poisson-nloglik:0.062412	valid-poisson-nloglik:0.063458
[1500]	train-poisson-nloglik:0.062273	valid-poisson-nloglik:0.063421
[1600]	train-poisson-nloglik:0.062143	valid-poisson-nloglik:0.063401
[1700]	train-poisson-nloglik:0.062027	valid-poisson-nloglik:0.063386
[1800]	train-poisson-nloglik:0.061911	valid-poisson-nloglik:0.063375
[1900]	train-poisson-nloglik:0.061802	valid-poisson-nloglik:0.063375
Stopping. Best iteration:
[1813]	train-poisson-nloglik:0.061895	valid-poisson-nloglik:0.063374

 fold: 2  of  5 : 
/home/kate/Research/Property/Models/wc_Poisson_XGB_All_bm_ecy_1.model file does not exists. Training model...
[0]	train-poisson-nloglik:0.488515	valid-poisson-nloglik:0.488267
Multiple eval metrics have been passed: 'valid-poisson-nloglik' will be used for early stopping.

Will train until valid-poisson-nloglik hasn't improved in 100 rounds.
[100]	train-poisson-nloglik:0.311215	valid-poisson-nloglik:0.31112
[200]	train-poisson-nloglik:0.205491	valid-poisson-nloglik:0.205503
[300]	train-poisson-nloglik:0.143171	valid-poisson-nloglik:0.143267
[400]	train-poisson-nloglik:0.10704	valid-poisson-nloglik:0.10722
[500]	train-poisson-nloglik:0.086561	valid-poisson-nloglik:0.086828
[600]	train-poisson-nloglik:0.075268	valid-poisson-nloglik:0.075638
[700]	train-poisson-nloglik:0.06922	valid-poisson-nloglik:0.069709
[800]	train-poisson-nloglik:0.066052	valid-poisson-nloglik:0.066673
[900]	train-poisson-nloglik:0.064409	valid-poisson-nloglik:0.065171
[1000]	train-poisson-nloglik:0.063525	valid-poisson-nloglik:0.064434
[1100]	train-poisson-nloglik:0.063025	valid-poisson-nloglik:0.064079
[1200]	train-poisson-nloglik:0.062725	valid-poisson-nloglik:0.063907
[1300]	train-poisson-nloglik:0.062522	valid-poisson-nloglik:0.063824
[1400]	train-poisson-nloglik:0.062359	valid-poisson-nloglik:0.063779
[1500]	train-poisson-nloglik:0.062234	valid-poisson-nloglik:0.063756
[1600]	train-poisson-nloglik:0.062116	valid-poisson-nloglik:0.063746
[1700]	train-poisson-nloglik:0.062004	valid-poisson-nloglik:0.063741
[1800]	train-poisson-nloglik:0.061893	valid-poisson-nloglik:0.063739
[1900]	train-poisson-nloglik:0.06178	valid-poisson-nloglik:0.063739
Stopping. Best iteration:
[1850]	train-poisson-nloglik:0.061838	valid-poisson-nloglik:0.063736

 fold: 3  of  5 : 
/home/kate/Research/Property/Models/wc_Poisson_XGB_All_bm_ecy_2.model file does not exists. Training model...
[0]	train-poisson-nloglik:0.48855	valid-poisson-nloglik:0.48813
Multiple eval metrics have been passed: 'valid-poisson-nloglik' will be used for early stopping.

Will train until valid-poisson-nloglik hasn't improved in 100 rounds.
[100]	train-poisson-nloglik:0.311281	valid-poisson-nloglik:0.3109
[200]	train-poisson-nloglik:0.205573	valid-poisson-nloglik:0.205234
[300]	train-poisson-nloglik:0.143255	valid-poisson-nloglik:0.142969
[400]	train-poisson-nloglik:0.10713	valid-poisson-nloglik:0.106912
[500]	train-poisson-nloglik:0.086649	valid-poisson-nloglik:0.086526
[600]	train-poisson-nloglik:0.075346	valid-poisson-nloglik:0.075345
[700]	train-poisson-nloglik:0.069285	valid-poisson-nloglik:0.069426
[800]	train-poisson-nloglik:0.066111	valid-poisson-nloglik:0.06642
[900]	train-poisson-nloglik:0.064458	valid-poisson-nloglik:0.064932
[1000]	train-poisson-nloglik:0.063573	valid-poisson-nloglik:0.064221
[1100]	train-poisson-nloglik:0.063061	valid-poisson-nloglik:0.063888
[1200]	train-poisson-nloglik:0.062738	valid-poisson-nloglik:0.063731
[1300]	train-poisson-nloglik:0.062518	valid-poisson-nloglik:0.063656
[1400]	train-poisson-nloglik:0.062344	valid-poisson-nloglik:0.063628
[1500]	train-poisson-nloglik:0.062202	valid-poisson-nloglik:0.063613
[1600]	train-poisson-nloglik:0.062077	valid-poisson-nloglik:0.063608
[1700]	train-poisson-nloglik:0.061952	valid-poisson-nloglik:0.063603
[1800]	train-poisson-nloglik:0.061833	valid-poisson-nloglik:0.063601
Stopping. Best iteration:
[1762]	train-poisson-nloglik:0.061882	valid-poisson-nloglik:0.0636

 fold: 4  of  5 : 
/home/kate/Research/Property/Models/wc_Poisson_XGB_All_bm_ecy_3.model file does not exists. Training model...
[0]	train-poisson-nloglik:0.488396	valid-poisson-nloglik:0.488748
Multiple eval metrics have been passed: 'valid-poisson-nloglik' will be used for early stopping.

Will train until valid-poisson-nloglik hasn't improved in 100 rounds.
[100]	train-poisson-nloglik:0.311156	valid-poisson-nloglik:0.311378
[200]	train-poisson-nloglik:0.205476	valid-poisson-nloglik:0.205632
[300]	train-poisson-nloglik:0.143177	valid-poisson-nloglik:0.143316
[400]	train-poisson-nloglik:0.107067	valid-poisson-nloglik:0.107225
[500]	train-poisson-nloglik:0.086594	valid-poisson-nloglik:0.086805
[600]	train-poisson-nloglik:0.075306	valid-poisson-nloglik:0.075602
[700]	train-poisson-nloglik:0.069251	valid-poisson-nloglik:0.069657
[800]	train-poisson-nloglik:0.066082	valid-poisson-nloglik:0.066622
[900]	train-poisson-nloglik:0.064434	valid-poisson-nloglik:0.065125
[1000]	train-poisson-nloglik:0.06355	valid-poisson-nloglik:0.064398
[1100]	train-poisson-nloglik:0.063047	valid-poisson-nloglik:0.064049
[1200]	train-poisson-nloglik:0.062743	valid-poisson-nloglik:0.063884
[1300]	train-poisson-nloglik:0.062531	valid-poisson-nloglik:0.063802
[1400]	train-poisson-nloglik:0.062368	valid-poisson-nloglik:0.063755
[1500]	train-poisson-nloglik:0.062231	valid-poisson-nloglik:0.063728
[1600]	train-poisson-nloglik:0.062106	valid-poisson-nloglik:0.06371
[1700]	train-poisson-nloglik:0.061984	valid-poisson-nloglik:0.063698
[1800]	train-poisson-nloglik:0.061871	valid-poisson-nloglik:0.063691
[1900]	train-poisson-nloglik:0.061758	valid-poisson-nloglik:0.063687
[2000]	train-poisson-nloglik:0.061643	valid-poisson-nloglik:0.063683
[2100]	train-poisson-nloglik:0.061533	valid-poisson-nloglik:0.063684
Stopping. Best iteration:
[2047]	train-poisson-nloglik:0.061593	valid-poisson-nloglik:0.063682

 fold: 5  of  5 : 
/home/kate/Research/Property/Models/wc_Poisson_XGB_All_bm_ecy_4.model file does not exists. Training model...
[0]	train-poisson-nloglik:0.488282	valid-poisson-nloglik:0.489203
Multiple eval metrics have been passed: 'valid-poisson-nloglik' will be used for early stopping.

Will train until valid-poisson-nloglik hasn't improved in 100 rounds.
[100]	train-poisson-nloglik:0.311069	valid-poisson-nloglik:0.311728
[200]	train-poisson-nloglik:0.205405	valid-poisson-nloglik:0.20592
[300]	train-poisson-nloglik:0.143116	valid-poisson-nloglik:0.143566
[400]	train-poisson-nloglik:0.107008	valid-poisson-nloglik:0.10745
[500]	train-poisson-nloglik:0.086536	valid-poisson-nloglik:0.087015
[600]	train-poisson-nloglik:0.075251	valid-poisson-nloglik:0.075804
[700]	train-poisson-nloglik:0.069199	valid-poisson-nloglik:0.069853
[800]	train-poisson-nloglik:0.066032	valid-poisson-nloglik:0.066805
[900]	train-poisson-nloglik:0.064389	valid-poisson-nloglik:0.06529
[1000]	train-poisson-nloglik:0.063509	valid-poisson-nloglik:0.064544
[1100]	train-poisson-nloglik:0.063004	valid-poisson-nloglik:0.064174
[1200]	train-poisson-nloglik:0.062683	valid-poisson-nloglik:0.063992
[1300]	train-poisson-nloglik:0.062465	valid-poisson-nloglik:0.063899
[1400]	train-poisson-nloglik:0.062297	valid-poisson-nloglik:0.06385
[1500]	train-poisson-nloglik:0.062157	valid-poisson-nloglik:0.063821
[1600]	train-poisson-nloglik:0.062029	valid-poisson-nloglik:0.063801
[1700]	train-poisson-nloglik:0.06191	valid-poisson-nloglik:0.063788
[1800]	train-poisson-nloglik:0.061793	valid-poisson-nloglik:0.063782
[1900]	train-poisson-nloglik:0.061688	valid-poisson-nloglik:0.063777
[2000]	train-poisson-nloglik:0.061581	valid-poisson-nloglik:0.063775
[2100]	train-poisson-nloglik:0.061468	valid-poisson-nloglik:0.063774
Stopping. Best iteration:
[2038]	train-poisson-nloglik:0.061535	valid-poisson-nloglik:0.063772

In [25]:
Scores = pd.DataFrame(list(zip(Train_Gini_l,Test_Gini_l,Train_LogLik_l,Test_LogLik_l)), 
               columns =['Train_Gini', 'Test_Gini','Train_nLogLik', 'Test_nLogLik']) 
Scores
Out[25]:
Train_Gini Test_Gini Train_nLogLik Test_nLogLik
0 0.501749 0.440039 0.061755 0.039204

Train Gini Test Gini 0.488423 0.441962 pure poisson xgb 0.5003 0.440047 poisson xgb + poisson GLM 0.501749 0.440039 poisson xgb + NB GLM

Adding Poisson GLM or NB GLM does not improve the result but makes higher overfitting. Can not add Classification XGB to test because it's in a different training dataset. It may improve results.