泰坦尼克

本文介绍了对泰坦尼克数据集进行数据挖掘的过程,包括加载数据、特征类型分析、无关特征删除。在特征分析中,发现'Name', 'Ticket', 'Sex', 'Cabin'等特征与存活率相关。通过删除无关特征和处理缺失值,如用中位数填充'Age',众数填充'Embarked',模型拟合和调参,最终发现随机森林模型表现优秀,但调整参数后效果反而降低,暗示了可能存在的问题。后续工作计划涉及异常值分析和多模型融合。" 112927170,10324536,Halcon窗体图片缩放与移动教程:WPF中的HWindowControlWPF实现,"['Halcon', '机器视觉', '图像处理', 'C#开发', 'WPF编程']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 加载数据

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
train_df = pd.read_csv("tatannic/train.csv")
test_df = pd.read_csv("tatannic/test.csv")

2. 特征类型分析

print(train_df.shape)
train_df.head()

在这里插入图片描述

print(test_df.shape)
test_df.head()

在这里插入图片描述

  • 可以发现测试集比训练集少‘Survived‘这个特征,当然我们要预测的也是这个特征
train_df.describe()

在这里插入图片描述

sns.countplot(train_df['Survived'])

在这里插入图片描述

train_df['Survived'].value_counts()

在这里插入图片描述

train_df.info()

在这里插入图片描述

  • 一共有12个特征,7个数值特征,5个类别特征,'Age’和‘Cabin’缺失的比较多,‘Embarked’缺失的较少
train_df.describe(include=[np.object])

在这里插入图片描述

3. 无关特征删除

类别特征

- Name

  • 目标变量分析的从存活率,所以这里我们删除’Name’这个特征
train_df.drop('Name', axis=1, inplace=True)
test_df.drop('Name', axis=1, inplace=True)

- Ticket

train_df['Ticket'].value_counts()

在这里插入图片描述

ticket_count = train_df['Ticket'].value_counts()
ticket_count = ticket_count[ticket_count>=4]
ticket_count_df = train_df[train_df['Ticket'].isin(ticket_count.index)]
ticket_count_df['Ticket'].value_counts()

在这里插入图片描述

ax, fig = plt.subplots(figsize=(12, 9))
sns.barplot(data=ticket_count_df, x='Ticket', y='Survived')
plt.xticks(rotation=90)

在这里插入图片描述

  • 我们可以发现113760和2666这两种票号的存活率基本为百分之百,347077、1601、17421、PC17757这些票号的存活率也较高
list = ['113760', '2666', '347077', '1601', '17421', 'PC17757']
for c in list:
    train_df['Ticket_rate'] = (train_df['Ticket'] == c).apply(int)
    test_df['Ticket_rate'] = (test_df['Ticket'] == c).apply(int)
train_df.drop('Ticket', axis=1, inplace=True)
test_df.drop('Ticket', axis=1, inplace=True)

- Embarked

train_df['Embarked'].value_counts()

在这里插入图片描述

sns.barplot(data=train_df, x='Embarked', y='Survived')

在这里插入图片描述

  • 可以发现在C登港口的存活率最高,S和Q登港口的存活率差不多
    - Sex
train_df['Sex'].value_counts()

在这里插入图片描述

sns.barplot(data=train_df, x='Sex', y='Survived')

在这里插入图片描述

  • 可以看出女性的存活率远远高于男性
    - Cabin
train_df['Cabin'].value_counts()

在这里插入图片描述

Cabin_count = train_df['Cabin'].value_counts()
Cabin_count = Cabin_count[Cabin_count >= 3]
Cabin_df = train_df[train_df['Cabin'].isin(Cabin_count.index)]
Cabin_df['Cabin'].value_counts()

在这里插入图片描述

ax, fig = plt.subplots(figsize=(12, 9))
sns.barplot(data=Cabin_df, x='Cabin', y='Survived')

在这里插入图片描述

  • 从图中发现,F33、E101、B96B98的 船舱的存活率为百分之百,接下来是F2和D船舱
list = ['F33', 'E101', 'B96B98', 'F2', 'D']
for c in list:
    train_df['Cabin_rate'] = (train_df['Cabin'] == c).apply(int)
    test_df['Cabin_rate'] = (test_df['Cabin'] == c).apply(int)
train_df.drop('Cabin', axis=1, inplace=True)
test_df.drop('Cabin', axis=1, inplace=True)

数值特征

value_cols = train_df.describe().columns
train_df[value_cols].nunique().describe()

在这里插入图片描述

train_df[value_cols].nunique().plot(kind='bar', logy=True)

