Тематическое исследование для анализа протокола результатов кредита

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

Шаг 1. Создайте объект creditscorecard.

Используйте CreditCardData.mat файл, чтобы загрузить data (использование набора данных от Refaat 2011). Если ваш data содержит много предикторов, можно сначала использовать screenpredictors от Risk Management Toolbox™, чтобы срезать потенциально большой набор предикторов к подмножеству, которое является самым прогнозирующим из переменной отклика протокола результатов кредита. Можно затем использовать это подмножество предикторов при создании creditscorecard объект.

При создании creditscorecard объект, по умолчанию, 'ResponseVar' установлен в последний столбец в данных ('status' в этом примере) и 'GoodLabel' к значению ответа с самым высоким количеством (0 в этом примере). Синтаксис для creditscorecard указывает на тот 'CustID' 'IDVar' удалить из списка предикторов. Кроме того, в то время как не продемонстрированный в этом примере, при создании creditscorecard объектное использование creditscorecard, можно использовать дополнительный аргумент пары "имя-значение" 'WeightsVar' задавать наблюдение (выборка) веса или 'BinMissingData' к интервалу недостающие данные.

load CreditCardData
sc = creditscorecard(data,'IDVar','CustID')
sc = 
  creditscorecard with properties:

                GoodLabel: 0
              ResponseVar: 'status'
               WeightsVar: ''
                 VarNames: {1x11 cell}
        NumericPredictors: {1x6 cell}
    CategoricalPredictors: {'ResStatus'  'EmpStatus'  'OtherCC'}
           BinMissingData: 0
                    IDVar: 'CustID'
            PredictorVars: {1x9 cell}
                     Data: [1200x11 table]

Выполните некоторое исследование исходных данных. Справьтесь о статистике предиктора для категориальной переменной 'ResStatus' и постройте информацию об интервале для 'ResStatus'.

bininfo(sc,'ResStatus')
ans=4×6 table
         Bin          Good    Bad     Odds        WOE       InfoValue
    ______________    ____    ___    ______    _________    _________

    {'Home Owner'}    365     177    2.0621     0.019329    0.0001682
    {'Tenant'    }    307     167    1.8383    -0.095564    0.0036638
    {'Other'     }    131      53    2.4717      0.20049    0.0059418
    {'Totals'    }    803     397    2.0227          NaN    0.0097738

plotbins(sc,'ResStatus')

Эта информация об интервале содержит частоты “Хороших” и “Плохих”, и статистика интервала. Постарайтесь не иметь интервалы с частотами нуля, потому что они приводят к бесконечному или неопределенному (NaN) статистика. Используйте modifybins или autobinning функции к интервалу данные соответственно.

Для числовых данных общий первый шаг является "прекрасной классификацией". Это означает раскладывание данные в несколько интервалов, заданных с обычной сеткой. Чтобы проиллюстрировать этот тезис, используйте предиктор 'CustIncome'.

cp = 20000:5000:60000;

sc = modifybins(sc,'CustIncome','CutPoints',cp);

bininfo(sc,'CustIncome')
ans=11×6 table
           Bin           Good    Bad     Odds         WOE       InfoValue 
    _________________    ____    ___    _______    _________    __________

    {'[-Inf,20000)' }      3       5        0.6      -1.2152      0.010765
    {'[20000,25000)'}     23      16     1.4375     -0.34151     0.0039819
    {'[25000,30000)'}     38      47    0.80851     -0.91698      0.065166
    {'[30000,35000)'}    131      75     1.7467     -0.14671      0.003782
    {'[35000,40000)'}    193      98     1.9694    -0.026696    0.00017359
    {'[40000,45000)'}    173      76     2.2763      0.11814     0.0028361
    {'[45000,50000)'}    131      47     2.7872      0.32063      0.014348
    {'[50000,55000)'}     82      24     3.4167      0.52425      0.021842
    {'[55000,60000)'}     21       8      2.625      0.26066     0.0015642
    {'[60000,Inf]'  }      8       1          8        1.375      0.010235
    {'Totals'       }    803     397     2.0227          NaN       0.13469

plotbins(sc,'CustIncome')

Шаг 2a. Автоматически интервал данные.

Используйте autobinning функция, чтобы выполнить автоматическое раскладывание для каждого переменного предиктора, с помощью 'Monotone' по умолчанию алгоритм с опциями алгоритма по умолчанию.

sc = autobinning(sc);

После автоматического шага раскладывания каждый интервал предиктора должен быть рассмотрен с помощью bininfo и plotbins функции и подстроенный. Монотонный, идеально линейный тренд в Весе доказательства (WOE) желателен для протоколов результатов кредита, потому что это переводит в линейные точки для данного предиктора. Тренды WOE могут визуализироваться с помощью plotbins.

