目录
一、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。可以说很垫底了,属实是重在参与。
现在刚开始入门只是进行简单的调用,在深入了解算法原理后,对具体问题进行参数的调整,可能会取得更好的结果。
浅薄之见,敬请指正!
共勉!