专栏首页Michael阿明学习之路泰坦尼克号生存预测入门

泰坦尼克号生存预测入门

本文作为学习记录,参考此处,如有侵权,联系删除。

1. 数据预览

import pandas as pd
import numpy as np
from pandas import Series, DataFrame
data_train = pd.read_csv("titanic_train.csv")
data_test = pd.read_csv("titanic_test.csv")
# 读取前10行
data_train.head(10)
data_train.info()
--------------------------------
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):
PassengerId    891 non-null int64
Survived       891 non-null int64
Pclass         891 non-null int64
Name           891 non-null object
Sex            891 non-null object
Age            714 non-null float64
SibSp          891 non-null int64
Parch          891 non-null int64
Ticket         891 non-null object
Fare           891 non-null float64
Cabin          204 non-null object	# 有的原始信息缺失
Embarked       889 non-null object
dtypes: float64(2), int64(5), object(5)
memory usage: 83.7+ KB
data_test.describe() # 可见一些统计信息

2. 特征初步选择

  • 由于Cabin客舱号大部分都缺失,进行填补,可能会造成较大误差,不选
  • 乘客id,是个连续数据,跟是否存活应该无关,不选
  • 年龄Age,是个比较重要的特征,对缺失的部分用中位数进行填充
data_train["Age"] = data_train["Age"].fillna(data_train["Age"].median())
  • 初步调用一些模型(默认参数)进行预测:
  • algs = [Perceptron(),KNeighborsClassifier(),GaussianNB(),DecisionTreeClassifier(), LinearRegression(),LogisticRegression(),SVC(),RandomForestClassifier()]
from sklearn.linear_model import Perceptron
from sklearn.neighbors import KNeighborsClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.tree import DecisionTreeClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.ensemble import RandomForestClassifier # boost
from sklearn.model_selection import KFold # 交叉验证
features = ["Pclass","Age","SibSp","Parch","Fare"]
algs = [Perceptron(),KNeighborsClassifier(),GaussianNB(),DecisionTreeClassifier(),
        LinearRegression(),LogisticRegression(),SVC(),RandomForestClassifier()]
for alg in algs:
    kf = KFold(n_splits=5,shuffle=True,random_state=1)
    predictions = []
    for train, test in kf.split(data_train):
        train_features = (data_train[features].iloc[train,:])
        train_label = data_train["Survived"].iloc[train]
        alg.fit(train_features,train_label)
        test_predictions = alg.predict(data_train[features].iloc[test,:])
        predictions.append(test_predictions)
    predictions = np.concatenate(predictions,axis=0) # 合并3组数据
    predictions[predictions>0.5] = 1
    predictions[predictions<=0.5] = 0
    accuracy = sum(predictions == data_train["Survived"])/len(predictions)
    print("模型准确率:", accuracy)

交叉验证的参数 shuffle = True,打乱数据

模型准确率: 0.531986531986532
模型准确率: 0.5488215488215489
模型准确率: 0.5566778900112234
模型准确率: 0.5353535353535354
模型准确率: 0.5712682379349046
模型准确率: 0.569023569023569
模型准确率: 0.5712682379349046
模型准确率: 0.5364758698092031

交叉验证参数 shuffle = False,正确率就提高了,why ???求解答

模型准确率: 0.5679012345679012
模型准确率: 0.6644219977553311
模型准确率: 0.6745230078563412
模型准确率: 0.632996632996633
模型准确率: 0.6947250280583613
模型准确率: 0.6980920314253648
模型准确率: 0.6644219977553311
模型准确率: 0.6846240179573513

3. 增加特征SexEmbarked

  • 上面效果不好,增加一些特征
  • 增加特征SexEmbarked,查看对预测的影响
  • 这两个特征为字符串,需要转成数字
print(pd.value_counts(data_train.loc[:,"Embarked"]))
----------------------
S    644
C    168
Q     77
Name: Embarked, dtype: int64
# sex转成数字
data_train.loc[data_train["Sex"]=="male","Sex"] = 0
data_train.loc[data_train["Sex"]=="female","Sex"] = 1
# 登船地点,缺失的用最多的S进行填充
data_train["Embarked"] = data_train["Embarked"].fillna('S') 
data_train.loc[data_train["Embarked"]=="S", "Embarked"]=0
data_train.loc[data_train["Embarked"]=="C", "Embarked"]=1
data_train.loc[data_train["Embarked"]=="Q", "Embarked"]=2
features = ["Pclass","Age","SibSp","Parch","Fare","Embarked","Sex"]

交叉验证的参数 shuffle = True,正确率依然很低,再次提问,why ???

模型准确率: 0.5521885521885522
模型准确率: 0.5432098765432098
模型准确率: 0.5185185185185185
模型准确率: 0.5286195286195287
模型准确率: 0.5230078563411896
模型准确率: 0.5252525252525253
模型准确率: 0.5723905723905723
模型准确率: 0.5196408529741863

交叉验证参数 shuffle = False,正确率相比于上面缺少特征SexEmbarked时,提高了不少,好的特征对预测结果提升很有帮助

模型准确率: 0.675645342312009
模型准确率: 0.691358024691358
模型准确率: 0.7856341189674523
模型准确率: 0.7822671156004489
模型准确率: 0.7878787878787878
模型准确率: 0.792368125701459
模型准确率: 0.6655443322109988
模型准确率: 0.8058361391694725

4. 选择随机森林调参

从上面可以看出随机森林模型的预测效果最好,使用该模型,进行调参

