Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Основы обзора данных на python с применением pandas sklearn

Anna | 16.06.2014 | нет комментариев
Добрый день уважаемые читатели. В сегодняшней посте я продолжу свой цикл статей посвященный обзору данных на python c поддержкой модуля Pandas и расскажу один из вариантов применения данного модуля в связке с модулем для машинного обучения scikit-learn. Работа данной связки будет показана на примерезадачи про спасенных с “Титаника&quot. Данное задание имеет огромную знаменитость среди людей, только начинающих заниматься обзором данных и машинным обучением.

Постановка задачи

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

  • train.csv — комплект данных на основании которого будет строиться модель (обучающая выборка)
  • test.csv — комплект данных для проверки модели

Как было написано выше, для обзор потребуются модули Pandas и scikit-learn. С поддержкой Pandas мы проведем первоначальный обзор данных, а sklearn поможет в вычислении прогнозной модели. Выходит, для начала загрузим надобные модули:
Помимо того даются пояснения по некоторым полям:

  • PassengerId — идентификатор пассажира
  • Survival — поле в котором указано спасся челоке(1) либо нет (0)
  • Pclass — содержит общественно-экономический ранг:
    1. высокий
    2. средний
    3. низкий
  • Name — имя пассажира
  • Sex — пол пассажира
  • Age — возраст
  • SibSp — содержит информацию о числе родственников 2-го порядка (супруг, жена, братья, сетры)
  • Parch — содержит информацию о числе родственников на борту 1-го порядка (мать, папа, дети)
  • Ticket — номер билета
  • Fare — цена билета
  • Cabin — каюта
  • Embarked — порт посадки
    • C — Cherbourg
    • Q — Queenstown
    • S — Southampton

Обзор входных данных

>Выходит, задача сформирована и дозволено приступить к ее решению.
Для загрузим тестовую выборку и посмотрим как она выглядит::

from pandas import read_csv, DataFrame, Series
data = read_csv('Kaggle_Titanic/Data/train.csv')
PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
1 0 3 Braund, Mr. Owen Harris male 22 1 0 A/5 21171 7.2500 NaN S
2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th… female 38 1 0 PC 17599 71.2833 C85 C
3 1 3 Heikkinen, Miss. Laina female 26 0 0 STON/O2. 3101282 7.9250 NaN S
4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35 1 0 113803 53.1000 C123 S
5 0 3 Allen, Mr. William Henry male 35 0 0 373450 8.0500 NaN S

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

data.pivot_table('PassengerId', 'Pclass', 'Survived', 'count').plot(kind='bar', stacked=True)

image
Наше вышеописанное предположение про то, что чем выше у пассажиров их общественное расположение, тем выше их вероятность спасения. Сейчас давайте взглянем, как число родственников влияет на факт спасения:

fig, axes = plt.subplots(ncols=2)
data.pivot_table('PassengerId', ['SibSp'], 'Survived', 'count').plot(ax=axes[0], title='SibSp')
data.pivot_table('PassengerId', ['Parch'], 'Survived', 'count').plot(ax=axes[1], title='Parch')

image
Как видно из графиков наше предположение вновь подтвердилось, и из людей имеющих огромнее 1 родственников спаслись не многие.
Теперь порассуждаем на предмет данных, которые находятся номера кают. Теоретически данных о каютах пользователей может не быть, так что давайте посмотрим на столько это поле заполнено:

data.PassengerId[data.Cabin.notnull()].count()

В выводе заполнено каждого 204 записи и 890, на основании этого дозволено сделать итог, что данное поле при обзоре дозволено опустить.
Следующее поле, которое мы разберем будет поле с возрастом (Age). Посмотрим на сколько оно заполнено:

data.PassengerId[data.Age.notnull()].count()

Данное поле фактически все заполнено (714 непустых записей), но есть пустые значения, которые не определены. Давайте зададим ему значение равное медиане по усилюсь из каждой выборки. Данный шаг необходим для больше точного построения модели:

data.Age = data.Age.median()

У нас осталось разобраться с полями TicketEmbarkedFareName. Давайте посмотрим на поле Embarked, в котором находится порт посадки и проверим есть ли такие пассажиры у которых порт не указан:

data[data.Embarked.isnull()]
PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
62 1 1 Icard, Miss. Amelie female 28 0 0 113572 80 B28 NaN
830 1 1 Stone, Mrs. George Nelson (Martha Evelyn) female 28 0 0 113572 80 B28 NaN

