Случай ввода Kaggle с машинным обучением — анализ данных Titanic

машинное обучение Kaggle сбор данных
Случай ввода Kaggle с машинным обучением — анализ данных Titanic

Общественный номер: You Er Hut
Автор: Питер
Редактор: Питер

Всем привет, меня зовут Питер~

Данные Titanic — это классический набор данных для интеллектуального анализа данных. В этой статье представлен первый обмен данными на kaggle. Оригинальный адрес блокнота:

Woohoo.Card Reformed.com/startup SCI/…

ранжирование

Взгляните на рейтинг этого дела:

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

Благодаря моему собственному общему изучению исходного кода, в первую очередь, обработка полей на ранней стадии очень подробная и всеобъемлющая, а процесс моделирования немного мельче.

исследование данных

библиотека импорта

Импортируйте три типа библиотек, необходимых для всего процесса:

  • обработка данных
  • библиотека визуализации
  • библиотека моделирования
# 数据处理
import pandas as pd
import numpy as np
import random as rnd

# 可视化
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline

# 模型
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC, LinearSVC
from sklearn.ensemble import RandomForestClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.linear_model import Perceptron
from sklearn.linear_model import SGDClassifier
from sklearn.tree import DecisionTreeClassifier

Импорт данных

Проверьте размер данных после импорта данных

Информация о поле

Посмотреть все поля:

train.columns

Index(['PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp',
       'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked'],
      dtype='object')

Ниже приводится конкретное значение полей:

  • PassengerId: идентификатор пользователя
  • выживание: выжить ли, 0-нет, 1-да
  • pclass: класс, 1-й класс, 2-й класс, 3-й класс
  • имя: имя
  • пол: пол
  • Возраст: возраст
  • sibsp: количество братьев/супругов на борту
  • parch: количество родителей/детей на борту
  • билет: номер билета
  • тариф: тариф
  • каюта: номер каюты; номер каюты
  • приземлился: место посадки

Классификация полей

В этом случае есть два основных типа данных:

  • Категориальный: Выжил, Пол и Отправился Порядковый номер: Pclass
  • Непрерывный: Age, Fare Дискретный: SibSp, Parch

пропущенное значение

Проверяем недостающие значения тренировочного набора и тестового набора:

В то же время вы также можете использовать информационную функцию для проверки основной информации о данных:

Предположения о данных

Опираясь на основную информацию и здравый смысл данных, автор приводит некоторые собственные предположения и следующие направления обработки и анализа данных:

удалить поле

  • Этот проект в основном исследует взаимосвязь между другими полями и полем выживания.
  • Поля фокуса: Возраст, Начало
  • Удаленные поля: не влияют на анализ данных, непосредственно удаленные поля: Ticket (номер билета), Cabin (номер салона), PassengerId (номер пассажира), Name (имя)

Изменить и добавить поля

  • Увеличение семьи: по данным Parch (количество братьев и сестер на борту) и SibSp (количество родителей и детей на борту)
  • Извлечь заголовок как новую функцию из поля «Имя»
  • Преобразование поля «Возраст» в упорядоченный категориальный признак
  • Создать функцию на основе диапазона тарифов Fare

предполагать

  • Женщины (пол = женский) имеют больше шансов выжить
  • Дети (возраст>?) имеют больше шансов выжить
  • Пассажиры с более высоким классом салона имеют больше шансов выжить (Pclass=1)

Статистический анализ

В основном анализируется категориальная переменная Sex, упорядоченная переменная Pclss, дискретная SibSp и Parch для проверки нашей гипотезы.

1. Класс салона (1-й класс, 2-й класс, 3-й класс)

Вывод: у людей первого класса больше шансов выжить

2. Пол

Вывод: у женщин больше шансов выжить

3. Количество братьев и сестер/супругов

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

4. Количество родителей/детей

Вывод: у родителей и детей больше шансов выжить, когда им 3 года.

Визуальный анализ

возраст и выживание

