Kaggle竞赛第1集——Predict survival on the Titanic

目录

一、Kaggle介绍

二、Titanic幸存预测——竞赛介绍

2.1、阅读项目基本信息

2.2、项目所给数据

三、竞赛分析及代码实现

         3.1 竞赛分析

3.2 代码实现 

3.3 结果展示


一、Kaggle介绍

        Kaggle合集开篇,还是对Kaggle进行简单的介绍。kaggle是一个全球的数据分析和机器学习网站。网站:Kaggle: Your Machine Learning and Data Science Community。界面如下:

 在这个网站上会有很多机构及公司发布数据及对应需求,每个项目都会有具体的包括:时间、背景、要求、数据说明等等详细介绍。你可以加入此竞赛来提交自己的作品,最后他会对你提交作品进行打分排名(首先你得注册账户)。至于其他的Kaggle相关操作就不赘述,可以自己在网站上慢慢摸索(我也是个摸索中的新手)。

二、Titanic幸存预测——竞赛介绍

        这个网站提供了很多对于初学者的学习课程和练手项目,包括Python基本语法、Python数据数据分析入门及Python深度学习等,还给了很多适合初学者的入门项目,其中最典型属以下两个:

 这是一个回归问题,预测不同房子的房价。链接:House Prices - Advanced Regression Techniques | Kaggle

再一个就是今天的主角:

 这是一个二分类问题(死或者活),根据Passengers的信息预测在这场事故中能否存活。

链接:Titanic - Machine Learning from Disaster | Kaggle

2.1、阅读项目基本信息

 大致就是说:他给了我们很多关于乘客的信息,让我们来看一下什么样的乘客更容易存活。

 

 项目成果要求极其提交格式。

2.2、项目所给数据

 

 点击这可以查看项目数据,有详细的数据的介绍和下载方法。

本项目由三个数据,一个是提交示例,一个是训练数据集,一个是测试数据集。

三、竞赛分析及代码实现

3.1 竞赛分析

        在知道了竞赛背景和要求之后,下载好数据,就可以开始进行建模(以下分析仅为参考)

        首先我们要剔除非必要的数据,关于能否存活,看与所给的那些数据有关,若所给字段很多可以使用相关性分析作为选择依据,所给数据如下:

 显然:能否存活与名字无关,删去Name列数据;与票号无关,删去Ticket列数据;与登港地无关,删去Embarks列数据;理论上与船舱有关,但Cabin数据不好量化,所以舍去Cabin数据;

所以在最后选择的数据为:

# Pclass: 社会经济地位
# Sex:性别
# Age:年龄
# SibSp:亲属关系
# Parch:配偶
# Fare:所附费用,间接代表舱的等级

 然后对性别字段进行量化,female为1,male为2。代码段如下:

sex_ls = []
for i in range(len(sex_data)):
    temp = str(sex_data[i])
    if temp == 'female':
        sex_ls.append(1)
    else:
        sex_ls.append(2)

然后是空值处理,在选择的数据中Age数据有空值,在训练集中可以选择删除整行数据的方法。(在测试集中不能删除数据)训练集中代码如下:

train_df = pd.read_csv(train_path)
train_df = pd.DataFrame(train_df,columns=['Survived',"Pclass","Sex",
                                          "Age","SibSp","Parch","Fare"])    # 选择需要的列组成数据
train_df = train_df.dropna(how='any')   # 删除有空值所在的行

 在测试集中我选择的是用均值填充:

test_df = pd.DataFrame(test_df,columns=["Pclass","Sex","Age",
                                        "SibSp","Parch","Fare"])    # 选择需要的列组成数据
test_df = test_df.fillna(test_df['Age'].mean())

 除此之外就是数据集组建,然后使用sklearn的API进行模型建立,我尝试以下6种方法。

SVC
KNN
随机森林回归
逻辑回归
AdaBoostClassifier
朴素贝叶斯

3.2 代码实现 

# 选择数据字段如下
# Pclass: 社会经济地位
# Sex:性别
# Age:年龄
# SibSp:亲属关系
# Parch:配偶
# Fare:所附费用,间接代表舱的等级

