В этом примере показано, как выполнить вменение отсутствующих данных в потоке операций кредитной карты показателей с использованием алгоритма k-ближайших соседей (kNN).
Алгоритм kNN - непараметрический метод, используемый для классификации и регрессии. В обоих случаях входные данные состоят из k-ближайших обучающих примеров в пространстве элементов. Выходные данные зависят от того, используется ли kNN для классификации или регрессии. В классификации kNN объект классифицируется множеством голосов его соседей, и объект присваивается классу, наиболее распространенному среди его k-ближайших соседей. При регрессии kNN выходной сигнал представляет собой среднее значение значений k-ближайших соседей. Для получения дополнительной информации об алгоритме kNN см. fitcknn.
Для получения дополнительной информации об альтернативных подходах к «обработке» отсутствующих данных см. Моделирование кредитной карты показателей с отсутствующими значениями.
Используйте dataMissing набор данных для расчета отсутствующих значений для CustAge (числовые) и ResStatus (категориальные) предикторы.
load CreditCardData.mat
disp(head(dataMissing)); CustID CustAge TmAtAddress ResStatus EmpStatus CustIncome TmWBank OtherCC AMBalance UtilRate status
______ _______ ___________ ___________ _________ __________ _______ _______ _________ ________ ______
1 53 62 <undefined> Unknown 50000 55 Yes 1055.9 0.22 0
2 61 22 Home Owner Employed 52000 25 Yes 1161.6 0.24 0
3 47 30 Tenant Employed 37000 61 No 877.23 0.29 0
4 NaN 75 Home Owner Employed 53000 20 Yes 157.37 0.08 0
5 68 56 Home Owner Employed 53000 14 Yes 561.84 0.11 0
6 65 13 Home Owner Employed 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' и 'status' столбцы удаляются в процессе вменения, так как это id и response значения соответственно. Кроме того, можно выбрать выход из 'status' столбец в.
dataToImpute = dataMissing(:,setdiff(dataMissing.Properties.VariableNames,... {'CustID','status'},'stable'));
Создайте фиктивные переменные для всех категориальных предикторов, чтобы алгоритм 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(sqrt(numObs)); if ~mod(k,2) k = k+1; end
Получение отсутствующих значений из CustAge и ResStatus предикторы.
missingResStatus = ismissing(dataToImpute.ResStatus); missingCustAge = ismissing(dataToImpute.CustAge);
Далее выполните следующие действия.
custAgeToImpute = dataToImpute; custAgeToImpute.HomeOwner = dResStatus(:,1); custAgeToImpute.Tenant = dResStatus(:,2); custAgeToImpute.Employed = dEmpStatus(:,1); custAgeToImpute.HasOtherCC = dOtherCC(:,2); custAgeToImpute = removevars(custAgeToImpute, 'ResStatus'); custAgeToImpute = removevars(custAgeToImpute, 'EmpStatus'); custAgeToImpute = removevars(custAgeToImpute, 'OtherCC'); knnCustAge = fitcknn(custAgeToImpute, 'CustAge', 'NumNeighbors', k, 'Standardize',true); imputedCustAge = predict(knnCustAge,custAgeToImpute(missingCustAge,:)); resStatusToImpute = dataToImpute; resStatusToImpute.Employed = dEmpStatus(:,1); resStatusToImpute.HasOtherCC = dOtherCC(:,2); resStatusToImpute = removevars(resStatusToImpute, 'EmpStatus'); resStatusToImpute = removevars(resStatusToImpute, 'OtherCC'); knnResStatus = fitcknn(resStatusToImpute, 'ResStatus', 'NumNeighbors', k, 'Standardize', true); 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 status
______ _______ ___________ __________ _________ __________ _______ _______ _________ ________ ______
5 68 56 Home Owner Employed 53000 14 Yes 561.84 0.11 0
6 65 13 Home Owner Employed 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
9 50 10 Tenant Unknown 52000 25 Yes 115.56 0.02 1
10 49 30 Home Owner Unknown 53000 23 Yes 718.5 0.17 1
disp(knnImputedData(find(missingCustAge,5),:));
CustID CustAge TmAtAddress ResStatus EmpStatus CustIncome TmWBank OtherCC AMBalance UtilRate status
______ _______ ___________ __________ _________ __________ _______ _______ _________ ________ ______
4 52 75 Home Owner Employed 53000 20 Yes 157.37 0.08 0
19 45 14 Home Owner Employed 51000 11 Yes 519.46 0.42 1
138 41 31 Other Employed 41000 2 Yes 1101.8 0.32 0
165 37 21 Home Owner Unknown 38000 70 No 1217 0.2 0
207 48 38 Home Owner Employed 48000 12 No 573.9 0.1 0
disp(knnImputedData(find(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 46 8 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 0 0
Постройте гистограмму значений предиктора до и после вменения.
Predictor ="CustAge"; f1 = figure; ax1 = axes(f1); histogram(ax1,knnImputedData.(Predictor),'FaceColor','red','FaceAlpha',1); hold on histogram(ax1,dataMissing.(Predictor),'FaceColor','blue','FaceAlpha',1); legend(strcat("Imputed ", Predictor), strcat("Observed ", Predictor)); title(strcat("Histogram of ", Predictor));

Используйте вмененные данные для создания creditscorecard объект, а затем использовать autobinning, fitmodel, и formatpoints для создания модели кредитной карты показателей.
sc = creditscorecard(knnImputedData,'IDVar','CustID'); sc = autobinning(sc); [sc,mdl] = fitmodel(sc,'display','off'); sc = formatpoints(sc,'PointsOddsAndPDO',[500 2 50]); PointsInfo = displaypoints(sc); disp(PointsInfo);
Predictors Bin Points
______________ _____________________ ______
{'CustAge' } {'[-Inf,33)' } 53.675
{'CustAge' } {'[33,37)' } 56.983
{'CustAge' } {'[37,40)' } 57.721
{'CustAge' } {'[40,45)' } 67.063
{'CustAge' } {'[45,48)' } 78.319
{'CustAge' } {'[48,51)' } 79.494
{'CustAge' } {'[51,58)' } 81.157
{'CustAge' } {'[58,Inf]' } 97.315
{'CustAge' } {'<missing>' } NaN
{'ResStatus' } {'Tenant' } 63.012
{'ResStatus' } {'Home Owner' } 72.35
{'ResStatus' } {'Other' } 92.434
{'ResStatus' } {'<missing>' } NaN
{'EmpStatus' } {'Unknown' } 58.892
{'EmpStatus' } {'Employed' } 86.83
{'EmpStatus' } {'<missing>' } NaN
{'CustIncome'} {'[-Inf,29000)' } 30.304
{'CustIncome'} {'[29000,33000)' } 56.365
{'CustIncome'} {'[33000,35000)' } 67.971
{'CustIncome'} {'[35000,40000)' } 70.136
{'CustIncome'} {'[40000,42000)' } 70.936
{'CustIncome'} {'[42000,47000)' } 82.196
{'CustIncome'} {'[47000,Inf]' } 96.405
{'CustIncome'} {'<missing>' } NaN
{'TmWBank' } {'[-Inf,12)' } 50.966
{'TmWBank' } {'[12,23)' } 60.975
{'TmWBank' } {'[23,45)' } 61.778
{'TmWBank' } {'[45,71)' } 93.007
{'TmWBank' } {'[71,Inf]' } 133.39
{'TmWBank' } {'<missing>' } NaN
{'OtherCC' } {'No' } 50.765
{'OtherCC' } {'Yes' } 75.649
{'OtherCC' } {'<missing>' } NaN
{'AMBalance' } {'[-Inf,558.88)' } 89.765
{'AMBalance' } {'[558.88,1254.28)' } 63.097
{'AMBalance' } {'[1254.28,1597.44)'} 59.725
{'AMBalance' } {'[1597.44,Inf]' } 49.184
{'AMBalance' } {'<missing>' } NaN
Создание набора данных 'new customers' а затем вычислить баллы и вероятности дефолта.
dataNewCustomers = dataMissing(1:20,1:end-1); disp(head(dataNewCustomers));
CustID CustAge TmAtAddress ResStatus EmpStatus CustIncome TmWBank OtherCC AMBalance UtilRate
______ _______ ___________ ___________ _________ __________ _______ _______ _________ ________
1 53 62 <undefined> Unknown 50000 55 Yes 1055.9 0.22
2 61 22 Home Owner Employed 52000 25 Yes 1161.6 0.24
3 47 30 Tenant Employed 37000 61 No 877.23 0.29
4 NaN 75 Home Owner Employed 53000 20 Yes 157.37 0.08
5 68 56 Home Owner Employed 53000 14 Yes 561.84 0.11
6 65 13 Home Owner Employed 48000 59 Yes 968.18 0.15
7 34 32 Home Owner Unknown 32000 26 Yes 717.82 0.02
8 50 57 Other Employed 51000 33 No 3041.2 0.13
Выполните ту же предварительную обработку на 'new customers' данные, как и данные обучения.
dResStatusNewCustomers = dummyvar(dataNewCustomers.ResStatus); dEmpStatusNewCustomers = dummyvar(dataNewCustomers.EmpStatus); dOtherCCNewCustomers = dummyvar(dataNewCustomers.OtherCC); dataNewCustomersCopy = dataNewCustomers; dataNewCustomersCopy.HomeOwner = dResStatusNewCustomers(:,1); dataNewCustomersCopy.Tenant = dResStatusNewCustomers(:,2); dataNewCustomersCopy.Employed = dEmpStatusNewCustomers(:,1); dataNewCustomersCopy.HasOtherCC = dOtherCCNewCustomers(:,2); dataNewCustomersCopy = removevars(dataNewCustomersCopy, 'ResStatus'); dataNewCustomersCopy = removevars(dataNewCustomersCopy, 'EmpStatus'); dataNewCustomersCopy = removevars(dataNewCustomersCopy, 'OtherCC');
Спрогнозировать отсутствующие данные в наборе данных оценки с помощью той же модели вменения, что и ранее.
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;
Использовать score для расчета количества новых клиентов.
[scores, points] = score(sc, dataNewCustomers); disp(scores);
531.2201 553.4261 505.1671 563.1321 552.6226 584.6546 445.1156 516.8917 524.9965 507.6668 498.2255 539.4057 516.4594 491.6344 566.1685 486.8248 476.0595 469.5488 550.2850 511.0285
disp(points);
CustAge ResStatus EmpStatus CustIncome TmWBank OtherCC AMBalance
_______ _________ _________ __________ _______ _______ _________
81.157 63.012 58.892 96.405 93.007 75.649 63.097
97.315 72.35 86.83 96.405 61.778 75.649 63.097
78.319 63.012 86.83 70.136 93.007 50.765 63.097
81.157 72.35 86.83 96.405 60.975 75.649 89.765
97.315 72.35 86.83 96.405 60.975 75.649 63.097
97.315 72.35 86.83 96.405 93.007 75.649 63.097
56.983 72.35 58.892 56.365 61.778 75.649 63.097
79.494 92.434 86.83 96.405 61.778 50.765 49.184
79.494 63.012 58.892 96.405 61.778 75.649 89.765
79.494 72.35 58.892 96.405 61.778 75.649 63.097
81.157 63.012 58.892 67.971 61.778 75.649 89.765
79.494 92.434 58.892 82.196 60.975 75.649 89.765
97.315 72.35 58.892 96.405 50.966 50.765 89.765
67.063 92.434 58.892 70.936 61.778 50.765 89.765
78.319 92.434 86.83 82.196 60.975 75.649 89.765
56.983 72.35 86.83 70.136 61.778 75.649 63.097
57.721 63.012 86.83 67.971 61.778 75.649 63.097
53.675 72.35 86.83 30.304 60.975 75.649 89.765
78.319 72.35 86.83 96.405 50.966 75.649 89.765
81.157 92.434 58.892 82.196 60.975 75.649 59.725