Tuning Full Model with Elastic Net Hyperparameters
Given a training set size for a specific date on all CAMEL variables, I first fit an elastic net model to that training set while validating the lambda and alpha parameters on the validation set. Recall that for a specified date, our dataset contains about n = 7731 financial institutions, so the typical example for a small training set size is:
- training_set = 100
- validation_set = 3816
- test_set = 3816
I’m of the opinion that the validation/test set sizes are overkill, but that’s OK. A word about the hyperparamater selection. Our series of parameters are accepted by the model: date of significance, training set size, minimum # of failures in a training set (simulations is nominally a parameter, but steadies at 100 so I’ll keep it there; the ‘best’ vs. ‘first’ logic for lambda selection from last week I’ve done away with, since there didn’t seem to be much of a difference between the two conventions.)
First, I loop over values of alpha surveying the whole range between 0.0, 0.1, … , 0.9, 1.0. For each alpha, I capture a sequence of lambdas using cv.glmnet (but don’t actually use the CV functionality – just gather the sequence). That sequence is used to fit an elastic-net model with the given alpha, and the best lambda which enforces our ratio rule (failures / predictors) for that alpha. For each alpha, that process occurs until we have a best-performing model in validation, with a specific alpha and lambda. Then we test.
Here’s how the whole thing performs against the single-variable models, given toggling some of the hyperparameters:
run_models("1.1: Elastic Net, training set = 100", "AUC", "elastic_net", 100, "2007-06-30", 100, 10)

run_models("1.2: Elastic Net, training set = 1000", "AUC", "elastic_net", 100, "2007-06-30", 1000, 10)

run_models("1.3: Elastic Net, training set = 100", "AUC", "elastic_net", 100, "2007-12-31", 100, 10)

run_models("1.4: Elastic Net, training set = 1000", "AUC", "elastic_net", 100, "2007-12-31", 1000, 10)

