Kaggle实战入门:泰坦尼克号生还预测(进阶版)

简介: Kaggle实战入门:泰坦尼克号生还预测(进阶版)


1. 加载数据

由于针对训练数据集、测试数据集均要做空值填充、编码转换、离散化、归一化等处理,因此可以加载训练数据集、测试数据集对其统一进行处理。

train_file = r'datasets/train.csv'
test_file  = r'datasets/test.csv'
data = pd.read_csv(train_file,index_col='PassengerId')
data_sub = pd.read_csv(test_file,index_col='PassengerId') 
data_copy = data.copy()
del data_copy['Survived']
data_all = pd.concat([data_copy,data_sub]) #数据合并
data_all.info() #查看数据情况

输出

<class ‘pandas.core.frame.DataFrame’>

Int64Index: 1309 entries, 1 to 1309

Data columns (total 10 columns):

Pclass 1309 non-null int64

Name 1309 non-null object

Sex 1309 non-null object

Age 1046 non-null float64

SibSp 1309 non-null int64

Parch 1309 non-null int64

Ticket 1309 non-null object

Fare 1308 non-null float64

Cabin 295 non-null object

Embarked 1307 non-null object

dtypes: float64(2), int64(3), object(5)

memory usage: 112.5+ KB

2. 特征工程

(1)填充空值

需要填充空值的字段包括:AgeFareEmbarked 三个字段,其中使用众数填充Embarked``Age的空值 ,使用均值填充Fare``Age的空值。

由于Name里有Mr,Mrs,Miss等称谓,可使用称谓对应的年龄的均值来填充Age的空值。

#填充Fare与Embark空值
Embarked_mode = data_all.Embarked.mode()[0] #计算众数
data_all.Embarked=data_all.Embarked.fillna(Embarked_mode) #众数填充
Fare_mean = data_all[data_all.Pclass == 3].Fare.mean() #计算均值
data_all.Fare=data_all.Fare.fillna(Fare_mean) #均值填充
#根据Title填充Age空值
def get_title(name):
    title_search = re.search("([A-Za-z]+)\.",name)
    if title_search:
        return title_search.group(1)
    return ""
data_all['Title'] = data_all.Name.apply(get_title)
for title in data_all[data_all.Age.isnull()].Title.unique():
    title_age_mean = data_all[data_all.Title == title].Age.mean()
    data_all.loc[data_all.Age.isnull()*data_all.Title == title,'Age'] = title_age_mean

(2)Age空值离散化

#年龄离散化
bins=[0,14,30,45,60,80]
cats=pd.cut(data_all.Age.as_matrix(),bins) 
data_all.Age=cats.codes

(3)Fare归一化

使用StandardScaler方法对Fare归一化处理

scaler=StandardScaler()
data_all.Fare=scaler.fit_transform(data_all.Fare.values.reshape(-1,1))

(4)形成新属性FamilySize

data_all['FamilySize'] = data_all.Parch + data_all.SibSp

(5)One-Hot Encoding

