Импортируем все необходимые библиотеки


In [274]:
# pandas
import pandas as pd
from pandas import DataFrame
import re

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_style('whitegrid')
%matplotlib inline

# machine learning
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import learning_curve, train_test_split, GridSearchCV
from sklearn.metrics import make_scorer, accuracy_score

Загружаем наши данные и смотрим на их состояние


In [275]:
# your code here
# train_df
# test_df

train_df.head()


Out[275]:
PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
0 1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 NaN S
1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 0 PC 17599 71.2833 C85 C
2 3 1 3 Heikkinen, Miss. Laina female 26.0 0 0 STON/O2. 3101282 7.9250 NaN S
3 4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 0 113803 53.1000 C123 S
4 5 0 3 Allen, Mr. William Henry male 35.0 0 0 373450 8.0500 NaN S

In [276]:
train_df.info()
print("----------------------------")
test_df.info()


<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):
PassengerId    891 non-null int64
Survived       891 non-null int64
Pclass         891 non-null int64
Name           891 non-null object
Sex            891 non-null object
Age            714 non-null float64
SibSp          891 non-null int64
Parch          891 non-null int64
Ticket         891 non-null object
Fare           891 non-null float64
Cabin          204 non-null object
Embarked       889 non-null object
dtypes: float64(2), int64(5), object(5)
memory usage: 83.6+ KB
----------------------------
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 418 entries, 0 to 417
Data columns (total 11 columns):
PassengerId    418 non-null int64
Pclass         418 non-null int64
Name           418 non-null object
Sex            418 non-null object
Age            332 non-null float64
SibSp          418 non-null int64
Parch          418 non-null int64
Ticket         418 non-null object
Fare           417 non-null float64
Cabin          91 non-null object
Embarked       418 non-null object
dtypes: float64(2), int64(4), object(5)
memory usage: 36.0+ KB

Легко заметить, что в тренировочном датасете у нас не хватает данных о возрасте, каюте и месте погружения пассажира на корабль. В тестовом датасете нам не хватает данных о возрасте, каюте и плате за пребывание на корабле.

Для начала разберемся с полем Embarked в тренировочном датасете, которое отвечает за место погружения. Проверим, в каких строках у нас отсутствуют данные.


In [277]:
# Embarked

# your code here


Out[277]:
PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
61 62 1 1 Icard, Miss. Amelie female 38.0 0 0 113572 80.0 B28 NaN
829 830 1 1 Stone, Mrs. George Nelson (Martha Evelyn) female 62.0 0 0 113572 80.0 B28 NaN

Посмотрим на общею зависимость шанса выживания от пункта погружения.


In [2]:
fig, (axis1,axis2,axis3) = plt.subplots(1,3,figsize=(15,5))

sns.countplot(x='Embarked', data=train_df, ax=axis1)
sns.countplot(x='Survived', hue="Embarked", data=train_df, order=[1,0], ax=axis2)

# group by embarked, and get the mean for survived passengers for each value in Embarked
embark_perc = train_df[["Embarked", "Survived"]].groupby(['Embarked'],as_index=False).mean()
sns.barplot(x='Embarked', y='Survived', data=embark_perc,order=['S','C','Q'],ax=axis3)


---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-2-2bade1dd435c> in <module>()
----> 1 fig, (axis1,axis2,axis3) = plt.subplots(1,3,figsize=(15,5))
      2 
      3 sns.countplot(x='Embarked', data=train_df, ax=axis1)
      4 sns.countplot(x='Survived', hue="Embarked", data=train_df, order=[1,0], ax=axis2)
      5 

NameError: name 'plt' is not defined

Смотрим на другие возможные зависимости, которые могли б нам указать на то, где пассажиры попали на корабль.


In [279]:
# проверить пассажиров с билетом 113572


Out[279]:
PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
61 62 1 1 Icard, Miss. Amelie female 38.0 0 0 113572 80.0 B28 NaN
829 830 1 1 Stone, Mrs. George Nelson (Martha Evelyn) female 62.0 0 0 113572 80.0 B28 NaN

