Разработка признаков — это важный шаг в конвейере машинного обучения, который включает преобразование необработанных данных в значимые признаки, которые могут использоваться алгоритмами машинного обучения. В этом посте мы рассмотрим разработку функций на примере набора данных Titanic и покажем, как мы можем извлечь новые функции из этого набора данных, чтобы повысить производительность наших моделей машинного обучения.
Набор данных «Титаник» — это классический набор данных, который содержит информацию о пассажирах, находившихся на борту «Титаника», когда он затонул. Цель этого набора данных — предсказать, выжил ли пассажир или нет, на основе различных характеристик, таких как возраст, пол, класс и стоимость проезда.
Давайте начнем с загрузки набора данных Titanic и изучения его функций:
import pandas as pd import numpy as np # Load the Titanic dataset titanic = pd.read_csv('titanic.csv') # Display the first few rows of the dataset print(titanic.head()) PassengerId Survived Pclass \ 0 1 0 3 1 2 1 1 2 3 1 3 3 4 1 1 4 5 0 3 Name Sex Age SibSp \ 0 Braund, Mr. Owen Harris male 22.0 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 2 Heikkinen, Miss. Laina female 26.0 0 3 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 4 Allen, Mr. William Henry male 35.0 0 Parch Ticket Fare Cabin Embarked 0 0 A/5 21171 7.2500 NaN S 1 0 PC 17599 71.2833 C85 C 2 0 STON/O2. 3101282 7.9250 NaN S 3 0 113803 53.1000 C123 S 4 0 373450 8.0500 NaN S
Из приведенного выше вывода мы видим, что набор данных содержит различные функции, такие как PassengerId
, Survived
, Pclass
, Name
, Sex
, Age
, SibSp
, Parch
, Ticket
, Fare
, Cabin
и Embarked
.
Теперь давайте рассмотрим некоторые новые функции, которые мы можем извлечь из этого набора данных:
- Размер семьи
Функции SibSp
и Parch
представляют количество братьев и сестер/супругов и родителей/детей, которые есть у пассажира на борту. Мы можем объединить эти функции, чтобы создать новую функцию под названием FamilySize
, которая представляет собой общее количество членов семьи на борту.
# Create a new feature called FamilySize titanic['FamilySize'] = titanic['SibSp'] + titanic['Parch'] + 1
2. Название
Функция Name
содержит титул каждого пассажира, по которому можно определить его социальный статус. Мы можем извлечь эту информацию и создать новую функцию под названием Title
.
# Create a new feature called Title titanic['Title'] = titanic['Name'].apply(lambda x: \ x.split(',')[1].split('.')[0].strip())
3. Возрастная группа
Признак Age
является непрерывным, и мы можем сгруппировать возраст в разные возрастные группы, чтобы создать новый категориальный признак под названием AgeGroup
. Это может помочь нам зафиксировать любую нелинейную связь между возрастом и выживанием.
# Create a new feature called AgeGroup bins = [0, 12, 18, 30, 50, 100] labels = ['Child', 'Teenager', 'Young Adult', 'Adult', 'Senior'] titanic['AgeGroup'] = pd.cut(titanic['Age'], bins=bins, labels=labels)
4. Группа тарифов
Функция Fare
также непрерывна, и мы можем сгруппировать тарифы в разные тарифные группы, чтобы создать новую категориальную функцию под названием FareGroup
. Это может помочь нам уловить любую нелинейную связь между платой за проезд и выживанием.
# Create a new feature called FareGroup bins = [0, 10, 20, 30, 100, 1000] labels = ['Very Cheap', 'Cheap', 'Moderate', 'Expensive', 'Very Expensive'] titanic['FareGroup'] = pd.cut(titanic['Fare'], bins=bins, labels=labels)
Теперь, когда мы создали эти новые функции, мы можем использовать их для повышения производительности наших моделей машинного обучения. Например, мы можем использовать эти новые функции для обучения классификатора случайного леса и посмотреть, как он работает:
from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import cross_val_score # Create a new DataFrame with the new features X = titanic[['Pclass', 'Sex', 'AgeGroup', 'FamilySize', 'Title', 'FareGroup']] y = titanic['Survived'] # Encode categorical features as numbers X = pd.get_dummies(X) # Train a random forest classifier rf = RandomForestClassifier(n_estimators=100, random_state=42) scores = cross_val_score(rf, X, y, cv=10) # Print the cross-validation scores print('Cross-validation scores:', scores) print('Mean cross-validation score:', scores.mean())
Благодаря использованию новых функций, которые мы создали, средняя оценка перекрестной проверки улучшилась по сравнению с базовой моделью. Это демонстрирует силу разработки признаков в повышении производительности моделей машинного обучения.
В заключение, набор данных Titanic — отличный пример того, как разработка функций может помочь нам повысить производительность моделей машинного обучения. Извлекая новые функции, такие как размер семьи, титул, возрастная группа и тарифная группа, мы можем получить важную информацию, которой не было в исходном наборе данных. Эти новые функции могут помочь нам создавать более точные и надежные модели машинного обучения, которые могут быть полезны во многих реальных приложениях.