plotbins(sc,sc.PredictorVars)

В отличие от первоначального графика 'ResStatus' когда протокол результатов был создан, новый график для 'ResStatus' показывает увеличивающийся тренд WOE. Это вызвано тем, что autobinning функция, по умолчанию, сортирует порядок категорий путем увеличения разногласий.

Эти графики показывают что 'Monotone' алгоритм делает хорошее задание, находящее монотонные тренды WOE для этого набора данных. Чтобы завершить процесс раскладывания, необходимо внести только несколько ручных корректировок для некоторых предикторов с помощью modifybins функция.

Шаг 2b. Подстройте интервалы с помощью ручного раскладывания.

Общие шаги, чтобы вручную изменить интервалы:

  • Используйте bininfo функция с двумя выходными аргументами, где второй аргумент содержит правила раскладывания.

  • Вручную измените правила раскладывания с помощью второго выходного аргумента от bininfo.

  • Установите обновленные правила раскладывания с modifybins и затем используйте plotbins или bininfo рассмотреть обновленные интервалы.

Например, на основе графика для 'CustAge' на Шаге 2a интервалы номер 1 и 2 имеют подобное ГОРЕ также, как и интервалы номер 5 и 6. Объединять эти интервалы с помощью шагов, обрисованных в общих чертах выше:

[bi,cp] = bininfo(sc,'CustAge');
cp([1 5]) = []; % To merge bins 1 and 2, and bins 5 and 6
sc = modifybins(sc,'CustAge','CutPoints',cp);
plotbins(sc,'CustAge')

Для 'CustIncome', на основе графика выше, лучше объединять интервалы 3, 4 и 5, потому что у них есть подобное ГОРЕ. Объединять эти интервалы:

[bi,cp] = bininfo(sc,'CustIncome');
cp([3 4]) = [];
sc = modifybins(sc,'CustIncome','CutPoints',cp);
plotbins(sc,'CustIncome')

Для 'TmWBank', на основе графика выше, лучше объединять интервалы 2 и 3, потому что у них есть подобное ГОРЕ. Объединять эти интервалы:

[bi,cp] = bininfo(sc,'TmWBank');
cp(2) = [];
sc = modifybins(sc,'TmWBank','CutPoints',cp);
plotbins(sc,'TmWBank')

Для 'AMBalance', на основе графика выше, лучше объединять интервалы 2 и 3, потому что у них есть подобное ГОРЕ. Объединять эти интервалы:

[bi,cp] = bininfo(sc,'AMBalance');
cp(2) = [];
sc = modifybins(sc,'AMBalance','CutPoints',cp);
plotbins(sc,'AMBalance')

Теперь, когда подстройка раскладывания завершается, интервалы для всех предикторов имеют близко-к-линейному тренды WOE.

Шаг 3. Подбирайте модель логистической регрессии.

fitmodel функция подбирает модель логистической регрессии к данным WOE. fitmodel внутренне интервалы обучающие данные, преобразовывает его в значения WOE, сопоставляет переменную отклика так, чтобы 'Good' 1, и подбирает линейную модель логистической регрессии. По умолчанию, fitmodel использует пошаговую процедуру, чтобы определить, которым предикторы должны быть в модели.

sc = fitmodel(sc);
1. Adding CustIncome, Deviance = 1490.8954, Chi2Stat = 32.545914, PValue = 1.1640961e-08
2. Adding TmWBank, Deviance = 1467.3249, Chi2Stat = 23.570535, PValue = 1.2041739e-06
3. Adding AMBalance, Deviance = 1455.858, Chi2Stat = 11.466846, PValue = 0.00070848829
4. Adding EmpStatus, Deviance = 1447.6148, Chi2Stat = 8.2432677, PValue = 0.0040903428
5. Adding CustAge, Deviance = 1442.06, Chi2Stat = 5.5547849, PValue = 0.018430237
6. Adding ResStatus, Deviance = 1437.9435, Chi2Stat = 4.1164321, PValue = 0.042468555
7. Adding OtherCC, Deviance = 1433.7372, Chi2Stat = 4.2063597, PValue = 0.040272676

Generalized linear regression model:
    status ~ [Linear formula with 8 terms in 7 predictors]
    Distribution = Binomial