g = sns.FacetGrid(train, col="Survived")
g.map(plt.hist, 'Age', bins=20)

plt.show()

  1. Для тех, кто не выжил, большинство было сосредоточено в возрасте 15-25 лет (левое изображение).
  2. Максимальный возраст выживших — 80 лет, при этом выживаемость детей до 4 лет очень высока (рисунок справа)
  3. Возраст большинства пассажиров от 15 до 35 лет (два фото)

Класс и выживание

grid = sns.FacetGrid(
    train,
    col="Survived",
    row="Pclass",
    size=2.2,
    aspect=1.6
    )

grid.map(plt.hist,"Age",alpha=0.5,bins=20)
grid.add_legend()
plt.show()

  • В классе 3 было больше всего пассажиров, но многие не выжили
  • Больше всего выжили пассажиры первого класса.

Взаимосвязь между местом посадки, полом и выживанием

grid = sns.FacetGrid(train,
                     row="Embarked",
                     size=2.2,
                     aspect=1.6)
grid.map(sns.pointplot,
         "Pclass",
         "Survived",
         "Sex",
         palette="deep")

grid.add_legend()

plt.show()

  1. Женщины выживают лучше мужчин
  2. За исключением Embarked=C, выживаемость мужчин выше.
  3. Когда все классы кают относятся к Pclass=3, выживаемость самцов в Embarked=C выше, чем у Q.

Плата за проезд, класс и выживание

grid = sns.FacetGrid(train, 
                     row='Embarked', 
                     col='Survived', 
                     size=2.2, aspect=1.6)

grid.map(sns.barplot, 
         'Sex', 
         'Fare', 
         alpha=.5, ci=None)

grid.add_legend()

plt.show()

  • Чем выше цена билета, тем лучше эффект выживания; 2 верхние картинки справа
  • Коэффициент выживаемости связан с положением на абордаже; очевидно, что он лучший в Embarked=C.

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

Удалить недействительные поля

Тарифный билет и номер кабины Cabin практически бесполезны для нашего анализа и могут считаться удаленными напрямую:

Создавайте новые функции

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

Обработка имени поля

Создайте имя, такое как Lady, DR, MISS и т. д., чтобы увидеть, есть ли связь между этим названием и информацией о выживании.

# 通过正则提取
for dataset in combine:
    dataset["Title"] = dataset.Name.str.extract('([A-Za-z]+)\.', expand=False)
    
  # 统计Title下的男女数量
train.groupby(["Sex","Title"]).size().reset_index()

Используйте статистику кросс-таблицы:

# 交叉表形式
pd.crosstab(train['Title'], train['Sex'])

Отсортируйте извлеченные наименования и классифицируйте их на распространенные наименования и редкую информацию:

for dataset in combine:
    dataset["Title"] = dataset["Title"].replace(['Lady', 'Countess','Capt', 'Col',\
 	'Don', 'Dr', 'Major', 'Rev', 'Sir', 'Jonkheer', 'Dona'], 'Rare')
    
    dataset['Title'] = dataset['Title'].replace('Mlle', 'Miss')
    dataset['Title'] = dataset['Title'].replace('Ms', 'Miss')
    dataset['Title'] = dataset['Title'].replace('Mme', 'Mrs')
    
    
# 根据称谓Title求生还的均值
train[["Title","Survived"]].groupby("Title",as_index=False).mean()

Сам заголовок является текстовым и бесполезен для последующего моделирования, поэтому мы напрямую преобразуем его в числовой вид:

title_mapping = {
  "Mr":1,
  "Miss":2,
  "Mrs":3,
  "Master":4,
  "Rare":5
}

for dataset in combine:
    # 存在数据的进行匹配
    dataset['Title'] = dataset['Title'].map(title_mapping)
    # 不存在则补0
    dataset['Title'] = dataset['Title'].fillna(0)
    
train.head()

Также необходимо удалить некоторые поля:

train = train.drop(['Name', 'PassengerId'], axis=1)
test = test.drop(['Name'], axis=1)

combine = [train, test]
train.shape, test.shape

# ((891, 9), (418, 9))

полевой секс

Преобразование пола Мужской и Женский в 0-Мужской, 1-Женский

 for dataset in combine:
    dataset['Sex'] = dataset['Sex'].map( {'female': 1, 'male': 0} ).astype(int)

Взаимосвязь между полом, возрастом и выживаемостью:

grid = sns.FacetGrid(
    train,
    row='Pclass',
    col='Sex',
    size=2.2, 
    aspect=1.6)

grid.map(plt.hist, 
         'Age', 
         alpha=.5, 
         bins=20)

grid.add_legend()

plt.show()

Поле Возраст

1. Первое — разобраться с пропущенными значениями полей.

Мы заметили, что в поле age отсутствуют значения, и заполнили его 6 комбинациями пола (0, 1) и класса P (1, 2, 3). Случай пропущенного значения:

Конкретный процесс заполнения:

guess_ages = np.zeros((2,3))

 for dataset in combine:
    for i in range(0,2):
        for j in range(0,3):
            # 找到某种条件下Age字段的缺失值并删除
            guess_df = dataset[(dataset["Sex"] == i) & (dataset["Pclass"] == j+1)]["Age"].dropna()
            age_guess = guess_df.median()  # 中位数
            guess_ages[i,j] = int(age_guess / 0.5 + 0.5) * 0.5
    for i in range(0,2):
        for j in range(0,3):
            dataset.loc[(dataset.Age.isnull()) & (dataset.Sex == i) & (dataset.Pclass == j+1),"Age"] = guess_ages[i,j]
    dataset["Age"] = dataset["Age"].astype(int)
    
# 填充后不存在缺失值
train.isnull().sum()

2. Возрастная группа

3. Преобразование в числовую классификацию

  • Замените 0 на возраст менее 16 лет.
  • от 16 до 32 заменяются на 1 и т.д...
for dataset in combine:
    dataset.loc[dataset["Age"] <= 16, "Age"] = 0
    dataset.loc[(dataset["Age"] > 16) & (dataset["Age"] <= 32), "Age"] = 1
    dataset.loc[(dataset["Age"] > 32) & (dataset["Age"] <= 48), "Age"] = 2
    dataset.loc[(dataset["Age"] > 48) & (dataset["Age"] <= 64), "Age"] = 3
    dataset.loc[(dataset["Age"] > 64), "Age"] = 4
    
# 删除年龄段AgeBand字段
train = train.drop(["AgeBand"], axis=1)
combine = [train, test]

Обработка поля

Создайте новые поля из существующих полей:

создать новое поле 1

Сначала создайте поле FamilySize на основе полей Parch и SibSp.

for dataset in combine:
    dataset["FamilySize"] = dataset["SibSp"] + dataset["Parch"] + 1

    
# 每个FamilySize的生还均值
train[['FamilySize', 'Survived']].groupby(['FamilySize'], as_index=False).mean().sort_values(by='Survived', ascending=False)

По полю FamilySize судить, является ли он Islone: ​​Если член семьи FamilySize является человеком, он должен быть Islone, который представлен 1, в противном случае он представлен 0

Наконец, Parch, SibSp и FamilySize удалены, оставлено только то, является ли человек Islone:

# 将 Parch, SibSp, and FamilySize删除,仅保留是否一个人Islone

train = train.drop(['Parch', 'SibSp', 'FamilySize'],axis=1)
test = test.drop(['Parch', 'SibSp', 'FamilySize'],axis=1)
combine = [train, test]

train.head()

создать новое поле 2

Новое поле 2 является произведением Age и Pclass:

Классификация закладных полей

Значение поля Embarked равно SQC. Сначала мы заполняем пропущенные значения

Убедитесь, что в этом поле отсутствуют значения:

Обработка: найдите моду, заполните пропущенные значения, посмотрите на среднее значение каждого значения.

