В этом примере показано, как создать creditscorecard объект, данные ячейки, отображение и печать информации о связанных данных. В этом примере также показано, как подогнать модель логистической регрессии, получить оценку для модели карты показателей, определить вероятности дефолта и проверить модель карты показателей кредитования с использованием трех различных метрик.
Используйте CreditCardData.mat для загрузки файла data (с использованием набора данных из Refaat 2011). Если ваш data содержит много предикторов, можно сначала использовать screenpredictors(Панель инструментов управления рисками) из Toolbox™ управления рисками, чтобы разбить потенциально большой набор предикторов на подмножество, наиболее прогнозирующее переменную ответа кредитной карты показателей. Затем можно использовать это подмножество предикторов при создании creditscorecard объект.
При создании creditscorecard object, по умолчанию, 'ResponseVar' установлен в последний столбец в данных ('status' в этом примере) и 'GoodLabel' к значению ответа с наибольшим числом (0 в этом примере). Синтаксис для creditscorecard указывает, что 'CustID' является 'IDVar' для удаления из списка предикторов. Также, хотя и не продемонстрировано в этом примере, при создании creditscorecard объект с использованием creditscorecard, можно использовать необязательный аргумент пара имя-значение 'WeightsVar' для указания веса наблюдения (образца) или 'BinMissingData' в ячейку с отсутствующими данными.
load CreditCardData
head(data)ans=8×11 table
CustID CustAge TmAtAddress ResStatus EmpStatus CustIncome TmWBank OtherCC AMBalance UtilRate status
______ _______ ___________ __________ _________ __________ _______ _______ _________ ________ ______
1 53 62 Tenant 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 50 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
Переменные в 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')
Используйте autobinning функция для выполнения автоматического binning для каждой переменной предиктора, используя значение по умолчанию 'Monotone' с параметрами алгоритма по умолчанию.
sc = autobinning(sc);
После этапа автоматического смешивания все ячейки предиктора должны быть проверены с помощью bininfo и plotbins функции и отлаженные. Монотонная, в идеале линейная тенденция в весе доказательств (WOE) желательна для кредитных карт показателей, потому что это переводится в линейные точки для данного предиктора. Тенденции WOE можно визуализировать с помощью plotbins.
Predictor =
'ResStatus';
plotbins(sc,Predictor)
В отличие от начального графика 'ResStatus' при создании карты показателей новый график для 'ResStatus' показывает возрастающую тенденцию WOE. Это потому, что autobinning функция по умолчанию сортирует порядок категорий путем увеличения шансов.
Эти графики показывают, что 'Monotone' алгоритм делает хорошую работу по поиску монотонных тенденций WOE для этого набора данных. Чтобы завершить процесс связывания, необходимо выполнить только несколько ручных регулировок для некоторых предикторов с помощью modifybins функция.
Общие шаги для изменения ячеек вручную:
Используйте bininfo с двумя выходными аргументами, где второй аргумент содержит правила объединения.
Вручную измените правила связывания, используя второй выходной аргумент из bininfo.
Установка обновленных правил связывания с помощью modifybins а затем использовать plotbins или bininfo для просмотра обновленных ячеек.
Например, на основе графика для 'CustAge' на этапе 2а бункеры 1 и 2 имеют такие же WOE, как бункеры 5 и 6. Для объединения этих ячеек с помощью описанных выше шагов:
Predictor =
'CustAge';
[bi,cp] = bininfo(sc,Predictor)bi=8×6 table
Bin Good Bad Odds WOE InfoValue
_____________ ____ ___ ______ _________ _________
{'[-Inf,33)'} 70 53 1.3208 -0.42622 0.019746
{'[33,37)' } 64 47 1.3617 -0.39568 0.015308
{'[37,40)' } 73 47 1.5532 -0.26411 0.0072573
{'[40,46)' } 174 94 1.8511 -0.088658 0.001781
{'[46,48)' } 61 25 2.44 0.18758 0.0024372
{'[48,58)' } 263 105 2.5048 0.21378 0.013476
{'[58,Inf]' } 98 26 3.7692 0.62245 0.0352
{'Totals' } 803 397 2.0227 NaN 0.095205
cp = 6×1
33
37
40
46
48
58
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, потому что они имеют аналогичные WOE. Для объединения этих ячеек:
Predictor =
'CustIncome';
[bi,cp] = bininfo(sc,Predictor)bi=8×6 table
Bin Good Bad Odds WOE InfoValue
_________________ ____ ___ _______ _________ __________
{'[-Inf,29000)' } 53 58 0.91379 -0.79457 0.06364
{'[29000,33000)'} 74 49 1.5102 -0.29217 0.0091366
{'[33000,35000)'} 68 36 1.8889 -0.06843 0.00041042
{'[35000,40000)'} 193 98 1.9694 -0.026696 0.00017359
{'[40000,42000)'} 68 34 2 -0.011271 1.0819e-05
{'[42000,47000)'} 164 66 2.4848 0.20579 0.0078175
{'[47000,Inf]' } 183 56 3.2679 0.47972 0.041657
{'Totals' } 803 397 2.0227 NaN 0.12285
cp = 6×1
29000
33000
35000
40000
42000
47000
cp([3 4]) = []; % To merge bins 3, 4, and 5 sc = modifybins(sc,'CustIncome','CutPoints',cp); plotbins(sc,'CustIncome')

