Поиск и устранение проблем с результатами карты показателей кредита

В этом разделе показаны некоторые результаты при использовании кредитных карт результатов, которые нуждаются в поиске и устранении проблем. Эти примеры охватывают полную область значений рабочего процесса по кредитным счетам карточным картам. Для получения дополнительной информации об общем процессе создания и разработки карт результатов кредита, смотрите Рабочий процесс моделирования карты показателей кредита.

Имя предиктора не задано, и анализатор возвращает ошибку

Если вы пытаетесь использовать modifybins, bininfo, или plotbins и опускает имя предиктора, анализатор возвращает ошибку.

load CreditCardData
sc = creditscorecard(data,'IDVar','CustID','GoodLabel',0);
modifybins(sc,'CutPoints',[20 30 50 65])
Error using creditscorecard/modifybins (line 79)
Expected a string for the parameter name, instead the input type was 'double'.

Решение: Обязательно включите имя предиктора при использовании этих функций. Используйте этот синтаксис, чтобы задать PredictorName при использовании modifybins.

load CreditCardData
sc = creditscorecard(data,'IDVar','CustID','GoodLabel',0);
modifybins(sc,'CustIncome','CutPoints',[20 30 50 65]);

Использование bininfo или plotbins Перед раскладыванием

Если вы используете bininfo или plotbins перед раскладывание результаты могут оказаться непригодными для использования.

load CreditCardData
sc = creditscorecard(data,'IDVar','CustID','GoodLabel',0);
bininfo(sc,'CustAge')
plotbins(sc,'CustAge')
ans = 

      Bin       Good    Bad     Odds         WOE       InfoValue 
    ________    ____    ___    _______    _________    __________

    '21'          2       1          2    -0.011271    3.1821e-07
    '22'          3       1          3      0.39419    0.00047977
    '23'          1       2        0.5      -1.3976     0.0053002
    '24'          3       4       0.75      -0.9921     0.0062895
    '25'          3       1          3      0.39419    0.00047977
    '26'          4       2          2    -0.011271    6.3641e-07
    '27'          6       5        1.2      -0.5221     0.0026744
    '28'         10       2          5      0.90502     0.0067112
    '29'          8       6     1.3333     -0.41674     0.0021465
    '30'          9      10        0.9     -0.80978      0.011321
    '31'          8       6     1.3333     -0.41674     0.0021465
    '32'         13      13          1     -0.70442      0.011663
    '33'          9      11    0.81818     -0.90509      0.014934
    '34'         14      12     1.1667     -0.55027     0.0070391
    '35'         18      10        1.8     -0.11663    0.00032342
    '36'         23      14     1.6429     -0.20798     0.0013772
    '37'         28      19     1.4737     -0.31665     0.0041132
    '38'         24      14     1.7143     -0.16542     0.0008894
    '39'         21      14        1.5     -0.29895     0.0027242
    '40'         31      12     2.5833      0.24466     0.0020499
    '41'         21      18     1.1667     -0.55027      0.010559
    '42'         29       9     3.2222      0.46565     0.0062605
    '43'         29      23     1.2609     -0.47262      0.010312
    '44'         28      16       1.75      -0.1448    0.00078672
    '45'         36      16       2.25      0.10651    0.00048246
    '46'         33      19     1.7368     -0.15235     0.0010303
    '47'         28       6     4.6667      0.83603      0.016516
    '48'         32      17     1.8824    -0.071896    0.00021357
    '49'         38      10        3.8      0.63058      0.013957
    '50'         33      14     2.3571      0.15303    0.00089239
    '51'         28       9     3.1111      0.43056     0.0052525
    '52'         35       8      4.375      0.77149       0.01808
    '53'         14       8       1.75      -0.1448    0.00039336
    '54'         27      12       2.25      0.10651    0.00036184
    '55'         20       9     2.2222     0.094089    0.00021044
    '56'         20      11     1.8182     -0.10658    0.00029856
    '57'         16       7     2.2857      0.12226    0.00028035
    '58'         11       7     1.5714     -0.25243    0.00099297
    '59'         11       6     1.8333    -0.098283    0.00013904
    '60'          9       4       2.25      0.10651    0.00012061
    '61'         11       2        5.5       1.0003     0.0086637
    '62'          8       0        Inf          Inf           Inf
    '63'          7       1          7       1.2415     0.0076953
    '64'         10       0        Inf          Inf           Inf
    '65'          4       1          4      0.68188     0.0016791
    '66'          6       1          6       1.0873     0.0053857
    '67'          2       3    0.66667      -1.1099     0.0056227
    '68'          6       1          6       1.0873     0.0053857
    '69'          6       0        Inf          Inf           Inf
    '70'          1       0        Inf          Inf           Inf
    '71'          1       0        Inf          Inf           Inf
    '72'          1       0        Inf          Inf           Inf
    '73'          3       0        Inf          Inf           Inf
    '74'          1       0        Inf          Inf           Inf
    'Totals'    803     397     2.0227          NaN           Inf

