主要内容

使用k-最近邻算法在信用记分卡工作流中输入缺失数据

这个例子展示了如何使用k-nearest neighbors (kNN)算法在信用记分卡工作流中执行缺失数据的补充。

kNN算法是一种用于分类和回归的非参数方法。在这两种情况下,输入由特征空间中k-最近的训练示例组成。输出取决于kNN是用于分类还是用于回归。在kNN分类中,一个对象是通过它的邻居的多数投票来分类的,并且对象被分配到它的k-最近邻居中最常见的类。在kNN回归中,输出是k个最近邻值的平均值。有关kNN算法的更多信息,请参见fitcknn

有关“处理”丢失数据的替代方法的更多信息,请参见缺少值的信用记分卡建模

利用kNN算法计算缺失数据

使用dataMissing的数据集的缺失值CustAge(数字),ResStatus(分类)预测。

负载CreditCardData.matdisp(头(dataMissing));
CustID CustAge TmAtAddress ResStatus EmpStatus CustIncome TmWBank OtherCC AMBalance UtilRate地位  ______ _______ ___________ ___________ _________ __________ _______ _______ _________ ________ ______ 53 62 <定义>未知50000 55是的1055.9 - 0.22 0 2 61 22业主雇佣52000 25是的1161.6 - 0.24 0 3 47 30租户使用37000 61没有877.23 - 0.29 0 4南75业主雇佣了53000 20是的157.37 - 0.08 0 5 68 56家老板雇用了53000名14是的561.84 - 0.11 0 6 65 13业主使用48000 59 Yes 968.18 0.15 0 7 34 32 Home Owner Unknown 32000 26 Yes 717.82 0.02 1 8 50 57 Other Employed 51000 33 No 3041.2 0.13 0

在本例中,“CustID”而且“状态”列在imputation过程中被删除,因为它们是id而且响应值分别。或者,您可以选择离开“状态”在列。

dataToImpute = dataMissing(:,setdiff(dataMissing. properties . variablenames,...“CustID”“状态”},“稳定”));

为所有类别预测器创建虚拟变量,使kNN算法可以计算欧氏距离。

dResStatus = dummyvar(dataToImpute.ResStatus);dEmpStatus = dummyvar(dataToImpute.EmpStatus);dOtherCC = dummyvar(dataToImpute.OtherCC);

“k”在kNN算法中是基于特征相似度的。选择正确的值“k”是一个称为参数调优的过程,该过程对于提高精度非常重要。没有物理方法来确定“最佳”的价值“k”,所以在选定一个值之前,你必须尝试几个值。的小值“k”可能有噪声,并受异常值的影响。较大的值“k”有更平滑的决策边界,这意味着更低的方差,但增加的偏见。

对于本例,请选择“k”是数据集中样本数的平方根。这是一个普遍接受的值“k”.选择值为“k”为了打破两类数据之间的联系,这是很奇怪的。

numObs = height(dataToImpute);k = round(根号(numObs));如果~mod(k,2) k = k+1;结束

方法中获取缺失的值CustAge而且ResStatus预测因子。

missingResStatus = ismissing(dataToImpute.ResStatus);missingCustAge = ismissing(dataToImpute.CustAge);

接下来,遵循以下步骤:

  • 修改数据集以合并虚拟变量。

  • 调用fitcknn函数创建一个k近邻分类器。

  • 调用预测方法来预测估算值。

custAgeToImpute = dataToImpute;custAgeToImpute。HomeOwner = dResStatus(:,1);custAgeToImpute。Tenant = dResStatus(:,2);custAgeToImpute。就业= dEmpStatus(:,1);custAgeToImpute。HasOtherCC = dOtherCC(:,2);custAgeToImpute = removevars“ResStatus”);custAgeToImpute = removevars“EmpStatus”);custAgeToImpute = removevars“OtherCC”);knnCustAge = fitcknn(custAgeToImpute,“CustAge”“NumNeighbors”、钾、“标准化”,真正的);imputedCustAge = predict(knnCustAge,custAgeToImpute(missingCustAge,:));resStatusToImpute = dataToImpute;resStatusToImpute。就业= dEmpStatus(:,1);resStatusToImpute。HasOtherCC = dOtherCC(:,2);resStatusToImpute = removevars(resStatusToImpute,“EmpStatus”);resStatusToImpute = removevars(resStatusToImpute,“OtherCC”);knnResStatus = fitcknn(resStatusToImpute,“ResStatus”“NumNeighbors”、钾、“标准化”,真正的);imputedResStatus = predict(knnResStatus,resStatusToImpute(missingResStatus,:));

比较输入数据和原始数据

用输入的数据创建一个新的数据集。

