fillmissing MATLAB ®В этом примере показан рабочий процесс сбора недостающих данных, ручной обработки обучающих данных, разработки новой creditscorecard, и лечить новые данные перед подсчетом баллов с помощью fillmissing MATLAB ®.
Преимущество этого метода в том, что вы можете использовать все опции, доступные в fillmissing для заполнения недостающих данных, а также других функциональных возможностей MATLAB, таких как standardizeMissing и функции для лечения выбросов. В этом подходе обратите внимание, что вы должны гарантировать, что обработка обучающих данных и обработка любого нового набора данных, который требует оценки, должны быть одинаковыми.
Кроме того, после создания creditscorecard объект, можно использовать fillmissing функция для creditscorecard объект для заполнения отсутствующих значений. Для получения дополнительной информации об альтернативных подходах к «обработке» недостающих данных смотрите Моделирование карты показателей кредита с отсутствующими значениями.
The 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 для явного сообщения информации об отсутствующих значениях. Затем применить автоматическое раскладывание с помощью 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> Интервал. Сходство значений выгодно, потому что аналогичные значения ГОРЕ означают аналогичные точки в карте показателей.
Для CustAge, bin 4 - интервал с наибольшим количеством наблюдений и mode значение исходных данных 43.
modeCustAge = mode(dataMissing.CustAge); disp(modeCustAge)
43
Значение ГОРЕ <missing> интервал аналогичен значению ГОРЕ интервала 4. Поэтому замена отсутствующих значений в CustAge со значением mode разумно.
Чтобы обработать данные, создайте копию данных и заполните отсутствующие значения.
dataTreated = dataMissing;
dataTreated.CustAge = fillmissing(dataTreated.CustAge,'constant',modeCustAge);Для ResStatus, значение 'Home Owner' - значение mode данных и значения ГОРЕ <missing> интервал наиболее близок к диску '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 рабочий процесс. Во-первых, создайте creditscorecard объект с обработанными данными, а затем применить автоматическое раскладывание.
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
Первые несколько интервалов являются одинаковыми, но обработка отсутствующих значений влияет на результаты раскладывания, начиная с интервала, где размещаются отсутствующие данные. Можно дополнительно изучить результаты раскладывание с помощью 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) интервал и получает 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