import sys
import numpy as np
import pandas as pd
from sklearn.svm import SVC
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import MinMaxScaler
from sklearn.ensemble import RandomForestClassifier,AdaBoostClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.naive_bayes import MultinomialNB
import matplotlib.pyplot as plt
import seaborn as sns

# 首先使用SVM算法进行分类
# 数据提取
train_path = "train.csv"
train_df = pd.read_csv(train_path)
train_df = pd.DataFrame(train_df,columns=['Survived',"Pclass","Sex",
                                          "Age","SibSp","Parch","Fare"])    # 选择需要的列组成数据
train_df = train_df.dropna(how='any')   # 删除有空值所在的行
lenth = len(train_df)
# print(train_df)
# 目标数据
survived_data = np.array(train_df["Survived"])
# 影响因子数据
pclass_data = np.array(train_df["Pclass"]).reshape((lenth,1))
sex_data = list(train_df["Sex"])
age_data = np.array(train_df["Age"]).reshape((lenth,1))
sibsp_data = np.array(train_df["SibSp"]).reshape((lenth,1))
parch_data = np.array(train_df["Parch"]).reshape((lenth,1))
fare_data = np.array(train_df["Fare"]).reshape((lenth,1))
# print(pclass_data,sex_data,sibsp_data,parch_data,fare_data)
# 对sex数据进行量化,female为1,male为2
sex_ls = []
for i in range(len(sex_data)):
    temp = str(sex_data[i])
    if temp == 'female':
        sex_ls.append(1)
    else:
        sex_ls.append(2)
sex_data = np.array(sex_ls).reshape((lenth,1))
train_data = np.hstack((pclass_data,sex_data,age_data,
                        sibsp_data,parch_data,fare_data))
# print(train_data.shape,survived_data.shape)
# 构建预测数据集
test_path = "test.csv"
test_df = pd.read_csv(test_path)
ID = test_df["PassengerId"]
test_df = pd.DataFrame(test_df,columns=["Pclass","Sex","Age",
                                        "SibSp","Parch","Fare"])    # 选择需要的列组成数据
test_df = test_df.fillna(test_df['Age'].mean())
test_lenth = len(test_df)
pclass_test = np.array(test_df["Pclass"]).reshape((test_lenth,1))
sex_test = list(test_df["Sex"])
age_test = np.array(test_df["Age"]).reshape((test_lenth,1))
sibsp_test = np.array(test_df["SibSp"]).reshape((test_lenth,1))
parch_test = np.array(test_df["Parch"]).reshape((test_lenth,1))
fare_test = np.array(test_df["Fare"]).reshape((test_lenth,1))
test_sex_ls = []
for i in range(len(sex_test)):
    temp = str(sex_test[i])
    if temp == 'female':
        test_sex_ls.append(1)
    else:
        test_sex_ls.append(2)
sex_test = np.array(test_sex_ls).reshape((test_lenth,1))
test_data = np.hstack((pclass_test,sex_test,age_test,
                       sibsp_test,parch_test,fare_test))
# print(test_data.shape)

# 开始预测
# -----使用SVC算法----- #
# 设置参数构建分类器
SVC_clf = SVC(C=1,kernel='rbf',gamma=1.5)
SVC_clf.fit(train_data, survived_data)
print("SVC训练结果得分:",SVC_clf.score(train_data, survived_data))
SVC_prediction = SVC_clf.predict(test_data)
# 预测数据输出
ID = np.array(ID).reshape((test_lenth,1))
SVC_prediction = np.array(SVC_prediction).reshape((test_lenth, 1))
submit = np.hstack((ID, SVC_prediction))
pd.DataFrame(submit,columns=['PassengerId',"Survived"]).to_csv("SVC_submission.csv",index=False)  # index=False写入文件不要索引
# 提交kaggle预测结果得分为0.59 #
# ------------------ #