In [280]:
# вывести кол-во пассажиров с ценами от 75 до 85


C == 16
S == 13

In [281]:
# присвоить пустым значениям те, которые мы решили

In [282]:
# проверить что пустых больше нет


Out[282]:
PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked

Теперь исправим пустое поле с платой за путешествение в тестовом датасете.


In [283]:
# показать пустые в тестовом датасете с полем Fare


Out[283]:
PassengerId Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
152 1044 3 Storey, Mr. Thomas male 60.5 0 0 3701 NaN NaN S

Давайте посмотрим на всех пассажиров, с похожими другими признаками.


In [284]:
fig = plt.figure(figsize=(8, 5))
ax = fig.add_subplot(111)

test_df[(test_df.Pclass==3)&(test_df.Embarked=='S')].Fare.hist(bins=100, ax=ax)
plt.xlabel('Fare')
plt.ylabel('Frequency')
plt.title('Histogram of Fare, Plcass 3 and Embarked S')


Out[284]:
<matplotlib.text.Text at 0x273e86aa828>

In [285]:
print ("The top 5 most common value of Fare")
# вывести топ 5 самых популярных значений для 3го класса (подсказка .value_counts() )


The top 5 most common value of Fare
Out[285]:
8.0500    17
7.8958    10
7.7750    10
7.8542     8
8.6625     8
Name: Fare, dtype: int64

Делаем вывод, что вероятнее всего плата была в таком размере.


In [286]:
test_df.set_value(test_df.Fare.isnull(), 'Fare', 8.05)
test_df.loc[test_df.Fare.isnull()]


Out[286]:
PassengerId Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked

Теперь разберемся с полем Возраста в тренировочном датасете. Ему нужно уделить больше внимания, т.к. это очень важный признак, который сильно влияет на выживаемость пассажиров.


In [287]:
# вывести пустые с возрастом


