Използвам различни класификационни модели, за да предвидя оцеляването на хората, които са били на Титаник.

Потъването на Титаник е едно от най-известните корабокрушения в историята. Титаник потъна след сблъсък с айсберг, който почти уби 1502 от 2224 пътници. Приложих класификационни модели, за да предвидя дали пътник ще оцелее след корабокрушението. Пълният код за бележника на jupyter съдържа документация за целия ми мисловен процес, може да бъде намерен на:



Както при всеки проект за наука за данни, трябва да създадем функции, които да улеснят почистването на данни по-късно. Първо ще заредим нашите зависимости и ще създадем проста функция за зареждане на тестовите файлове и набора за обучение.

Ще опитам нещо ново и ще кача цялата същност тук, всеки може да види кода и резултатите.

Целта

Целта на този проект е да се определи степента на оцеляване на пътниците на Титаник с дадените характеристики.

Характеристиките:

  • PassengerId
  • оцеля
  • Pclass
  • Име
  • секс
  • Възраст
  • SibSp
  • Парч
  • Билет
  • тарифа
  • Кабина
  • Качен

Има много по-малко функции в сравнение с нашия набор от данни за цените на жилищата. Преди да подадем тези данни в модел за машинно обучение, трябва да почистим нашите данни. Почистването на нашите данни включва:

  • Избор на функции и инженеринг — Гарантиране, че характеристиките, които въвеждаме в модела, определят дали човек оцелява или не. Например функция, която ни казва дали този човек е носил часовник, вероятно няма да е важна за оцеляването.
  • Намиране и заместване на липсващи стойности — Трябва да сме сигурни, че няма липсващи стойности в нашия набор от данни, защото това ще подведе нашия модел и дори може да причини грешки.
  • Кодирайте категорични характеристики — Моделите за машинно обучение могат да приемат само цели числа като входни данни, така че ще трябва да помислим за ефективен начин да картографираме нашите категорични колони (Пол и т.н.) в цели числа. Категория като Секс е сравнително лесна, защото данните са или мъжки, или женски, които могат да бъдат съпоставени с 0 или 1.

Нека да видим дали има някакви функции, от които можем да се отървем с помощта на някои методи на pandas.

.info()ни дава общ преглед на това колко стойности са записани за всяка функция. Можем да видим, че Cabin има само 204 записани екземпляра и възрастта липсва някои. Нека помислим теоретично за тези функции, преди да решим как да подходим към функциите за възраст и кабина.

Прилагане на познания в областта

Когато има корабокрушение, насоките, които всички трябва да следват, са първо жените и децата. Предполагам, че пътниците на Титаник са последвали примера, което означава, че характеристиките за възраст и пол биха били важни за процента на оцеляване. Можем също така да предположим, че Pclass, пътническата класа (1,2,3), в която е бил човекът, също е била важна. Сигурен съм, че тези пътници от първа класа ще се опитат да бъдат спасени първи. Можем да проверим важността на тези характеристики, като групираме тези колони заедно в йерархична рамка от данни.

Тази информация е доста мрачна! Оказва се, че сме били на прав път с нашите теоретични характеристики. Преди това обобщих общия брой на жените, 314, и мъжете, 577. Можем да видим от това групиране, че само 109/577 мъже са оцелели, изглежда, че са следвали указанията (съжалявам Джак). За женските имаше 233/314, които оцеляха и погледнете броя на женските, които умряха в първи клас, само 3. Във всички Pclass изглежда процентът на оцеляване при женските беше висок, с изключение на Pclass 3, където процентът на оцеляване беше 50%.

Тези характеристики изглеждат доста важни, сега трябва да начертаем някои от тези характеристики като хистограми, за да визуализираме данните. Това е важно, за да знаете дали някои функции се нуждаят от трансформации, преди да бъдат включени в модел за машинно обучение.

Случайно начертах PassengerId, което изобщо не е свързано с оцеляването. От тези хистограми можем да видим, че двете характеристики Parch и SibSp съдържат голямо количество нули. Това може да изкриви нашите модели и трябва да решим дали да се отървем от тези функции или да създадем нова функция, като ги комбинираме. Има някои нули във функцията за възраст, които можем да променим, като ги заменим с режима, медианата или средните стойности за тази колона.