# -----使用KNN算法----- #
KNN_clf = KNeighborsClassifier(n_neighbors=3)
KNN_clf.fit(train_data,survived_data)
print("KNN训练结果得分:",KNN_clf.score(train_data,survived_data))
KNN_prediction = np.array(KNN_clf.predict(test_data)).reshape((test_lenth,1))
KNN_submit = np.hstack((ID,KNN_prediction))
pd.DataFrame(KNN_submit,columns=['PassengerId',"Survived"]).to_csv("KNN_submission.csv",index=False)
# 提交kaggle预测结果得分为0.612 #
# -------------------- #

# -----使用Random forest classifier---- #
RFC_clf = RandomForestClassifier(n_estimators=100)
RFC_clf.fit(train_data,survived_data)
print("随机森林回归训练结果得分:",RFC_clf.score(train_data,survived_data))
RFC_prediction = np.array(RFC_clf.predict(test_data)).reshape((test_lenth,1))
RFC_submit = np.hstack((ID,RFC_prediction))
pd.DataFrame(RFC_submit,columns=['PassengerId',"Survived"]).to_csv("RFC_submission.csv",index=False)
# 提交kaggle预测结果得分为0.746 #
# -------------------- #

# ----- 使用Logistic Regression Classifier ----- #
LR_clf = LogisticRegression(penalty='l2')
LR_clf.fit(train_data,survived_data)
print("逻辑回归训练结果得分为:",LR_clf.score(train_data,survived_data))
LR_prediction = np.array(LR_clf.predict(test_data)).reshape((test_lenth,1))
LR_submit = np.hstack((ID,LR_prediction))
pd.DataFrame(LR_submit,columns=['PassengerId',"Survived"]).to_csv("LR_submission.csv",index=False)
# 提交kaggle预测结果得分为0.755 #
# --------------------------------------------- #

# ----- 使用AdaBoostClassifier ----- #
ABC_clf = AdaBoostClassifier(n_estimators=200)
ABC_clf.fit(train_data,survived_data)
print("AdaBoostClassifier训练结果得分为:",ABC_clf.score(train_data,survived_data))
ABC_prediction = np.array(ABC_clf.predict(test_data)).reshape((test_lenth,1))
ABC_submit = np.hstack((ID,ABC_prediction))
pd.DataFrame(ABC_submit,columns=['PassengerId',"Survived"]).to_csv("ABC_submission.csv",index=False)
# 提交kaggle预测结果得分为0.741 #
# --------------------------------------------- #

# -----使用朴素贝叶斯进行分类----- #
Bye_clf = MultinomialNB(alpha=0.7)
Bye_clf.fit(train_data,survived_data)
print("朴素贝叶斯训练结果得分为:",Bye_clf.score(train_data,survived_data))
Bye_prediction = np.array(Bye_clf.predict(test_data)).reshape((test_lenth,1))
Bye_submit = np.hstack((ID,Bye_prediction))
pd.DataFrame(Bye_submit,columns=['PassengerId',"Survived"]).to_csv("Bye_submission.csv",index=False)
# 提交kaggle预测结果得分为0.660 #
# --------------------------- #

# 绘图
sns.set_style('darkgrid')
# darkgrid, whitegrid, dark, white, ticks
data1 = [0.964,0.827,0.985,0.802,0.857,0.689]
data2 = [0.59,0.612,0.746,0.755,0.741,0.660]
label = ['SVC','KNN','RFC','LRC','ABC',"ByeC"]
x = range(6)
plt.bar(x,data1,width=0.3,fc='b',label='train score')
x = [i+0.3 for i in x]
plt.bar(x,data2,width=0.3,fc='r',label='prediction score')
plt.xticks([i-0.15 for i in x],label)
plt.title("comparison of different algorithms")
plt.xlabel("algorithms")
plt.ylabel("score")
plt.legend()
plt.show()

3.3 结果展示

        就训练结果得分和提交Kaggle预测结果得分来说,绘图如下:

 Kaggle排名12584/14705。可以说很垫底了,属实是重在参与。

现在刚开始入门只是进行简单的调用,在深入了解算法原理后,对具体问题进行参数的调整,可能会取得更好的结果。


 浅薄之见,敬请指正!

共勉!


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值