В этом примере показано, как выполнить обвинение недостающих данных в рабочем процессе протокола результатов кредита с помощью случайного лесного алгоритма.
Случайные леса являются методом приобретения знаний ансамблем для классификации или регрессии, которая действует путем построения множества деревьев решений в учебное время и получения класса, который является режимом классов (классификация) или среднее предсказание (регрессия) отдельных деревьев. Случайные леса корректируют для тенденции деревьев решений сверхсоответствовать к набору обучающих данных. Для получения дополнительной информации о случайном лесном алгоритме смотрите 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 54 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 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 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)' } 83.828 {'CustAge' } {'[33,37)' } 86.511 {'CustAge' } {'[37,40)' } 88.307 {'CustAge' } {'[40,46)' } 97.562 {'CustAge' } {'[46,48)' } 106.75 {'CustAge' } {'[48,51)' } 107.21 {'CustAge' } {'[51,58)' } 108.57 {'CustAge' } {'[58,Inf]' } 123.71 {'CustAge' } {'<missing>' } NaN {'EmpStatus' } {'Unknown' } 87.502 {'EmpStatus' } {'Employed' } 115.45 {'EmpStatus' } {'<missing>' } NaN {'CustIncome'} {'[-Inf,29000)' } 58.301 {'CustIncome'} {'[29000,33000)' } 84.752 {'CustIncome'} {'[33000,35000)' } 96.533 {'CustIncome'} {'[35000,40000)' } 98.73 {'CustIncome'} {'[40000,42000)' } 99.542 {'CustIncome'} {'[42000,47000)' } 110.97 {'CustIncome'} {'[47000,Inf]' } 125.39 {'CustIncome'} {'<missing>' } NaN {'TmWBank' } {'[-Inf,12)' } 79.83 {'TmWBank' } {'[12,23)' } 89.717 {'TmWBank' } {'[23,45)' } 90.511 {'TmWBank' } {'[45,71)' } 121.36 {'TmWBank' } {'[71,Inf]' } 161.25 {'TmWBank' } {'<missing>' } NaN {'AMBalance' } {'[-Inf,558.88)' } 118.25 {'AMBalance' } {'[558.88,1254.28)' } 91.772 {'AMBalance' } {'[1254.28,1597.44)'} 88.425 {'AMBalance' } {'[1597.44,Inf]' } 77.96 {'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);
534.5927 546.8314 534.0648 557.3729 546.0376 577.6807 441.0492 516.5229 528.8639 502.3882 501.3591 513.6481 534.6783 493.3650 541.1380 482.9742 482.5726 465.5446 547.4855 485.1795
disp(points);
CustAge EmpStatus CustIncome TmWBank AMBalance _______ _________ __________ _______ _________ 108.57 87.502 125.39 121.36 91.772 123.71 115.45 125.39 90.511 91.772 106.75 115.45 98.73 121.36 91.772 108.57 115.45 125.39 89.717 118.25 123.71 115.45 125.39 89.717 91.772 123.71 115.45 125.39 121.36 91.772 86.511 87.502 84.752 90.511 91.772 107.21 115.45 125.39 90.511 77.96 107.21 87.502 125.39 90.511 118.25 107.21 87.502 125.39 90.511 91.772 108.57 87.502 96.533 90.511 118.25 107.21 87.502 110.97 89.717 118.25 123.71 87.502 125.39 79.83 118.25 97.562 87.502 99.542 90.511 118.25 106.75 115.45 110.97 89.717 118.25 86.511 115.45 98.73 90.511 91.772 88.307 115.45 96.533 90.511 91.772 83.828 115.45 58.301 89.717 118.25 108.57 115.45 125.39 79.83 118.25 108.57 87.502 110.97 89.717 88.425