knnImputedData = dataMissing;knnImputedData.CustAge(missingCustAge) = imputedCustAge;knnImputedData.ResStatus(missingResStatus) = imputedResStatus;: disp (knnImputedData (5:10));
CustID CustAge TmAtAddress ResStatus EmpStatus CustIncome TmWBank OtherCC AMBalance UtilRate地位  ______ _______ ___________ __________ _________ __________ _______ _______ _________ ________ ______ 5 68 56家老板雇用了53000名14是的561.84 0.11 0 6 65 13业主雇用了48000名59岁是的968.18 - 0.15 0 7 34 32房主未知32000 26是的717.82 0.02 1 8 50 57其他雇佣了51000 33没有3041.2 - 0.13 0 9 50 10租户未知52000 25是的115.56 - 0.02 1 10 49 53000房主未知23是的718.5 0.17 1
disp (knnImputedData(找到(missingCustAge 5):));
CustID CustAge TmAtAddress ResStatus EmpStatus CustIncome TmWBank OtherCC AMBalance UtilRate地位  ______ _______ ___________ __________ _________ __________ _______ _______ _________ ________ ______ 4 52 75业主雇用了53000名20是的157.37 - 0.08 0 19 45 14家老板雇用了51000名11是的519.46 0.42 1 138 41 31其他雇佣了41000 2是的1101.8 - 0.32 0 165 37 21房主未知38000 70 1217 0.2 0 207 48 38家老板雇用了48000名12没有573.9 - 0.1 0
disp (knnImputedData(找到(missingResStatus 5):));
CustID CustAge TmAtAddress ResStatus EmpStatus CustIncome TmWBank OtherCC AMBalance UtilRate status ______ _______ ___________ __________ _________ __________ _______ _______ _________ ________ ______ 1 53 62 Tenant Unknown 50000 55 Yes 1055.9 0.22 0 22 51 13 Tenant Employed 35000 33 Yes 468.85 0.01 0 33 468 Home Owner Unknown 32000 26 Yes 940.78 0.3 0 47 52 56 Tenant Employed 56000 79 Yes 294.46 0.12 0 103 64 49 Tenant Employed 50000 35 Yes 118.43 00

绘制估算前后预测值的直方图。

