fillmissingВ этом примере показан поток операций для сбора отсутствующих данных, обработки данных обучения вручную, разработки нового creditscorecardи обрабатывать новые данные перед оценкой с помощью MATLAB ®fillmissing.
Преимущество этого метода заключается в том, что можно использовать все опции, доступные в fillmissing для заполнения недостающих данных, а также других функциональных возможностей MATLAB, таких как standardizeMissing и особенности лечения отклонений. В этом подходе следует отметить, что необходимо обеспечить одинаковую обработку данных обучения и обработку любого нового набора данных, который требует оценки.
Либо после создания creditscorecard объект, вы можете использовать fillmissing для функции creditscorecard объект для заполнения отсутствующих значений. Для получения дополнительной информации об альтернативных подходах к «обработке» отсутствующих данных см. Моделирование кредитной карты показателей с отсутствующими значениями.
dataMissing в таблице CreditCardData.mat файл имеет два предиктора с отсутствующими значениями - CustAge и ResStatus.
load CreditCardData.mat
head(dataMissing)ans=8×11 table
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
Сначала проанализируйте недостающие данные, используя необработанные учебные данные.
Создать creditscorecard с использованием CreditCardData.mat для загрузки файла dataMissing содержит отсутствующие значения. Установите 'BinMissingData' аргумент для creditscorecard кому true явным образом сообщать информацию об отсутствующих значениях. Затем применить автоматическое binning с помощью autobinning.
sc = creditscorecard(dataMissing,'IDVar','CustID','BinMissingData',true); sc = autobinning(sc);
Информация о ячейках и графики ячеек для предикторов, у которых отсутствуют данные, оба показывают <missing> бункер в конце. Два предиктора с отсутствующими значениями в этом наборе данных: CustAge и ResStatus.
bi = bininfo(sc,'CustAge');
disp(bi) Bin Good Bad Odds WOE InfoValue
_____________ ____ ___ ______ ________ __________
{'[-Inf,33)'} 69 52 1.3269 -0.42156 0.018993
{'[33,37)' } 63 45 1.4 -0.36795 0.012839
{'[37,40)' } 72 47 1.5319 -0.2779 0.0079824
{'[40,46)' } 172 89 1.9326 -0.04556 0.0004549
{'[46,48)' } 59 25 2.36 0.15424 0.0016199
{'[48,51)' } 99 41 2.4146 0.17713 0.0035449
{'[51,58)' } 157 62 2.5323 0.22469 0.0088407
{'[58,Inf]' } 93 25 3.72 0.60931 0.032198
{'<missing>'} 19 11 1.7273 -0.15787 0.00063885
{'Totals' } 803 397 2.0227 NaN 0.087112
plotbins(sc,'CustAge')
bi = bininfo(sc,'ResStatus');
disp(bi) Bin Good Bad Odds WOE InfoValue
______________ ____ ___ ______ _________ __________
{'Tenant' } 296 161 1.8385 -0.095463 0.0035249
{'Home Owner'} 352 171 2.0585 0.017549 0.00013382
{'Other' } 128 52 2.4615 0.19637 0.0055808
{'<missing>' } 27 13 2.0769 0.026469 2.3248e-05
{'Totals' } 803 397 2.0227 NaN 0.0092627
plotbins(sc,'ResStatus')
Отсутствующее складское место можно оставить как есть, хотя обычной альтернативой является обработка отсутствующих значений. Обратите внимание, что обработка недостающих значений должна выполняться с осторожностью, поскольку она изменяет данные и может привести к смещению.
Для обработки отсутствующих значений можно применить другие критерии. Этот пример следует прямому подходу для замены отсутствующих наблюдений наиболее распространенным или типичным значением в распределении данных, которое является значением mode для данных. Для этого примера: mode имеет значение WOE, аналогичное исходному <missing> бункер. Сходство значений является благоприятным, поскольку аналогичные значения WOE означают аналогичные точки в карте показателей.
Для CustAge, ячейка 4 является ячейкой с наибольшим количеством наблюдений и mode значение исходных данных равно 43.
modeCustAge = mode(dataMissing.CustAge); disp(modeCustAge)
43
Значение WOE для <missing> ячейка аналогична значению WOE ячейки 4. Поэтому замена отсутствующих значений в CustAge со значением mode является разумным.
Для обработки данных создайте копию данных и заполните недостающие значения.
dataTreated = dataMissing;
dataTreated.CustAge = fillmissing(dataTreated.CustAge,'constant',modeCustAge);Для ResStatus, значение 'Home Owner' - значение mode данных и значение WOE <missing> bin наиболее близок к bin 'Home Owner' бункер.
modeResStatus = mode(dataMissing.ResStatus); disp(modeResStatus)
Home Owner
Использовать MATLAB ®fillmissing для замены отсутствующих данных на 'Home Owner'.
dataTreated.ResStatus = fillmissing(dataTreated.ResStatus,'constant',string(modeResStatus));Обработанный набор данных теперь не имеет отсутствующих значений.
disp(any(any(ismissing(dataTreated))))
0
Используя обработанный набор данных, примените типовые creditscorecard workflow-процесс. Сначала создайте creditscorecard объект с обработанными данными, а затем применить автоматическое binning.
scTreated = creditscorecard(dataTreated,'IDVar','CustID'); scTreated = autobinning(scTreated);
Сравнение данных ячейки необработанных данных для CustAge с информацией о ячейке обработанных данных для CustAge.
bi = bininfo(sc,'CustAge');
disp(bi) Bin Good Bad Odds WOE InfoValue
_____________ ____ ___ ______ ________ __________
{'[-Inf,33)'} 69 52 1.3269 -0.42156 0.018993
{'[33,37)' } 63 45 1.4 -0.36795 0.012839
{'[37,40)' } 72 47 1.5319 -0.2779 0.0079824
{'[40,46)' } 172 89 1.9326 -0.04556 0.0004549
{'[46,48)' } 59 25 2.36 0.15424 0.0016199
{'[48,51)' } 99 41 2.4146 0.17713 0.0035449
{'[51,58)' } 157 62 2.5323 0.22469 0.0088407
{'[58,Inf]' } 93 25 3.72 0.60931 0.032198
{'<missing>'} 19 11 1.7273 -0.15787 0.00063885
{'Totals' } 803 397 2.0227 NaN 0.087112
biTreated = bininfo(scTreated,'CustAge');
disp(biTreated) Bin Good Bad Odds WOE InfoValue
_____________ ____ ___ ______ ________ _________
{'[-Inf,33)'} 69 52 1.3269 -0.42156 0.018993
{'[33,37)' } 63 45 1.4 -0.36795 0.012839
{'[37,40)' } 72 47 1.5319 -0.2779 0.0079824
{'[40,45)' } 156 86 1.814 -0.10891 0.0024345
{'[45,48)' } 94 39 2.4103 0.17531 0.0033002
{'[48,58)' } 256 103 2.4854 0.20603 0.01223
{'[58,Inf]' } 93 25 3.72 0.60931 0.032198
{'Totals' } 803 397 2.0227 NaN 0.089977
Первые несколько ячеек одинаковы, но обработка отсутствующих значений влияет на результаты объединения, начиная с ячейки, в которую помещаются отсутствующие данные. Дополнительные сведения о результатах binning можно получить с помощью autobinning с другим алгоритмом или можно вручную изменить ячейки с помощью modifybins.
Для ResStatusрезультаты для обработанных данных выглядят аналогично исходным результатам, за исключением более высоких показателей в 'Home Owner' бункер из-за обработки. Для категориальной переменной с большим количеством категорий (или уровней) автоматический алгоритм может найти группы категорий, и результаты могут показать больше различий до и после лечения.
bi = bininfo(sc,'ResStatus');
disp(bi) Bin Good Bad Odds WOE InfoValue
______________ ____ ___ ______ _________ __________
{'Tenant' } 296 161 1.8385 -0.095463 0.0035249
{'Home Owner'} 352 171 2.0585 0.017549 0.00013382
{'Other' } 128 52 2.4615 0.19637 0.0055808
{'<missing>' } 27 13 2.0769 0.026469 2.3248e-05
{'Totals' } 803 397 2.0227 NaN 0.0092627
biTreated = bininfo(scTreated,'ResStatus');
disp(biTreated) Bin Good Bad Odds WOE InfoValue
______________ ____ ___ ______ _________ __________
{'Tenant' } 296 161 1.8385 -0.095463 0.0035249
{'Home Owner'} 379 184 2.0598 0.018182 0.00015462
{'Other' } 128 52 2.4615 0.19637 0.0055808
{'Totals' } 803 397 2.0227 NaN 0.0092603
Подберите логистическую модель, масштабируйте точки и просмотрите окончательную карту показателей.
[scTreated, mdl] = fitmodel(scTreated,'Display','off'); scTreated = formatpoints(scTreated,'PointsOddsAndPDO',[500 2 50]); ScPoints = displaypoints(scTreated); disp(ScPoints)
Predictors Bin Points
______________ _____________________ ______
{'CustAge' } {'[-Inf,33)' } 53.507
{'CustAge' } {'[33,37)' } 55.798
{'CustAge' } {'[37,40)' } 59.646
{'CustAge' } {'[40,45)' } 66.868
{'CustAge' } {'[45,48)' } 79.013
{'CustAge' } {'[48,58)' } 80.326
{'CustAge' } {'[58,Inf]' } 97.559
{'CustAge' } {'<missing>' } NaN
{'ResStatus' } {'Tenant' } 62.161
{'ResStatus' } {'Home Owner' } 73.305
{'ResStatus' } {'Other' } 90.777
{'ResStatus' } {'<missing>' } NaN
{'EmpStatus' } {'Unknown' } 58.846
{'EmpStatus' } {'Employed' } 86.887
{'EmpStatus' } {'<missing>' } NaN
{'CustIncome'} {'[-Inf,29000)' } 29.906
{'CustIncome'} {'[29000,33000)' } 56.219
{'CustIncome'} {'[33000,35000)' } 67.938
{'CustIncome'} {'[35000,40000)' } 70.123
{'CustIncome'} {'[40000,42000)' } 70.931
{'CustIncome'} {'[42000,47000)' } 82.3
{'CustIncome'} {'[47000,Inf]' } 96.647
{'CustIncome'} {'<missing>' } NaN
{'TmWBank' } {'[-Inf,12)' } 51.05
{'TmWBank' } {'[12,23)' } 61.018
{'TmWBank' } {'[23,45)' } 61.818
{'TmWBank' } {'[45,71)' } 92.921
{'TmWBank' } {'[71,Inf]' } 133.14
{'TmWBank' } {'<missing>' } NaN
{'OtherCC' } {'No' } 50.806
{'OtherCC' } {'Yes' } 75.642
{'OtherCC' } {'<missing>' } NaN
{'AMBalance' } {'[-Inf,558.88)' } 89.788
{'AMBalance' } {'[558.88,1254.28)' } 63.088
{'AMBalance' } {'[1254.28,1597.44)'} 59.711
{'AMBalance' } {'[1597.44,Inf]' } 49.157
{'AMBalance' } {'<missing>' } NaN
Новая карта показателей не знает, что данные были обработаны, поэтому присваивает NaNs в < отсутствующие > ячейки. Если требуется набрать новый набор данных и он содержит отсутствующие данные, по умолчанию score функция устанавливает точки на NaN. Для дальнейшего изучения обработки недостающих данных возьмите несколько строк из исходных данных в качестве тестовых данных и введите некоторые недостающие данные.
tdata = dataTreated(11:14,mdl.PredictorNames); % Keep only the predictors retained in the model % Set some missing values tdata.CustAge(1) = NaN; tdata.ResStatus(2) = '<undefined>'; tdata.EmpStatus(3) = '<undefined>'; tdata.CustIncome(4) = NaN; disp(tdata)
CustAge ResStatus EmpStatus CustIncome TmWBank OtherCC AMBalance
_______ ___________ ___________ __________ _______ _______ _________
NaN Tenant Unknown 34000 44 Yes 119.8
48 <undefined> Unknown 44000 14 Yes 403.62
65 Home Owner <undefined> 48000 6 No 111.88
44 Other Unknown NaN 35 No 436.41
Оцените новые данные и посмотрите, как установлены баллы NaN, что приводит к NaN оценки.
[Scores,Points] = score(scTreated,tdata); disp(Scores)
NaN NaN NaN NaN
disp(Points)
CustAge ResStatus EmpStatus CustIncome TmWBank OtherCC AMBalance
_______ _________ _________ __________ _______ _______ _________
NaN 62.161 58.846 67.938 61.818 75.642 89.788
80.326 NaN 58.846 82.3 61.018 75.642 89.788
97.559 73.305 NaN 96.647 51.05 50.806 89.788
66.868 90.777 58.846 NaN 61.818 50.806 89.788
Для назначения точек отсутствующим данным можно использовать аргумент пара имя-значение 'Missing' в formatpoints выбор способа назначения точек отсутствующим значениям.
Используйте 'MinPoints' для опции 'Missing' аргумент. Эта опция присваивает отсутствующим данным минимальное количество возможных точек в карте показателей. В этом примере минимальное количество возможных точек для CustIncome является 29.906, так что последняя строка в таблице получает 29.906 точки для отсутствующих CustIncome значение.
scTreated = formatpoints(scTreated,'Missing','MinPoints'); [Scores,Points] = score(scTreated,tdata); disp(Scores)
469.7003 510.0812 518.0013 448.8099
disp(Points)
CustAge ResStatus EmpStatus CustIncome TmWBank OtherCC AMBalance
_______ _________ _________ __________ _______ _______ _________
53.507 62.161 58.846 67.938 61.818 75.642 89.788
80.326 62.161 58.846 82.3 61.018 75.642 89.788
97.559 73.305 58.846 96.647 51.05 50.806 89.788
66.868 90.777 58.846 29.906 61.818 50.806 89.788
Однако для предикторов, обработанных в данных обучения, таких как CustAge, влияние 'Missing' аргумент несовместим с обработкой данных обучения. Например, для CustAge, первое наблюдение получает 53.507 точки для отсутствующего значения, но если новые данные были «обработаны», и отсутствующее значение для CustAge были заменены на mode данных обучения (возраст 43), это наблюдение падает в [40,45) bin и получает 66.868 точки.
Поэтому перед оценкой наборы данных должны обрабатываться так же, как и данные обучения. Использование 'Missing' аргумент все еще важен для назначения баллов для необработанных предикторов, и обработанные предикторы получают баллы таким образом, который согласуется с способом разработки модели.
tdataTreated = tdata; tdataTreated.CustAge = fillmissing(tdataTreated.CustAge,'constant',modeCustAge); tdataTreated.ResStatus = fillmissing(tdataTreated.ResStatus,'constant',string(modeResStatus)); disp(tdataTreated)
CustAge ResStatus EmpStatus CustIncome TmWBank OtherCC AMBalance
_______ __________ ___________ __________ _______ _______ _________
43 Tenant Unknown 34000 44 Yes 119.8
48 Home Owner Unknown 44000 14 Yes 403.62
65 Home Owner <undefined> 48000 6 No 111.88
44 Other Unknown NaN 35 No 436.41
[Scores,Points] = score(scTreated,tdataTreated); disp(Scores)
483.0606 521.2249 518.0013 448.8099
disp(Points)
CustAge ResStatus EmpStatus CustIncome TmWBank OtherCC AMBalance
_______ _________ _________ __________ _______ _______ _________
66.868 62.161 58.846 67.938 61.818 75.642 89.788
80.326 73.305 58.846 82.3 61.018 75.642 89.788
97.559 73.305 58.846 96.647 51.05 50.806 89.788
66.868 90.777 58.846 29.906 61.818 50.806 89.788