features = ["Pclass","Age","SibSp","Parch","Fare","Embarked","Sex"]
estimator_num = [5,10,15,20,25,30]
splits_num = [3,5,10,15]
for e_n in estimator_num:
    for sp_n in splits_num:
        alg = RandomForestClassifier(n_estimators=e_n)
        kf = KFold(n_splits=sp_n,shuffle=False,random_state=1)
        predictions_train = []
        for train, test in kf.split(data_train):
            train_features = (data_train[features].iloc[train,:])
            train_label = data_train["Survived"].iloc[train]
            alg.fit(train_features,train_label)
            train_pred = alg.predict(data_train[features].iloc[test,:])
            predictions_train.append(train_pred)
        predictions_train = np.concatenate(predictions_train,axis=0) # 合并3组数据
        predictions_train[predictions_train>0.5] = 1
        predictions_train[predictions_train<=0.5] = 0
        accuracy = sum(predictions_train == data_train["Survived"])/len(predictions_train)
        print("%d折数据集,%d棵决策树,模型准确率:%.4f" %(sp_n,e_n,accuracy))
3折数据集,5棵决策树,模型准确率:0.7890
5折数据集,5棵决策树,模型准确率:0.7901
10折数据集,5棵决策树,模型准确率:0.7935
15折数据集,5棵决策树,模型准确率:0.8092
3折数据集,10棵决策树,模型准确率:0.7890
5折数据集,10棵决策树,模型准确率:0.8047
10折数据集,10棵决策树,模型准确率:0.8137
15折数据集,10棵决策树,模型准确率:0.8092
3折数据集,15棵决策树,模型准确率:0.7868
5折数据集,15棵决策树,模型准确率:0.8002
10折数据集,15棵决策树,模型准确率:0.8092
15折数据集,15棵决策树,模型准确率:0.8047
3折数据集,20棵决策树,模型准确率:0.7969
5折数据集,20棵决策树,模型准确率:0.8092
10折数据集,20棵决策树,模型准确率:0.8114
15折数据集,20棵决策树,模型准确率:0.8092
3折数据集,25棵决策树,模型准确率:0.7924
5折数据集,25棵决策树,模型准确率:0.8070
10折数据集,25棵决策树,模型准确率:0.8103
15折数据集,25棵决策树,模型准确率:0.8025
3折数据集,30棵决策树,模型准确率:0.7890
5折数据集,30棵决策树,模型准确率:0.8013
10折数据集,30棵决策树,模型准确率:0.8081
15折数据集,30棵决策树,模型准确率:0.8193

最后一种参数下,随机森林模型的预测效果最好

5. 实践总结

熟悉了机器学习的基本流程

  • 导入工具包 numpy, pandas, sklearn等
  • 数据读取,pandas.read_csv(file)
  • pandas的一些数据处理 data.head(n) 读取前n行展示 data.info() 获取数据的信息 data.describe() 获取统计信息(均值、方差等) data["Age"] = data["Age"].fillna(data["Age"].median()) 缺失数据填补(均值、最大值、根据别的特征分段填充等) 性别等字符串特征数字化
  • 选取特征,初步预测
  • 不断的加入新的特征预测
  • 选定较好的模型,再调整这些模型的参数,选出最好的模型参数

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 预测分析 · 员工满意度预测

    可以看出 上一次的评分、有没有工伤、过去5年有没有晋升 跟 满意度 呈正相关系数

    Michael阿明
  • 基于sklearn的LogisticRegression二分类实践

    本文使用sklearn的逻辑斯谛回归模型,进行二分类预测,并通过调整各种参数,对预测结果进行对比。

    Michael阿明
  • 程序员面试金典 - 面试题 05.02. 二进制数转字符串(浮点型 转 二进制小数,乘2取整)

    二进制数转字符串。给定一个介于0和1之间的实数(如0.72),类型为double,打印它的二进制表达式。

    Michael阿明
  • 模型|利用Python语言做逻辑回归算法

    问题是这些预测对于分类来说是不合理的,因为真实的概率必然在0到1之间。为了避免这个问题,我们必须使用一个函数对p(X)建模,该函数为X的所有值提供0到1之间的输...

    陆勤_数据人网
  • 【机器学习】--模型评估指标之混淆矩阵,ROC曲线和AUC面积

    实际上非常简单,精确率是针对我们预测结果而言的,它表示的是预测为正的样本中有多少是真正的正样本。那么预测为正就有两种可能了,一种就是把正类预测为正类(TP),另...

    LhWorld哥陪你聊算法
  • 如何提高FPGA工作频率?影响FPGA运行速度的几大因素

    对于设计者来说,当然希望我们设计的电路的工作频率(在这里如无特别说明,工作频率指FPGA片内的工作频率)尽量高。我们也经常听说用资源换速度,用流水的方式可以提高...

    数字芯片社区
  • java:自动搜索不同位置的properties文件并加载

    版权声明:本文为博主原创文章,转载请注明源地址。 https://blog.csdn.net...

    用户1148648
  • 基于PyTorch的分类和时间序列预测小例子

    最近确实太忙了,没能很好的写这个系列的文章,但是大家不要急,好事多磨,我要保证每一篇的质量。

    深度学习与交通大数据
  • 5G时代,电信运营商如何打造云网一体新生态

    随着5G时代的到来,运营商纷纷进入了数字化转型的关键阶段,在SDN/NFV技术的驱动下,电信运营商开始依托云网一体化服务推动自身网络资源的优化升级,为自己创造更...

    CloudBest
  • 【CentOS】配置网络yum源遇到的问题之解决办法

    我配置的是yum源是:wget http://mirrors.sohu.com/help/CentOS-Base-sohu.repo

    BigYoung小站

扫码关注云+社区

领取腾讯云代金券