Plot for CustAge demonstrating when there are too many bins

График для CustAge невозможно считать, поскольку в нем слишком много интервалов. Кроме того, bininfo возвращает данные, которые Inf значения для ГОРЕ из-за нулевых наблюдений для Good или Bad.

Решение: отобразите данные используя autobinning или modifybins перед построением графика или запросами о статистике интервала, чтобы избежать наличия слишком большого количества интервалов или NaNs и Infs. Например, можно использовать аргумент пары "имя-значение" для AlgoOptions с autobinning функция для определения количества интервалов.

load CreditCardData
sc = creditscorecard(data,'IDVar','CustID','GoodLabel',0);
AlgoOptions = {'NumBins',4};
sc = autobinning(sc,'CustAge','Algorithm','EqualFrequency',...
'AlgorithmOptions',AlgoOptions);
bininfo(sc,'CustAge','Totals','off')
plotbins(sc,'CustAge')
ans = 

        Bin        Good    Bad     Odds       WOE       InfoValue
    ___________    ____    ___    ______    ________    _________

    '[-Inf,39)'    186     133    1.3985    -0.36902      0.03815
    '[39,46)'      195     108    1.8056    -0.11355    0.0033158
    '[46,52)'      192      75      2.56     0.23559     0.011823
    '[52,Inf]'     230      81    2.8395     0.33921      0.02795

Plot for CustAge with appropriate number of bins after using the autobinning function

Если категориальные данные даны как число

Категориальные данные часто записываются с помощью числовых значений и могут храниться в числовом массиве. Хотя вы знаете, что данные должны интерпретироваться как категориальная информация, для creditscorecard этот предиктор выглядит как числовой массив.

Чтобы показать случай, когда категориальные данные заданы как числовые данные, данные для переменной ResStatus преднамеренно преобразуется в числовые значения.

load CreditCardData
data.ResStatus = double(data.ResStatus);
sc = creditscorecard(data,'IDVar','CustID')
sc = 

  creditscorecard with properties:

                GoodLabel: 0
              ResponseVar: 'status'
                 VarNames: {1x11 cell}
        NumericPredictors: {1x7 cell}
    CategoricalPredictors: {'EmpStatus'  'OtherCC'}
                    IDVar: 'CustID'
            PredictorVars: {1x9 cell}

Обратите внимание, что 'ResStatus' появляется как часть NumericPredictors свойство. Если мы применили автоматическое раскладывание, получившаяся информация о интервал поднимает флаги, касающиеся типа предиктора.

sc = autobinning(sc,'ResStatus');
[bi,cg] = bininfo(sc,'ResStatus')
bi = 

       Bin        Good    Bad     Odds        WOE       InfoValue 
    __________    ____    ___    ______    _________    __________

    '[-Inf,2)'    365     177    2.0621     0.019329     0.0001682
    '[2,Inf]'     438     220    1.9909    -0.015827    0.00013772
    'Totals'      803     397    2.0227          NaN    0.00030592


cg =

     2

Числовые области значений в метках интервала показывают, что 'ResStatus' рассматривается как числовая переменная. Это также подтверждается тем фактом, что необязательный выход из bininfo является числовым массивом точек разреза, в отличие от таблицы с группами категорий. Более того, выход из predictorinfo подтверждает, что кредитная карта показателей обрабатывает данные как число.

[T,Stats] = predictorinfo(sc,'ResStatus')
T = 

                 PredictorType        LatestBinning     
                 _____________    ______________________

    ResStatus    'Numeric'        'Automatic / Monotone'


Stats = 

             Value 
            _______

    Min           1
    Max           3
    Mean     1.7017
    Std     0.71863