Out[287]:
PassengerId Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
10 902 3 Ilieff, Mr. Ylio male NaN 0 0 349220 7.8958 NaN S
22 914 1 Flegenheim, Mrs. Alfred (Antoinette) female NaN 0 0 PC 17598 31.6833 NaN S
29 921 3 Samaan, Mr. Elias male NaN 2 0 2662 21.6792 NaN C
33 925 3 Johnston, Mrs. Andrew G (Elizabeth Lily" Watson)" female NaN 1 2 W./C. 6607 23.4500 NaN S
36 928 3 Roth, Miss. Sarah A female NaN 0 0 342712 8.0500 NaN S

In [288]:
#fig, (axis1,axis2) = plt.subplots(1,2,figsize=(15,4))
#axis1.set_title('Original Age values')
#axis2.set_title('New Age values')

# среднее, дисперсия и пустые значение в тестовом датасете ( .mean() .std() .isnull().sum() )
#average_age_train   = 
#std_age_train       = 
#count_nan_age_train = 

# среднее, дисперсия и пустые значение в тестовом датасете
#average_age_test   = 
#std_age_test       = 
#count_nan_age_test = 

# генерируем случайные значения (mean - std) & (mean + std)
rand_1 = np.random.randint(average_age_train - std_age_train, average_age_train + std_age_train, size = count_nan_age_train)
rand_2 = np.random.randint(average_age_test - std_age_test, average_age_test + std_age_test, size = count_nan_age_test)

# строим гистограму возраста до изменений (пустые конвертим в инты)
train_df['Age'].dropna().astype(int).hist(bins=70, ax=axis1)
test_df['Age'].dropna().astype(int).hist(bins=70, ax=axis1)

# заполняем случайными значениями пустые поля с возрастом
train_df["Age"][np.isnan(train_df["Age"])] = rand_1
test_df["Age"][np.isnan(test_df["Age"])] = rand_2

# конвертим флоаты в инты
train_df['Age'] = train_df['Age'].astype(int)
test_df['Age']    = test_df['Age'].astype(int)

# гистограма нового возраста
train_df['Age'].hist(bins=70, ax=axis2)
test_df['Age'].hist(bins=70, ax=axis2)


C:\Users\Admin\Anaconda3\lib\site-packages\ipykernel\__main__.py:24: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
C:\Users\Admin\Anaconda3\lib\site-packages\ipykernel\__main__.py:25: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
Out[288]:
<matplotlib.axes._subplots.AxesSubplot at 0x273e8c78be0>

In [289]:
# Еще немного графиков

# пик выживаемости в зависимости от возраста
facet = sns.FacetGrid(train_df, hue="Survived",aspect=4)
facet.map(sns.kdeplot,'Age',shade= True)
facet.set(xlim=(0, train_df['Age'].max()))
facet.add_legend()

# средняя выживаемость по возрасту
fig, axis1 = plt.subplots(1,1,figsize=(18,4))
average_age = train_df[["Age", "Survived"]].groupby(['Age'],as_index=False).mean()
sns.barplot(x='Age', y='Survived', data=average_age)


C:\Users\Admin\Anaconda3\lib\site-packages\statsmodels\nonparametric\kdetools.py:20: VisibleDeprecationWarning: using a non-integer number instead of an integer will result in an error in the future
  y = X[:m/2+1] + np.r_[0,X[m/2+1:],0]*1j
Out[289]:
<matplotlib.axes._subplots.AxesSubplot at 0x273e8e9fa58>

In [290]:
# проверим статус наших датасетов после преобразование данных


<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):
PassengerId    891 non-null int64
Survived       891 non-null int64
Pclass         891 non-null int64
Name           891 non-null object
Sex            891 non-null object
Age            891 non-null int32
SibSp          891 non-null int64
Parch          891 non-null int64
Ticket         891 non-null object
Fare           891 non-null float64
Cabin          204 non-null object
Embarked       891 non-null object
dtypes: float64(1), int32(1), int64(5), object(5)
memory usage: 80.1+ KB
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 418 entries, 0 to 417
Data columns (total 11 columns):
PassengerId    418 non-null int64
Pclass         418 non-null int64
Name           418 non-null object
Sex            418 non-null object
Age            418 non-null int32
SibSp          418 non-null int64
Parch          418 non-null int64
Ticket         418 non-null object
Fare           418 non-null float64
Cabin          91 non-null object
Embarked       418 non-null object
dtypes: float64(1), int32(1), int64(4), object(5)
memory usage: 34.4+ KB

В именах есть приставки, с ними тоже можно кое-что сделать, т.к. социальный статус может быть важным признаком выживаемости.


In [292]:
Title_Dictionary = {
                    "Capt":       "Officer",
                    "Col":        "Officer",
                    "Major":      "Officer",
                    "Jonkheer":   "Nobel",
                    "Don":        "Nobel",
                    "Sir" :       "Nobel",
                    "Dr":         "Officer",
                    "Rev":        "Officer",
                    "the Countess":"Nobel",
                    "Dona":       "Nobel",
                    "Mme":        "Mrs",
                    "Mlle":       "Miss",
                    "Ms":         "Mrs",
                    "Mr" :        "Mr",
                    "Mrs" :       "Mrs",
                    "Miss" :      "Miss",
                    "Master" :    "Master",
                    "Lady" :      "Nobel"
                    } 

#train_df['Title'] = 
#test_df['Title'] = 

train_df.head()


Out[292]:
PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked Title
0 1 0 3 Braund, Mr. Owen Harris male 22 1 0 A/5 21171 7.2500 NaN S Mr
1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38 1 0 PC 17599 71.2833 C85 C Mrs
2 3 1 3 Heikkinen, Miss. Laina female 26 0 0 STON/O2. 3101282 7.9250 NaN S Miss
3 4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35 1 0 113803 53.1000 C123 S Mrs
4 5 0 3 Allen, Mr. William Henry male 35 0 0 373450 8.0500 NaN S Mr

