Тестово изпълнение - Probit класификация с помощта на C#
Вероятностната единица (probit) е техника за машинно обучение (ML), която може да се използва за правене на прогнози в ситуации, при които зависимата променлива, чиято стойност трябва да се прогнозира, е двоична, т.е. може да приеме една от две възможни стойности. Пробит класификацията се нарича още пробит регресия и пробит моделиране.
Пробит класификацията е много подобна на класификационния метод на логистичната регресия (логистична регресия, LR). Тези два метода се прилагат за едни и същи типове проблеми и дават подобни резултати. Изборът на един от тези два метода обикновено зависи от дисциплината, в която работите. Probit често се използва в икономиката и финансите, докато LR се използва по-често в други области.
За да получите представа какво е probit класификация, разгледайте демонстрационната програма нафиг. 1.

В демонстрацията пробит класификацията се използва за създаване на модел, който прогнозира дали пациентът ще умре в болница въз основа на неговата възраст, пол и резултати от бъбречни изследвания. Данните са напълно изкуствени. Първият елемент от оригиналните данни изглежда така:
Изходните данни (сурови данни) се състоят от 30 елемента. Полът се кодира като -1 (мъжки) и +1 (женски). Предсказаната стойност на Died е в последната колона и е кодирана като 0 = невярно (пациентът ще оцелее) и 1 = вярно. Така първият елемент от данни идентифицира 48-годишна жена с бъбречен резултат 4,40, която ще оцелее. Демонстрацията започва с нормализиране на данните за възрастта и здравето на бъбреците, така че всички стойности да са приблизително от същия порядък. Първи елемент от данни след нормализиранестава така:
Нормализираните стойности по-малки от 0,0 (тук: възраст и бъбречен резултат) са под средните стойности, а стойностите по-големи от 0,0 са над средните.
След това оригиналните данни се разделят произволно на набор от 24 елемента за обучение за изграждане на модела и набор от 6 елемента за валидиране, за да се оцени точността на модела, когато се прилага към нови данни с неизвестни резултати.
След това демонстрационната програма създава пробит модел. Зад кулисите, обучението се извършва с помощта на симплексния метод за оптимизация с максимален брой итерации, равен на 100. След обучението се показват теглата, които определят модела - < -4.26, 2.30, -1.29, 3.45 >.
Първата стойност на теглото (–4,26) е универсална константа и не се прилага към никоя специфична предикторна променлива. Второто тегло (2,30) се отнася за възрастта, третото (–1,29) за пола, а четвъртото (3,45) за резултатите от бъбреците. Положителните тегла, като тези, свързани с възрастта и състоянието на бъбреците, означават, че по-високите предикторни стойности показват, че зависимата променлива Died ще бъде по-близо до истината.
Демонстрацията изчислява точността на модела върху набор от 24 елемента за обучение (100% правилен) и набор за валидиране (83,33%, или пет правилни и един неправилен). По-високата от тези две стойности е точността на теста. Това е груба оценка на общата точност на пробит модела.
Тази статия предполага, че имате поне средно ниво на програмиране и основно разбиране на ML класификацията, но нищо за probit класификацията. Демо програмата е написана на C#, но вие няматетрябва да има някои специални проблеми, ако искате да преработите код за други .NET езици. Демото е твърде дълго, за да бъде представено изцяло в тази статия, но можете да намерите пълния изходен код в кодовия пакет, който придружава тази статия. Цялата обща обработка на грешки е премахната, за да не се замъгляват основните идеи.
Разбиране на Probit класификацията
Лесен начин за прогнозиране на смърт поради променливи като възраст, пол и бъбречно здраве би била линейна комбинация:
където b0, b1, b2, b3 са стойности на теглото, които трябва да бъдат определени по някакъв начин, така че изходните стойности, изчислени в набора за обучение, да съответстват точно на известните стойности на зависимата променлива. Логистичната регресия разширява тази идея с по-сложна функция за прогнозиране:
Математиката тук е доста сложна, но функцията за прогнозиране, наречена логистична сигмоидна функция, винаги връща стойност между 0,0 и 1,0, която може да се тълкува като вероятност, за наше удобство. Probit класификацията използва различна функция за прогнозиране:
Функцията Phi(z) се нарича стандартна нормална функция за кумулативна плътност (обикновено съкратена като CDF) и винаги връща стойност между 0,0 и 1,0. CDF е доста сложен, защото няма просто уравнение за него. CDF за z стойност е площта под известната камбанообразна крива на Гаус (функция на Гаус) от отрицателна безкрайност до z.
Звучи много по-сложно, отколкото е в действителност. Погледнете графиката нафиг. 2. Показва логистична сигмоидна функция и CDF функция,точките от които са нанесени на близката графика. Важно е, че за всяка стойност на z, въпреки че основните функции са напълно различни, и двете функции връщат стойност между 0,0 и 1,0, която може да се тълкува като вероятност.

