Kaggle入门实战:Titanic - Machine Learning from Disaster

Titanic项目

Use machine learning to create a model that predicts which passengers survived the Titanic shipwreck.
基于机器学习建立模型预测泰坦尼克号灾难中哪些乘客得以生存。
p.s.本次练习主要在于熟悉数据分析项目流程、思考方式与实际操作,并未以达到最高准确率为目标

Kaggle入门项目:Titanic overview
参考分析视频:Beginner Kaggle Data Science Project Walk-Through (Titanic)
参考分析笔记:Titanic Project Example Walk Through

关于数据

数据概括

训练数据(training set):
含有关于乘客生存信息的数据,用来建立机器学习模型。建立模型模型时应基于训练数据中关于乘客年龄、客舱等级、亲属数等的属性(详情见数据字段描述)
train set

测试数据(test set):
将模型运用于测试数据中并预测乘客生存与否,将根据上传的测试数据预测结果评判模型准确度
测试数据比训练数据只少了survived一列(需根据模型自行预测)
test set

数据字段描述

数据字典

官方教程代码

from sklearn.ensemble import RandomForestClassifier

y = train_data["Survived"]

features = ["Pclass", "Sex", "SibSp", "Parch"]
X = pd.get_dummies(train_data[features])
X_test = pd.get_dummies(test_data[features])

model = RandomForestClassifier(n_estimators=100, max_depth=5, random_state=1)
model.fit(X, y)
predictions = model.predict(X_test)

output = pd.DataFrame({
   'PassengerId': test_data.PassengerId, 'Survived': predictions})
output.to_csv('my_submission.csv', index=False)
print("Your submission was successfully saved!")

按照上述代码运用随机森林得到的结果为0.77511

数据分析

总体思路

  • 1.了解数据基本信息,使用 .info() .describe()
  • 2.画图展现数据分布便于数据分析、特征分析 e.g.Histograms, boxplots
  • 3.分析不同属性的值
  • 4.分析不同属性之间的关联性
  • 5.思考分析的主题,提出思考的问题
    (例如对本次Titanic数据:生存与否与乘客性别有关?与乘客本人经济条件有关?与年龄有关?哪个港口登船的乘客更容易生存?)
  • 6.特征工程
  • 7.处理缺失数据
  • 8.整合训练数据和测试数据?
  • 8.进行特征缩放 scaling?
  • 9.建立模型
  • 10.利用交叉验证 CV 对比模型效果

初步分析

import numpy as np 
import pandas as pd 
train_data = pd.read_csv('/kaggle/input/titanic/train.csv')
test_data = pd.read_csv("/kaggle/input/titanic/test.csv")
#查看训练数据相关信息
train_data.info() 

训练数据信息如下:

可以看出Age字段与Cabin字段有较多缺失数据,Embarked字段有2条缺失数据

#进一步查看数据的统计信息
train_data.describe()
数值型数据

针对数值型数据 (numeric data):

  • 通过画矩形图了解数据分布情况(histogram)
  • 画图探索不同数据的相关性
  • 运用透视表比较生存率与不同变量之间的关系(pivot table)
import matplotlib.pyplot as plt
#提取数值型属性
df_num = train_data[['Age','SibSp','Parch','Fare']]
#画矩形图
for i in df_num.columns:
    plt.hist(df_num[i])
    plt.title(i)
    plt.show()

Age接近正态分布,其他三个属性无特殊分布。Fare属性值的分布较广,考虑在后期进行数据标准化(normalization)处理。

import seaborn as sns 
# 画图探索不同数据的相关性
print(df_num.corr()) #相关系数
sns.heatmap(df_num.corr()) #使用热图查看相关系数分布情况

可以看出SibSp与Parch有一定的相关性,即家庭成员一起出游的可能性较大
(属性相关性分析在回归分析中很重要,因为要避免因为不同属性有较强相关性从而对模型造成影响)

# 用透视图观察存活率与同变量之间的关系
pd.pivot_table(train_data, index = 'Survived', values = ['Age','SibSp','Parch','Fare'])

对于Age属性,可以推测也许年轻的人有更大的概率生存
对于Fare属性,可以推测也许付钱更多的人有更大的概率生存
对于Parch属性,可以推测也许有父母小孩一同登船的人有更大概率生存
对于SibSp属性,可以推测也许有兄弟姐妹或配偶登船的人生存几率更小

补充:
关于pd.pivot_table 函数:pd.pivot_table(df,index=[“A”,“B”], values=[“C”])
按照index内的变量进行分组,再利用values定义关心的域,透视表默认计算列内数据的平均值
也可以通过(aggfunc= )函数列元素进行计数或求和
pd.pivot_table(df,index=[“A”,“B”], values=[“C”], aggfunc=np.sum)

属性型数据

针对属性型数据( Categorical Data):

  • 观察不同属性的分布情况(bar charts)
  • 运用透视表比较生存率与不同变量之间的关系(pivot table)
df_cat = training[['Survived','Pclass','Sex','Ticket','Cabin','Embarked']]
#可以通过柱状图判断不同属性值的分布情况
for i in df_cat.columns:
    sns.barplot(df_cat[i].value_counts().index,df_cat[i].value_counts()).set_title(i)
    plt.show()