Для 'TmWBank', основываясь на графике выше, лучше всего объединить бункеры 2 и 3, потому что они имеют аналогичные WOE. Для объединения этих ячеек:
Predictor =
'TmWBank';
[bi,cp] = bininfo(sc,Predictor)bi=6×6 table
Bin Good Bad Odds WOE InfoValue
_____________ ____ ___ ______ ________ _________
{'[-Inf,12)'} 141 90 1.5667 -0.25547 0.013057
{'[12,23)' } 165 93 1.7742 -0.13107 0.0037719
{'[23,45)' } 224 125 1.792 -0.12109 0.0043479
{'[45,71)' } 177 67 2.6418 0.26704 0.013795
{'[71,Inf]' } 96 22 4.3636 0.76889 0.049313
{'Totals' } 803 397 2.0227 NaN 0.084284
cp = 4×1
12
23
45
71
cp(2) = []; % To merge bins 2 and 3 sc = modifybins(sc,'TmWBank','CutPoints',cp); plotbins(sc,'TmWBank')

Для 'AMBalance', основываясь на графике выше, лучше всего объединить бункеры 2 и 3, потому что они имеют аналогичные WOE. Для объединения этих ячеек:
Predictor =
'AMBalance';
[bi,cp] = bininfo(sc,Predictor)bi=5×6 table
Bin Good Bad Odds WOE InfoValue
_____________________ ____ ___ ______ ________ _________
{'[-Inf,558.88)' } 346 134 2.5821 0.24418 0.022795
{'[558.88,1254.28)' } 309 171 1.807 -0.11274 0.0051774
{'[1254.28,1597.44)'} 76 44 1.7273 -0.15787 0.0025554
{'[1597.44,Inf]' } 72 48 1.5 -0.29895 0.0093402
{'Totals' } 803 397 2.0227 NaN 0.039868
cp = 3×1
103 ×
0.5589
1.2543
1.5974
cp(2) = []; % To merge bins 2 and 3 sc = modifybins(sc,'AMBalance','CutPoints',cp); plotbins(sc,'AMBalance')

Теперь, когда точная настройка биннинга завершена, бункеры для всех предикторов имеют близкие к линейным тенденции WOE.
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
После подгонки логистической модели точки по умолчанию не масштабируются и поступают непосредственно из комбинации значений 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
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
Чтобы вычислить вероятность дефолта, используйте 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

creditscorecard класс поддерживает три метода проверки: профиль кумулятивной точности (CAP), рабочую характеристику приемника (ROC) и статистику Колмогорова-Смирнова (K-S). Дополнительные сведения о CAP, 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
autobinning | bindata | bininfo | compact | creditscorecard | displaypoints | fitmodel | formatpoints | modifybins | modifypredictor | plotbins | predictorinfo | probdefault | score | setmodel | validatemodel