<jupyter_start><jupyter_text>The importance of signsВ этом задании мы вновь рассмотрим данные о пассажирах Титаника. Будем решать на них задачу классификации, в которой по различным характеристикам пассажиров требуется предсказать, кто из них выжил после крушения корабля.  Реализация в Scikit-LearnВ библиотеке scikit-learn решающие деревья реализованы в классах sklearn.tree.DecisionTreeСlassifier (для классификации) и sklearn.tree.DecisionTreeRegressor (для регрессии). Обучение модели производится с помощью функции fit.Пример использования:<jupyter_code>import numpy as np
from sklearn.tree import DecisionTreeClassifier
X = np.array([[1, 2], [3, 4], [5, 6]])
y = np.array([0, 1, 0])
clf = DecisionTreeClassifier()
clf.fit(X, y)<jupyter_output><empty_output><jupyter_text>В этом задании вам также потребуется находить важность признаков. Это можно сделать, имея уже обученный классификатор:<jupyter_code>importances = clf.feature_importances_
importances<jupyter_output><empty_output><jupyter_text>Переменная importances будет содержать массив "важностей" признаков. Индекс в этом массиве соответствует индексу признака в данных.Стоит обратить внимание, что данные могут содержать пропуски. Pandas хранит такие значения как nan (not a number). Для того, чтобы проверить, является ли число nan'ом, можно воспользоваться функцией np.isnan.Пример использования:<jupyter_code>np.isnan(X)<jupyter_output><empty_output><jupyter_text>Материалы- [Подробнее про решающие деревья в sklearn](http://scikit-learn.org/stable/modules/tree.html)- [Работа с пропущенными значениями в pandas](http://pandas.pydata.org/pandas-docs/stable/missing_data.html)- [Подробнее о деревьях и их построении](https://github.com/esokolov/ml-course-hse/blob/master/2016-fall/lecture-notes/lecture07-trees.pdf)  Инструкция по выполнению1. Загрузите выборку из файла titanic.csv с помощью пакета Pandas.2. Оставьте в выборке четыре признака: класс пассажира (Pclass), цену билета (Fare), возраст пассажира (Age) и его пол (Sex).3. Обратите внимание, что признак Sex имеет строковые значения.4. Выделите целевую переменную — она записана в столбце Survived.5. В данных есть пропущенные значения — например, для некоторых пассажиров неизвестен их возраст. Такие записи при чтении их в pandas принимают значение nan. Найдите все объекты, у которых есть пропущенные признаки, и удалите их из выборки.6. Обучите решающее дерево с параметром random_state=241 и остальными параметрами по умолчанию (речь идет о параметрах конструктора DecisionTreeСlassifier).7. Вычислите важности признаков и найдите два признака с наибольшей важностью. Их названия будут ответами для данной задачи (в качестве ответа укажите названия признаков через запятую или пробел, порядок не важен).Ответ на каждое задание — текстовый файл, содержащий ответ в первой строчке. Обратите внимание, что отправляемые файлы не должны содержать перевод строки в конце. Данный нюанс является ограничением платформы Coursera. Мы работаем над тем, чтобы убрать это ограничение.<jupyter_code>import numpy as np
import pandas as pd<jupyter_output><empty_output><jupyter_text>1. Загрузите выборку из файла titanic.csv с помощью пакета Pandas.<jupyter_code>data = pd.read_csv('titanic.csv', index_col='PassengerId')
data.head()
print(data.columns)
print(data.shape)
print(data.dtypes)<jupyter_output>Index(['Survived', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp', 'Parch', 'Ticket',
       'Fare', 'Cabin', 'Embarked'],
      dtype='object')
(891, 11)
Survived      int64
Pclass        int64
Name         object
Sex          object
Age         float64
SibSp         int64
Parch         int64
Ticket       object
Fare        float64
Cabin        object
Embarked     object
dtype: object<jupyter_text>2. Оставьте в выборке четыре признака: класс пассажира (Pclass), цену билета (Fare), возраст пассажира (Age) и его пол (Sex).<jupyter_code>X = data[['Pclass', 'Fare', 'Age', 'Sex']]
X.head()<jupyter_output><empty_output><jupyter_text>3. Обратите внимание, что признак Sex имеет строковые значения.<jupyter_code>mapping = {'male': 0, 'female': 1}
X = X.replace({ 'Sex': mapping })
X.head()
X['Sex'] = X['Sex'].map(lambda x: 0 if x == 'female' else 1)<jupyter_output><empty_output><jupyter_text>4. Выделите целевую переменную — она записана в столбце Survived.<jupyter_code>y = data['Survived']
y.head()<jupyter_output><empty_output><jupyter_text>5. В данных есть пропущенные значения — например, для некоторых пассажиров неизвестен их возраст. Такие записи при чтении их в pandas принимают значение nan. Найдите все объекты, у которых есть пропущенные признаки, и удалите их из выборки.<jupyter_code>nans = lambda df: df[df.isnull().any(axis=1)]
nans(X).head()
X = X[np.isfinite(X['Age'])]
X.head()
y = y[X.index.values]
print(len(X) == len(y))
print('Labels: ', len(X))
print('Samples: ', len(y))<jupyter_output>True
Labels:  714
Samples:  714<jupyter_text>6. Обучите решающее дерево с параметром random_state=241 и остальными параметрами по умолчанию (речь идет о параметрах конструктора DecisionTreeСlassifier).<jupyter_code>from sklearn.tree import DecisionTreeClassifier

clf = DecisionTreeClassifier(random_state=241)
clf.fit(X, y)<jupyter_output><empty_output><jupyter_text>7. Вычислите важности признаков и найдите два признака с наибольшей важностью. Их названия будут ответами для данной задачи (в качестве ответа укажите названия признаков через запятую или пробел, порядок не важен).<jupyter_code>importances = clf.feature_importances_
importances
pd.Series(clf.feature_importances_)
X.columns<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.09182571119913575, 'fraction_numerical': 0.011883327331652862, 'mean_word_length': 5.969887076537014, 'pattern_counts': {'":': 0, '<': 43, '<?xml version=': 0, '>': 43, 'https://': 1, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 1, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '11', 'dir': 'jupyter-structured-clean-dedup', 'id': '448923', 'license': 'MIT', 'n_tokens_mistral': 2204, 'n_tokens_neox': 2473, 'n_words': 559, 'path': 'assignment-importance/solution.ipynb', 'repo_name': 'kstepanmpmg/hse-yandex-introduction-to-machine-learning', 'size': '5554'}