Решение: Для creditscorecard, 'Categorical' означает MATLAB® категориальный тип данных. Для получения дополнительной информации см. categorical. Лечить 'ResStatus' как категориально, измените 'PredictorType' от PredictorName 'ResStatus' от 'Numeric' на 'Categorical' использование modifypredictor.

sc = modifypredictor(sc,'ResStatus','PredictorType','Categorical')
[T,Stats] = predictorinfo(sc,'ResStatus')
sc = 

  creditscorecard with properties:

                GoodLabel: 0
              ResponseVar: 'status'
                 VarNames: {1x11 cell}
        NumericPredictors: {1x6 cell}
    CategoricalPredictors: {'ResStatus'  'EmpStatus'  'OtherCC'}
                    IDVar: 'CustID'
            PredictorVars: {1x9 cell}


T = 

                 PredictorType    Ordinal     LatestBinning 
                 _____________    _______    _______________

    ResStatus    'Categorical'    false      'Original Data'


Stats = 

          Count
          _____

    C1    542  
    C2    474  
    C3    184  

Обратите внимание, что 'ResStatus' теперь появляется как часть Категориальных предикторов. Также, predictorinfo теперь описывает 'ResStatus' как категориальный и отображает счетчики категорий.

Если вы подаете заявку autobinning, категории теперь переупорядочены, как показано по вызову bininfo, который также показывает метки категорий, в отличие от числовых областей значений. Необязательный выход bininfo теперь является таблицей группировок категорий.

sc = autobinning(sc,'ResStatus');
[bi,cg] = bininfo(sc,'ResStatus')
bi = 

      Bin       Good    Bad     Odds        WOE       InfoValue
    ________    ____    ___    ______    _________    _________

    'C2'        307     167    1.8383    -0.095564    0.0036638
    'C1'        365     177    2.0621     0.019329    0.0001682
    'C3'        131      53    2.4717      0.20049    0.0059418
    'Totals'    803     397    2.0227          NaN    0.0097738


cg = 

    Category    BinNumber
    ________    _________

    'C2'        1        
    'C1'        2        
    'C3'        3        

NaNs Возвращено при подсчете «тестового» набора данных

При применении creditscorecard моделировать в «тестовый» набор данных с помощью score функция, если наблюдение в наборе данных «test» имеет NaN или <undefined> значение, a NaN общий счет возвращается для каждого из этих наблюдений. Для примера, a creditscorecard создается с использованием «обучающих» данных.

load CreditCardData
sc = creditscorecard(data,'IDVar','CustID');
sc = autobinning(sc);
sc = fitmodel(sc);
1. Adding CustIncome, Deviance = 1490.8527, Chi2Stat = 32.588614, PValue = 1.1387992e-08
2. Adding TmWBank, Deviance = 1467.1415, Chi2Stat = 23.711203, PValue = 1.1192909e-06
3. Adding AMBalance, Deviance = 1455.5715, Chi2Stat = 11.569967, PValue = 0.00067025601
4. Adding EmpStatus, Deviance = 1447.3451, Chi2Stat = 8.2264038, PValue = 0.0041285257
5. Adding CustAge, Deviance = 1441.994, Chi2Stat = 5.3511754, PValue = 0.020708306
6. Adding ResStatus, Deviance = 1437.8756, Chi2Stat = 4.118404, PValue = 0.042419078
7. Adding OtherCC, Deviance = 1433.707, Chi2Stat = 4.1686018, PValue = 0.041179769

Generalized Linear regression model:
    logit(status) ~ 1 + CustAge + ResStatus + EmpStatus + CustIncome + TmWBank + OtherCC + AMBalance
    Distribution = Binomial

Estimated Coefficients:
                   Estimate       SE       tStat       pValue  
                   ________    ________    ______    __________

    (Intercept)    0.70239     0.064001    10.975    5.0538e-28
    CustAge        0.60833      0.24932      2.44      0.014687
    ResStatus        1.377      0.65272    2.1097      0.034888
    EmpStatus      0.88565        0.293    3.0227     0.0025055
    CustIncome     0.70164      0.21844    3.2121     0.0013179
    TmWBank         1.1074      0.23271    4.7589    1.9464e-06
    OtherCC         1.0883      0.52912    2.0569      0.039696
    AMBalance        1.045      0.32214    3.2439     0.0011792