预测=“CustAge”;F1 =数字;Ax1 =轴(f1);直方图(ax₁,knnImputedData。(预测),“FaceColor”“红色”“FaceAlpha”1);持有直方图(ax₁,dataMissing。(预测),“FaceColor”“蓝”“FaceAlpha”1);传奇(strcat (“估算”,预测者),strcat(“观察”预测);标题(strcat (的直方图预测);

图中包含一个轴对象。CustAge的标题为Histogram的axis对象包含2个类型为Histogram的对象。这些对象代表了Imputed CustAge, Observed CustAge。

使用新的估算数据创建信用记分卡模型

使用估算的数据来创建creditscorecard对象,然后使用autobinningfitmodel,formatpoints创建信用记分卡模型。

sc = creditscorecard(knnImputedData,“IDVar”“CustID”);Sc = autobinning(Sc);[sc,mdl] = fitmodel(sc,“显示”“关闭”);Sc = formatpoints(Sc,“PointsOddsAndPDO”,[500 2 50]);PointsInfo = displaypoints(sc);disp (PointsInfo);
预测本点  ______________ _____________________ ______ {' CustAge’}{[无穷,33)的53.893}{‘CustAge}{[33岁,37)的55.874}{‘CustAge}{[37、40)的57.89}{‘CustAge}{[40岁,46)的68.976}{‘CustAge}{[46岁,48)的77.972}{‘CustAge}{[48, 51)的80.576}{‘CustAge}{[51岁,58)的81.041}{‘CustAge}{[58岁的Inf]的}97.002{‘CustAge}{“失踪> <”}南{‘ResStatus}{“租户”}62.974{‘ResStatus}{‘业主’}72.355{‘ResStatus}{‘其他’}92.531{‘ResStatus}{< >失踪的}南{‘EmpStatus}{‘未知’}58.822{‘EmpStatus}{“雇佣”}86.917{‘EmpStatus}{“失踪> <”}南{‘CustIncome}{[无穷,29000)的30.381}{‘CustIncome}{[29000、33000)的56.394}{‘CustIncome}{[33000、35000)的67.979}{‘CustIncome}{[35000、40000)的70.14}{‘CustIncome}{[40000、42000)的70.938}{‘CustIncome}{[42000、47000)的82.177}{‘CustIncome}{”(47000年,正)}96.36{‘CustIncome}{“失踪> <”}南{‘TmWBank}{[无穷,12)的51.08}{‘TmWBank}{61.034}[12、23){‘TmWBank}{61.833的45(23日)}{‘TmWBank}{[71)的92.889}{‘TmWBank}{”(71年,正)}133.05{‘TmWBank}{“失踪> <”}南{‘OtherCC}{‘不’}50.819{‘OtherCC}{'是的'}75.639{‘OtherCC}{“失踪> <”}南{‘AMBalance}{[无穷,558.88)的89.8}{‘AMBalance}{[558.88, 1254.28)的63.083}{‘AMBalance}{[1254.28, 1597.44)的59.704}{‘AMBalance}{'[1597.44,正]}49.144{‘AMBalance}{“失踪> <”}NaN

计算新申请人的分数和违约概率

的数据集“新客户”然后计算分数和违约概率。

dataNewCustomers = dataMissing(1:20,1:end-1);disp(头(dataNewCustomers));
CustID CustAge TmAtAddress ResStatus EmpStatus CustIncome TmWBank OtherCC AMBalance UtilRate  ______ _______ ___________ ___________ _________ __________ _______ _______ _________ ________ 1 53 62 <定义>未知50000 55是的1055.9 - 0.22 2 61 22业主雇佣52000 25是的1161.6 - 0.24 3 47 30租户雇佣了37000 61没有877.23 - 0.29 4南75业主雇佣了53000 20是的157.37 - 0.08 5 68 56家老板雇用了53000名14是的561.84 - 0.11 6 65 13业主雇佣了48000 59是的968.180.15 7 34 32房主未知32000 26是717.82 0.02 8 50 57其他雇员51000 33否3041.2 0.13

上执行相同的预处理“新客户”数据与训练数据一样。

dResStatusNewCustomers = dummyvar(dataNewCustomers.ResStatus);dEmpStatusNewCustomers = dummyvar(dataNewCustomers.EmpStatus);dOtherCCNewCustomers = dummyvar(dataNewCustomers.OtherCC);dataNewCustomersCopy = dataNewCustomers;dataNewCustomersCopy。HomeOwner = dResStatusNewCustomers(:,1);dataNewCustomersCopy。Tenant = dResStatusNewCustomers(:,2);dataNewCustomersCopy。雇用= dEmpStatusNewCustomers(:,1); dataNewCustomersCopy.HasOtherCC = dOtherCCNewCustomers(:,2); dataNewCustomersCopy = removevars(dataNewCustomersCopy,“ResStatus”);dataNewCustomersCopy = removevars(dataNewCustomersCopy,“EmpStatus”);dataNewCustomersCopy = removevars(dataNewCustomersCopy,“OtherCC”);

用与之前相同的imputation模型预测评分数据集中缺失的数据。

missingCustAgeNewCustomers = isnan(dataNewCustomers.CustAge);missingResStatusNewCustomers = ismissing(dataNewCustomers.ResStatus);imputedCustAgeNewCustomers = round(predict(knnCustAge, dataNewCustomersCopy(missingCustAgeNewCustomers,:)));imputedResStatusNewCustomers = predict(knnResStatus, dataNewCustomersCopy(missingResStatusNewCustomers,:));dataNewCustomers.CustAge(missingCustAgeNewCustomers) = imputedCustAgeNewCustomers;dataNewCustomers.ResStatus(missingResStatusNewCustomers) = imputedResStatusNewCustomers;

使用分数计算新客户的得分。

[scores, points] = score(sc, dataNewCustomers);disp(分数);
530.8074 553.1893 504.7937 563.1458 552.3902 584.2455 443.9994 518.1807 526.0037 508.6677 498.0866 540.5789 516.2379 493.7192 566.0705 485.8408 476.3143 470.0189 541.1280 510.9479
disp(点);
CustAge ResStatus EmpStatus CustIncome TmWBank OtherCC AMBalance _______ _________ _________ __________ _______ _______ _________ 81.041 62.974 58.822 96.36 92.889 75.639 63.083 97.002 72.355 86.917 96.36 63.083 86.917 70.14 92.889 50.819 63.083 81.041 72.355 86.917 96.36 61.034 75.639 63.083 97.002 72.355 86.917 96.36 61.034 75.639 63.083 97.002 72.355 86.917 96.36 61.034 75.639 63.083 97.002 72.355 86.917 96.36 92.389 75.639 63.083 55.874 72.355 58.822 56.394 63.083 80.576 92.531 86.917 96.36 96.36 61.87650.819 49.144 80.576 62.974 58.822 96.36 61.833 75.639 81.833 72.355 58.822 67.979 61.833 75.639 89.8 97.002 72.355 58.831 58.822 82.177 71.034 75.638 61.833 50.819 89.8 8972 92.531 86.919 89.8 8972 61.034 75.639 89.8 55.874 72.355 86.917 72.917 61.833 75.639 63.083 53.893 72.355 86.917 30.381 61.034 75.639 63.083 72.355 86.917 30.381 61.034 75.639 89.8 68.976 72.35586.917 96.36 51.08 75.639 89.8 81.041 92.531 58.822 82.177 61.034 75.639 59.704