Общественный номер: 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()
- Для тех, кто не выжил, большинство было сосредоточено в возрасте 15-25 лет (левое изображение).
- Максимальный возраст выживших — 80 лет, при этом выживаемость детей до 4 лет очень высока (рисунок справа)
- Возраст большинства пассажиров от 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()
- Женщины выживают лучше мужчин
- За исключением Embarked=C, выживаемость мужчин выше.
- Когда все классы кают относятся к 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: логистическая регрессия
# 模型实例化
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-ближайшего соседа).