Estimated Coefficients:
                   Estimate      SE       tStat       pValue  
                   ________    _______    ______    __________

    (Intercept)     0.7024       0.064    10.975    5.0407e-28
    CustAge        0.61562     0.24783    2.4841      0.012988
    ResStatus       1.3776     0.65266    2.1107      0.034799
    EmpStatus      0.88592     0.29296     3.024     0.0024946
    CustIncome     0.69836     0.21715     3.216     0.0013001
    TmWBank          1.106     0.23266    4.7538    1.9958e-06
    OtherCC         1.0933     0.52911    2.0662      0.038806
    AMBalance       1.0437     0.32292    3.2322     0.0012285


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

Шаг 4. Анализ и точки протокола результатов формата.

После того, чтобы подбирать логистическую модель по умолчанию моменты не масштабированы и наступают непосредственно от комбинации значений WOE и коэффициентов модели. displaypoints функция обобщает точки протокола результатов.

p1 = displaypoints(sc);
disp(p1)
      Predictors              Bin              Points  
    ______________    ____________________    _________

    {'CustAge'   }    {'[-Inf,37)'       }     -0.15314
    {'CustAge'   }    {'[37,40)'         }    -0.062247
    {'CustAge'   }    {'[40,46)'         }     0.045763
    {'CustAge'   }    {'[46,58)'         }      0.22888
    {'CustAge'   }    {'[58,Inf]'        }      0.48354
    {'CustAge'   }    {'<missing>'       }          NaN
    {'ResStatus' }    {'Tenant'          }    -0.031302
    {'ResStatus' }    {'Home Owner'      }      0.12697
    {'ResStatus' }    {'Other'           }      0.37652
    {'ResStatus' }    {'<missing>'       }          NaN
    {'EmpStatus' }    {'Unknown'         }    -0.076369
    {'EmpStatus' }    {'Employed'        }      0.31456
    {'EmpStatus' }    {'<missing>'       }          NaN
    {'CustIncome'}    {'[-Inf,29000)'    }     -0.45455
    {'CustIncome'}    {'[29000,33000)'   }      -0.1037
    {'CustIncome'}    {'[33000,42000)'   }     0.077768
    {'CustIncome'}    {'[42000,47000)'   }      0.24406
    {'CustIncome'}    {'[47000,Inf]'     }      0.43536
    {'CustIncome'}    {'<missing>'       }          NaN
    {'TmWBank'   }    {'[-Inf,12)'       }     -0.18221
    {'TmWBank'   }    {'[12,45)'         }    -0.038279
    {'TmWBank'   }    {'[45,71)'         }      0.39569
    {'TmWBank'   }    {'[71,Inf]'        }      0.95074
    {'TmWBank'   }    {'<missing>'       }          NaN
    {'OtherCC'   }    {'No'              }       -0.193
    {'OtherCC'   }    {'Yes'             }      0.15868
    {'OtherCC'   }    {'<missing>'       }          NaN
    {'AMBalance' }    {'[-Inf,558.88)'   }       0.3552
    {'AMBalance' }    {'[558.88,1597.44)'}    -0.026797
    {'AMBalance' }    {'[1597.44,Inf]'   }     -0.21168
    {'AMBalance' }    {'<missing>'       }          NaN

Это - хорошее время, чтобы изменить метки интервала, если это - что-то представляющее интерес по косметическим причинам. Для этого используйте modifybins изменить метки интервала.

sc = modifybins(sc,'CustAge','BinLabels',...
{'Up to 36' '37 to 39' '40 to 45' '46 to 57' '58 and up'});

sc = modifybins(sc,'CustIncome','BinLabels',...
{'Up to 28999' '29000 to 32999' '33000 to 41999' '42000 to 46999' '47000 and up'});

sc = modifybins(sc,'TmWBank','BinLabels',...
{'Up to 11' '12 to 44' '45 to 70' '71 and up'});

sc = modifybins(sc,'AMBalance','BinLabels',...
{'Up to 558.87' '558.88 to 1597.43' '1597.44 and up'});