1200 observations, 1192 error degrees of freedom
Dispersion: 1
Chi^2-statistic vs. constant model: 89.7, p-value = 1.4e-16

Предположим, что отсутствующее наблюдение (Nan) добавляется к данным и затем newdata оценивается с помощью score функция. По умолчанию точки и счета, присвоенные отсутствующему значению NaN.

newdata = data(1:10,:);
newdata.CustAge(1) = NaN;
[Scores,Points] = score(sc,newdata)
Scores =

       NaN
    1.4646
    0.7662
    1.5779
    1.4535
    1.8944
   -0.0872
    0.9207
    1.0399
    0.8252


Points = 

    CustAge     ResStatus    EmpStatus    CustIncome     TmWBank     OtherCC     AMBalance
    ________    _________    _________    __________    _________    ________    _________

         NaN    -0.031252    -0.076317     0.43693        0.39607     0.15842    -0.017472
       0.479      0.12696      0.31449     0.43693      -0.033752     0.15842    -0.017472
     0.21445    -0.031252      0.31449    0.081611        0.39607    -0.19168    -0.017472
     0.23039      0.12696      0.31449     0.43693      -0.044811     0.15842      0.35551
       0.479      0.12696      0.31449     0.43693      -0.044811     0.15842    -0.017472
       0.479      0.12696      0.31449     0.43693        0.39607     0.15842    -0.017472
    -0.14036      0.12696    -0.076317    -0.10466      -0.033752     0.15842    -0.017472
     0.23039      0.37641      0.31449     0.43693      -0.033752    -0.19168     -0.21206
     0.23039    -0.031252    -0.076317     0.43693      -0.033752     0.15842      0.35551
     0.23039      0.12696    -0.076317     0.43693      -0.033752     0.15842    -0.017472

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

Решение: Чтобы решить эту проблему, используйте formatpoints функция с аргументом пары "имя-значение" Missing. При использовании Missingможно заменить NaN предиктора значение по трем альтернативным критериям ('ZeroWoe', 'MinPoints', или 'MaxPoints').

Для примера используйте Missing чтобы заменить отсутствующее значение на 'MinPoints' опция. Строка с отсутствующими данными теперь имеет счет, соответствующее присвоению ей минимально возможных точек для CustAge.

sc = formatpoints(sc,'Missing','MinPoints');
[Scores,Points] = score(sc,newdata)
PointsTable = displaypoints(sc);
PointsTable(1:7,:)
Scores =

    0.7074
    1.4646
    0.7662
    1.5779
    1.4535
    1.8944
   -0.0872
    0.9207
    1.0399
    0.8252


Points = 

    CustAge     ResStatus    EmpStatus    CustIncome     TmWBank     OtherCC     AMBalance
    ________    _________    _________    __________    _________    ________    _________

    -0.15894    -0.031252    -0.076317     0.43693        0.39607     0.15842    -0.017472
       0.479      0.12696      0.31449     0.43693      -0.033752     0.15842    -0.017472
     0.21445    -0.031252      0.31449    0.081611        0.39607    -0.19168    -0.017472
     0.23039      0.12696      0.31449     0.43693      -0.044811     0.15842      0.35551
       0.479      0.12696      0.31449     0.43693      -0.044811     0.15842    -0.017472
       0.479      0.12696      0.31449     0.43693        0.39607     0.15842    -0.017472
    -0.14036      0.12696    -0.076317    -0.10466      -0.033752     0.15842    -0.017472
     0.23039      0.37641      0.31449     0.43693      -0.033752    -0.19168     -0.21206
     0.23039    -0.031252    -0.076317     0.43693      -0.033752     0.15842      0.35551
     0.23039      0.12696    -0.076317     0.43693      -0.033752     0.15842    -0.017472


ans = 

    Predictors        Bin         Points  
    __________    ___________    _________

    'CustAge'     '[-Inf,33)'     -0.15894
    'CustAge'     '[33,37)'       -0.14036
    'CustAge'     '[37,40)'      -0.060323
    'CustAge'     '[40,46)'       0.046408
    'CustAge'     '[46,48)'        0.21445
    'CustAge'     '[48,58)'        0.23039
    'CustAge'     '[58,Inf]'         0.479

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

См. также

| | | | | | | | | | | | | |

Похожие примеры

Подробнее о