លំហសិក្សាធិការកម្ពុជា
V1.0
The rapid expansion of consumer lending, digital banking, and other technology-enabled financial services increases the need for timely and consistent credit-risk assessment. Traditional loan underwriting commonly relies on predefined rules and manual review of income, employment, collateral, guarantors, and credit-bureau information. Although such approaches remain important, they can be slow and may have limited ability to identify complex, non-linear relationships among borrower and loan characteristics. This study develops and evaluates a machine-learning-based loan risk prediction framework for binary classification of loans into lower-risk and higher-risk outcomes. The project uses an approximately one-million-record historical loan dataset obtained from Kaggle, with 57 attributes in the supplied schema. The methodology includes data cleaning, missing-value handling, categorical encoding, numerical scaling, outlier treatment, feature engineering, stratified train-test splitting, model training, hyperparameter tuning, and iterative refinement. Five supervised learning approaches were compared: Logistic Regression, Decision Tree, Random Forest, Gradient Boosting, and XGBoost. The reported test ROC-AUC scores were 0.7024, 0.5515, 0.7165, 0.7193, and 0.7266, respectively, making XGBoost the best untuned model. After hyperparameter tuning, XGBoost achieved a test ROC-AUC of 0.7273. The results indicate that XGBoost provides the strongest overall discrimination among the tested models, while threshold selection remains a critical business decision because it changes the balance between approving good customers and preventing default exposure. The proposed framework also includes model export using joblib and deployment through a REST API and web application. The study demonstrates the potential of machine learning as a decision-support tool for credit risk management, while emphasizing that local Cambodian loan data, cost-sensitive thresholding, monitoring, and explainability are required before production deployment.
Credit risk is a central concern in retail and commercial banking because a lending decision creates both an opportunity for income and an exposure to future loss. As financial institutions expand consumer lending, SME financing, credit cards, and digital loan channels, the number of applications that must be evaluated can grow faster than the capacity of manual underwriting teams. The project presentation identifies this challenge in the Cambodian banking context, where loan officers may rely on salary documents, guarantors, collateral, and Credit Bureau Cambodia (CBC) reports while applying institutional credit policies. The project argues that manual evaluation can be time-consuming, operationally intensive, and less capable of discovering complex relationships among borrower characteristics.
The Cambodian context provides a meaningful motivation for data-driven credit-risk research. The National Bank of Cambodia (NBC) reported that banking-sector assets increased by 8.2% in 2024 to KHR 342.8 trillion (approximately USD 84.6 billion), while credit increased by 3.3% to KHR 220.1 trillion (approximately USD 54.3 billion). The same report indicates that personal lending represented 10.1% of banking-sector credit and mortgages represented 12.5%, illustrating the scale of retail-oriented lending activity. These figures do not prove that machine learning is required, but they demonstrate why efficient and robust credit-risk processes are strategically relevant. [6]
The central problem addressed in this study is therefore not simply whether a machine-learning algorithm can classify historical loans. The more practical question is whether a model can provide useful risk ranking while maintaining an acceptable balance between credit losses and lost business opportunities. A model that rejects too many good customers can reduce revenue and customer acquisition, whereas a model that approves too many risky borrowers can increase expected credit losses and collection workload. Consequently, model evaluation must include discrimination metrics such as ROC-AUC and class-specific precision and recall, together with business-oriented analysis of decision thresholds.
The primary objective is to develop an ML-based loan-risk prediction model using historical loan data and to compare multiple supervised learning algorithms. The project also aims to identify influential risk variables, improve model performance through tuning and iterative refinement, and demonstrate a deployment path through a REST API and web application. The intended application is decision support for loan approval, risk classification, and credit-policy review rather than fully autonomous lending without human oversight.
The main contributions of the study are:
· A complete credit-risk modelling workflow covering data preparation, feature engineering, model training, evaluation, tuning, refinement, and deployment.
· A comparative experiment involving Logistic Regression, Decision Tree, Random Forest, Gradient Boosting, and XGBoost.
· An empirical demonstration that XGBoost produced the highest reported test ROC-AUC among the tested models and improved slightly after tuning.
· A business interpretation of confusion-matrix trade-offs, showing how different decision thresholds affect approval volume and default capture.
· A deployment-oriented design using a reusable preprocessing/model pipeline, joblib serialization, REST API, and web interface.
Credit scoring is commonly formulated as a classification problem in which historical borrower information is used to estimate the probability that an applicant will exhibit an undesirable future outcome, such as default. The literature has developed from statistical scorecards toward a wider set of machine-learning classifiers. Louzada, Ara, and Fernandes reviewed binary classification techniques used in credit scoring and highlighted the importance of comparing alternative methods rather than assuming that one algorithm is universally optimal. [2]
Logistic Regression remains an important benchmark because it is relatively simple, computationally efficient, and easier to interpret than many ensemble models. Its limitation in this application is that a basic linear decision boundary may not capture interactions and non-linear relationships among income, debt burden, credit utilization, delinquency history, loan characteristics, and other variables. This limitation motivates comparison with tree-based models.
Decision Trees can represent non-linear decision rules and are intuitive to visualize, but a fully grown tree can memorize the training data. Random Forest reduces some of this instability by aggregating many decision trees trained with randomized samples and feature subsets. Gradient Boosting constructs a sequence of weak learners in which later learners focus on previous errors. XGBoost extends gradient boosting with engineering and algorithmic improvements for efficient and scalable tree boosting. Chen and Guestrin describe XGBoost as a scalable tree-boosting system designed for large-scale machine-learning tasks. [3]
The credit-scoring literature also shows that model comparison should not rely only on accuracy. Lessmann et al. benchmarked 41 classifiers across eight real-world credit-scoring datasets and concluded that several ensemble approaches can outperform the traditional Logistic Regression benchmark. Their work also emphasizes the managerial relevance of scorecard performance, which supports the approach adopted in this project: comparing several models and then interpreting the results from a business perspective rather than selecting a model only because it has a high training score. [1]
Another important issue is explainability. Credit decisions can affect access to financial services, so a model should be sufficiently understandable for credit officers, risk managers, model validators, and customers where appropriate. Research on explainable AI in credit risk has explored SHAP and LIME to provide global and local explanations for machine-learning credit models. [4], [5] Although the present project does not report a completed SHAP analysis, its feature-importance objective and deployment architecture provide a suitable foundation for adding explainability before production use.
For Cambodia, the research opportunity is especially relevant because the country's financial system contains commercial banks, specialized banks, microfinance institutions, and other financial institutions under NBC supervision. NBC reports that, as of December 2024, the banking system included 59 commercial banks, 9 specialized banks, 89 microfinance institutions, and other financial-sector institutions. [7] The project therefore positions machine learning as a potential decision-support capability for a diverse and increasingly digital lending environment. However, an important limitation must be stated: the experimental dataset supplied for this project is a Kaggle historical loan dataset with fields such as U.S. states, ZIP-code prefixes, FICO ranges, and LendingClub-style loan statuses. Therefore, the reported results should be interpreted as a proof of concept rather than evidence that the model is already valid for Cambodian borrowers.
The study follows a supervised binary-classification workflow. Historical loan records are transformed into model-ready features, a target label is defined from the historical loan outcome, multiple classifiers are trained, and their predictions are evaluated on unseen data. The workflow is designed to support both academic model comparison and a practical deployment path.