p1 = displaypoints(sc);
disp(p1)
      Predictors               Bin              Points  
    ______________    _____________________    _________

    {'CustAge'   }    {'Up to 36'         }     -0.15314
    {'CustAge'   }    {'37 to 39'         }    -0.062247
    {'CustAge'   }    {'40 to 45'         }     0.045763
    {'CustAge'   }    {'46 to 57'         }      0.22888
    {'CustAge'   }    {'58 and up'        }      0.48354
    {'CustAge'   }    {'<missing>'        }          NaN
    {'ResStatus' }    {'Tenant'           }    -0.031302
    {'ResStatus' }    {'Home Owner'       }      0.12697
    {'ResStatus' }    {'Other'            }      0.37652
    {'ResStatus' }    {'<missing>'        }          NaN
    {'EmpStatus' }    {'Unknown'          }    -0.076369
    {'EmpStatus' }    {'Employed'         }      0.31456
    {'EmpStatus' }    {'<missing>'        }          NaN
    {'CustIncome'}    {'Up to 28999'      }     -0.45455
    {'CustIncome'}    {'29000 to 32999'   }      -0.1037
    {'CustIncome'}    {'33000 to 41999'   }     0.077768
    {'CustIncome'}    {'42000 to 46999'   }      0.24406
    {'CustIncome'}    {'47000 and up'     }      0.43536
    {'CustIncome'}    {'<missing>'        }          NaN
    {'TmWBank'   }    {'Up to 11'         }     -0.18221
    {'TmWBank'   }    {'12 to 44'         }    -0.038279
    {'TmWBank'   }    {'45 to 70'         }      0.39569
    {'TmWBank'   }    {'71 and up'        }      0.95074
    {'TmWBank'   }    {'<missing>'        }          NaN
    {'OtherCC'   }    {'No'               }       -0.193
    {'OtherCC'   }    {'Yes'              }      0.15868
    {'OtherCC'   }    {'<missing>'        }          NaN
    {'AMBalance' }    {'Up to 558.87'     }       0.3552
    {'AMBalance' }    {'558.88 to 1597.43'}    -0.026797
    {'AMBalance' }    {'1597.44 and up'   }     -0.21168
    {'AMBalance' }    {'<missing>'        }          NaN

Точки обычно масштабируются и также часто округляются. Для этого используйте formatpoints функция. Например, можно установить целевой уровень точек, соответствующих целевому уровню разногласий, и также установить необходимые точки удваивать разногласия (PDO).

TargetPoints = 500;
TargetOdds = 2;
PDO = 50; % Points to double the odds

sc = formatpoints(sc,'PointsOddsAndPDO',[TargetPoints TargetOdds PDO]);
p2 = displaypoints(sc);
disp(p2)
      Predictors               Bin             Points
    ______________    _____________________    ______

    {'CustAge'   }    {'Up to 36'         }    53.239
    {'CustAge'   }    {'37 to 39'         }    59.796
    {'CustAge'   }    {'40 to 45'         }    67.587
    {'CustAge'   }    {'46 to 57'         }    80.796
    {'CustAge'   }    {'58 and up'        }    99.166
    {'CustAge'   }    {'<missing>'        }       NaN
    {'ResStatus' }    {'Tenant'           }    62.028
    {'ResStatus' }    {'Home Owner'       }    73.445
    {'ResStatus' }    {'Other'            }    91.446
    {'ResStatus' }    {'<missing>'        }       NaN
    {'EmpStatus' }    {'Unknown'          }    58.777
    {'EmpStatus' }    {'Employed'         }    86.976
    {'EmpStatus' }    {'<missing>'        }       NaN
    {'CustIncome'}    {'Up to 28999'      }    31.497
    {'CustIncome'}    {'29000 to 32999'   }    56.805
    {'CustIncome'}    {'33000 to 41999'   }    69.896
    {'CustIncome'}    {'42000 to 46999'   }    81.891
    {'CustIncome'}    {'47000 and up'     }     95.69
    {'CustIncome'}    {'<missing>'        }       NaN
    {'TmWBank'   }    {'Up to 11'         }    51.142
    {'TmWBank'   }    {'12 to 44'         }    61.524
    {'TmWBank'   }    {'45 to 70'         }    92.829
    {'TmWBank'   }    {'71 and up'        }    132.87
    {'TmWBank'   }    {'<missing>'        }       NaN
    {'OtherCC'   }    {'No'               }    50.364
    {'OtherCC'   }    {'Yes'              }    75.732
    {'OtherCC'   }    {'<missing>'        }       NaN
    {'AMBalance' }    {'Up to 558.87'     }    89.908
    {'AMBalance' }    {'558.88 to 1597.43'}    62.353
    {'AMBalance' }    {'1597.44 and up'   }    49.016
    {'AMBalance' }    {'<missing>'        }       NaN

Шаг 5. Выиграйте данные.

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

[Scores,Points] = score(sc);
disp(Scores(1:10))
  528.2044
  554.8861
  505.2406
  564.0717
  554.8861
  586.1904
  441.8755
  515.8125
  524.4553
  508.3169