Вместо двух полей указывающий на наличие партнера (Parch) или родственника (SibSp), сделаем одно поле FamilySize


In [293]:
#train_df['FamilySize'] =
#test_df['FamilySize'] =

train_df.head()


Out[293]:
PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked Title FamilySize
0 1 0 3 Braund, Mr. Owen Harris male 22 1 0 A/5 21171 7.2500 NaN S Mr 1
1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38 1 0 PC 17599 71.2833 C85 C Mrs 1
2 3 1 3 Heikkinen, Miss. Laina female 26 0 0 STON/O2. 3101282 7.9250 NaN S Miss 0
3 4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35 1 0 113803 53.1000 C123 S Mrs 1
4 5 0 3 Allen, Mr. William Henry male 35 0 0 373450 8.0500 NaN S Mr 0

Пол тоже очень важный признак, но если вы смотрели фильм титаник, то наверное помните "Сначала женщин и детей." Поэтому предлагаю сооздать новый признак, который будет учитывать как пол, так и возраст


In [294]:
def get_person(passenger):
    # your code here
    pass
    
train_df['Person'] = train_df[['Age','Sex']].apply(get_person,axis=1)
test_df['Person']    = test_df[['Age','Sex']].apply(get_person,axis=1)

train_df.head()


Out[294]:
PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked Title FamilySize Person
0 1 0 3 Braund, Mr. Owen Harris male 22 1 0 A/5 21171 7.2500 NaN S Mr 1 male
1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38 1 0 PC 17599 71.2833 C85 C Mrs 1 female
2 3 1 3 Heikkinen, Miss. Laina female 26 0 0 STON/O2. 3101282 7.9250 NaN S Miss 0 female
3 4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35 1 0 113803 53.1000 C123 S Mrs 1 female
4 5 0 3 Allen, Mr. William Henry male 35 0 0 373450 8.0500 NaN S Mr 0 male

In [295]:
# print status of datasets


<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 15 columns):
PassengerId    891 non-null int64
Survived       891 non-null int64
Pclass         891 non-null int64
Name           891 non-null object
Sex            891 non-null object
Age            891 non-null int32
SibSp          891 non-null int64
Parch          891 non-null int64
Ticket         891 non-null object
Fare           891 non-null float64
Cabin          204 non-null object
Embarked       891 non-null object
Title          891 non-null object
FamilySize     891 non-null int64
Person         891 non-null object
dtypes: float64(1), int32(1), int64(6), object(7)
memory usage: 101.0+ KB
----------------------------
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 15 columns):
PassengerId    891 non-null int64
Survived       891 non-null int64
Pclass         891 non-null int64
Name           891 non-null object
Sex            891 non-null object
Age            891 non-null int32
SibSp          891 non-null int64
Parch          891 non-null int64
Ticket         891 non-null object
Fare           891 non-null float64
Cabin          204 non-null object
Embarked       891 non-null object
Title          891 non-null object
FamilySize     891 non-null int64
Person         891 non-null object
dtypes: float64(1), int32(1), int64(6), object(7)
memory usage: 101.0+ KB

Убедились, что теперь наши данные в порядке и переходим к откидыванию лишнего.


In [297]:
# drop 'Name', 'Cabin', 'Ticket', 'SibSp', 'Parch', 'Sex'. Drop 'PassengerId' only for traind_df
train_df.drop(labels=['PassengerId', 'Name', 'Cabin', 'Ticket', 'SibSp', 'Parch', 'Sex'], axis=1, inplace=True)
test_df.drop(labels=['Name', 'Cabin', 'Ticket', 'SibSp', 'Parch', 'Sex'], axis=1, inplace=True)

In [298]:
train_df.head()


Out[298]:
Survived Pclass Age Fare Embarked Title FamilySize Person
0 0 3 22 7.2500 S Mr 1 male
1 1 1 38 71.2833 C Mrs 1 female
2 1 3 26 7.9250 S Miss 0 female
3 1 1 35 53.1000 S Mrs 1 female
4 0 3 35 8.0500 S Mr 0 male