Our results here are generally unsurprising, notably:
- For a farther back time period (Q2 2007), the full model’s test AUC isn’t notably better than individual models, and is in fact worse than some of the individual predictors. This indicates to me some noise in the multiple-variable model during earlier time periods, even when 2-3 predictor variables are being removed by the elastic net. At this size/timeframe, elastic net performs slightly worse than pure lasso did as we saw last week (~.63, Chart 3.1).
- An increase in our training set size decreases bias across the board, and the full model outperforms all but one single variable handily (Tier 1 capital ratio is consistent throughout this week’s models for reliably measuring failure risk).
- Both “sides” of the elastic net seem to be utilized well – the lambda not close to zero in any cases, 2-3 variables being dropped in most cases, and alpha lingering between .4-.6.
- 1.4 is a promising result – big differential between test AUC and the nearest individual model – but that’s a bit close to the actual crisis years.
Also, I tested gathering the lambda from the same banks in the training set, but with the oldest data points in the dataset I’ve pulled (2004). While not visualized here (and a little cumbersome to code), the model performance wasn’t reaching an AUC of above .55 or an MSE of < .12. Suffice to say, the manual validation of alpha / lambda performs this task pretty well.
#### How does AUC change as sample size changes?
This was another intuitive result to recreate, where the pattern of “more complex models are generally overperformant when more data exists” can be seen in multiple examples. I declined to visualize this, since it becomes tricky when different individual models knock one another off for best performer across different sample sizes.
Here’s a display of a bunch of examples of these across different full model types (lasso, ridge, etc.) and time periods. The function is hard-code to the same range of minimum failures, simulations, etc.:
sample_size_to_AUC_differential
sample_size_to_AUC_differential("lasso", "2007-06-30")
sample_size_to_AUC_differential("ridge", "2007-06-30")
sample_size_to_AUC_differential("logit", "2007-06-30")
And similarly for early 2007…
sample_size_to_AUC_differential
sample_size_to_AUC_differential("lasso", "2007-03-31")
sample_size_to_AUC_differential("ridge", "2007-03-31")
sample_size_to_AUC_differential("logit", "2007-03-31")
And finally, in late 2007 – presumably more accurate across the board…
sample_size_to_AUC_differential("lasso", "2007-12-31")
sample_size_to_AUC_differential("ridge", "2007-12-31")
sample_size_to_AUC_differential("logit", "2007-12-31")
LS0tCnRpdGxlOiAiV2VlayAxMDogRWxhc3RpYyBOZXQsIENveCBhbmQgTW9yZSIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0Kc291cmNlKCJQcmUtUHJvY2Vzc2luZy5SIikKc291cmNlKCJMQVNTTyBFbGFzdGljIE5ldCBDb3guUiIpCmBgYAoKIyMjIyBUdW5pbmcgRnVsbCBNb2RlbCB3aXRoIEVsYXN0aWMgTmV0IEh5cGVycGFyYW1ldGVycwoKR2l2ZW4gYSB0cmFpbmluZyBzZXQgc2l6ZSBmb3IgYSBzcGVjaWZpYyBkYXRlIG9uIGFsbCBDQU1FTCB2YXJpYWJsZXMsIEkgZmlyc3QgZml0IGFuIGVsYXN0aWMgbmV0IG1vZGVsIHRvIHRoYXQgdHJhaW5pbmcgc2V0IHdoaWxlIHZhbGlkYXRpbmcgdGhlIF9sYW1iZGFfIGFuZCBfYWxwaGFfIHBhcmFtZXRlcnMgb24gdGhlIHZhbGlkYXRpb24gc2V0LiBSZWNhbGwgdGhhdCBmb3IgYSBzcGVjaWZpZWQgZGF0ZSwgb3VyIGRhdGFzZXQgY29udGFpbnMgYWJvdXQgX24gPSA3NzMxXyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLCBzbyB0aGUgdHlwaWNhbCBleGFtcGxlIGZvciBhIHNtYWxsIHRyYWluaW5nIHNldCBzaXplIGlzOgoKIC0gdHJhaW5pbmdfc2V0ID0gMTAwCiAtIHZhbGlkYXRpb25fc2V0ID0gMzgxNgogLSB0ZXN0X3NldCA9IDM4MTYKCkknbSBvZiB0aGUgb3BpbmlvbiB0aGF0IHRoZSB2YWxpZGF0aW9uL3Rlc3Qgc2V0IHNpemVzIGFyZSBvdmVya2lsbCwgYnV0IHRoYXQncyBPSy4gQSB3b3JkIGFib3V0IHRoZSBoeXBlcnBhcmFtYXRlciBzZWxlY3Rpb24uIE91ciBzZXJpZXMgb2YgcGFyYW1ldGVycyBhcmUgYWNjZXB0ZWQgYnkgdGhlIG1vZGVsOiBkYXRlIG9mIHNpZ25pZmljYW5jZSwgdHJhaW5pbmcgc2V0IHNpemUsIG1pbmltdW0gIyBvZiBmYWlsdXJlcyBpbiBhIHRyYWluaW5nIHNldCAoc2ltdWxhdGlvbnMgaXMgbm9taW5hbGx5IGEgcGFyYW1ldGVyLCBidXQgc3RlYWRpZXMgYXQgMTAwIHNvIEknbGwga2VlcCBpdCB0aGVyZTsgdGhlICdiZXN0JyB2cy4gJ2ZpcnN0JyBsb2dpYyBmb3IgbGFtYmRhIHNlbGVjdGlvbiBmcm9tIGxhc3Qgd2VlayBJJ3ZlIGRvbmUgYXdheSB3aXRoLCBzaW5jZSB0aGVyZSBkaWRuJ3Qgc2VlbSB0byBiZSBtdWNoIG9mIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0d28gY29udmVudGlvbnMuKSAKCkZpcnN0LCBJIGxvb3Agb3ZlciB2YWx1ZXMgb2YgX2FscGhhXyBzdXJ2ZXlpbmcgdGhlIHdob2xlIHJhbmdlIGJldHdlZW4gMC4wLCAwLjEsIC4uLiAsIDAuOSwgMS4wLiBGb3IgZWFjaCBfYWxwaGFfLCBJIGNhcHR1cmUgYSBzZXF1ZW5jZSBvZiBsYW1iZGFzIHVzaW5nIGN2LmdsbW5ldCAoYnV0IGRvbid0IGFjdHVhbGx5IHVzZSB0aGUgQ1YgZnVuY3Rpb25hbGl0eSAtLSBqdXN0IGdhdGhlciB0aGUgc2VxdWVuY2UpLiBUaGF0IHNlcXVlbmNlIGlzIHVzZWQgdG8gZml0IGFuIGVsYXN0aWMtbmV0IG1vZGVsIHdpdGggdGhlIGdpdmVuIGFscGhhLCBhbmQgdGhlIGJlc3QgbGFtYmRhIHdoaWNoIGVuZm9yY2VzIG91ciByYXRpbyBydWxlIChmYWlsdXJlcyAvIHByZWRpY3RvcnMpIGZvciB0aGF0IGFscGhhLiBGb3IgX2VhY2ggYWxwaGFfLCB0aGF0IHByb2Nlc3Mgb2NjdXJzIHVudGlsIHdlIGhhdmUgYSBiZXN0LXBlcmZvcm1pbmcgbW9kZWwgaW4gdmFsaWRhdGlvbiwgd2l0aCBhIHNwZWNpZmljIF9hbHBoYV8gYW5kIF9sYW1iZGFfLiBUaGVuIHdlIHRlc3QuCgpIZXJlJ3MgaG93IHRoZSB3aG9sZSB0aGluZyBwZXJmb3JtcyBhZ2FpbnN0IHRoZSBzaW5nbGUtdmFyaWFibGUgbW9kZWxzLCBnaXZlbiB0b2dnbGluZyBzb21lIG9mIHRoZSBoeXBlcnBhcmFtZXRlcnM6CgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpydW5fbW9kZWxzKCIxLjE6IEVsYXN0aWMgTmV0LCB0cmFpbmluZyBzZXQgPSAxMDAiLCAiQVVDIiwgImVsYXN0aWNfbmV0IiwgMTAwLCAiMjAwNy0wNi0zMCIsIDEwMCwgMTApCnJ1bl9tb2RlbHMoIjEuMjogRWxhc3RpYyBOZXQsIHRyYWluaW5nIHNldCA9IDEwMDAiLCAiQVVDIiwgImVsYXN0aWNfbmV0IiwgMTAwLCAiMjAwNy0wNi0zMCIsIDEwMDAsIDEwKQpgYGAKCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnJ1bl9tb2RlbHMoIjEuMzogRWxhc3RpYyBOZXQsIHRyYWluaW5nIHNldCA9IDEwMCIsICJBVUMiLCAiZWxhc3RpY19uZXQiLCAxMDAsICIyMDA3LTEyLTMxIiwgMTAwLCAxMCkKcnVuX21vZGVscygiMS40OiBFbGFzdGljIE5ldCwgdHJhaW5pbmcgc2V0ID0gMTAwMCIsICJBVUMiLCAiZWxhc3RpY19uZXQiLCAxMDAsICIyMDA3LTEyLTMxIiwgMTAwMCwgMTApCmBgYAoKT3VyIHJlc3VsdHMgaGVyZSBhcmUgZ2VuZXJhbGx5IHVuc3VycHJpc2luZywgbm90YWJseToKCiAtIEZvciBhIGZhcnRoZXIgYmFjayB0aW1lIHBlcmlvZCAoUTIgMjAwNyksIHRoZSBmdWxsIG1vZGVsJ3MgdGVzdCBBVUMgaXNuJ3Qgbm90YWJseSBiZXR0ZXIgdGhhbiBpbmRpdmlkdWFsIG1vZGVscywgYW5kIGlzIGluIGZhY3Qgd29yc2UgdGhhbiBzb21lIG9mIHRoZSBpbmRpdmlkdWFsIHByZWRpY3RvcnMuIFRoaXMgaW5kaWNhdGVzIHRvIG1lIHNvbWUgbm9pc2UgaW4gdGhlIG11bHRpcGxlLXZhcmlhYmxlIG1vZGVsIGR1cmluZyBlYXJsaWVyIHRpbWUgcGVyaW9kcywgZXZlbiB3aGVuIDItMyBwcmVkaWN0b3IgdmFyaWFibGVzIGFyZSBiZWluZyByZW1vdmVkIGJ5IHRoZSBlbGFzdGljIG5ldC4gQXQgdGhpcyBzaXplL3RpbWVmcmFtZSwgZWxhc3RpYyBuZXQgcGVyZm9ybXMgc2xpZ2h0bHkgd29yc2UgdGhhbiBwdXJlIGxhc3NvIGRpZCBhcyB3ZSBzYXcgbGFzdCB3ZWVrICh+LjYzLCBDaGFydCAzLjEpLiAKIC0gQW4gaW5jcmVhc2UgaW4gb3VyIHRyYWluaW5nIHNldCBzaXplIGRlY3JlYXNlcyBiaWFzIGFjcm9zcyB0aGUgYm9hcmQsIGFuZCB0aGUgZnVsbCBtb2RlbCBvdXRwZXJmb3JtcyBhbGwgYnV0IG9uZSBzaW5nbGUgdmFyaWFibGUgaGFuZGlseSAoVGllciAxIGNhcGl0YWwgcmF0aW8gaXMgY29uc2lzdGVudCB0aHJvdWdob3V0IHRoaXMgd2VlaydzIG1vZGVscyBmb3IgcmVsaWFibHkgbWVhc3VyaW5nIGZhaWx1cmUgcmlzaykuIAogLSBCb3RoICJzaWRlcyIgb2YgdGhlIGVsYXN0aWMgbmV0IHNlZW0gdG8gYmUgdXRpbGl6ZWQgd2VsbCAtLSB0aGUgbGFtYmRhIG5vdCBjbG9zZSB0byB6ZXJvIGluIGFueSBjYXNlcywgMi0zIHZhcmlhYmxlcyBiZWluZyBkcm9wcGVkIGluIG1vc3QgY2FzZXMsIGFuZCBhbHBoYSBsaW5nZXJpbmcgYmV0d2VlbiAuNC0uNi4gCiAtIDEuNCBpcyBhIHByb21pc2luZyByZXN1bHQgLS0gYmlnIGRpZmZlcmVudGlhbCBiZXR3ZWVuIHRlc3QgQVVDIGFuZCB0aGUgbmVhcmVzdCBpbmRpdmlkdWFsIG1vZGVsIC0tIGJ1dCB0aGF0J3MgYSBiaXQgY2xvc2UgdG8gdGhlIGFjdHVhbCBjcmlzaXMgeWVhcnMuCiAKICpBbHNvKiwgSSB0ZXN0ZWQgZ2F0aGVyaW5nIHRoZSBsYW1iZGEgZnJvbSB0aGUgc2FtZSBiYW5rcyBpbiB0aGUgdHJhaW5pbmcgc2V0LCBidXQgd2l0aCB0aGUgb2xkZXN0IGRhdGEgcG9pbnRzIGluIHRoZSBkYXRhc2V0IEkndmUgcHVsbGVkICgyMDA0KS4gV2hpbGUgbm90IHZpc3VhbGl6ZWQgaGVyZSAoYW5kIGEgbGl0dGxlIGN1bWJlcnNvbWUgdG8gY29kZSksIHRoZSBtb2RlbCBwZXJmb3JtYW5jZSB3YXNuJ3QgcmVhY2hpbmcgYW4gQVVDIG9mIGFib3ZlIC41NSBvciBhbiBNU0Ugb2YgPCAuMTIuIFN1ZmZpY2UgdG8gc2F5LCB0aGUgbWFudWFsIHZhbGlkYXRpb24gb2YgYWxwaGEgLyBsYW1iZGEgcGVyZm9ybXMgdGhpcyB0YXNrIHByZXR0eSB3ZWxsLiAKIAogIyMjIyBIb3cgZG9lcyBBVUMgY2hhbmdlIGFzIHNhbXBsZSBzaXplIGNoYW5nZXM/IAogClRoaXMgd2FzIGFub3RoZXIgaW50dWl0aXZlIHJlc3VsdCB0byByZWNyZWF0ZSwgd2hlcmUgdGhlIHBhdHRlcm4gb2YgIm1vcmUgY29tcGxleCBtb2RlbHMgYXJlIGdlbmVyYWxseSBvdmVycGVyZm9ybWFudCB3aGVuIG1vcmUgZGF0YSBleGlzdHMiIGNhbiBiZSBzZWVuIGluIG11bHRpcGxlIGV4YW1wbGVzLiBJIGRlY2xpbmVkIHRvIHZpc3VhbGl6ZSB0aGlzLCBzaW5jZSBpdCBiZWNvbWVzIHRyaWNreSB3aGVuIGRpZmZlcmVudCBpbmRpdmlkdWFsIG1vZGVscyBrbm9jayBvbmUgYW5vdGhlciBvZmYgZm9yIGJlc3QgcGVyZm9ybWVyIGFjcm9zcyBkaWZmZXJlbnQgc2FtcGxlIHNpemVzLgoKSGVyZSdzIGEgZGlzcGxheSBvZiBhIGJ1bmNoIG9mIGV4YW1wbGVzIG9mIHRoZXNlIGFjcm9zcyBkaWZmZXJlbnQgZnVsbCBtb2RlbCB0eXBlcyAobGFzc28sIHJpZGdlLCBldGMuKSBhbmQgdGltZSBwZXJpb2RzLiBUaGUgZnVuY3Rpb24gaXMgaGFyZC1jb2RlIHRvIHRoZSBzYW1lIHJhbmdlIG9mIG1pbmltdW0gZmFpbHVyZXMsIHNpbXVsYXRpb25zLCBldGMuOgoKc2FtcGxlX3NpemVfdG9fQVVDX2RpZmZlcmVudGlhbApgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpzYW1wbGVfc2l6ZV90b19BVUNfZGlmZmVyZW50aWFsKCJsYXNzbyIsICIyMDA3LTA2LTMwIikKc2FtcGxlX3NpemVfdG9fQVVDX2RpZmZlcmVudGlhbCgicmlkZ2UiLCAiMjAwNy0wNi0zMCIpCnNhbXBsZV9zaXplX3RvX0FVQ19kaWZmZXJlbnRpYWwoImxvZ2l0IiwgIjIwMDctMDYtMzAiKQpgYGAKCkFuZCBzaW1pbGFybHkgZm9yIGVhcmx5IDIwMDcuLi4KCnNhbXBsZV9zaXplX3RvX0FVQ19kaWZmZXJlbnRpYWwKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0Kc2FtcGxlX3NpemVfdG9fQVVDX2RpZmZlcmVudGlhbCgibGFzc28iLCAiMjAwNy0wMy0zMSIpCnNhbXBsZV9zaXplX3RvX0FVQ19kaWZmZXJlbnRpYWwoInJpZGdlIiwgIjIwMDctMDMtMzEiKQpzYW1wbGVfc2l6ZV90b19BVUNfZGlmZmVyZW50aWFsKCJsb2dpdCIsICIyMDA3LTAzLTMxIikKYGBgCgoKQW5kIGZpbmFsbHksIGluIGxhdGUgMjAwNyAtLSBwcmVzdW1hYmx5IG1vcmUgYWNjdXJhdGUgYWNyb3NzIHRoZSBib2FyZC4uLgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpzYW1wbGVfc2l6ZV90b19BVUNfZGlmZmVyZW50aWFsKCJsYXNzbyIsICIyMDA3LTEyLTMxIikKc2FtcGxlX3NpemVfdG9fQVVDX2RpZmZlcmVudGlhbCgicmlkZ2UiLCAiMjAwNy0xMi0zMSIpCnNhbXBsZV9zaXplX3RvX0FVQ19kaWZmZXJlbnRpYWwoImxvZ2l0IiwgIjIwMDctMTItMzEiKQpgYGA=