Figure 1. End-to-end workflow used by the project, from historical loan data to deployment.
The final project presentation states that the dataset contains approximately one million records and was downloaded from Kaggle. The supplied data schema contains 57 attributes. The records include loan characteristics, employment and income information, credit-history variables, debt and utilization variables, loan outcomes, and several post-origination payment fields.
Feature group | Representative variables |
Loan attributes | loan_amnt, term, int_rate, grade, sub_grade, purpose, application_type |
Employment and income | emp_title, emp_length, annual_inc, verification_status |
Credit history | fico_range_high, earliest_cr_line, delinq_2yrs, inq_last_6mths, open_acc, total_acc, pub_rec |
Debt and utilization | dti, revol_bal, revol_util, total_bal_ex_mort, tot_cur_bal, bc_open_to_buy |
Public/negative credit signals | pub_rec_bankruptcies, tax_liens, collections_12_mths_ex_med, chargeoff_within_12_mths |
Outcome/payment fields | loan_status, total_pymnt, recoveries, last_pymnt_amnt, last_fico_range_high |
Table 1. Main feature groups represented in the supplied 57-column loan schema.
The target variable is loan_status. For the project's binary classification, Fully Paid is treated as the non-default class (0), while Charged Off/Default is treated as the default-risk class (1). The classification reports in the final presentation contain 197,510 evaluation observations: 158,131 non-default observations and 39,379 default observations. This corresponds to approximately 80.1% non-default and 19.9% default observations, demonstrating class imbalance.
Data preprocessing was designed to make the historical records consistent and suitable for supervised learning. The final presentation reports five major preparation activities: data cleaning, feature engineering, missing-value handling, outlier treatment, and an 80/20 stratified train-test split.
1. Duplicate and irrelevant records/columns were removed where appropriate, and formats and data types were standardized.
2. Missing numerical values were imputed using median or domain logic, while categorical gaps were filled with a mode or an Unknown category. Missingness may also be flagged when it carries predictive information.
3. Categorical variables were encoded numerically, while numerical variables were scaled. A OneHotEncoder-based preprocessing component was used in the deployment pipeline.
4. Extreme observations were detected using IQR and z-score methods. The project reports removing or capping outliers in variables such as income, loan amount, and repayment duration while checking that class balance was not unintentionally distorted.
5. Feature engineering included a Debt-to-Income (DTI) measure, a repayment score, and a utilization score as described in the final presentation. The exact mathematical formula for the repayment score is not specified in the supplied presentation and should therefore be documented in the implementation appendix before final submission.
An important data-leakage consideration is that several fields in the supplied schema are generated after a loan has been issued. Examples include total_pymnt, total_rec_int, recoveries, last_pymnt_d, last_pymnt_amnt, and last_credit_pull_d. These variables can reveal information about the future performance of a loan and should not be used as predictors for an approval-time model. A production credit-application model should use only information available at or before the application decision.
The final presentation specifies an 80% training and 20% testing split with stratification. Stratification preserves the relative distribution of default and non-default observations in both partitions. For hyperparameter selection, the project used systematic search within the training data. The final test set should be treated as an untouched holdout for the final performance estimate. Because the project materials report train and test AUC for several models, the experiment log also provides a direct view of generalization behavior.
Model | Role | Reason for inclusion |
Logistic Regression | Baseline / interpretable | Provides a transparent benchmark and a commonly used credit-scoring reference. |
Decision Tree | Non-linear single tree | Captures rule-based relationships but is vulnerable to overfitting. |
Random Forest | Bagging ensemble | Combines many trees and can model non-linear relationships more robustly. |
Gradient Boosting | Boosting ensemble | Sequentially improves weak learners to capture complex patterns. |
XGBoost | Optimized boosting ensemble | Strong tabular-data performance and efficient gradient boosting. |
Table 2. Machine-learning algorithms evaluated in the project.
ROC-AUC is the primary ranking metric reported in the project because it evaluates how well the model separates default and non-default observations over different classification thresholds. Accuracy measures the overall proportion of correct predictions, but it can be misleading under class imbalance. Precision for the default class measures the proportion of predicted defaults that are truly defaults, while recall measures the proportion of actual defaults that the model identifies. F1-score summarizes precision and recall using their harmonic mean.
For a banking application, the most useful interpretation is not 'which model has the highest accuracy?' but 'which model gives the bank the best risk ranking and decision trade-off for its risk appetite and expected economics?' The final decision threshold should therefore be selected using business costs such as probability of default (PD), loss given default (LGD), exposure at default (EAD), expected interest/revenue, and the opportunity cost of rejecting good borrowers.
The project tuned XGBoost using a systematic search. The reported best configuration was: max_depth = 4, n_estimators = 841, learning_rate ≈ 0.06336, subsample ≈ 0.76441, and colsample_bytree ≈ 0.99910. The tuned model achieved a test ROC-AUC of 0.7273 compared with 0.7266 for the untuned XGBoost model. The improvement of 0.0007 is small in AUC terms, which is itself an important result: tuning did not transform the model's ranking capability dramatically, although it changed the classification behavior observed in the reported classification metrics.
A rigorous experiment log should retain each tested parameter combination, validation score, training time, and rank. This allows the research team to explain why a parameter configuration was selected and makes the model-development process reproducible.
The project uses an iterative refinement cycle: train, evaluate, learn from errors and feature behavior, improve the data/model/threshold, and repeat. This is necessary because a model that performs well on training data can still fail on unseen applicants. The final experiment table demonstrates this issue clearly: the Decision Tree and Random Forest obtained extremely high training AUC values (1.0000 and 0.9990) but much lower test AUC values (0.5515 and 0.7165), indicating substantial overfitting.
The project defines the AUC gap as Train AUC − Test AUC and uses it as a practical diagnostic. The supplied experiment report labels gaps greater than 0.10 as overfitting, gaps below −0.05 as underfitting, and values between those limits as balanced. This rule is a project-specific diagnostic rather than a universal statistical standard, but it is useful for documenting model behavior consistently across experiments.
The final presentation demonstrates a deployment-oriented design. OneHotEncoder converts categorical inputs into numerical representations; a feature-list component ensures that the production input columns remain consistent with the training order; the trained model generates a probability of default; and a full pipeline keeps preprocessing and prediction together. The pipeline is serialized using joblib so that the exact trained object can be loaded by an application without retraining. The project then exposes the prediction service through a REST API and provides a web-based interface for users. This separation between training and inference is important because production systems must reproduce the same transformation logic used during model development.
The supplied classification reports evaluate 197,510 observations. Of these, 158,131 belong to class 0 (paid/non-default) and 39,379 belong to class 1 (default). The class ratio is therefore approximately 80:20. This imbalance explains why a model can achieve around 80% accuracy while still performing poorly at identifying defaults. For credit risk, class-specific recall and precision are therefore essential.
Model | Train AUC | Test AUC | AUC Gap | Train F1 | Test F1 | Project status |
Logistic Regression | 0.7016 | 0.7024 | -0.0009 | 0.1138 | 0.1098 | Balanced |
SGD Classifier | 0.5046 | 0.5056 | -0.0010 | 0.0314 | 0.0344 | Balanced |
Decision Tree | 1.0000 | 0.5515 | 0.4485 | 1.0000 | 0.2851 | Overfitting |
Random Forest | 0.9990 | 0.7165 | 0.2825 | 0.9677 | 0.3108 | Overfitting |
XGBoost | 0.7441 | 0.7266 | 0.0175 | 0.1676 | 0.1494 | Balanced |
Gradient Boosting | 0.7198 | 0.7193 | 0.0005 | 0.1290 | 0.1247 | Balanced |
XGBoost Tuned | 0.7362 | 0.7273 | 0.0090 | 0.4476 | 0.4401 | Balanced |
Table 3. Experiment tracking results reported in the final project presentation.