У нас есть дискретные переменные и нам стоило б их закодировать. Для этого в пандас уже существует функция get_dummies


In [299]:
# кодировать переменные с помощью get_dummies, http://pandas.pydata.org/pandas-docs/version/0.18.1/generated/pandas.get_dummies.html

#dummies_person_train = 
#dummies_embarked_train = 
#dummies_title_train = 
#dummies_pclass_train = 

# обьеденяем добавляем новые переменные в наш датафрейм с помощью concat(), http://pandas.pydata.org/pandas-docs/stable/generated/pandas.concat.html
#train_df = 
#train_df = 

train_df.head()


Out[299]:
Survived Age Fare FamilySize Person_child Person_female Person_male Embarked_C Embarked_Q Embarked_S Title_Master Title_Miss Title_Mr Title_Mrs Title_Nobel Title_Officer Pclass_1 Pclass_2 Pclass_3
0 0 22 7.2500 1 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 1.0
1 1 38 71.2833 1 0.0 1.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0
2 1 26 7.9250 0 0.0 1.0 0.0 0.0 0.0 1.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0
3 1 35 53.1000 1 0.0 1.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0
4 0 35 8.0500 0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 1.0

In [300]:
# Аналогично для тестового датасета

#dummies_person_test = 
#dummies_embarked_test = 
#dummies_title_test = 
#dummies_pclass_test = 

#test_df = 
#test_df = 

test_df.head()


Out[300]:
PassengerId Age Fare FamilySize Person_child Person_female Person_male Embarked_C Embarked_Q Embarked_S Title_Master Title_Miss Title_Mr Title_Mrs Title_Nobel Title_Officer Pclass_1 Pclass_2 Pclass_3
0 892 34 7.8292 0 0.0 0.0 1.0 0.0 1.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 1.0
1 893 47 7.0000 1 0.0 1.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0
2 894 62 9.6875 0 0.0 0.0 1.0 0.0 1.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0
3 895 27 8.6625 0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 1.0
4 896 22 12.2875 2 0.0 1.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0

Создадим функцию, которая будет строить зависимость обучаемости от кол-ва тестовых семплов.


In [ ]:
# не вдаемся в подробности, используем готовый код

def plot_learning_curve(estimator, title, X, y, ylim=None, cv=None,
                        n_jobs=1, train_sizes=np.linspace(.1, 1.0, 5), scoring='accuracy'):
    plt.figure(figsize=(10,6))
    plt.title(title)
    if ylim is not None:
        plt.ylim(*ylim)
    plt.xlabel("Training examples")
    plt.ylabel(scoring)
    train_sizes, train_scores, test_scores = learning_curve(estimator, X, y, cv=cv, scoring=scoring,
                                                            n_jobs=n_jobs, train_sizes=train_sizes)
    train_scores_mean = np.mean(train_scores, axis=1)
    train_scores_std = np.std(train_scores, axis=1)
    test_scores_mean = np.mean(test_scores, axis=1)
    test_scores_std = np.std(test_scores, axis=1)
    plt.grid()

    plt.fill_between(train_sizes, train_scores_mean - train_scores_std,
                     train_scores_mean + train_scores_std, alpha=0.1,
                     color="r")
    plt.fill_between(train_sizes, test_scores_mean - test_scores_std,
                     test_scores_mean + test_scores_std, alpha=0.1, color="g")
    plt.plot(train_sizes, train_scores_mean, 'o-', color="r",
             label="Training score")
    plt.plot(train_sizes, test_scores_mean, 'o-', color="g",
             label="Cross-validation score")

    plt.legend(loc="best")
    return plt

Разбиваем наш тренировочный датасет на 2, что б прежде чем сабмитить нашу модель, мы убедились что она не переобучается на наших данных (т.н. кросс-валидация)