属性分布情况如下:

其中Cabin和Ticket属性值较多,在后期特征工程阶段进行分析
# 用透视图分析三个属性与是否生存之间的关系,此处使用了 aggfunc ='count' 方法
print(pd.pivot_table(train_data, index = 'Survived', columns = 'Pclass', values = 'Ticket' ,aggfunc ='count'))
print()
print(pd.pivot_table(train_data, index = 'Survived', columns = 'Sex', values = 'Ticket' ,aggfunc ='count'))
print()
print(pd.pivot_table(train_data, index = 'Survived', columns = 'Embarked', values = 'Ticket' ,aggfunc ='count'))

可以看出一等舱的乘客生存概率更大,女性生存概率更大,在S处登船的乘客生存概率更大

特征工程

1.对于Cabin属性:可以分析Cabin属性内值的个数(购票数)、Cabin属性的字母值(舱位号)与生存率之间是否有关联

df_cat.Cabin
#分析Cabin内值的个数,0代表Cabin属性为空,1代表有1个值,2代表有2个值
train_data['cabin_multiple'] = train_data.Cabin.apply(lambda x: 0 if pd.isna(x) else len(x.split(' ')))
train_data['cabin_multiple'].value_counts()

结果如下:

0    687
1    180
2     16
3      6
4      2
#运用透视表分析Cabin值的个数与存活率的关系
pd.pivot_table(train_data, index = 'Survived', columns = 'cabin_multiple', values = 'Ticket' ,aggfunc ='count')
#增加cabin_adv属性表示Cabin字母值
train_data['cabin_adv'] = train_data.Cabin.apply(lambda x: str(x)[0])
print(train_data.cabin_adv.value_counts())

结果如下:其中n代表值为null,此处将缺失值(null)作为一类进行进行分析

n    687
C     59
B     47
D     33
E     32
A     15
F     13
G      4
T      1
#利用透视表分析Cabin字母值与存活率的关系
pd.pivot_table(train_data,index='Survived',columns='cabin_adv', values = 'Name'
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,下面是预测泰坦尼克号上的生还情况的Scala代码: 1. 数据探索和清洗 ```scala import org.apache.spark.sql.SparkSession val spark = SparkSession.builder().appName("Titanic").getOrCreate() val df = spark.read.format("csv").option("header", "true").load("titanic_train.csv") df.show() // 查看数据集是否有缺失值 df.na.drop().show() // 清洗数据集 val cleanedDf = df.na.drop().drop("PassengerId", "Name", "Ticket", "Cabin", "Embarked") cleanedDf.show() ``` 2. 特征工程 ```scala import org.apache.spark.ml.feature.StringIndexer import org.apache.spark.ml.feature.VectorAssembler // 对类别型特征进行编码 val genderIndexer = new StringIndexer().setInputCol("Sex").setOutputCol("Gender") val indexedDf = genderIndexer.fit(cleanedDf).transform(cleanedDf) indexedDf.show() // 创建新的特征 val assembler = new VectorAssembler().setInputCols(Array("Pclass", "Age", "SibSp", "Parch", "Fare", "Gender")).setOutputCol("features") val transformedDf = assembler.transform(indexedDf) transformedDf.show() ``` 3. 模型选择和训练 ```scala import org.apache.spark.ml.classification.LogisticRegression // 训练逻辑回归模型 val lr = new LogisticRegression().setLabelCol("Survived").setFeaturesCol("features") val lrModel = lr.fit(transformedDf) lrModel.summary.accuracy ``` 4. 模型评估和优化 ```scala import org.apache.spark.ml.tuning.{CrossValidator, ParamGridBuilder} import org.apache.spark.ml.evaluation.BinaryClassificationEvaluator // 定义超参数网格 val paramGrid = new ParamGridBuilder().addGrid(lr.regParam, Array(0.1, 0.01)).addGrid(lr.elasticNetParam, Array(0.0, 0.5, 1.0)).build() // 定义交叉验证器 val cv = new CrossValidator().setEstimator(lr).setEvaluator(new BinaryClassificationEvaluator).setEstimatorParamMaps(paramGrid).setNumFolds(5) // 进行交叉验证 val cvModel = cv.fit(transformedDf) // 查看最佳模型的评估指标 cvModel.bestModel.summary.accuracy ``` 5. 预测 ```scala val testDf = spark.read.format("csv").option("header", "true").load("titanic_test.csv") testDf.show() // 清洗测试数据集 val cleanedTestDf = testDf.na.drop().drop("PassengerId", "Name", "Ticket", "Cabin", "Embarked") cleanedTestDf.show() // 对测试数据集进行特征工程 val indexedTestDf = genderIndexer.fit(cleanedTestDf).transform(cleanedTestDf) val transformedTestDf = assembler.transform(indexedTestDf) transformedTestDf.show() // 使用已训练好的模型进行预测 val predictions = cvModel.transform(transformedTestDf) predictions.show() ``` 以上就是使用Scala预测泰坦尼克号上的生还情况的代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值