经典泰坦尼克数据集生存率预测

今天发现投的实习都gg了,正式开始学机器学习啦。
之前coursera的吴恩达其实学过的,python基础也有的,所以直接开始搞项目。kaggle登不上去,打算从天池和科赛开始模仿起。
第一个项目,泰坦尼克号生存率预测,三种算法:
1、线性回归
2、逻辑回归
3、随机森林

【数据预处理】

import pandas as pd
import numpy as np

path1='D:/data_analysis/jupyter_notebook/machine_learning/dataset//titannic/test.xls'
path2='D:/data_analysis/jupyter_notebook/machine_learning/dataset//titannic/train.xls'
data_train=pd.read_csv(path2)
data_test=pd.read_csv(path1)
data_train

在这里插入图片描述

data_test

在这里插入图片描述

'''数据空值处理
--客舱号Cabin列由于存在大量的空值,如果直接对空值进行填空,带来的误差影响会比较大,先不选用Cabin列做特征
--年龄列对于是否能够存活的判断很重要,采用Age均值对空值进行填充
--PassengerId是一个连续的序列,对于是否能够存活的判断无关,不选用PassengerId作为特征
'''
data_train['Age']=data_train['Age'].fillna(data_train['Age'].median())
#用年龄的中位数填充年龄空值
data_train.describe()

在这里插入图片描述

【线性回归】

#线性回归算法,
#没有用到验证集
from sklearn.linear_model import LinearRegression#线性回归
from sklearn.model_selection import KFold#训练集交叉验证,得到平均值
#选取简单的可用输入特征
predictors=['Pclass','Age','SibSp','Parch','Fare']
#初始化线性回归算法
alg=LinearRegression()
kf=KFold(n_splits=3,shuffle=False,random_state=1)#数据分成3份,交叉验证
predictions=[]#存放所有结果
for train,test in kf.split(data_train):#生成3个元组,for循环迭代这三个元组,得到train和test的索引
    train_predictors=data_train[predictors].iloc[train,:]#根据五个特征选取当前训练集数据数据
    train_target=data_train['Survived'].iloc[train]#训练目标是存活与否
    alg.fit(train_predictors,train_target)#用线性回归算法训练数据
    test_predictions=alg.predict(data_train[predictors].iloc[test,:])#预测测试集数据
    predictions.append(test_predictions)

k-交叉验证KFold
X是一个9*3的矩阵,即9个样本,3个特征,y是一个9维列向量,即9个标签。现在我要进行3折交叉验证。
执行kFold = KFold(n_splits=3) :其中KFold是一个类,n_split=3表示,当执行KFold的split函数后,数据集被分成三份,两份训练集和一份验证集。
执行index = kFold.split(X=X):index是一个生成器,每个元素是一个元组,元组里面有两个元素,第一个是训练集的索引,第二个是验证集的索引。因为这里将9个样本分成三份,所以index中有三个这样的元组
之后便可以迭代index来获得训练集和验证集的索引,从而获得训练集和测试集了。

#检查预测的准确性
import numpy as np
predictions=np.concatenate(predictions)#使用concatenate完成多个数组的拼接
predictions[predictions>.5]=1
predictions[predictions<=.5]=0
accuracy=sum(predictions==data_train['Survived'])/len(predictions)
print('准确率为:',accuracy)#0.7037037037037037

【逻辑回归】

from sklearn import model_selection
from sklearn.linear_model import LogisticRegression
#初始化逻辑回归
LogRegAlg=LogisticRegression(random_state=1)
re=LogRegAlg.fit(data_train[predictors],data_train['Survived'])
#使用sklearn库里的交叉验证函数获取预测准确率分数
scores=model_selection.cross_val_score(LogRegAlg,data_train[predictors],data_train['Survived'],cv=3)
print(scores.mean())#0.7003367003367004

讨论一下random_state参数:
(在随机森林中更显著)
在需要设置random_state的地方给其赋一个值,当多次运行此段代码能够得到完全一样的结果,别人运行此代码也可以复现你的过程。若不设置此参数则会随机选择一个种子,执行结果也会因此而不同了。虽然可以对random_state进行调参,但是调参后在训练集上表现好的模型未必在陌生训练集上表现好,所以一般会随便选取一个random_state的值作为参数。

#增加特征Sex和Embarked列,查看对预测的影响
#sex处理:male=0,female=1
data_train.loc[data_train['Sex']=='male','Sex']=0
data_train.loc[data_train['Sex']=='female','Sex']=1
#Embarked缺失值用最多的‘S’进行填充
data_train['Embarked']=data_train['Embarked'].fillna('S')
#Embarked处理:用0,1,2
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
#增加2个特征sex和embarked
predictors=['Pclass','Sex','Age','SibSp','Parch','Fare','Embarked']
#初始化逻辑回归
LogRegAlg=LogisticRegression(random_state=1)
re=LogRegAlg.fit(data_train[predictors],data_train['Survived'])
#使用sklearn库里的交叉验证函数获取预测准确率分数
scores=model_selection.cross_val_score(LogRegAlg,data_train[predictors],data_train['Survived'],cv=3)
print(scores.mean())#0.7957351290684623

增加了sex和embarked两个参数后,准确率从70%到79%,显著升高。

以上都是基于训练集,接下来对测试集进行预测。

#新增:对测试集数据进行预处理,并进行结果预测
#age列缺失值用age均值填充,fare用最大值,sex用0,1,embarked用0,1,2
data_test.describe()
data_test['Age']=data_test['Age'].fillna(data_test['Age'].median())
data_test['Fare']=data_test['Fare'].fillna(data_test['Fare'].max())
data_test.loc[data_test['Sex']=='male','Sex']=0
data_test.loc[data_test['Sex']=='female','Sex']=1
data_test['Embarked']=data_test['Embarked'].fillna('S')
data_test.loc[data_test['Embarked']=='S','Embarked']=0
data_test.loc[data_test['Embarked']=='C','Embarked']=1
data_test.loc[data_test['Embarked']=='Q','Embarked']=2
test_features=['Pclass','Sex','Age','SibSp','Parch','Fare','Embarked']
#构造测试集的survived列
data_test['Survived']=-1
test_predictors=data_test[test_features]
data_test['Survived']=LogRegAlg.predict(test_predictors)
data_test

在这里插入图片描述

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值