disp(Points(1:10,:))
    CustAge    ResStatus    EmpStatus    CustIncome    TmWBank    OtherCC    AMBalance
    _______    _________    _________    __________    _______    _______    _________

    80.796      62.028       58.777         95.69      92.829     75.732      62.353  
    99.166      73.445       86.976         95.69      61.524     75.732      62.353  
    80.796      62.028       86.976        69.896      92.829     50.364      62.353  
    80.796      73.445       86.976         95.69      61.524     75.732      89.908  
    99.166      73.445       86.976         95.69      61.524     75.732      62.353  
    99.166      73.445       86.976         95.69      92.829     75.732      62.353  
    53.239      73.445       58.777        56.805      61.524     75.732      62.353  
    80.796      91.446       86.976         95.69      61.524     50.364      49.016  
    80.796      62.028       58.777         95.69      61.524     75.732      89.908  
    80.796      73.445       58.777         95.69      61.524     75.732      62.353  

Шаг 6. Вычислите вероятность значения по умолчанию.

Чтобы вычислить вероятность значения по умолчанию, используйте probdefault функция.

pd = probdefault(sc);

Задайте вероятность того, чтобы быть “Хорошим” и постройте предсказанные разногласия по сравнению с отформатированными баллами. Визуально анализируйте это целевые точки и предназначайтесь для соответствия разногласий и что точки, чтобы удвоить разногласия (PDO) отношение содержат.

ProbGood = 1-pd;
PredictedOdds = ProbGood./pd;

figure
scatter(Scores,PredictedOdds)
title('Predicted Odds vs. Score')
xlabel('Score')
ylabel('Predicted Odds')

hold on

xLimits = xlim;
yLimits = ylim;

% Target points and odds
plot([TargetPoints TargetPoints],[yLimits(1) TargetOdds],'k:')
plot([xLimits(1) TargetPoints],[TargetOdds TargetOdds],'k:')

% Target points plus PDO
plot([TargetPoints+PDO TargetPoints+PDO],[yLimits(1) 2*TargetOdds],'k:')
plot([xLimits(1) TargetPoints+PDO],[2*TargetOdds 2*TargetOdds],'k:')

% Target points minus PDO
plot([TargetPoints-PDO TargetPoints-PDO],[yLimits(1) TargetOdds/2],'k:')
plot([xLimits(1) TargetPoints-PDO],[TargetOdds/2 TargetOdds/2],'k:')

hold off

Шаг 7. Подтвердите модель протокола результатов кредита использование ДНА, ROC и статистической величины Кольмогорова-Смирнова

creditscorecard класс поддерживает три метода валидации, Совокупный профиль точности (CAP), Рабочую характеристику получателя (ROC) и Кольмогорова-Смирнова (K-S) статистическая величина. Для получения дополнительной информации о ДНЕ ROC и KS, видят Совокупный профиль точности (CAP), Рабочую характеристику получателя (ROC) и статистическую величину Кольмогорова-Смирнова (KS).

[Stats,T] = validatemodel(sc,'Plot',{'CAP','ROC','KS'});

disp(Stats)
            Measure              Value 
    ________________________    _______

    {'Accuracy Ratio'      }    0.32225
    {'Area under ROC curve'}    0.66113
    {'KS statistic'        }    0.22324
    {'KS score'            }     499.18
disp(T(1:15,:))
    Scores    ProbDefault    TrueBads    FalseBads    TrueGoods    FalseGoods    Sensitivity    FalseAlarm      PctObs  
    ______    ___________    ________    _________    _________    __________    ___________    __________    __________

     369.4       0.7535          0           1           802          397                 0     0.0012453     0.00083333
    377.86      0.73107          1           1           802          396         0.0025189     0.0012453      0.0016667
    379.78       0.7258          2           1           802          395         0.0050378     0.0012453         0.0025
    391.81      0.69139          3           1           802          394         0.0075567     0.0012453      0.0033333
    394.77      0.68259          3           2           801          394         0.0075567     0.0024907      0.0041667
    395.78      0.67954          4           2           801          393          0.010076     0.0024907          0.005
    396.95      0.67598          5           2           801          392          0.012594     0.0024907      0.0058333
    398.37      0.67167          6           2           801          391          0.015113     0.0024907      0.0066667
    401.26      0.66276          7           2           801          390          0.017632     0.0024907         0.0075
    403.23      0.65664          8           2           801          389          0.020151     0.0024907      0.0083333
    405.09      0.65081          8           3           800          389          0.020151      0.003736      0.0091667
    405.15      0.65062         11           5           798          386          0.027708     0.0062267       0.013333
    405.37      0.64991         11           6           797          386          0.027708      0.007472       0.014167
    406.18      0.64735         12           6           797          385          0.030227      0.007472          0.015
    407.14      0.64433         13           6           797          384          0.032746      0.007472       0.015833

Смотрите также

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

Связанные примеры

Больше о

Внешние веб-сайты

Для просмотра документации необходимо авторизоваться на сайте