Разработка признаков — это важный шаг в конвейере машинного обучения, который включает преобразование необработанных данных в значимые признаки, которые могут использоваться алгоритмами машинного обучения. В этом посте мы рассмотрим разработку функций на примере набора данных 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.

Теперь давайте рассмотрим некоторые новые функции, которые мы можем извлечь из этого набора данных:

  1. Размер семьи

Функции 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 — отличный пример того, как разработка функций может помочь нам повысить производительность моделей машинного обучения. Извлекая новые функции, такие как размер семьи, титул, возрастная группа и тарифная группа, мы можем получить важную информацию, которой не было в исходном наборе данных. Эти новые функции могут помочь нам создавать более точные и надежные модели машинного обучения, которые могут быть полезны во многих реальных приложениях.