Стандартен нормален CDF | Стандартен нормален CDF |
Кумулативна плътност (z) | Кумулативна плътност (z) |
CDF | CDF |
лог сигмоида | Логистична сигма |
И така, от гледна точка на разработчика, първата задача е да се напише функция, която изчислява CDF за стойността z. Няма просто уравнение за изчисляване на CDF, но има десетки екзотично изглеждащи приближения. Един от най-често срещаните начини за приближаване на CDF е да се изчисли erf (съкратено от Error Function) с помощта на уравнение, наречено "A&S 7.1.26" и да се използва erf за определяне на CDF. Кодът за функцията CDF е показан нафиг. 3.
Фиг. 3. CDF функция в C#
Обобщете. Probit класификацията използва функцията CDF за изчисляване на изходната стойност. Функцията CDF се нарича още фи. CDF е площта под кривата на Гаус и за нея няма просто уравнение. Обичаен начин за приближаване на CDF е да се използва формула A&S 7.1.26, за да се получи erf и след това да се използва erf, за да се получи CDF.
С функцията CDF е лесно да се изчисли пробит изходът за набор от входни стойности и набор от стойности на теглото:
Второто предизвикателство при писане на код за probit класификация е да се определят стойностите за теглата, така че когато данните за обучение се предават, изчислените изходни стойности да съвпадат точно с известните изходни стойности.Друг начин да се разгледа този проблем е да се минимизира грешката между изчислените и известни изходни стойности. Това се нарича обучение на модела с числена оптимизация.
Няма лесен начин за обучение на повечето ML класификатори, включително пробит класификатори. Има около дузина основни методи, които можете да използвате, и всеки метод има десетки варианти. Общите методи за обучение включват просто градиентно спускане, обратно разпространение, алгоритъм на Нютон-Рафсън, оптимизация на рояк частици, еволюционна оптимизация и L-BFGS. Демо програмата използва един от най-старите и прости методи за обучение, симплексна оптимизация.
Разбиране на симплексната оптимизация
Грубо казано, симплексът е триъгълник. Идеята зад симплекс оптимизацията е да се започне с три възможни решения (оттук и името симплекс). Едно от решенията ще бъде „най-доброто“ (с най-малката грешка), другото ще бъде „най-лошото“ (най-голямата грешка), а третото ще бъде „различно“. След това симплексният алгоритъм за оптимизация генерира три нови потенциални решения: разширено, отразено и свито. Всеки от тях се сравнява с текущото най-лошо решение и ако някой от новите кандидати е по-добър (с по-малко грешки), той замества най-лошото решение.
Симплексната оптимизация е показана нафиг. 4. В простия случай, когато решението се състои от две стойности, например (1.23, 4.56), решението може да се разглежда като точка в равнината (x, y). От лявата странаФиг. 4 може да се види, че три нови кандидат-решения са генерирани от "най-добрите", "най-лошите" и "другите" решения.

друго | друго |
най-лошото | по-лошо |
договорени | компресиран |
центроид | центроид |
отразени | отразени |
разширена | удължен |
най-доброто | най-доброто |
Трима кандидати за заместване на най-лошия | Трима кандидати да заменят най-лошото решение |
друг' | друг' |
най-лошото' | по-лошо' |
Свиване | Намаляване |
Първо се изчислява центроидът. Центроидът е средната стойност на най-доброто и другото решение. В две измерения това е точката по средата между точките на най-добрите и другите решения. След това се начертава въображаема линия, която започва от най-лошата точка на решение и минава през центроида. Компресираният кандидат се намира между най-лошите точки за вземане на решение и центроида. Отразеният кандидат е разположен на въображаема линия зад центроида, а разширеният кандидат е разположен зад отразената точка на решение.
При всяка итерация на симплексната оптимизация, ако един от кандидатите (разширен, отразен или компресиран) е по-добър от текущото най-лошо решение, последното се заменя с този кандидат. Ако нито един от трите генерирани кандидата не е по-добър от най-лошото решение, текущото най-лошо и другото решение се изместват към най-доброто решение някъде между текущите им позиции и позицията на най-доброто решение, както е показано от дясната страна нафиг. 4.
След всяка итерация се образува нов виртуален триъгълник „най-добър-друг-по-лош“, който се доближава все повече до оптималното решение. Ако направите снимка на всеки триъгълник с последователен подход, тогава изместването на триъгълниците прилича на движението на заострена капкана плоскост в стила на едноклетъчна амеба. Поради тази причина симплексната оптимизация понякога се нарича оптимизация на метода на амеба.
Има много варианти на симплексна оптимизация, които се различават по това колко далеч са компресираните, отразените и разширените кандидат-решения от текущия центроид и по реда, в който кандидат-решенията се тестват, за да се види дали са по-добри от текущото най-лошо решение. Най-често срещаната форма на симплексна оптимизация е алгоритъмът на Nelder-Mead. Демото използва по-опростен вариант, който няма конкретно име.
В случай на пробит класификация, всяко потенциално решение е набор от тегла. В псевдокода нафиг. 5 показва вариант на симплексната оптимизация, използвана в демонстрационната програма.
Фиг. 5. Псевдокод за симплексна оптимизация, използван от демонстрацията