Припишите протоколам результатов ограниченные коэффициенты логистической регрессии

Вычислить музыку к creditscorecard объект с ограничениями для равенства, неравенства, или границ на коэффициентах модели логистической регрессии, использует fitConstrainedModel. В отличие от fitmodel, fitConstrainedModel решает для обоих неограниченную и ограниченную задачу. Текущий решатель раньше минимизировал целевую функцию для fitConstrainedModel fmincon, от Optimization Toolbox™.

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

Создайте creditscorecard Объект и данные об Интервале

load CreditCardData.mat
sc = creditscorecard(data,'IDVar','CustID');
sc = autobinning(sc);

Неограниченная модель Используя fitConstrainedModel

Решите для неограниченных коэффициентов с помощью fitConstrainedModel со значениями по умолчанию для входных параметров. fitConstrainedModel использует внутренний решатель оптимизации fmincon от Optimization Toolbox™. Если вы не устанавливаете ограничений, fmincon обрабатывает модель как проблему оптимизации без ограничений. Параметры по умолчанию для LowerBound и UpperBound -Inf и +Inf, соответственно. Для ограничений равенства и ограничений неравенства, значением по умолчанию является пустой числовой массив.

[sc1,mdl1] = fitConstrainedModel(sc);
coeff1 = mdl1.Coefficients.Estimate;
disp(mdl1.Coefficients);
                   Estimate 
                   _________

    (Intercept)      0.70246
    CustAge           0.6057
    TmAtAddress       1.0381
    ResStatus         1.3794
    EmpStatus        0.89648
    CustIncome       0.70179
    TmWBank           1.1132
    OtherCC           1.0598
    AMBalance         1.0572
    UtilRate       -0.047597

В отличие от fitmodel который дает p-значения, при использовании fitConstrainedModel, необходимо использовать начальную загрузку, чтобы узнать, какие предикторы отклоняются из модели, когда удовлетворяющий ограничениям. Это проиллюстрировано в разделе "Significance Bootstrapping".

Используя fitmodel сравнить результаты и калибровать модель

fitmodel подбирает модель логистической регрессии к данным о Весе доказательства (WOE) и нет никаких ограничений. Можно сравнить результаты раздела "Unconstrained Model Using fitConstrainedModel" с теми из fitmodel проверять, что модель хорошо калибруется.

Теперь решите неограниченную задачу при помощи fitmodel. Обратите внимание на то, что fitmodel и fitConstrainedModel используйте другие решатели. В то время как fitConstrainedModel использование fmincon, fitmodel использование stepwiseglm по умолчанию. Чтобы включать все предикторы от запуска, установите 'VariableSelection' аргумент пары "имя-значение" fitmodel к 'fullmodel'.

[sc2,mdl2] = fitmodel(sc,'VariableSelection','fullmodel','Display','off');
coeff2 = mdl2.Coefficients.Estimate;
disp(mdl2.Coefficients);
                   Estimate        SE         tStat        pValue  
                   _________    ________    _________    __________

    (Intercept)      0.70246    0.064039       10.969    5.3719e-28
    CustAge           0.6057     0.24934       2.4292      0.015131
    TmAtAddress       1.0381     0.94042       1.1039       0.26963
    ResStatus         1.3794      0.6526       2.1137      0.034538
    EmpStatus        0.89648     0.29339       3.0556     0.0022458
    CustIncome       0.70179     0.21866       3.2095     0.0013295
    TmWBank           1.1132     0.23346       4.7683    1.8579e-06
    OtherCC           1.0598     0.53005       1.9994      0.045568
    AMBalance         1.0572     0.36601       2.8884     0.0038718
    UtilRate       -0.047597     0.61133    -0.077858       0.93794
figure
plot(coeff1,'*')
hold on
plot(coeff2,'s')
xticklabels(mdl1.Coefficients.Properties.RowNames)
xtickangle(45)
ylabel('Model Coefficients')
title('Unconstrained Model Coefficients')
legend({'Calculated by fitConstrainedModel with defaults','Calculated by fimodel'},'Location','best')
grid on

И как таблицы и как график показывают, соответствие коэффициентов модели. Можно быть уверены что эта реализация fitConstrainedModel хорошо калибруется.

Ограниченная модель

В ограниченном подходе модели вы решаете для значений коэффициентов bi из логистической модели согласно ограничениям. Поддерживаемые ограничения связаны, равенство или неравенство. Коэффициенты максимизируют функцию, определяемую вероятности значения по умолчанию для наблюдения i, как:

Li=p(Defaulti)yi×(1-p(Defaulti))1-yi                    

где:

  • p(Defaulti)=1    1+e-bxi

  • b=[b1b2...bK] неизвестный коэффициент модели

  • xi=[xi1x2...xiK] значения предиктора при наблюдении i

  • yi значение ответа; значение 1 представляет значение по умолчанию, и значение 0 представляет не по умолчанию

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

