In [28]:
import pandas as pd
from sklearn.tree import DecisionTreeClassifier

from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"

1. Загрузите выборку из файла titanic.csv с помощью пакета Pandas.


In [29]:
df = pd.read_csv('../data/titanic.csv', index_col='PassengerId')
df.head()


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

2. Оставьте в выборке четыре признака: класс пассажира (Pclass), цену билета (Fare), возраст пассажира (Age) и его пол (Sex).

3. Обратите внимание, что признак Sex имеет строковые значения.

4. Выделите целевую переменную — она записана в столбце Survived.

5. В данных есть пропущенные значения — например, для некоторых пассажиров неизвестен их возраст. Такие записи при чтении их в pandas принимают значение nan. Найдите все объекты, у которых есть пропущенные признаки, и удалите их из выборки.


In [30]:
df_no_missing = df[['Survived', 'Pclass', 'Fare', 'Age', 'Sex']].dropna()
X_train_withStrings = df_no_missing[['Pclass', 'Fare', 'Age', 'Sex']]
y_train = df_no_missing['Survived']

def strings_to_int(df, target_column):
    df_mod = df.copy()
    targets_to_rename = df_mod[target_column].unique()
    map_to_int = {name: n for n, name in enumerate(targets_to_rename)}
    df_mod[target_column] = df_mod[target_column].replace(map_to_int)

    return df_mod

X_train = strings_to_int(X_train_withStrings, "Sex")
X_train.head()


Out[30]:
Pclass Fare Age Sex
PassengerId
1 3 7.2500 22.0 0
2 1 71.2833 38.0 1
3 3 7.9250 26.0 1
4 1 53.1000 35.0 1
5 3 8.0500 35.0 0

6. Обучите решающее дерево с параметром random_state=241 и остальными параметрами по умолчанию.


In [31]:
clf = DecisionTreeClassifier(random_state=241)
clf.fit(X_train, y_train)


Out[31]:
DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=None,
            max_features=None, max_leaf_nodes=None,
            min_impurity_split=1e-07, min_samples_leaf=1,
            min_samples_split=2, min_weight_fraction_leaf=0.0,
            presort=False, random_state=241, splitter='best')

7. Вычислите важности признаков и найдите два признака с наибольшей важностью. Их названия будут ответами для данной задачи (в качестве ответа укажите названия признаков через запятую без пробелов).


In [32]:
importances = pd.Series(clf.feature_importances_, index = list(X_train))
importances
print(' '.join(importances.sort_values(ascending=False).head(2).index.values))


Out[32]:
Pclass    0.147518
Fare      0.295385
Age       0.256585
Sex       0.300512
dtype: float64
Sex Fare