В этом примере показано, как выполнить вменение отсутствующих данных в рабочем процессе карты показателей кредита с помощью алгоритма случайного леса.
Случайные леса - это метод обучения ансамбля для классификации или регрессии, который действует путем построения множества деревьев решений во время обучения и получения класса, который является режимом классов (классификации) или среднего предсказания (регрессии) отдельных деревьев. Случайные леса исправляют тенденцию деревьев решений к переоборудованию на набор обучающих данных. Для получения дополнительной информации об алгоритме случайного леса смотрите fitrensemble
и fitcensemble
.
Для получения дополнительной информации об альтернативных подходах к «обработке» недостающих данных смотрите Моделирование карты показателей кредита с отсутствующими значениями.
Используйте 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')); rfImputedData = dataMissing;
Поскольку несколько предикторов содержат отсутствующие данные, включите 'Surrogate'
флаг при создании шаблона дерева решений.
rng('default'); tmp = templateTree('Surrogate','on','Reproducible',true);
Далее используйте fitrensemble
и fitcensemble
функции, которые возвращают обученные объекты модели регрессии и классификационного ансамбля, содержат результаты увеличения 100 деревьев регрессии и классификации с помощью LSBoost
, соответственно.
missingCustAge = ismissing(dataToImpute.CustAge); % Fit ensemble of regression learners rfCustAge = fitrensemble(dataToImpute,'CustAge','Method','Bag',... 'NumLearningCycles',200,'Learners',tmp,'CategoricalPredictors',... {'ResStatus','EmpStatus','OtherCC'}); rfImputedData.CustAge(missingCustAge) = predict(rfCustAge,... dataToImpute(missingCustAge,:)); missingResStatus = ismissing(dataToImpute.ResStatus); % Fit ensemble of classification learners rfResStatus = fitcensemble(dataToImpute,'ResStatus','Method','Bag',... 'NumLearningCycles',200,'Learners',tmp,'CategoricalPredictors',... {'EmpStatus','OtherCC'}); rfImputedData.ResStatus(missingResStatus) = predict(rfResStatus,... dataToImpute(missingResStatus,:)); % Optionally, round the age to the nearest integer rfImputedData.CustAge = round(rfImputedData.CustAge);
disp(rfImputedData(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(rfImputedData(find(missingCustAge,5),:));
CustID CustAge TmAtAddress ResStatus EmpStatus CustIncome TmWBank OtherCC AMBalance UtilRate status ______ _______ ___________ __________ _________ __________ _______ _______ _________ ________ ______ 4 55 75 Home Owner Employed 53000 20 Yes 157.37 0.08 0 19 54 14 Home Owner Employed 51000 11 Yes 519.46 0.42 1 138 52 31 Other Employed 41000 2 Yes 1101.8 0.32 0 165 46 21 Home Owner Unknown 38000 70 No 1217 0.2 0 207 52 38 Home Owner Employed 48000 12 No 573.9 0.1 0
disp(rfImputedData(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 Home Owner 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 Home Owner Employed 50000 35 Yes 118.43 0 0
Постройте гистограмму значений предиктора до и после вменения.
Predictor = "CustAge"; f1 = рисунок; ax1 = оси (f1); гистограмма (ax1,rfImputedData. (Предиктор),'FaceColor','red','FaceAlpha',1); держаться on гистограмма (ax1,dataMissing. (Предиктор),'FaceColor','blue','FaceAlpha',1); легенда (strcat ("Imputed ", Предиктор), strcat ("Observed ", Предиктор)); заголовок (strcat ("Histogram of ", Предиктор));
Используйте вмененные данные для создания creditscorecard
объект, а затем используйте autobinning
, fitmodel
, и formatpoints
для создания модели карты показателей кредита.
sc = creditscorecard(rfImputedData,'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)' } 54.313 {'CustAge' } {'[33,37)' } 57.145 {'CustAge' } {'[37,40)' } 59.04 {'CustAge' } {'[40,46)' } 68.806 {'CustAge' } {'[46,51)' } 78.204 {'CustAge' } {'[51,58)' } 81.041 {'CustAge' } {'[58,Inf]' } 96.395 {'CustAge' } {'<missing>' } NaN {'ResStatus' } {'Tenant' } 62.768 {'ResStatus' } {'Home Owner' } 72.621 {'ResStatus' } {'Other' } 92.228 {'ResStatus' } {'<missing>' } NaN {'EmpStatus' } {'Unknown' } 58.839 {'EmpStatus' } {'Employed' } 86.897 {'EmpStatus' } {'<missing>' } NaN {'CustIncome'} {'[-Inf,29000)' } 29.765 {'CustIncome'} {'[29000,33000)' } 56.167 {'CustIncome'} {'[33000,35000)' } 67.926 {'CustIncome'} {'[35000,40000)' } 70.119 {'CustIncome'} {'[40000,42000)' } 70.93 {'CustIncome'} {'[42000,47000)' } 82.337 {'CustIncome'} {'[47000,Inf]' } 96.733 {'CustIncome'} {'<missing>' } NaN {'TmWBank' } {'[-Inf,12)' } 51.023 {'TmWBank' } {'[12,23)' } 61.005 {'TmWBank' } {'[23,45)' } 61.806 {'TmWBank' } {'[45,71)' } 92.95 {'TmWBank' } {'[71,Inf]' } 133.22 {'TmWBank' } {'<missing>' } NaN {'OtherCC' } {'No' } 50.796 {'OtherCC' } {'Yes' } 75.644 {'OtherCC' } {'<missing>' } NaN {'AMBalance' } {'[-Inf,558.88)' } 89.941 {'AMBalance' } {'[558.88,1254.28)' } 63.018 {'AMBalance' } {'[1254.28,1597.44)'} 59.613 {'AMBalance' } {'[1597.44,Inf]' } 48.972 {'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
Предсказать отсутствующие данные в наборе скоринговых данных с той же моделью вменения, что и ранее.
missingCustAgeNewCustomers = isnan(dataNewCustomers.CustAge); missingResStatusNewCustomers = ismissing(dataNewCustomers.ResStatus); imputedCustAgeNewCustomers = round(predict(rfCustAge, dataNewCustomers(missingCustAgeNewCustomers,:))); imputedResStatusNewCustomers = predict(rfResStatus, dataNewCustomers(missingResStatusNewCustomers,:)); dataNewCustomers.CustAge(missingCustAgeNewCustomers) = imputedCustAgeNewCustomers; dataNewCustomers.ResStatus(missingResStatusNewCustomers) = imputedResStatusNewCustomers;
Использование score
вычислить счета новых клиентов.
[scores, points] = score(sc, dataNewCustomers); disp(scores);
530.9936 553.1144 504.7522 563.8821 552.3131 584.2581 445.2402 515.6361 523.9354 506.8645 497.9661 538.1986 516.3480 493.3467 566.2568 487.2501 477.0996 470.1861 553.9004 510.7086
disp(points);
CustAge ResStatus EmpStatus CustIncome TmWBank OtherCC AMBalance _______ _________ _________ __________ _______ _______ _________ 81.041 62.768 58.839 96.733 92.95 75.644 63.018 96.395 72.621 86.897 96.733 61.806 75.644 63.018 78.204 62.768 86.897 70.119 92.95 50.796 63.018 81.041 72.621 86.897 96.733 61.005 75.644 89.941 96.395 72.621 86.897 96.733 61.005 75.644 63.018 96.395 72.621 86.897 96.733 92.95 75.644 63.018 57.145 72.621 58.839 56.167 61.806 75.644 63.018 78.204 92.228 86.897 96.733 61.806 50.796 48.972 78.204 62.768 58.839 96.733 61.806 75.644 89.941 78.204 72.621 58.839 96.733 61.806 75.644 63.018 81.041 62.768 58.839 67.926 61.806 75.644 89.941 78.204 92.228 58.839 82.337 61.005 75.644 89.941 96.395 72.621 58.839 96.733 51.023 50.796 89.941 68.806 92.228 58.839 70.93 61.806 50.796 89.941 78.204 92.228 86.897 82.337 61.005 75.644 89.941 57.145 72.621 86.897 70.119 61.806 75.644 63.018 59.04 62.768 86.897 67.926 61.806 75.644 63.018 54.313 72.621 86.897 29.765 61.005 75.644 89.941 81.041 72.621 86.897 96.733 51.023 75.644 89.941 81.041 92.228 58.839 82.337 61.005 75.644 59.613