pi=p(Defaulti)yi*p(Defaulti)yi*...*p(Defaulti)yiwitimes=p(Defaulti)wi*yi

Аналогично, вероятность не по умолчанию для взвешенного наблюдения i:

pˆi=p(~Defaulti)1-yi*p(~Defaulti)1-yi*...*p(~Defaulti)1-yiwitimes=(1-p(Defaulti))wi*(1-yi)

Для взвешенных данных, если существует значение по умолчанию в заданном наблюдении i, чей вес wi, это - как будто был a wi количество того одного наблюдения и всех их или все значение по умолчанию или все не по умолчанию. wi май или не может быть целым числом.

Поэтому для взвешенных данных, функция вероятности значения по умолчанию для наблюдения i в первом уравнении становится

Li=p(Defaulti)wi*yi×(1-p(Defaulti))wi*(1-yi)

Предположением всеми значениями по умолчанию являются независимые события, таким образом, целевая функция

L=L1×L2×...×LN

или, в более удобных логарифмических терминах:

log(L)=i=1Nwi*[yilog(p(Defaulti))+(1-yi)log(1-p(Defaulti))]

Примените ограничения на коэффициенты

После калибровки неограниченной модели как описано в разделе "Unconstrained Model Using fitConstrainedModel" можно решить для коэффициентов модели, удовлетворяющих ограничениям. Можно выбрать нижние и верхние границы, таким образом что 0bi1,i=1...K, за исключением прерывания. Кроме того, поскольку потребительский возраст и клиент поступают, несколько коррелируются, можно также использовать дополнительные ограничения на их коэффициенты, например, |bCusAge-bCustIncome|<0.1. Коэффициенты, соответствующие предикторам 'CustAge' и 'CustIncome' в этом примере b2 и b6, соответственно.

K  = length(sc.PredictorVars);
lb = [-Inf;zeros(K,1)];
ub = [Inf;ones(K,1)];
AIneq = [0 -1 0 0 0 1 0 0 0 0;0 -1 0 0 0 -1 0 0 0 0];
bIneq = [0.05;0.05];
Options = optimoptions('fmincon','SpecifyObjectiveGradient',true,'Display','off');
[sc3,mdl] = fitConstrainedModel(sc,'AInequality',AIneq,'bInequality',bIneq,...
    'LowerBound',lb,'UpperBound',ub,'Options',Options);

figure
plot(coeff1,'*','MarkerSize',8)
hold on
plot(mdl.Coefficients.Estimate,'.','MarkerSize',12)
line(xlim,[0 0],'color','k','linestyle',':')
line(xlim,[1 1],'color','k','linestyle',':')
text(1.1,0.1,'Lower bound')
text(1.1,1.1,'Upper bound')
grid on

xticklabels(mdl.Coefficients.Properties.RowNames)
xtickangle(45)
ylabel('Model Coefficients')
title('Comparison Between Unconstrained and Constrained Solutions')
legend({'Unconstrained','Constrained'},'Location','best')

Начальная загрузка значения

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

В загружающемся подходе, при использовании fitConstrainedModel, вы устанавливаете аргумент 'Bootstrap' значения имени к true и выбрал значение для аргумента 'BootstrapIter' значения имени. Начальная загрузка средних значений это NIter выборки (с заменой) от исходных наблюдений выбраны. В каждой итерации, fitConstrainedModel решает для той же ограниченной проблемы как раздел "Constrained Model". fitConstrainedModel получает несколько значений (решения) для каждого коэффициента bi и можно построить их как boxplot или histogram. Используя коробчатую диаграмму или гистограмму, можно исследовать средние значения, чтобы оценить, вдали ли коэффициенты от нуля и сколько коэффициенты отклоняют от их средних значений.

lb = [-Inf;zeros(K,1)];
ub = [Inf;ones(K,1)];
AIneq = [0 -1 0 0 0 1 0 0 0 0;0 1 0 0 0 -1 0 0 0 0];
bIneq = [0.05;0.05];
c0 = zeros(K,1);
NIter = 100;
Options = optimoptions('fmincon','SpecifyObjectiveGradient',true,'Display','off');
rng('default')

[sc,mdl] = fitConstrainedModel(sc,'AInequality',AIneq,'bInequality',bIneq,...
    'LowerBound',lb,'UpperBound',ub,'Bootstrap',true,'BootstrapIter',NIter,'Options',Options);

figure
boxplot(mdl.Bootstrap.Matrix,mdl.Coefficients.Properties.RowNames)
hold on
line(xlim,[0 0],'color','k','linestyle',':')
line(xlim,[1 1],'color','k','linestyle',':')
title('Bootstrapping with N = 100 Iterations')
ylabel('Model Coefficients')
xtickangle(45)