Выходит у нас нашлось 2 таких пассажира. Давайте присвоим эти пассажирам порт в котором село огромнее каждого людей:

MaxPassEmbarked = data.groupby('Embarked').count()['PassengerId']
data.Embarked[data.Embarked.isnull()] = MaxPassEmbarked[MaxPassEmbarked == MaxPassEmbarked.max()].index[0]

Ну что же разобрались еще с одним полем и сейчас у нас остались поля с имя пассажира, номером билета и ценой билета.
По сути нам из этих 3 полей нам необходима только цена(Fare), т.к. она в какой-то мере определяем ранжирование внутри классов поля Pclass. Т. е. скажем люди внутри среднего класса могут быть поделены на тех, кто ближе к первому(высшему) классу, а кто к третьему(низший). Проверим это поле на пустые значения и если таковые имеются заменим цену медианой по цене из все выборки:

data.PassengerId[data.Fare.isnull()]

В нашем случае пустых записей нет.
В свою очередь номер билета и имя пассажира нам никак не помогут, т. к. это легко справочная информация. Исключительное для чего они могут сгодиться — это определение кто из пассажиров допустимо являются родственниками, но так как люди у которых есть родственники фактически не спаслись (это было показано выше) дозволено пренебречь этими данными.
Сейчас, позже удаления всех непотребных полей, наш комплект выглядит так:

data = data.drop(['PassengerId','Name','Ticket','Cabin'],axis=1)
Survived Pclass Sex Age SibSp Parch Fare Embarked
0 3 male 28 1 0 7.2500 S
1 1 female 28 1 0 71.2833 C
1 3 female 28 0 0 7.9250 S
1 1 female 28 1 0 53.1000 S
0 3 male 28 0 0 8.0500 S

Заблаговременная обработка входных данных

Заблаговременный обзор данных закончен, и по его итогам у нас получилась некая выборка, в которой содержатся несколько полей и как бы бы дозволено преступить к построению модели, если бы не одно «но»: наши данные содержат не только числовые, но и текстовые данные.
Следственно переде тем, как строить модель, необходимо закодировать все наши текстовые зна!62.0 0 0 9.6875 1 3 1 27.0 0 0 8.6625 2 3 0 22.0 1 1 12.2875 2

Построение моделей систематизации и их обзор

Ну что же, данные обработаны и дозволено приступить к построению модели, но для начала необходимо определиться с тем, как мы будем проверять точность полученной модели. Для данной проверки мы будем применять скользящий контроль и ROC-кривые. Проверку будем исполнять на обучающей выборке, позже чего применим ее на тестовую.
Выходит разглядим несколько алгорифмов машинного обучения:

Загрузим надобные нам библиотеки:

from sklearn import cross_validation, svm
from sklearn.neighbors import KNeighborsClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import roc_curve, auc
import pylab as pl

Для начала, нужно поделить нашу обучаюшую выборку на показатель, тот, что мы исследуем, и знаки его определяющие:

target = data.Survived
train = data.drop(['Survived'], axis=1) #из начальных данных убираем Id пассажира и флаг спасся он либо нет
kfold = 5 #количество подвыборок для валидации
itog_val = {} #список для записи итогов кросс валидации различных алгорифмов

Сейчас наша обучающая выборка выглядит так:

Pclass Sex Age SibSp Parch Fare Embarked
3 1 28 1 0 7.2500 2
1 0 28 1 0 71.2833 0
3 0 28 0 0 7.9250 2
1 0 28 1 0 53.1000 2
3 1 28 0 0 8.0500 2

