В этом примере показано, как выполнить обвинение недостающих данных в рабочем процессе протокола результатов кредита с помощью алгоритма k - ближайших соседей (kNN).
kNN алгоритм является непараметрическим методом, используемым в классификации и регрессии. В обоих случаях вход состоит из k-closest учебных примеров в пространстве признаков. Выход зависит от того, используется ли 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 55 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 = фигура; ax1 = оси (f1); гистограмма (ax1, knnImputedData. (Предиктор),'FaceColor','red','FaceAlpha',1); содержание on гистограмма (ax1, dataMissing. (Предиктор),'FaceColor','blue','FaceAlpha',1); легенда (strcat ("Imputed ", Предиктор), strcat ("Observed ", Предиктор)); заголовок (strcat ("Histogram of ", Предиктор));

Используйте оценочные данные, чтобы создать 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)' } 52.425
{'CustAge' } {'[33,37)' } 56.637
{'CustAge' } {'[37,40)' } 57.392
{'CustAge' } {'[40,45)' } 66.957
{'CustAge' } {'[45,48)' } 80.031
{'CustAge' } {'[48,58)' } 80.54
{'CustAge' } {'[58,Inf]' } 97.928
{'CustAge' } {'<missing>' } NaN
{'ResStatus' } {'Tenant' } 63.009
{'ResStatus' } {'Home Owner' } 72.35
{'ResStatus' } {'Other' } 92.439
{'ResStatus' } {'<missing>' } NaN
{'EmpStatus' } {'Unknown' } 58.91
{'EmpStatus' } {'Employed' } 86.808
{'EmpStatus' } {'<missing>' } NaN
{'CustIncome'} {'[-Inf,29000)' } 30.822
{'CustIncome'} {'[29000,33000)' } 56.555
{'CustIncome'} {'[33000,35000)' } 68.016
{'CustIncome'} {'[35000,40000)' } 70.153
{'CustIncome'} {'[40000,42000)' } 70.943
{'CustIncome'} {'[42000,47000)' } 82.062
{'CustIncome'} {'[47000,Inf]' } 96.092
{'CustIncome'} {'<missing>' } NaN
{'TmWBank' } {'[-Inf,12)' } 50.924
{'TmWBank' } {'[12,23)' } 60.953
{'TmWBank' } {'[23,45)' } 61.759
{'TmWBank' } {'[45,71)' } 93.05
{'TmWBank' } {'[71,Inf]' } 133.51
{'TmWBank' } {'<missing>' } NaN
{'OtherCC' } {'No' } 50.656
{'OtherCC' } {'Yes' } 75.67
{'OtherCC' } {'<missing>' } NaN
{'AMBalance' } {'[-Inf,558.88)' } 89.682
{'AMBalance' } {'[558.88,1254.28)' } 63.136
{'AMBalance' } {'[1254.28,1597.44)'} 59.779
{'AMBalance' } {'[1597.44,Inf]' } 49.286
{'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);
530.4076 553.7430 506.8439 562.0948 552.9379 585.0343 445.0174 517.5798 525.6620 508.4568 497.5853 540.2558 516.5434 491.3461 567.6451 486.5128 475.7897 468.7094 552.0658 510.3532
disp(points);
CustAge ResStatus EmpStatus CustIncome TmWBank OtherCC AMBalance
_______ _________ _________ __________ _______ _______ _________
80.54 63.009 58.91 96.092 93.05 75.67 63.136
97.928 72.35 86.808 96.092 61.759 75.67 63.136
80.031 63.009 86.808 70.153 93.05 50.656 63.136
80.54 72.35 86.808 96.092 60.953 75.67 89.682
97.928 72.35 86.808 96.092 60.953 75.67 63.136
97.928 72.35 86.808 96.092 93.05 75.67 63.136
56.637 72.35 58.91 56.555 61.759 75.67 63.136
80.54 92.439 86.808 96.092 61.759 50.656 49.286
80.54 63.009 58.91 96.092 61.759 75.67 89.682
80.54 72.35 58.91 96.092 61.759 75.67 63.136
80.54 63.009 58.91 68.016 61.759 75.67 89.682
80.54 92.439 58.91 82.062 60.953 75.67 89.682
97.928 72.35 58.91 96.092 50.924 50.656 89.682
66.957 92.439 58.91 70.943 61.759 50.656 89.682
80.031 92.439 86.808 82.062 60.953 75.67 89.682
56.637 72.35 86.808 70.153 61.759 75.67 63.136
57.392 63.009 86.808 68.016 61.759 75.67 63.136
52.425 72.35 86.808 30.822 60.953 75.67 89.682
80.54 72.35 86.808 96.092 50.924 75.67 89.682
80.54 92.439 58.91 82.062 60.953 75.67 59.779