Figure 2. Test ROC-AUC comparison. XGBoost has the highest untuned score, and tuned XGBoost is slightly higher.

Figure 3. AUC gaps indicate strong overfitting for the Decision Tree and Random Forest, while XGBoost and Gradient Boosting generalize more consistently.
The strongest untuned model is XGBoost with a test ROC-AUC of 0.7266, followed by Gradient Boosting at 0.7193 and Random Forest at 0.7165. Logistic Regression achieved 0.7024, while Decision Tree achieved only 0.5515. The Decision Tree result is especially important because its training AUC was 1.0000, showing that excellent training performance did not translate into generalization. Random Forest shows a similar, although less extreme, pattern with 0.9990 training AUC and 0.7165 test AUC.
Model | Accuracy | Default Precision | Default Recall | Default F1 | ROC-AUC |
Logistic Regression | 0.80 | 0.51 | 0.06 | 0.11 | 0.7024 |
XGBoost | 0.80 | 0.57 | 0.09 | 0.15 | 0.7266 |
Decision Tree | 0.71 | 0.28 | 0.29 | 0.29 | 0.5515 |
Random Forest | 0.79 | 0.46 | 0.23 | 0.31 | 0.7165 |
Gradient Boosting | 0.80 | 0.56 | 0.07 | 0.12 | 0.7193 |
XGBoost Tuned | 0.65 | 0.33 | 0.68 | 0.44 | 0.7273 |
Table 4. Reported classification metrics for the main model experiments.
The classification results reveal an important distinction between ranking performance and a single binary decision threshold. The untuned XGBoost model has a ROC-AUC of 0.7266, but its reported default-class recall is only 0.09. In other words, under the classification setting used for that report, only about 9% of actual defaults were identified. The tuned XGBoost report has a similar ROC-AUC of 0.7273 but a default recall of 0.68 and default F1-score of 0.44. This indicates that tuning and/or the classification configuration produced a much more risk-sensitive decision rule. For a banking application, this is exactly why AUC should not be treated as the final approval policy: the bank must separately choose a threshold and evaluate the resulting business consequences.
Parameter | Selected value |
colsample_bytree | 0.999096 |
learning_rate | 0.063356 |
max_depth | 4 |
n_estimators | 841 |
subsample | 0.764415 |
Test ROC-AUC | 0.7273 |
Table 5. Best XGBoost hyperparameters reported by the project.
The tuned configuration increased test ROC-AUC from 0.7266 to 0.7273. This is a modest improvement, but the tuning experiment also produced a substantially stronger default-class recall and F1-score in the reported classification output. The result suggests that the model's ranking quality changed only slightly while its operating point changed substantially. A production implementation should explicitly record the threshold used to generate each classification report so that model improvement and threshold adjustment are not confused.

