kaggle小白入门——泰坦尼克号公分0.8+

经过不断的尝试,看了无数的kernels以及各种博客,终于把公分提到了0.8以上,写这篇博客记录一下,也希望能够对各位新手们有所帮助。

一、导包

# 数据处理及可视化
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 算法
from sklearn.ensemble import RandomForestRegressor
from sklearn.svm import SVC
# 训练
from sklearn.model_selection import train_test_split
from sklearn.model_selection import learning_curve
from sklearn.model_selection import ShuffleSplit
from sklearn.model_selection import GridSearchCV

二、获取数据

train = pd.read_csv("all/train.csv")
test = pd.read_csv("all/test.csv")
gender_submission = pd.read_csv("all/gender_submission.csv")

三、数据分析及特征工程

train.describe(include="all")

各个特征总结:

PassengerId:当然没用;

Pclass:代表社会地位,社会地位越高,当然越容易存活;

Name:初次尝试时,多数人会把Name直接删掉。但后面越来越深入,会发现Name中隐含着巨大的信息,包括称呼,姓氏。也有见过使用名字长度为特征的,我也尝试了一下,发现并没有太大的帮助;

Sex:女士优先原则,女性的生存率相当的高;

Age:小孩生存率相当高。年龄有大量缺失值,需要填充;

SibSp:船上的兄弟姐妹和配偶数量;

Parch:船上的父母子女数量;

Ticket:初次尝试时,也都会把Ticket去掉。但是,Ticket与Name一起构成了重要的家庭特征,也是本文大力处理的地方;

Fare:票价与票号对应,相同票号价格相同,但相同票价不一定相同票号;

Cabin:多数用有无Cabin特征处理,但其实影响不大;

Embarked:S港登船的人最多,生存率也最高,但经过尝试,其实影响也不大。

对于Cabin,Embarked等已经在我的模型中可有可无的特征,本文将不再讨论。本文重点将在Name,SibSp,Parch,Ticket中讨论,来构建家庭和团体特征

Sex生存率:

sns.barplot(x="Sex", y="Survived", data=train)
print("女性生存率:", train["Survived"][train["Sex"] == "female"].value_counts(normalize=True)[1])
print("男性生存率:", train["Survived"][train["Sex"] == "male"].value_counts(normalize=True)[1])

可以看到,女性生存率相当的高,男性生存率相当的低。基本上每5个女性有1个死亡,每5个男性有1个存活,这里就要注意了,假设泰坦尼克上女的全活了,男的全死了,那么我们就需要关注一下那个死亡的女性发生了什么恐怖的事,以及那个活着的男性遇到了什么幸运的事。纵观特征,唯一能够想到的就是各种亲友拖累了那个死亡的女性或者救了那个活着的男性,因此将注意力转到家庭以及同行的人。(其实是看各种大佬kernels得到的启发)

添加Family_size特征

train["Family_size"] = train["SibSp"] + train["Parch"]
test["Family_size"] = test["SibSp"] + test["Parch"]

添加Fname特征,即姓氏

train["Fname"] = train.Name.apply(lambda x: x.split(",")[0])
test["Fname"] = test.Name.apply(lambda x: x.split(",")[0])

然后,经过一系列的爆炸观察,好吧,这里没有可视化,就是一条一条数据直接肉眼观察的。

结论:

1、Fname相同,Ticket相同,Family_size>0可以确定一个家庭,只有一个家庭例外,这个家庭的票号连号,但影响不大。

2、有女性死亡的家庭,除了1岁以下的婴儿外,家庭成员全部死亡。(分数第一次有大的提升,也是添加了该特征之后)

3、家庭中若有大于18岁男性存活,或年龄为nan的男性存活,则该家庭全部存活。(加入该特征后,公分达到了0.8)

4、其余家庭,除极个别

### ID3决策树算法在Kaggle泰坦尼克号生存预测问题中的实现和应用 #### 1. ID3决策树简介 ID3(Iterative Dichotomiser 3)是一种经典的决策树算法,由Ross Quinlan于1986年提出。该算法的核心思想是通过信息增益来选择最优的分裂属性[^5]。具体来说,在每次节点分裂时,计算各个特征的信息增益,并选取信息增益最大的特征作为当前节点的最佳分割点。 信息熵用于衡量数据集的混乱程度,其公式如下: \[ H(D) = - \sum_{i=1}^{n} p_i \log_2(p_i) \] 其中 \(p_i\) 表示类别 \(C_i\) 出现的概率。基于此,信息增益可以表示为父节点的熵减去子节点加权后的平均熵: \[ Gain(D,A) = H(D) - \sum_{v=1}^{V}\frac{|D_v|}{|D|}H(D_v) \] #### 2. 数据预处理 在泰坦尼克号生存预测问题中,原始数据包含了多个特征,如 `Pclass`、`Sex`、`Age` 和 `Fare` 等。为了使这些特征能够被ID3算法有效利用,需要对其进行一系列预处理操作: - **缺失值填充**:对于含有缺失值的列(如 `Age`),可以通过均值或众数等方式填补缺失值[^1]。 - **特征编码**:ID3算法无法直接处理字符串类型的特征,因此需要将分类变量转换为数值形式。例如,使用 `LabelEncoder` 将 `Sex` 转换为 {male: 0, female: 1}[^2]。 - **特征选择**:挑选与目标变量高度相关的特征作为输入。通常可以选择诸如 `Pclass`、`Sex`、`Age` 和 `Fare` 这样的特征[^4]。 #### 3. 模型训练 以下是使用Python实现ID3决策树的一个简单例子: ```python from sklearn.tree import DecisionTreeClassifier import pandas as pd # 加载数据 data = pd.read_csv('titanic_train.csv') # 特征选择 features = ['Pclass', 'Sex', 'Age', 'Fare'] X = data[features].copy() # 处理缺失值 X['Age'].fillna(X['Age'].median(), inplace=True) # 类别特征编码 X['Sex'] = X['Sex'].map({'female': 1, 'male': 0}) y = data['Survived'] # 构建ID3决策树模型 clf = DecisionTreeClassifier(criterion='entropy', random_state=42) clf.fit(X, y) ``` 在此代码片段中,`criterion='entropy'` 参数指定了使用信息熵作为分裂准则,这是ID3算法的关键特性之一。 #### 4. 模型评估 完成模型训练后,可通过交叉验证或其他指标评估模型性能。常用的评价指标包括准确率、召回率、F1分数等。例如: ```python from sklearn.model_selection import cross_val_score scores = cross_val_score(clf, X, y, cv=5, scoring='accuracy') print(f"Cross-validation accuracy scores: {scores}") print(f"Mean accuracy: {scores.mean():.4f}") ``` 此外,还可以绘制混淆矩阵以更直观地理解模型的表现。 #### 5. 结果分析 尽管ID3算法具有易于理解和解释的优点,但在实际应用中可能存在过拟合的风险。特别是在泰坦尼克号这样的复杂场景下,建议结合其他技术手段优化模型表现,比如剪枝策略或者集成方法[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值