In [301]:
# использовать train_test_split
X = train_df.drop(['Survived'], axis=1)
y = train_df.Survived
X_train, X_test, y_train, y_test =

Строим простую модель

Random forest

Модель случайного леса это ничто иное как ансамбль решающих деревьев:

Который в результате будет выглядить где-то так:

Настоятельно рекомендую просмотреть это видео (https://www.youtube.com/watch?v=loNcrMjYh64) если вас интерисует как работает этот алгоритм

Посмотрим модель случайного леса. Параметры укажем обычные, потом благодаря GridSearchCV подберем оптимальные. Ну и в конце взглянем на то, что у нас вышло


In [303]:
# создадим обьект нашего классификатора
clf = RandomForestClassifier()

# задаем параметры случайным образом
parameters = {'n_estimators': [4, 6, 9], 
              'max_features': ['log2', 'sqrt','auto'], 
              'criterion': ['entropy', 'gini'],
              'max_depth': [2, 3, 5, 10], 
              'min_samples_split': [2, 3, 5],
              'min_samples_leaf': [1,5,8]
             }


# параметр для расчета точности нашей модели
acc_scorer = make_scorer(accuracy_score)

# подбираем оптимальные параметры для нашей модели с помощью GridSearchCV
# grid_obj = 


# устанавливаем полученные параметры для нашей модели
clf = grid_obj.best_estimator_

clf.fit(X_train, y_train)


Out[303]:
RandomForestClassifier(bootstrap=True, class_weight=None, criterion='entropy',
            max_depth=10, max_features='log2', max_leaf_nodes=None,
            min_impurity_split=1e-07, min_samples_leaf=5,
            min_samples_split=3, min_weight_fraction_leaf=0.0,
            n_estimators=9, n_jobs=1, oob_score=False, random_state=None,
            verbose=0, warm_start=False)

In [3]:
# Посмотрим скорость обучения нашей модели

predictions = clf.predict(X_test)
print(accuracy_score(y_test, predictions))
plot_learning_curve(clf, 'Random Forest', X, y, cv=4);


---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-3-85020dd65e99> in <module>()
      1 # Посмотрим скорость обучения нашей модели
      2 
----> 3 predictions = clf.predict(X_test)
      4 print(accuracy_score(y_test, predictions))
      5 plot_learning_curve(clf, 'Random Forest', X, y, cv=4);

NameError: name 'clf' is not defined

Logistic regression

Повторим все выше описанные процедуры, которые мы делали для рандом фореста, теперь для логистической регрессии.

Функция активации для логистической регрессии (сигмоид):

Cost function:


In [310]:
from sklearn.linear_model import LogisticRegression
lg = LogisticRegression(random_state=42, penalty='l1')
parameters = {'C':[0.5]}


acc_scorer_lg = make_scorer(accuracy_score)

# параметр для расчета точности нашей модели
# grid_obj_lg = 


# устанавливаем полученные параметры для нашей модели
lg = grid_obj_lg.best_estimator_

lg.fit(X_train, y_train)


Out[310]:
LogisticRegression(C=0.5, class_weight=None, dual=False, fit_intercept=True,
          intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,
          penalty='l1', random_state=42, solver='liblinear', tol=0.0001,
          verbose=0, warm_start=False)

In [307]:
# Посмотрим скорость обучения нашей модели

predictions_lg = lg.predict(X_test)
print(accuracy_score(y_test, predictions_lg))
plot_learning_curve(lg, 'Logistic Regression', X, y, cv=4);


0.804469273743

Выбираем ту модель, которая нам больше понравилась и сабмитим ее на кагл.


In [ ]:
# Можем засабмитить нашу модель

#ids = test_df['PassengerId']
#predictions = clf.predict(test_df.drop('PassengerId', axis=1))


#output = pd.DataFrame({ 'PassengerId' : ids, 'Survived': predictions })
#output.to_csv('titanic-predictions.csv', index = False)
#output.head()