Като последна техника за проучвателен анализ на данни, нека създадем корелационна матрица, за да разберем точната връзка на тези характеристики с оцелялата характеристика.

Първо създавам функция за картографиране на функцията Sex в двоични 0 и 1, което ще позволи да се използва в корелационната матрица. Изглежда има силни корелации между пола, Pclass и тарифата, но не толкова много възрастта. Сега, след като имаме известно разбиране за нашите функции, трябва да създадем функция за почистване на нашите данни.

Инженеринг на функции/ Почистване на данни

Функциите, които трябва да променим, са:

  • Кабина — Много липсващи стойности
  • Билет — изглежда безполезен и има много уникални стойности
  • Възраст — Заменете липсващите стойности
  • Име — всяко име е уникално
  • Embarked — Попълнете 2 липсващи стойности и създайте фиктивни променливи

Кабина —Мисля, че най-добрият подход към функцията за кабина е да се създаде нова функция, наречена HasCabin, и да се кодира с двоични стойности, 0 и 1.

Билет —Засега смятам, че тази колона е безполезна и ще я премахна от модела.

Възраст —Ще попълня всички липсващи стойности със средната възраст, защото изглежда представителна за набора от извадки.

Име —Изглежда, че всяко име има свързано заглавие, като г-н, госпожа и т.н. Те са разделени със запетая и точка, така че ще разделя всеки низ между тези разделители и ще създам нова функция, наречена Заглавие. Ще съпоставя всяко заглавие с числова стойност от 0 до 3.

Embarked —Тази функция има две липсващи стойности, които ще попълним с режима на тази колона. След това ще използвам фиктивни променливи, предоставени от модула Pandas, за да кодирам тази категорична характеристика.

Трябва да създадем функция за прилагане на всички тези трансформации към нашия набор от данни и крайният код за почистване на нашите данни е:

Модели на машинно обучение

Ще използвам ансамбъл от следните класификационни модели за машинно обучение:

  • AdaBoost DecisionTreeClassifier
  • ExtraTreeClassifier
  • Случайни гори
  • GradientBoostingClassifier
  • SupportVectorClassifier

Произволен вход беше предоставен на 10 различни класификационни алгоритми и те имаха най-висока средна точност от тях, поради което бяха избрани. Използвах GridSearchCV, за да определя оптималните параметри за всеки модел и StratifiedKFold, за да разделя допълнително нашия набор за обучение в негов собствен набор за обучение и тестване. В името на пространството ще пропусна всеки алгоритъм, но всички те могат да бъдат намерени в моя githib. Класификаторът за гласуване комбинира тези модели и прави окончателна прогноза въз основа на прогнозите на класификационните модели.

Последната стъпка е да заредим нашия тестов набор, да приложим нашите трансформации и да извикаме метода за прогнозиране на тестовия набор. Качих прогнозите в kaggle и бях доволен от мястото си в състезанието.

Това не е най-добрият ранг, но е много по-добър от предишния ми ранг за състезанието за цени на жилища. Това показва, че научавам повече за инженеринга на функции и как да подходя към анализирането на набори от данни!

Важност на характеристиките

Едно нещо, което разбрах как да направя, беше да начертая важността на характеристиките за всеки модел и мисля, че резултатът беше доста интересен:

От тази графика се оказва, че възрастта не е толкова важна, колкото си мислехме! Заглавие, тарифа и пол бяха най-важните характеристики за вземане на решение за оцеляване. Това може да означава, че трябва да разработим по-добре функции, може да има по-добра комбинация от функции/нови функции, които имат по-голям шанс за прогнозиране на оцеляването. Или това означава, че пътниците с определени титли са имали по-висок процент на оцеляване (г-жа, г-жа).

Какво следва?

Сега, когато ми е малко по-удобно да работя с и да почиствам данни, ще опитам личен проект по тема, към която съм много запален, видеоигрите!