本文尝试提出建立一个农业贷款的信用风险评价模型的思路和步骤,使用了matlab中的主成分分析法和 Logistic 回归方法,实际应用时可以以科技(如卫星遥感技术)手段和实际调查等获得的数据为训练集和测试集,以期减少目前对个体客户的信用评分大多依靠专家指定的规则来主观评价的局限,并且应加强对客户基础数据库的建设,从而有利于对现有信用评价体系的修正和完善,提高其准确性。
1.数据的获取加工和处理
filename = "C:\Users\86198\Documents\logistic.xlsx"; % 替换为实际的数据集文件名
data = readtable(filename);
existing_matrix=table2array(data(:, 1:end-1));
total_rows = 500;
num_random_rows = total_rows - size(existing_matrix, 1);
min_value = min(existing_matrix, [], 1);
max_value = max(existing_matrix, [], 1);
random_data = (max_value - min_value) .* rand(num_random_rows, size(existing_matrix, 2)) + min_value;
extended_matrix = [existing_matrix; random_data];
newColumn = rand(500, 1) <= 0.4;
data=[extended_matrix,newColumn];
x = data(:, 1:11);
y = data(:, 12);
我们数据集中的自变量主要考察了化肥使用量,农药使用量,人均粮食产量,人均可支配收入,固定资产投资增长,消费价格指数,农业生产资料指数,农产品生产价格指数,人均粮食消费量,移动电话拥有量,冰箱拥有量,农业总产值。因变量则是违约与否,违约记为1,不违约记为0。因为我们获取数据的能力有限,无法细化到每个个体客户的状况,数据总量也很少,所以使用了随机模拟将数据补充为500行;每个个体的违约信息我们无从获得所以使用0,1随机生成了一列因变量,为了便于后面的模型评估,控制违约率0.4,与实际情况差距较大,这里强调:实际应用中务必输入来源可靠的详细数据作为训练集和测试集,才能得到正确的模型,估计出正确的信用值。
2.模型选择与主成分分析(PCA)
基于研究问题的性质和数据的形式,我们选择了Logistic 回归模型。之所以没有选用多重线性回归模型,是因为其要求因变量是连续型的正态分布变量,且自变量与因变量呈线性关系。当因变量是分类变量,且自变量与因变量不呈线性关系时,就不能确足多重线性回归模型的适用条件。而Logistic回归分析属于非线性回归,它是研究因变量为二项分类或多项分类结果与某些影响因素之间关系的一种多重回归分析方法。
[coeff, score, latent] = pca(x);
explained_variance_ratio = latent / sum(latent);
cumulative_variance_ratio = cumsum(explained_variance_ratio);
num_components = find(cumulative_variance_ratio >= 0.99, 1);% 这里的0.99表示前若干个主成分的特征值的累计贡献率达到99%,可根据实际调整。
X_pca = score(:, 1:num_components);
disp(['系数矩阵(前 ', num2str(num_components), ' 个主成分):']);
系数矩阵(前 3 个主成分):
disp(coeff(:, 1:num_components));
-0.0036 -0.0036 0.0176 -0.0001 0.0000 -0.0001 0.0016 -0.0196 0.9996 0.9998 -0.0219 -0.0020 -0.0003 0.0003 -0.0010 -0.0000 -0.0000 0.0001 -0.0000 0.0001 0.0001 -0.0001 0.0000 -0.0001 -0.0001 0.0003 0.0007 -0.0005 -0.0013 -0.0023 0.0219 0.9996 0.0196
for i=1:num_components
figure;% 可视化第i个主成分与原始影响因素的关系
bar(coeff(:, i)); % 显示第i个主成分的系数
xlabel('原始影响因素');
ylabel('系数值');
title(['第', num2str(i), '个主成分与原始影响因素的关系']);
end
由于 Logistic 回归方法对模型中自变量的多维相关性较为敏感,需要利用主成分分析或变量聚类分析等手段来选择代表性的自变量,以减少候选变量 之间的相关性。故上述代码先对数据进行主成分分析,接下来再利用 logistic 回归模型计算农户的守约概率。通过系数矩阵可以精确得知某个选中的主成分由哪些比例的原自变量构成,并且,借助matlab的可视化功能可以直观看到。
3.使用 logistic 模型
rng(123); % 设置随机种子以确保结果可复现
cv = cvpartition(y, 'HoldOut', 0.2);% 划分数据为训练集和测试集
X_train = X_pca(training(cv), :);
y_train = y(training(cv), :);
X_test = X_pca(test(cv), :);
y_test = y(test(cv), :);
% 逻辑回归模型训练
mdl = fitglm(X_train, y_train, 'Distribution', 'binomial', 'Link', 'logit');
% 获取模型系数和截距
coefficients = mdl.Coefficients.Estimate;
intercept = coefficients(1);
% 获取特征名称
feature_names = {'F1', 'F2', 'F3','F4','F5','F6'};%根据自己的需要可以有若干个特征(主成分)名称
% 构建逻辑回归表达式
logistic_expression = ['logit(p) = ', num2str(intercept)];
for i = 2:length(coefficients)
logistic_expression = [logistic_expression, ' + ', num2str(coefficients(i)), ' * ', feature_names{i-1}];
end
disp('逻辑回归表达式:');
逻辑回归表达式:
disp(logistic_expression);
logit(p) = -0.49143 + 8.3635e-05 * F1 + 7.8445e-05 * F2 + -0.00048396 * F3
y_pred = predict(mdl, X_test);
划分训练集和测试集,将上面得到的几个主成分和因变量代入 logistic 模型,构建逻辑回归表达式。
4.计算性能指标
confusion_matrix = confusionmat(y_test, round(y_pred));
accuracy = sum(diag(confusion_matrix)) / sum(confusion_matrix(:));
precision = confusion_matrix(2, 2) / sum(confusion_matrix(:, 2));
recall = confusion_matrix(2, 2) / sum(confusion_matrix(2, :));
f1_score = 2 * (precision * recall) / (precision + recall);
disp(['Accuracy: ', num2str(accuracy)]);
Accuracy: 0.57
disp(['Precision: ', num2str(precision)]);
Precision: 0.3
disp(['Recall: ', num2str(recall)]);
Recall: 0.076923
disp(['F1 Score: ', num2str(f1_score)]);
F1 Score: 0.12245
这四个指标分别代表如下含义:
准确度(Accuracy):
- 准确度是模型正确预测的样本数量占总样本数量的比例。
- 计算方式:准确度 = (真正例 + 真负例) / (真正例 + 假正例 + 真负例 + 假负例)
精确度(Precision):
- 精确度是模型正确预测为正例的样本数量占所有预测为正例的样本数量的比例。
- 计算方式:精确度 = 真正例 / (真正例 + 假正例)
召回率(Recall)(也称为灵敏度或真正例率):
- 召回率是模型正确预测为正例的样本数量占所有实际正例的样本数量的比例。
- 计算方式:召回率 = 真正例 / (真正例 + 假负例)
F1分数(F1 Score):
- F1分数是精确度和召回率的调和平均值,用于综合考虑模型的精确性和召回率。
- 计算方式:F1分数 = 2 * (精确度 * 召回率) / (精确度 + 召回率)
可以看到这个模型的测试状况,主要是因为数据的质量问题(大多是随机模拟的,很可能并不符合事实),在实际预测时务必输入来源可靠的详细数据作为训练集和测试集,才能得到正确的模型,估计出正确的信用值。在实际应用时,可以根据这4个指标对模型超参数进行调整和优化,以找到最佳的设置。同时,考虑到违约数据实际占比会很小,使正负样本不平衡,可以采取平衡类别的方法,如过采样或欠采样,以改善模型的性能。
5.实证研究
new_data = [297.270000000000 5.73000000000000 493.690000000000 15373 -12.5000000000000 103.200000000000 103.100000000000 107.100000000000 157.600000000000 246.400000000000 3114.86000000000];
r=new_data*coeff(:, 1:num_components);
disp('预测该客户的违约概率为: ');
预测该客户的违约概率为:
disp(predict(mdl, r))
0.6815
在训练并测试好模型之后,我们就可以给它自变量的数据去预测违约概率了,结果越接近1则违约率越高。注意要先对原自变量进行与测试集相同的PCA,再代入模型。