针对Embarked(‘S’, ‘C’, 'Q’三个取值)、Pclass(1,2,3三个取值)字段,若简单的将其映射为数值0 , 1 , 2 0,1,20,1,2,训练时模型会认为该属性的数据具有线性特征。

机器学习中,一般将离散型特征(标称属性、序数属性)的每个取值都看成一种状态,若该特征中有N NN个不相同的取值,可通过One-Hot Encoding(独热编码),将其转换为N NN个状态,只有一个状态位值为1 11,其他状态位都是0 00,即将其转换为N NN个二元特征。使得模型具有较强的非线性能力。

对于SexPclassEmbarked属性使用pd.get_dummies方法,将其转换为One-hot向量,如将Embarked转换为[ 1 , 0 , 0 ] , [ 0 , 1 , 0 ] , [ 0 , 0 , 1 ] [1,0,0],[0,1,0],[0,0,1][1,0,0],[0,1,0],[0,0,1]

对于Cabin,将其展开为两个属性:数据中Cabin值为空的Cabin_null取值为1,Cabin_nnull取值为0;Cabin值不为空的Cabin_null取值为1,Cabin_nnull取值为0。

Sex_dummies = pd.get_dummies(data_all.Sex, prefix= 'Sex')
Pclass_dummies = pd.get_dummies(data_all.Pclass,prefix= 'Pclass')
Embarked_dummies = pd.get_dummies(data_all.Embarked,prefix= 'Embarked')
data_all['Cabin_null'] = np.array(data_all.Cabin.isnull()).astype(np.int32)
data_all['Cabin_nnull'] = np.array(data_all.Cabin.notnull()).astype(np.int32)

各个特征(属性)的处理总结如下

属性名 处理方式
Pclass 形成One-Hot向量
Name 未处理
Sex 形成One-Hot向量
Age 根据称谓填充空值后,离散化
SibSp 形成新属性FamilySize
Parch
Ticket 未处理
Fare 归一化
Cabin 形成One-Hot向量
Embarked 形成One-Hot向量

构建训练数据:

data_all = pd.concat([data_all, Sex_dummies, Pclass_dummies,Embarked_dummies], axis=1)
feature = [ 'Age','Fare','FamilySize','Cabin_null','Cabin_nnull','Sex_female','Sex_male','Pclass_1','Pclass_2','Pclass_3','Embarked_C','Embarked_Q','Embarked_S']
X = data_all.loc[data.index][feature] 
y = data.Survived

3. 模型训练

(1)组合分类器

组合分类器将多个不同类型的分类器(例如逻辑回归,SVM,随机森林)的预测结果进行组合,将多数分类器输出的结果作为最终的预测结果(hard voting classifier)。如果所有的分类器都能够预测类别的概率(拥有predict_proba方法),可将平均概率最高的结果作为最终的预测结果(soft voting classifier)通常比hard voting classifier效果好。

(2)参数优化

机器学习中的一项主要工作是参数优化(俗称“调参”)。sklearn提供了GridSearchCV方法,它网格式的自动遍历提供的参数组合,通过交叉验证确定最优化结果的参数(可通过best_params_属性查看)。

本文使用的分类器包括:随机森林、支持向量机、GBDT和神经网络。

from sklearn.model_selection import GridSearchCV, StratifiedKFold
kfold = StratifiedKFold(n_splits=10)
clf_RF = RF()
rf_param_grid = {"max_depth": [None],
              "max_features": [1, 3, 10],
              "min_samples_split": [2, 3, 10],
              "min_samples_leaf": [1, 3, 10],
              "bootstrap": [False],
              "n_estimators" :[100,300,500],
              "criterion": ["gini"]}
gsRF = GridSearchCV(clf_RF,param_grid = rf_param_grid, cv=kfold,scoring="accuracy", n_jobs= 4, verbose = 1)
gsRF.fit(X,y)
rf_best = gsRF.best_estimator_
clf_SVC = SVC(probability=True)
svc_param_grid = {'kernel': ['rbf'], 
                  'gamma': [ 0.001, 0.01, 0.1, 1],
                  'C': [1, 10, 50, 100,200,300, 1000]}
gsSVC = GridSearchCV(clf_SVC,param_grid = svc_param_grid, cv=kfold, scoring="accuracy", n_jobs= 4, verbose = 1)
gsSVC.fit(X,y)
svm_best = gsSVC.best_estimator_
clf_GB = GB()
gb_param_grid = {'loss' : ['deviance'],
              'n_estimators' : [100,300,500],
              'learning_rate': [0.1, 0.05, 0.01],
              'max_depth': [4, 8],
              'min_samples_leaf': [100,150],
              'max_features': [0.3, 0.1]}
gsGB = GridSearchCV(clf_GB,param_grid = gb_param_grid, cv=kfold, scoring="accuracy", n_jobs= 4, verbose = 1)
gsGB.fit(X,y)
gb_best = gsGB.best_estimator_
clf_MLP = MLP()
mlp_param_grid = {'hidden_layer_sizes' : [100,200,300,400,500],
              'activation' : ['relu'],
              'solver' : ['adam'],
              'learning_rate_init': [0.01, 0.001],
              'max_iter': [5000]}
gsMLP = GridSearchCV(clf_MLP,param_grid = mlp_param_grid, cv=kfold, scoring="accuracy", n_jobs= 4, verbose = 1)
gsMLP.fit(X,y)
mlp_best = gsMLP.best_estimator_
votingC = VotingClassifier(estimators=[('clf_GB', gb_best),  ('clf_RF', rf_best),('clf_SVC', svm_best),
('clf_MLP',mlp_best)],voting='soft', n_jobs=4)
votingC = votingC.fit(X, y)

4. 模型部署

使用predict方法预测,将生成的结果文件在Kaggle页面点击Submit Predictions进行提交,Kaggle会给出准确率和排名。

X_sub = data_all.loc[data_sub.index][feature]  #提取测试数据特征
y_sub = votingC.predict(X_sub) #使用模型预测数据标签
result = pd.DataFrame({'PassengerId':data_sub.index,'Survived':y_sub})
result.to_csv(r'D:\[DataSet]\1_Titanic\submission.csv', index=False)
相关文章
|
机器学习/深度学习 人工智能 API
TensorFlow Lite,ML Kit 和 Flutter 移动深度学习:1~5
TensorFlow Lite,ML Kit 和 Flutter 移动深度学习:1~5
555 0
|
10月前
|
机器学习/深度学习 存储 自然语言处理
从零开始构建基于DeepSeek的智能客服系统
在数字化时代,智能客服系统成为企业与客户沟通的重要桥梁。本文介绍如何使用PHP和DeepSeek技术构建智能客服系统,涵盖环境搭建、核心功能实现、多轮对话支持及电商客服案例。DeepSeek基于深度学习,能理解复杂意图并提供个性化服务,显著提升客户体验和运营效率。通过具体代码示例,帮助开发者从零开始构建强大智能客服系统。
|
10月前
|
存储 安全 数据安全/隐私保护
企业如何搭建技术支持体系?盘点三个需重点关注的方面
随着企业业务规模扩大,售后技术支持压力上升,构建高效专业的远程技术支持体系至关重要。向日葵技术支持方案从三个方面助力企业:1. 远控工具高效安全,提升客户体验;2. 自动化工单平台,优化需求流转;3. 客户信息管理,确保数据安全与追溯。向日葵凭借高效的产品设计、智能工单系统和完善的客户资料管理,帮助企业建立专业、可靠的售后服务体系。
385 0
|
Python
利用Python判断一个数是否在列表中
利用Python判断一个数是否在列表中
1299 0
|
机器学习/深度学习 数据可视化 Serverless
Kaggle实战入门:泰坦尼克号生还预测(基础版)
Kaggle实战入门:泰坦尼克号生还预测(基础版)
|
测试技术 计算机视觉
斯坦福新研究提升大模型长视频理解能力
【2月更文挑战第29天】斯坦福大学研究团队开发的VideoAgent系统在长视频理解上取得突破,提升了大型语言模型处理视频内容的能力。该系统通过模拟人类认知过程,以高效(平均8.4帧)实现高准确率(54.1%和71.3%的零样本准确率),在EgoSchema和NExT-QA基准测试中超越现有最佳方法。VideoAgent借鉴人类观看视频的方式,迭代选择关键帧进行信息提取和推理,为长视频理解设定新标准。论文链接:[arxiv.org/pdf/2403.10517.pdf](https://arxiv.org/pdf/2403.10517.pdf)
474 1
斯坦福新研究提升大模型长视频理解能力
|
机器学习/深度学习 算法 数据可视化
【python kaggle机器学习】泰坦尼克号 - 灾难中的机器学习详解
【python kaggle机器学习】泰坦尼克号 - 灾难中的机器学习详解
|
机器学习/深度学习 安全 数据处理
泰坦尼克号乘客生存情况预测分析1
泰坦尼克号乘客生存情况预测分析1
738 2
|
存储 数据采集 机器人
介绍大语言模型:langchain
**LangChain框架** 是一个开源工具,由Lang.AI开发,专为基于大语言模型(LLM)的应用程序设计。它简化了与LLM的交互,整合数据检索和功能模块,支持上下文感知和逻辑推理。框架包括**基础层**(Models、LLM、Index)、**能力层**(Chains、Memory、Tools)和**应用层**(Agent),提供模型集成、提示管理、内存系统、索引、链和代理等模块。LangChain的特点包括上下文感知、逻辑推理、预制链和组件,以及开发工具如LangSmith和LangServe。广泛应用在文档分析、聊天机器人、智能助手、代码生成、内容创作和数据科学等领域。
|
机器学习/深度学习 算法 数据可视化
机器学习决策树算法泰坦尼克号乘客生存预测
机器学习决策树算法泰坦尼克号乘客生存预测
337 0