在这里插入图片描述

print("全部为unique的特征", train_df[value_cols].columns[train_df[value_cols].nunique() == len(train_df)])

在这里插入图片描述

  • 为PassengerId为序号,不能体现和存活率的关系,故删除
train_df.drop('PassengerId', axis=1, inplace=True)
test_ID = test_df['PassengerId']
test_df.drop('PassengerId', axis=1, inplace=True)

4. 数据类型转化

train_df.describe(include=[np.object])

在这里插入图片描述

sex_map = {'male':0, 'female':1}
train_df['Sex'] = train_df['Sex'].map(sex_map)
test_df['Sex'] = test_df['Sex'].map(sex_map)
train_df['Embarked'].value_counts()

在这里插入图片描述

embarked_map = {'S':0, 'C':1, 'Q':2}
train_df['Embarked'] = train_df['Embarked'].map(embarked_map)
test_df['Embarked'] = test_df['Embarked'].map(embarked_map)

5. 缺失值处理

def missing_values_table(df):
    missing_values = df.isnull().sum()
    missing_values_percent = 100 * df.isnull().sum() / len(df)
    missing_values_table = pd.concat([missing_values, missing_values_percent], axis=1,
                                     keys=['Missig Values', '% of Total Values'])
    missing_values_table = missing_values_table[missing_values_table.iloc[:,1] != 0].sort_values(
                            "% of Total Values", ascending =False)
    return missing_values_table
missing_values = missing_values_table(train_df)
missing_values.head()

在这里插入图片描述

train_df['Age'] = train_df['Age'].fillna(train_df['Age'].median())
test_df['Age'] = test_df['Age'].fillna(test_df['Age'].median())
rain_df['Embarked'] = train_df['Embarked'].fillna(train_df['Embarked'].mode()[0])
test_df['Embarked'] = test_df['Embarked'].fillna(test_df['Embarked'].mode()[0])
  • 这里我用中位数填充Age,用众数填充Embarked,至于为什么要这样填充,就是想这样填充
missing_values_table(train_df).head()

在这里插入图片描述

missing_values_table(test_df).head()

在这里插入图片描述

test_df['Fare'] = test_df['Fare'].fillna(test_df['Fare'].mode()[0])

6. 模型拟合

from sklearn.preprocessing import MinMaxScaler
from sklearn.svm import SVC
from sklearn.pipeline import make_pipeline
from sklearn.ensemble import RandomForestClassifier
from sklearn.neighbors import KNeighborsClassifier
label = train_df['Survived']
train_df.drop('Survived', axis=1, inplace=True)
pipe_svc = make_pipeline(MinMaxScaler(), SVC())
pipe_svc.fit(train_df, label)
y_svc = pipe_svc.predict(test_df)
pipe_svc.score(train_df, label)

在这里插入图片描述

pipe_rfc = make_pipeline(MinMaxScaler(), RandomForestClassifier(n_estimators=300))
pipe_rfc.fit(train_df, label)
y_rfc = pipe_rfc.predict(test_df)
print(pipe_rfc)
pipe_rfc.score(train_df, label)

在这里插入图片描述

pipe_knn = make_pipeline(MinMaxScaler(), KNeighborsClassifier())
pipe_knn.fit(train_df, label)
y_knn = pipe_knn.predict(test_df)
pipe_knn.score(train_df, label)

在这里插入图片描述

7. 调参

  • 上面可以看到随机森林表现的效果较好,这里我意思的用下网格搜索
from sklearn.model_selection import GridSearchCV
n_fold = 5
param = {'n_estimators': [20, 50, 100, 200]}
rfc = RandomForestClassifier()
scaler = MinMaxScaler().fit(train_df)
train_df_std = scaler.transform(train_df)
test_df_std = scaler.transform(train_df)
grid = GridSearchCV(rfc, param, cv=n_fold)
grid.fit(train_df, label)
print(grid.best_score_)   #最优分数
print(grid.best_params_)   #最优参数display(pd.DataFrame(ltc_grid.cv_results_).T)
display(pd.DataFrame(grid.cv_results_).T)

在这里插入图片描述
在这里插入图片描述

  • 惊奇的发现分庶还降低了。。。
rfc = RandomForestClassifier()
rfc.fit(train_df_std, label)
test_label = rfc.predict(test_df)
submission = pd.DataFrame({
        "PassengerId": test_ID,
        "Survived": test_label
    })

在这里插入图片描述

submission['Survived'].value_counts()

在这里插入图片描述

  • 有待进一步深入的:
    1. 异常值的分析
    2. 多模型融合
    3. 。。。。。。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值