Твердые красные линии в коробчатой диаграмме указывают, что средние значения и нижняя часть и верхние края для 25th и 75th процентили. "Контактные усики" являются минимальными и максимальными значениями, не включая выбросы. Пунктирные линии представляют ограничения нижней и верхней границы на коэффициенты. В этом примере коэффициенты не могут быть отрицательными конструкцией.

Чтобы помочь решить который предикторы сохранить в модели, оцените пропорцию времен, каждый коэффициент является нулем.

Tol = 1e-6;
figure
bar(100*sum(mdl.Bootstrap.Matrix<= Tol)/NIter)
ylabel('% of Zeros')
title('Percentage of Zeros Over Bootstrap Iterations')
xticklabels(mdl.Coefficients.Properties.RowNames)
xtickangle(45)
grid on

На основе графика можно отклонить 'UtilRate' поскольку это имеет самое большое количество нулевых значений. Можно также решить отклонить 'TmAtAddress' поскольку это показывает пик, хотя маленький.

Обнулите соответствующие коэффициенты

Чтобы обнулить соответствующие коэффициенты, обнулите их верхнюю границу и решите модель снова с помощью исходного набора данных.

ub(3) = 0;
ub(end) = 0;
[sc,mdl] = fitConstrainedModel(sc,'AInequality',AIneq,'bInequality',bIneq,'LowerBound',lb,'UpperBound',ub,'Options',Options);
Ind = (abs(mdl.Coefficients.Estimate) <= Tol);
ModelCoeff = mdl.Coefficients.Estimate(~Ind);
ModelPreds = mdl.Coefficients.Properties.RowNames(~Ind)';

figure
hold on
plot(ModelCoeff,'.','MarkerSize',12)
ylim([0.2 1.2])
ylabel('Model Coefficients')
xticklabels(ModelPreds)
xtickangle(45)
title('Selected Model Coefficients After Bootstrapping')
grid on

Задержите ограниченные коэффициенты в creditscorecard

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

ModelPreds = ModelPreds(2:end);
sc = setmodel(sc,ModelPreds,ModelCoeff);
p = displaypoints(sc);

disp(p)
      Predictors               Bin              Points  
    ______________    _____________________    _________

    {'CustAge'   }    {'[-Inf,33)'        }     -0.16725
    {'CustAge'   }    {'[33,37)'          }     -0.14811
    {'CustAge'   }    {'[37,40)'          }    -0.065607
    {'CustAge'   }    {'[40,46)'          }     0.044404
    {'CustAge'   }    {'[46,48)'          }      0.21761
    {'CustAge'   }    {'[48,58)'          }      0.23404
    {'CustAge'   }    {'[58,Inf]'         }      0.49029
    {'CustAge'   }    {'<missing>'        }          NaN
    {'ResStatus' }    {'Tenant'           }    0.0044307
    {'ResStatus' }    {'Home Owner'       }      0.11932
    {'ResStatus' }    {'Other'            }      0.30048
    {'ResStatus' }    {'<missing>'        }          NaN
    {'EmpStatus' }    {'Unknown'          }    -0.077028
    {'EmpStatus' }    {'Employed'         }      0.31459
    {'EmpStatus' }    {'<missing>'        }          NaN
    {'CustIncome'}    {'[-Inf,29000)'     }     -0.43795
    {'CustIncome'}    {'[29000,33000)'    }    -0.097814
    {'CustIncome'}    {'[33000,35000)'    }     0.053667
    {'CustIncome'}    {'[35000,40000)'    }     0.081921
    {'CustIncome'}    {'[40000,42000)'    }     0.092364
    {'CustIncome'}    {'[42000,47000)'    }      0.23932
    {'CustIncome'}    {'[47000,Inf]'      }      0.42477
    {'CustIncome'}    {'<missing>'        }          NaN
    {'TmWBank'   }    {'[-Inf,12)'        }     -0.15547
    {'TmWBank'   }    {'[12,23)'          }    -0.031077
    {'TmWBank'   }    {'[23,45)'          }    -0.021091
    {'TmWBank'   }    {'[45,71)'          }      0.36703
    {'TmWBank'   }    {'[71,Inf]'         }      0.86888
    {'TmWBank'   }    {'<missing>'        }          NaN
    {'OtherCC'   }    {'No'               }     -0.16832
    {'OtherCC'   }    {'Yes'              }      0.15336
    {'OtherCC'   }    {'<missing>'        }          NaN
    {'AMBalance' }    {'[-Inf,558.88)'    }      0.34418
    {'AMBalance' }    {'[558.88,1254.28)' }    -0.012745
    {'AMBalance' }    {'[1254.28,1597.44)'}    -0.057879
    {'AMBalance' }    {'[1597.44,Inf]'    }     -0.19896
    {'AMBalance' }    {'<missing>'        }          NaN

Используя немасштабированные точки, можно следовать за остатком от Протокола результатов Кредита, Моделируя Рабочий процесс, чтобы вычислить баллы и вероятности значения по умолчанию и подтвердить модель.