Figure 4. Threshold-based confusion matrix: 77,028 good loans predicted paid, 81,103 good loans predicted default, 7,198 defaults predicted paid, and 32,181 defaults predicted default.

Figure 5. Alternative threshold-based confusion matrix: 102,496 good loans predicted paid, 55,635 good loans predicted default, 12,576 defaults predicted paid, and 26,803 defaults predicted default.
Strategy | Good approved | Good rejected | Bad approved | Bad rejected | Overall approval rate | Default capture |
Strategy A | 77,028 | 81,103 | 7,198 | 32,181 | 42.6% | 81.7% |
Strategy B | 102,496 | 55,635 | 12,576 | 26,803 | 58.3% | 68.1% |
Table 6. Business interpretation of the two threshold-based confusion matrices.
Strategy A is more conservative. It approves fewer borrowers overall (approximately 42.6%) and captures about 81.7% of actual defaults, while only 7,198 default cases are classified as paid. The cost is that 81,103 good customers are rejected. Strategy B is more growth-oriented: approximately 58.3% of applications are approved and 102,496 good customers are accepted, but 12,576 default cases are also approved. Its default capture falls to about 68.1%.
From a human perspective, the difference is simple: Strategy A says, 'When uncertain, protect the bank from losses,' while Strategy B says, 'When uncertain, give more customers a chance to borrow.' Neither strategy is automatically correct. A bank with a low risk appetite may prefer the conservative strategy, while a bank seeking growth may accept more risk if expected returns justify it. The final threshold should therefore be chosen using expected-loss and profitability analysis rather than a generic 0.50 probability cutoff.
XGBoost was selected as the project winner because it achieved the highest test ROC-AUC among the five principal algorithms: 0.7266 before tuning and 0.7273 after tuning. The model also showed a relatively small train-test AUC gap compared with the Decision Tree and Random Forest. This indicates a better balance between learning the training patterns and generalizing to unseen observations. The result is consistent with prior credit-scoring research showing that ensemble methods can provide strong predictive performance compared with traditional Logistic Regression benchmarks. [1]
The result should not be interpreted as proof that XGBoost is always the best credit-scoring model. Model performance depends on the dataset, feature definitions, target window, class imbalance, preprocessing, calibration, and economic environment. The correct conclusion from this experiment is narrower: XGBoost was the strongest model among the algorithms tested on this dataset under the project's evaluation procedure.
For a credit officer, the model is best understood as a risk-ranking and decision-support tool. Instead of asking the system only whether a borrower is 'good' or 'bad', the system can estimate a probability of default and allow the bank to apply a policy threshold. For example, a high-risk applicant may be rejected, a medium-risk applicant may require additional documentation or manual review, and a low-risk applicant may be approved automatically within predefined policy limits.
This three-zone approach can be more realistic than a simple approve/reject rule. It also reduces the risk of treating the machine-learning model as a replacement for credit policy. Human review remains valuable for exceptional cases, incomplete information, suspected fraud, or policy exceptions.
The confusion matrices demonstrate that threshold selection changes the bank's business outcome even when the underlying model is unchanged. A useful production framework is to estimate expected credit loss using the general relationship: Expected Loss ≈ PD × LGD × EAD. Here, PD is probability of default, LGD is loss given default, and EAD is exposure at default. The bank can then compare expected loss with expected interest income, fees, capital usage, collection cost, and the opportunity cost of rejecting a good applicant.
The project does not contain LGD, EAD, revenue, collection-cost, or capital-cost data, so a financially optimal threshold cannot be calculated from the supplied results alone. The two confusion matrices should therefore be treated as an illustration of the risk-growth trade-off rather than a final recommendation for a real bank.
The supplied schema contains many variables that have a plausible relationship with credit risk, including loan amount, term, interest rate, employment length, annual income, DTI, delinquency history, FICO range, credit utilization, public records, and total balances. These variables capture several dimensions of borrower risk: ability to repay, willingness or historical behavior, existing indebtedness, and credit experience.
However, not every variable should automatically be used. Post-origination payment variables can create severe target leakage, and location or employment-title fields may introduce fairness, privacy, or stability concerns. Feature selection should therefore combine statistical evidence with business knowledge, data governance, and legal/regulatory review.
· The experimental dataset is an external Kaggle historical dataset and is not a representative Cambodian banking dataset. The U.S.-style fields such as state, ZIP prefix, and FICO ranges limit direct generalization to Cambodia.
· The final presentation reports approximately one million records, but the exact Kaggle dataset identifier/version is not included in the supplied materials. The final paper should insert the exact dataset citation and access date.
· The reported methodology uses an 80/20 train-test split. A stronger production study should use a time-based validation design because credit-risk relationships can change over time.
· The classification reports and confusion matrices do not clearly document the exact numeric threshold used for every output. Future experiments should record the threshold explicitly.
· The study reports ROC-AUC but does not report probability calibration, Brier score, cost-sensitive evaluation, or expected credit loss. These should be added for a banking deployment.
· The project identifies feature importance as an objective but does not provide a completed SHAP analysis in the final presentation. Explainability should be added before using the model for consequential lending decisions.
· No fairness analysis is reported. A production system should test whether approval and error rates differ systematically across relevant customer groups and should review whether any feature acts as an inappropriate proxy.
The project is most appropriately positioned as a proof-of-concept for Cambodian commercial banks and MFIs. NBC's published data shows a substantial and diverse financial system, while the project presentation identifies growing digital lending, operational workload, and competition as practical motivations. [6], [7] A Cambodian implementation should retrain the model on locally sourced application and repayment data, use locally meaningful variables such as CBC information and institution-specific affordability measures, and validate the model against local default definitions and regulatory requirements.
A practical deployment could integrate the model into a Loan Origination System (LOS). The application would submit standardized borrower and loan attributes to the REST API, the pipeline would apply the same preprocessing used during training, XGBoost would generate a probability of default, and a decision engine would map that probability to an approval, manual-review, or rejection outcome. Every prediction should be logged with model version, input-data version, threshold version, and explanation information so that decisions can be audited.
This study developed and evaluated a machine-learning framework for loan risk prediction and credit-scoring decision support. The work addressed a practical banking problem: traditional manual underwriting can be slow and may not capture complex patterns in borrower and loan data. Using an approximately one-million-record historical dataset and a binary paid/default target, the project applied data cleaning, missing-value handling, categorical encoding, numerical scaling, outlier treatment, feature engineering, stratified data splitting, model comparison, hyperparameter tuning, and iterative refinement.
Five principal algorithms were evaluated. Logistic Regression achieved a test ROC-AUC of 0.7024, Decision Tree 0.5515, Random Forest 0.7165, Gradient Boosting 0.7193, and XGBoost 0.7266. XGBoost was therefore selected as the best untuned model. Hyperparameter tuning increased its reported test ROC-AUC slightly to 0.7273. The experiment log also showed that Decision Tree and Random Forest suffered substantial overfitting, reinforcing the importance of evaluating unseen data rather than relying on training performance.
The confusion-matrix analysis further demonstrated that credit-scoring performance is a business trade-off. A conservative strategy captured more actual defaults but rejected more good customers, while a more permissive strategy approved more good customers but also approved more defaults. Therefore, the final lending policy should not be determined by model accuracy or ROC-AUC alone. Thresholds should be selected using the bank's risk appetite, expected credit loss, profitability, capital considerations, and customer strategy.
Future work should focus on:
· Obtaining a large, representative Cambodian loan dataset and validating the model using local default definitions and CBC-related information.
· Using time-based validation and out-of-time testing to measure stability under changing economic conditions.
· Adding probability calibration and cost-sensitive threshold optimization based on PD, LGD, EAD, revenue, and operational costs.
· Applying SHAP or similar explainability methods to provide global feature importance and case-level reasons for predictions.
· Conducting fairness, bias, privacy, and data-governance assessments before production deployment.
· Adding model monitoring for drift, performance deterioration, data-quality problems, and changes in default rates.
· Integrating the model with a Loan Origination System through the demonstrated REST API and web application architecture.
[1] S. Lessmann, B. Baesens, H.-V. Seow, and L. C. Thomas, “Benchmarking state-of-the-art classification algorithms for credit scoring: An update of research,” European Journal of Operational Research, vol. 247, no. 1, pp. 124–136, 2015, doi: 10.1016/j.ejor.2015.05.030.
[2] F. Louzada, A. Ara, and G. B. Fernandes, “Classification methods applied to credit scoring: A systematic review and overall comparison,” arXiv:1602.02137, 2016.
[3] T. Chen and C. Guestrin, “XGBoost: A scalable tree boosting system,” in Proc. 22nd ACM SIGKDD Int. Conf. Knowledge Discovery and Data Mining, 2016, pp. 785–794, doi: 10.1145/2939672.2939785.
[4] B. Hadji Misheva, J. Osterrieder, A. Hirsa, O. Kulkarni, and S. F. Lin, “Explainable AI in credit risk management,” arXiv:2103.00949, 2021.
[5] L. M. Demajo, V. Vella, and A. Dingli, “Explainable AI for interpretable credit scoring,” arXiv:2012.03749, 2020.
[6] National Bank of Cambodia, “Annual Report 2024,” Phnom Penh, Cambodia, 2025.
[7] National Bank of Cambodia, “Banking Institutions,” NBC official website, information for December 2024.
[8] F. Pedregosa et al., “Scikit-learn: Machine learning in Python,” Journal of Machine Learning Research, vol. 12, pp. 2825–2830, 2011.
[9] L. Breiman, “Random forests,” Machine Learning, vol. 45, pp. 5–32, 2001.
[10] J. H. Friedman, “Greedy function approximation: A gradient boosting machine,” Annals of Statistics, vol. 29, no. 5, pp. 1189–1232, 2001.
[11] Kaggle loan dataset used by the project team. The exact dataset URL, dataset version, and access date should be inserted here before final submission.
The following 57 fields are taken from the dataset header supplied with the project. They are included to make the paper reproducible and to document the feature space used as the starting point for preprocessing.
Field 1 | Field 2 | Field 3 |
loan_amnt | term | int_rate |
grade | sub_grade | emp_title |
emp_length | home_ownership | annual_inc |
verification_status | issue_d | loan_status |
purpose | title | zip_code |
addr_state | dti | delinq_2yrs |
earliest_cr_line | fico_range_high | inq_last_6mths |
open_acc | pub_rec | revol_bal |
revol_util | total_acc | initial_list_status |
total_pymnt | total_rec_int | total_rec_late_fee |
recoveries | last_pymnt_d | last_pymnt_amnt |
last_credit_pull_d | last_fico_range_high | collections_12_mths_ex_med |
application_type | acc_now_delinq | tot_coll_amt |
tot_cur_bal | acc_open_past_24mths | bc_open_to_buy |
chargeoff_within_12_mths | delinq_amnt | mort_acc |
mths_since_recent_inq | num_accts_ever_120_pd | num_rev_tl_bal_gt_0 |
num_tl_120dpd_2m | num_tl_30dpd | num_tl_op_past_12m |
pct_tl_nvr_dlq | pub_rec_bankruptcies | tax_liens |
total_bal_ex_mort | disbursement_method | debt_settlement_flag |
Table A1. Complete 57-field header supplied for the project dataset.
Source note: Project-specific claims, numerical results, confusion matrices, model settings, and deployment details in this paper are grounded in the supplied final presentation and dataset schema. External literature and Cambodia banking context are separately cited in the reference list. Where the supplied materials do not specify an exact formula, threshold, dataset version, or implementation detail, the paper explicitly avoids inventing it.