Сейчас разобьем показатели полученные ранее на 2 подвыборки(обучающую и тестовую) для расчет ROC кривых (для скользящего контроля этого делать не нужно, т.к. функция проверки это делает сама. В этом нам поможет функция train_test_split модуля cross_validation:

ROCtrainTRN, ROCtestTRN, ROCtrainTRG, ROCtestTRG = cross_validation.train_test_split(train, target, test_size=0.25) 

В качестве параметров ей передается:

  • Массив параметров
  • Массив значений показателей
  • Соотношение в котором будет разбита обучающая выборка (в нашем случае для тестового комплекта будет выделена 1/4 часть данных начальной обучающей выборки)

На выходе функция выдает 4 массива:

  1. Новейший обучающий массив параметров
  2. тестовый массив параметров
  3. Новейший массив показателей
  4. тестовый массив показателей

Дальше представлены перечисленные способы с наилучшими параметрами подобранные опытным путем:

model_rfc = RandomForestClassifier(n_estimators = 70) #в параметре передаем кол-во деревьев
model_knc = KNeighborsClassifier(n_neighbors = 18) #в параметре передаем кол-во соседей
model_lr = LogisticRegression(penalty='l1', tol=0.01) 
model_svc = svm.SVC() #по умолчанию kernek='rbf'

Сейчас проверим полученные модели с поддержкой скользящего контроля. Для этого нам нужно воcпользоваться функцией cross_val_score

scores = cross_validation.cross_val_score(model_rfc, train, target, cv = kfold)
itog_val['RandomForestClassifier'] = scores.mean()
scores = cross_validation.cross_val_score(model_knc, train, target, cv = kfold)
itog_val['KNeighborsClassifier'] = scores.mean()
scores = cross_validation.cross_val_score(model_lr, train, target, cv = kfold)
itog_val['LogisticRegression'] = scores.mean()
scores = cross_validation.cross_val_score(model_svc, train, target, cv = kfold)
itog_val['SVC'] = scores.mean()

Давайте посмотрим на графике средний показатель тестов перекрестной проверки всякой модели:

DataFrame.from_dict(data = itog_val, orient='index').plot(kind='bar', legend=False)

image

Как дозволено увидеть из графика отменнее каждого себя показал алгорифм RandomForest. Сейчас же давайте взглянем на графики ROC-кривых, для оценки точности работы классификатора. Графики будем рисовать с поддержкой библиотеки matplotlib:

pl.clf()
plt.figure(figsize=(8,6))
#SVC
model_svc.probability = True
probas = model_svc.fit(ROCtrainTRN, ROCtrainTRG).predict_proba(ROCtestTRN)
fpr, tpr, thresholds = roc_curve(ROCtestTRG, probas[:, 1])
roc_auc  = auc(fpr, tpr)
pl.plot(fpr, tpr, label='%s ROC (area = %0.2f)' % ('SVC', roc_auc))
#RandomForestClassifier
probas = model_rfc.fit(ROCtrainTRN, ROCtrainTRG).predict_proba(ROCtestTRN)
fpr, tpr, thresholds = roc_curve(ROCtestTRG, probas[:, 1])
roc_auc  = auc(fpr, tpr)
pl.plot(fpr, tpr, label='%s ROC (area = %0.2f)' % ('RandonForest',roc_auc))
#KNeighborsClassifier
probas = model_knc.fit(ROCtrainTRN, ROCtrainTRG).predict_proba(ROCtestTRN)
fpr, tpr, thresholds = roc_curve(ROCtestTRG, probas[:, 1])
roc_auc  = auc(fpr, tpr)
pl.plot(fpr, tpr, label='%s ROC (area = %0.2f)' % ('KNeighborsClassifier',roc_auc))
#LogisticRegression
probas = model_lr.fit(ROCtrainTRN, ROCtrainTRG).predict_proba(ROCtestTRN)
fpr, tpr, thresholds = roc_curve(ROCtestTRG, probas[:, 1])
roc_auc  = auc(fpr, tpr)
pl.plot(fpr, tpr, label='%s ROC (area = %0.2f)' % ('LogisticRegression',roc_auc))
pl.plot([0, 1], [0, 1], 'k--')
pl.xlim([0.0, 1.0])
pl.ylim([0.0, 1.0])
pl.xlabel('False Positive Rate')
pl.ylabel('True Positive Rate')
pl.legend(loc=0, fontsize='small')
pl.show()

image
Как видно по итогам ROC-обзора наилучший итог вновь показал RandomForest. Сейчас осталось только применить нашу модель к тестовой выборке:

model_rfc.fit(train, target)
result.insert(1,'Survived', model_rfc.predict(test))
result.to_csv('Kaggle_Titanic/Result/test.csv', index=False)

Завершение

В данной статье я постарался показать, как дозволено применять пакет pandas в связке с пакетом для машинного обучения sklearn. Полученная модель при сабмите на Kaggle показала точность 0.77033. В статье я огромнее хотел показать именно работу с инструментарием и ход выполнения изыскания, а не построение подробного алгорифма, как скажем в этой серии статей.

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB