exponenta event banner

Обработка отсутствующих данных в потоке операций кредитной карты показателей с помощью MATLAB ®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')

Figure contains an axes. The axes with title CustAge contains 3 objects of type bar, line. These objects represent Good, Bad.

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')

Figure contains an axes. The axes with title ResStatus contains 3 objects of type bar, line. These objects represent Good, Bad.

Отсутствующее складское место можно оставить как есть, хотя обычной альтернативой является обработка отсутствующих значений. Обратите внимание, что обработка недостающих значений должна выполняться с осторожностью, поскольку она изменяет данные и может привести к смещению.

Для обработки отсутствующих значений можно применить другие критерии. Этот пример следует прямому подходу для замены отсутствующих наблюдений наиболее распространенным или типичным значением в распределении данных, которое является значением 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