Преобразование текстового типа в числовой тип:

Обработка поля тарифа

В обучающем наборе пропущенных значений в этом поле нет, а в тестовом наборе есть:

Заполнить медианой:

Выполните операцию биннинга:

# 只对FareBand字段分箱
train['FareBand'] = pd.qcut(train['Fare'], 4)  # 分成4组

# 生还的均值
train[['FareBand', 'Survived']].groupby(['FareBand'], as_index=False).mean().sort_values(by='FareBand', ascending=True)

Преобразуйте каждый сегмент в числовые данные:

# 4个分段
for dataset in combine:
    dataset.loc[ dataset['Fare'] <= 7.91, 'Fare'] = 0
    dataset.loc[(dataset['Fare'] > 7.91) & (dataset['Fare'] <= 14.454), 'Fare'] = 1
    dataset.loc[(dataset['Fare'] > 14.454) & (dataset['Fare'] <= 31), 'Fare']   = 2
    dataset.loc[ dataset['Fare'] > 31, 'Fare'] = 3
    dataset['Fare'] = dataset['Fare'].astype(int)

# 
train = train.drop(['FareBand'], axis=1)
combine = [train, test]
    
test.head()

Таким образом, мы получаем поля данных и, в конечном итоге, для моделирования:

моделирование

Ниже приведен конкретный процесс моделирования, мы сначала разделяем набор данных:

# 训练集
X_train = train.drop("Survived", axis=1)
Y_train = train["Survived"]

# 测试集
X_test  = test.drop("PassengerId", axis=1).copy()
X_train.shape, Y_train.shape, X_test.shape

Конкретный процесс для каждой модели:

  1. Создание экземпляра объекта модели
  2. Установите тренировочный набор
  3. Делайте прогнозы на тестовом наборе
  4. Рассчитать точность

Модель 1: логистическая регрессия

# 模型实例化
logreg = LogisticRegression()
# 拟合过程
logreg.fit(X_train, Y_train)

# 测试集预测
Y_pred = logreg.predict(X_test)
# 准确率求解
acc_log = round(logreg.score(X_train, Y_train) * 100, 2)
acc_log

# 结果
81.37

Коэффициенты, полученные из модели логистической регрессии:

# 逻辑回归特征和系数


coeff_df = pd.DataFrame(train.columns[1:])  # 除去Survived特征
coeff_df.columns = ["Features"]

coeff_df["Correlation"] = pd.Series(logreg.coef_[0])

# 从高到低
coeff_df.sort_values(by='Correlation', ascending=False)

Вывод: пол действительно является важным фактором нашего выживания.

Модель 2: машина опорных векторов SVM

Модель 3: КНН

Модель 4: Наивный Байес

Модель 5: Персептрон

Модель 6: Классификация линейных опорных векторов

linear_svc = LinearSVC()
linear_svc.fit(X_train, Y_train)

Y_pred = linear_svc.predict(X_test)

acc_linear_svc = round(linear_svc.score(X_train, Y_train) * 100, 2)
acc_linear_svc
# 结果
79.46

Модель 7: стохастический градиентный спуск

Модель 8: Дерево решений

Модель 9: Случайный лес

Сравнение моделей

Сравните результаты (показатели точности) 9 моделей выше:

models = pd.DataFrame({
    'Model': ['Support Vector Machines', 'KNN', 'Logistic Regression', 
              'Random Forest', 'Naive Bayes', 'Perceptron', 
              'Stochastic Gradient Decent', 'Linear SVC', 
              'Decision Tree'],
    'Score': [acc_svc, acc_knn, acc_log, 
              acc_random_forest, acc_gaussian, acc_perceptron, 
              acc_sgd, acc_linear_svc, acc_decision_tree]})

models.sort_values(by='Score', ascending=False)

Сравнивая результаты: деревья решений и случайные леса работают лучше всего в этом наборе данных; вторым является алгоритм KNN (K-ближайшего соседа).