泰坦尼克号——“十年生死两茫茫”

2023-11-21 22:10

本文主要是介绍泰坦尼克号——“十年生死两茫茫”,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

机器学习——泰坦尼克号生死预测案例

引言:学习机器学习已经有一段时间了,在Kaggle里看到一个针对初学者练手的一个案例——关于泰坦尼克号之灾,今天我也拿它来练练手,顺便记录一下。

一、先从Kaggle官网上下载一些数据:
在这里插入图片描述
下载完,我们得到压缩包,挤压后得到3个文件,一个是训练数据集 train.csv,一个是测试数据集test.csv,还有一个是记录乘客Id是否存活的文件gender_submission.csv
这样,我们项目数据已经准备好了。

二、特征提取(对数据分析和清洗)

重要提示:我之前是做开发的,也有很多跟我一样做开发的童鞋,平常拿到的配表之类的文件,都是配好的,拿来可以直接带入到逻辑代码里面使用,但是,机器学习不一样。做机器学习的主要流程:特征提取、建立模型、训练模型和评估模型,其中特征提取,非常关键。我们后面的所有都是在特征提取的基础上来完成的,所有特征提取就显得尤为关键

1、创建一个项目文件夹taitan**,把三个数据文件和**一个代码文件(taitan.py)放在文件夹下,后面的代码我就都写在taitan.py里面了(小项目,不需要多个文件)。在这里插入图片描述
导入我们要做特征提取的一些类库:

import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt

2、首先,我们先分析一下train.csv里的数据

trainData = pd.read_csv("train.csv")
trainData.info()

输出信息:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):#   Column       Non-Null Count  Dtype  
---  ------       --------------  -----  0   PassengerId  891 non-null    int64  1   Survived     891 non-null    int64  2   Pclass       891 non-null    int64  3   Name         891 non-null    object 4   Sex          891 non-null    object 5   Age          714 non-null    float646   SibSp        891 non-null    int64  7   Parch        891 non-null    int64  8   Ticket       891 non-null    object 9   Fare         891 non-null    float6410  Cabin        204 non-null    object 11  Embarked     889 non-null    object 
dtypes: float64(2), int64(5), object(5)
memory usage: 83.7+ KB

从上面输出,我们可以得到一下信息:

a、 除去Survived,因为Survived就是我们要预测的值。这样我们一共有11个特征信息,其他特征重要性后面我们再看。
b、 这里面一共有891条乘客数据,Age 缺少177条;Cabin只有204条,缺少较多;Embarked只缺少2条。

3、我们逐条看看 各个特征 和 Survived 之间的关系

aPassengerId:乘客的编号,这个特征信息应该与Survived之间的关系不大

Name(名字先不看)它有点特殊
bPclass:社会等级,先看看Pclass里的数据

print(trainData['Pclass'])
0      3
1      1
2      3
3      1
4      3..
886    2
887    1
888    3
889    1
890    3
Name: Pclass, Length: 891, dtype: int64

Pclass都是一些int型的数据,数值都是{1,2,3}。
我们来看看PclassSurvived之间的关系:

pclass = trainData['Pclass'].groupby(trainData['Survived'])
print(pclass.value_counts().unstack())

输出数据:

Pclass      1   2    3
Survived              
0          80  97  372
1         136  87  119
pclass = trainData['Pclass'].groupby(trainData['Survived'])
pclass.value_counts().unstack().plot(kind='bar')
plt.show()

在这里插入图片描述
Pcalss = 1时候,存活的人数 > 死亡的人数;
Pcalss = 2时候,存活的人数 和 死亡的人数 几乎一样;
Pcalss = 3时候,存活的人数 < 死亡的人数;
看来,PcalssSurvived有关系,估计有钱的人,在船舱的位置比较好,环境里面人员少,比较好逃生。

c、Sex:性别,跟Pclass一样,直接看数据和图

pclass = trainData['Sex'].groupby(trainData['Survived'])
print(pclass.value_counts().unstack())

输出数据:

Sex       female  male
Survived              
0             81   468
1            233   109
pclass = trainData['Sex'].groupby(trainData['Survived'])
pclass.value_counts().unstack().plot(kind='bar')
plt.show()

在这里插入图片描述
图和数据结合发现:死亡中,女的少,男的多;存活中,女的多,男的少;而且差异非常大。说明性别对获救的影响非常高。
这让我想起一句话:让妇女和儿童先走!
Sex:它不是一个数值,做机器学习,是对数据进行分析,因此,这里把Sex用one-hot编码处理,新建2个列(”Sex_female“,“Sex_male”)。Sex_female=1,Sex_male=0 代表女性;Sex_female=0,Sex_male=1代表男性,并加入到原来的数据集里。

代码如下:

dummies_Sex = pd.get_dummies(trainData['Sex'], prefix= 'Sex').astype("int64")
trainData = pd.concat([trainData,dummies_Sex],axis=1)#整合到原来数据**trainData**里面
trainData.info()

输入:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 14 columns):#   Column       Non-Null Count  Dtype  
---  ------       --------------  -----  0   PassengerId  891 non-null    int64  1   Survived     891 non-null    int64  2   Pclass       891 non-null    int64  3   Name         891 non-null    object 4   Sex          891 non-null    object 5   Age          714 non-null    float646   SibSp        891 non-null    int64  7   Parch        891 non-null    int64  8   Ticket       891 non-null    object 9   Fare         891 non-null    float6410  Cabin        204 non-null    object 11  Embarked     889 non-null    object 12  Sex_female   891 non-null    int64  13  Sex_male     891 non-null    int64  
dtypes: float64(2), int64(7), object(5)
memory usage: 97.6+ KB

## (本来这边要分析Age(年龄)的,但是Age有缺损,放在后面)

d、SibSp和Parch:这两个分别是 直系亲友 和 旁系亲友
先来看看 SibSpSurvived

pclass = trainData['SibSp'].groupby(trainData['Survived'])
print(pclass.value_counts().unstack())

输入:

SibSp         0      1     2     3     4    5    8
Survived                                          
0         398.0   97.0  15.0  12.0  15.0  5.0  7.0
1         210.0  112.0  13.0   4.0   3.0  NaN  NaN
pclass = trainData['SibSp'].groupby(trainData['Survived'])
pclass.value_counts().unstack().plot(kind='bar')
plt.show()

在这里插入图片描述
直系亲友越多,存活率越高。

我们再看看 ParchSurvived

pclass = trainData['Parch'].groupby(trainData['Survived'])
print(pclass.value_counts().unstack())

输入:

Parch         0     1     2    3    4    5    6
Survived                                       
0         445.0  53.0  40.0  2.0  4.0  4.0  1.0
1         233.0  65.0  40.0  3.0  NaN  1.0  NaN
pclass = trainData['Parch'].groupby(trainData['Survived'])
pclass.value_counts().unstack().plot(kind='bar')
plt.show()

在这里插入图片描述
旁系亲友越多,存活率越高。

我们把这ParchSibSp两列的值合并,生成一个s_p特征(当然自己也要加上),看看:

trainData["s_p"] = trainData["SibSp"] + trainData["Parch"]+1#都是没有缺损值的int64类型数据,不需要其他处理
trainData.info()

输出

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 15 columns):#   Column       Non-Null Count  Dtype  
---  ------       --------------  -----  0   PassengerId  891 non-null    int64  1   Survived     891 non-null    int64  2   Pclass       891 non-null    int64  3   Name         891 non-null    object 4   Sex          891 non-null    object 5   Age          714 non-null    float646   SibSp        891 non-null    int64  7   Parch        891 non-null    int64  8   Ticket       891 non-null    object 9   Fare         891 non-null    float6410  Cabin        204 non-null    object 11  Embarked     889 non-null    object 12  Sex_female   891 non-null    int64  13  Sex_male     891 non-null    int64  14  s_p          891 non-null    int64  
dtypes: float64(2), int64(8), object(5)
memory usage: 104.5+ KB

这时候,来看看s_pSurvived的关系:
在这里插入图片描述
从上面对 Parch 、SibSp和s_p来分析,亲友越多,存活率越高;但是当人数大于4的时候,存活率就下降了。可以想象逃生的时候有多个人一起帮忙,获救率应该会高很多,但是人太多了,如果一个人救1、2个人还好,再继续救人,搞不好会把自己搭上。

e、Embarked:上船时的港口编号:
直接看数据和图:

pclass = trainData['Embarked'].groupby(trainData['Survived'])
print(pclass.value_counts().unstack())

输出:

Embarked   C   Q    S
Survived             
0         75  47  427
1         93  30  217
pclass = trainData['Embarked'].groupby(trainData['Survived'])
pclass.value_counts().unstack().plot(kind='bar')
plt.show()

在这里插入图片描述
从图中发现,C港口存活率是1/2多一些,Q港口存活率略小于1/2,S港口存活率1/3多一些;看来EmbarkedSurvived还是有关系的。
但是Embarked不是数据,我们要把Embarked转换成数据才能训练,和Sex一样,但是首先要把Embarked缺少的2个值补齐。
Pclass(社会地位)、Fare(票价)应该和Embarked(上船时的港口编号),是有联系的。社会地位高,Embarked肯定会好些,下面我们来看看他们三者之间的关系:

print(trainData.groupby(by=["Pclass","Embarked"]).Fare.median())
Pclass  Embarked
1       C           78.2667Q           90.0000S           52.0000
2       C           24.0000Q           12.3500S           13.5000
3       C            7.8958Q            7.7500S            8.0500
Name: Fare, dtype: float64

再看看,2个缺损Embarked乘客的信息:

print(trainData[pd.isna(trainData["Embarked"])])
     PassengerId  Survived  Pclass  ... Embarked_C Embarked_Q  Embarked_S
61            62         1       1  ...          0          0           0
829          830         1       1  ...          0          0           0[2 rows x 18 columns]

由于2人的Pclass都是1,并且2人的Fare都是80,结合上面Pclass(社会地位)、Fare(票价)应该和Embarked(上船时的港口编号)的关系数据,我们可以把这2个人缺损的Embarked都用C来代替。

trainData['Embarked'] = trainData['Embarked'].fillna('C')
trainData.info()

输出:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 15 columns):#   Column       Non-Null Count  Dtype  
---  ------       --------------  -----  0   PassengerId  891 non-null    int64  1   Survived     891 non-null    int64  2   Pclass       891 non-null    int64  3   Name         891 non-null    object 4   Sex          891 non-null    object 5   Age          714 non-null    float646   SibSp        891 non-null    int64  7   Parch        891 non-null    int64  8   Ticket       891 non-null    object 9   Fare         891 non-null    float6410  Cabin        204 non-null    object 11  Embarked     891 non-null    object 12  Sex_female   891 non-null    int64  13  Sex_male     891 non-null    int64  14  s_p          891 non-null    int64  
dtypes: float64(2), int64(8), object(5)
memory usage: 104.5+ KB

接着把Embarked进行one-hot编码处理:

dummies_Embarked = pd.get_dummies(trainData['Embarked'], prefix= 'Embarked').astype("int64")
trainData = pd.concat([trainData,dummies_Embarked],axis=1)#整合到原来数据**trainData**里面
trainData.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 18 columns):#   Column       Non-Null Count  Dtype  
---  ------       --------------  -----  0   PassengerId  891 non-null    int64  1   Survived     891 non-null    int64  2   Pclass       891 non-null    int64  3   Name         891 non-null    object 4   Sex          891 non-null    object 5   Age          714 non-null    float646   SibSp        891 non-null    int64  7   Parch        891 non-null    int64  8   Ticket       891 non-null    object 9   Fare         891 non-null    float6410  Cabin        204 non-null    object 11  Embarked     891 non-null    object 12  Sex_female   891 non-null    int64  13  Sex_male     891 non-null    int64  14  s_p          891 non-null    int64  15  Embarked_C   891 non-null    int64  16  Embarked_Q   891 non-null    int64  17  Embarked_S   891 non-null    int64  
dtypes: float64(2), int64(11), object(5)
memory usage: 125.4+ KB

f、Name:名字
一般名字与大部分事物预测没啥联系,但是这里给定特征Name不一样,它带有一些专属特称,如:Mr、Mrs、Master等,具有一定社会地位的标记。我们把这些标记做一个分类:
‘Capt’, ‘Col’, ‘Major’, ‘Dr’, ‘Rev’——>“Officer”
‘Don’, ‘Sir’, ‘the Countess’, ‘Dona’, ‘Lady’——>“Royalty”
‘Mme’, ‘Ms’, ‘Mrs’——>“Mrs”
‘Mlle’, ‘Miss’——>“Miss”
‘Master’,‘Jonkheer’——>“Master”
“Mr”——>‘Mr’

trainData['Name_flag'] = trainData['Name'].apply(lambda x:x.split(',')[1].split('.')[0].strip())
trainData['Name_flag'].replace(['Capt', 'Col', 'Major', 'Dr', 'Rev'],'Officer', inplace=True)
trainData['Name_flag'].replace(['Don', 'Sir', 'the Countess', 'Dona', 'Lady'], 'Royalty', inplace=True)
trainData['Name_flag'].replace(['Mme', 'Ms', 'Mrs'],'Mrs', inplace=True)
trainData['Name_flag'].replace(['Mlle', 'Miss'], 'Miss', inplace=True)
trainData['Name_flag'].replace(['Master','Jonkheer'],'Master', inplace=True)
trainData['Name_flag'].replace(['Mr'], 'Mr', inplace=True)
trainData.info()

输出:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 19 columns):#   Column       Non-Null Count  Dtype  
---  ------       --------------  -----  0   PassengerId  891 non-null    int64  1   Survived     891 non-null    int64  2   Pclass       891 non-null    int64  3   Name         891 non-null    object 4   Sex          891 non-null    object 5   Age          714 non-null    float646   SibSp        891 non-null    int64  7   Parch        891 non-null    int64  8   Ticket       891 non-null    object 9   Fare         891 non-null    float6410  Cabin        204 non-null    object 11  Embarked     891 non-null    object 12  Sex_female   891 non-null    int64  13  Sex_male     891 non-null    int64  14  s_p          891 non-null    int64  15  Embarked_C   891 non-null    int64  16  Embarked_Q   891 non-null    int64  17  Embarked_S   891 non-null    int64  18  Name_flag    891 non-null    object 
dtypes: float64(2), int64(11), object(6)
memory usage: 132.4+ KB

下面我们来看看Name_flagSurvived的相关性:

pclass = trainData['Name_flag'].groupby(trainData['Survived'])
print(pclass.value_counts().unstack())
Name_flag  Master  Miss   Mr  Mrs  Officer  Royalty
Survived                                           
0              18    55  436   26       13        1
1              23   129   81  101        5        3
pclass = trainData['Name_flag'].groupby(trainData['Survived'])
pclass.value_counts().unstack().plot(kind='bar')
plt.show()

在这里插入图片描述
从上面数据我们可以看出,MissMrs存活率比其他的高了很多。
下面我们把Name_flag进行one-hot编码:

dummies_Name = pd.get_dummies(trainData['Name_flag'], prefix= 'Name_flag').astype("int64")
trainData = pd.concat([trainData,dummies_Name],axis=1)#整合到原来数据**trainData**里面
trainData.info()

输出:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 25 columns):#   Column             Non-Null Count  Dtype  
---  ------             --------------  -----  0   PassengerId        891 non-null    int64  1   Survived           891 non-null    int64  2   Pclass             891 non-null    int64  3   Name               891 non-null    object 4   Sex                891 non-null    object 5   Age                714 non-null    float646   SibSp              891 non-null    int64  7   Parch              891 non-null    int64  8   Ticket             891 non-null    object 9   Fare               891 non-null    float6410  Cabin              204 non-null    object 11  Embarked           891 non-null    object 12  Sex_female         891 non-null    int64  13  Sex_male           891 non-null    int64  14  s_p                891 non-null    int64  15  Embarked_C         891 non-null    int64  16  Embarked_Q         891 non-null    int64  17  Embarked_S         891 non-null    int64  18  Name_flag          891 non-null    object 19  Name_flag_Master   891 non-null    int64  20  Name_flag_Miss     891 non-null    int64  21  Name_flag_Mr       891 non-null    int64  22  Name_flag_Mrs      891 non-null    int64  23  Name_flag_Officer  891 non-null    int64  24  Name_flag_Royalty  891 non-null    int64  
dtypes: float64(2), int64(17), object(6)
memory usage: 174.1+ KB

g、Age:年龄
年龄的缺失很大,用众数或者平均数填充是不合理的,因此这里使用随机森林的方法来估测缺损的年龄数据。

from sklearn.ensemble import RandomForestRegressor
train_part = trainData[["Age",'Pclass', 'Sex_female','Sex_male','Name_flag_Master',"Name_flag_Miss","Name_flag_Mr","Name_flag_Mrs","Name_flag_Officer","Name_flag_Royalty"]]
train_part=pd.get_dummies(train_part)
age_has = train_part[train_part.Age.notnull()].values
age_no = train_part[train_part.Age.isnull()].values
y = age_has[:, 0]
X = age_has[:, 1:]
rfr_clf = RandomForestRegressor(random_state=60, n_estimators=100, n_jobs=-1)
rfr_clf.fit(X, y)
result = rfr_clf.predict(age_no[:, 1:])
trainData.loc[ (trainData.Age.isnull()), 'Age' ] = result
trainData.info()

输出:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 25 columns):#   Column             Non-Null Count  Dtype  
---  ------             --------------  -----  0   PassengerId        891 non-null    int64  1   Survived           891 non-null    int64  2   Pclass             891 non-null    int64  3   Name               891 non-null    object 4   Sex                891 non-null    object 5   Age                891 non-null    float646   SibSp              891 non-null    int64  7   Parch              891 non-null    int64  8   Ticket             891 non-null    object 9   Fare               891 non-null    float6410  Cabin              204 non-null    object 11  Embarked           891 non-null    object 12  Sex_female         891 non-null    int64  13  Sex_male           891 non-null    int64  14  s_p                891 non-null    int64  15  Embarked_C         891 non-null    int64  16  Embarked_Q         891 non-null    int64  17  Embarked_S         891 non-null    int64  18  Name_flag          891 non-null    object 19  Name_flag_Master   891 non-null    int64  20  Name_flag_Miss     891 non-null    int64  21  Name_flag_Mr       891 non-null    int64  22  Name_flag_Mrs      891 non-null    int64  23  Name_flag_Officer  891 non-null    int64  24  Name_flag_Royalty  891 non-null    int64  
dtypes: float64(2), int64(17), object(6)
memory usage: 174.1+ KB

这样,缺少的Age信息我们也补全了

h、Cabin这个数据缺损台多了,这里我舍弃了

那么现在,测试数据里面的特征以及清洗、提取了,后面我们要开始训练我们的模型了。

三、训练模型

import pandas as pd
import numpy as np
from sklearn.model_selection import StratifiedKFold
from sklearn.linear_model import SGDClassifier
from sklearn.base import clonetrainData = pd.read_csv("train.csv")dummies_Sex = pd.get_dummies(trainData['Sex'], prefix= 'Sex').astype("int64")
trainData = pd.concat([trainData,dummies_Sex],axis=1)trainData["s_p"] = trainData["SibSp"] + trainData["Parch"]+1trainData['Embarked'] = trainData['Embarked'].fillna('C')dummies_Embarked = pd.get_dummies(trainData['Embarked'], prefix= 'Embarked').astype("int64")
trainData = pd.concat([trainData,dummies_Embarked],axis=1)trainData['Name_flag'] = trainData['Name'].apply(lambda x:x.split(',')[1].split('.')[0].strip())
trainData['Name_flag'].replace(['Capt', 'Col', 'Major', 'Dr', 'Rev'],'Officer', inplace=True)
trainData['Name_flag'].replace(['Don', 'Sir', 'the Countess', 'Dona', 'Lady'], 'Royalty', inplace=True)
trainData['Name_flag'].replace(['Mme', 'Ms', 'Mrs'],'Mrs', inplace=True)
trainData['Name_flag'].replace(['Mlle', 'Miss'], 'Miss', inplace=True)
trainData['Name_flag'].replace(['Master','Jonkheer'],'Master', inplace=True)
trainData['Name_flag'].replace(['Mr'], 'Mr', inplace=True)dummies_Name = pd.get_dummies(trainData['Name_flag'], prefix= 'Name_flag').astype("int64")
trainData = pd.concat([trainData,dummies_Name],axis=1)from sklearn.ensemble import RandomForestRegressor
train_part = trainData[["Age",'Pclass', 'Sex_female','Sex_male','Name_flag_Master',"Name_flag_Miss","Name_flag_Mr","Name_flag_Mrs","Name_flag_Officer","Name_flag_Royalty"]]
train_part=pd.get_dummies(train_part)
age_has = train_part[train_part.Age.notnull()].values
age_no = train_part[train_part.Age.isnull()].values
y = age_has[:, 0]
X = age_has[:, 1:]
rfr_clf = RandomForestRegressor(random_state=60, n_estimators=100, n_jobs=-1)
rfr_clf.fit(X, y)
result = rfr_clf.predict(age_no[:, 1:])
trainData.loc[ (trainData.Age.isnull()), 'Age' ] = resulttrain_Model_data = trainData[["Survived","Age",'Pclass', 'Sex_female','Sex_male','Name_flag_Master',"Name_flag_Miss","Name_flag_Mr","Name_flag_Mrs","Name_flag_Officer","Name_flag_Royalty","s_p","Embarked_C","Embarked_S","Embarked_Q"]].valuesdataLen = len(train_Model_data)train_x = train_Model_data[:,1:]
train_y = train_Model_data[:,0]shuffle_index = np.random.permutation(dataLen)train_x = train_x[shuffle_index]
train_y = train_y[shuffle_index]
skfolds = StratifiedKFold(n_splits=3, random_state=42)sgd_clf = SGDClassifier(loss='log', random_state=42, max_iter=1000, tol=1e-4)for train_index, test_index in skfolds.split(train_x, train_y):clone_clf = clone(sgd_clf)X_train_folds = train_x[train_index]y_train_folds = train_y[train_index]X_test_folds = train_x[test_index]y_test_folds = train_y[test_index]clone_clf.fit(X_train_folds, y_train_folds)y_pred = clone_clf.predict(X_test_folds)print(y_pred)n_correct = sum(y_pred == y_test_folds)print(n_correct / len(y_pred))

输出:

[0. 0. 0. 0. 0. 1. 0. 1. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 1. 0. 0. 1. 0. 0. 0. 1. 0. 0. 0. 0. 0.0. 1. 0. 0. 0. 0. 1. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 1. 0. 0. 0. 1. 0.0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 1. 0. 0. 1. 1. 0. 0. 0. 0. 0. 0.0. 0. 1. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0.1. 0. 1. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 1. 0. 0. 0. 1. 0. 1. 0. 0.0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 1. 0. 0. 0. 0.0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 1. 1. 0. 0. 0.0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0.1. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 1. 0. 1. 1. 0. 0. 0. 0. 0. 1. 1.1. 0. 1. 1. 1. 1. 0. 1. 0.]
0.7676767676767676
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.0. 0. 0. 1. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 1. 1. 0. 0. 0. 0. 1. 1. 0. 1.1. 1. 1. 1. 0. 1. 0. 0. 1. 1. 0. 0. 0. 1. 1. 1. 0. 0. 0. 0. 1. 0. 0. 1.1. 1. 0. 1. 1. 0. 0. 0. 1. 0. 1. 0. 0. 0. 1. 1. 1. 0. 1. 0. 0. 0. 0. 0.0. 0. 0. 0. 1. 0. 0. 1. 1. 0. 1. 0. 1. 1. 1. 1. 0. 1. 1. 0. 0. 0. 0. 0.0. 0. 0. 0. 0. 1. 0. 1. 0. 0. 0. 1. 0. 0. 0. 0. 0. 1. 0. 1. 1. 0. 1. 0.1. 0. 0. 0. 0. 1. 1. 0. 1. 1. 0. 0. 0. 0. 0. 1. 1. 0. 1. 1. 0. 0. 1. 0.0. 1. 0. 0. 0. 1. 0. 0. 0. 1. 0. 1. 1. 0. 1. 0. 1. 0. 0. 1. 0. 0. 0. 1.1. 1. 1. 1. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0.0. 0. 0. 0. 0. 1. 0. 0. 1. 0. 0. 1. 0. 1. 0. 1. 1. 0. 0. 0. 0. 1. 1. 0.1. 0. 0. 0. 1. 1. 0. 0. 1. 0. 0. 0. 0. 1. 1. 0. 1. 0. 0. 0. 0. 0. 0. 1.0. 1. 1. 0. 0. 1. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 1. 0. 0. 1. 1. 1. 1.0. 1. 1. 1. 1. 1. 1. 1. 1.]
0.8249158249158249
[0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 1. 1. 0. 1.0. 1. 0. 0. 1. 1. 1. 0. 1. 0. 0. 0. 0. 1. 1. 0. 0. 0. 0. 1. 1. 0. 0. 0.0. 0. 0. 1. 1. 0. 0. 0. 1. 0. 0. 1. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1.1. 0. 1. 1. 1. 0. 0. 0. 0. 1. 0. 0. 1. 0. 0. 1. 0. 1. 1. 1. 0. 0. 1. 0.1. 1. 0. 0. 0. 0. 0. 1. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 1. 1. 0. 0.0. 0. 1. 0. 1. 0. 0. 0. 0. 1. 1. 1. 1. 0. 0. 1. 0. 1. 0. 1. 0. 1. 0. 0.0. 0. 1. 0. 0. 0. 0. 1. 0. 0. 1. 0. 0. 1. 1. 0. 1. 0. 0. 0. 1. 0. 1. 1.0. 0. 0. 0. 0. 0. 1. 1. 0. 1. 0. 0. 0. 1. 0. 0. 0. 0. 0. 1. 0. 0. 1. 1.0. 0. 1. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 1. 1. 1. 1. 0. 0. 1.0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 1. 0. 1. 0. 0. 1. 0. 0. 1. 0. 0. 1. 0. 0.0. 1. 1. 0. 1. 1. 0. 1. 0. 0. 1. 0. 1. 0. 0. 0. 0. 0. 1. 0. 0. 0. 1. 0.0. 0. 1. 0. 0. 0. 1. 0. 0. 0. 1. 0. 1. 1. 1. 0. 0. 1. 0. 1. 0. 0. 0. 1.1. 0. 0. 0. 1. 0. 1. 0. 0.]
0.8282828282828283

这个模型我没有用 test.csv里的数据测试,仅仅用了train.csv里的数据进行了3折的交叉验证。
最终:我的模型得分为 0.8282828282828283

这篇关于泰坦尼克号——“十年生死两茫茫”的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/405430

相关文章

每个游戏公司的领导都应该看看Supercell的“十年总结”

我知道,你一定会说,Supercell的案例太特殊了。手游出现以来,全世界就只有这么一个Supercell,它的经历、理念和公司架构这些文化,其他公司学不来,不管对中国公司还是海外公司,都没有什么实际借鉴意义。 但Supercell真的有这么“特殊”吗? 比如他们对于留存数据的看重,尤其是测试期留存的看重,和国内——和任何一家常规游戏公司看重留存的态度,都没有什么明显不同。 他们也会试着设立

大数据方向另一个十年开启 |《硬刚系列》第一版完结

《硬刚Presto|Presto原理&调优&面试&实战全面升级版》 《硬刚Apache Iceberg | 技术调研&在各大公司的实践应用大总结》 《硬刚ClickHouse | 4万字长文ClickHouse基础&实践&调优全视角解析》 《硬刚数据仓库|SQL Boy的福音之数据仓库体系建模&实施&注意事项小总结》 《硬刚Hive | 4万字基础调优面试小总结》 《硬刚用户画像(一) | 标

20-30岁,我拿十年做什么!

20-30岁,我拿十年做什么! 一:这10年,一定要有自己的方向   1、没有方向感,是最要命的   2、不管起点有多低,都要坦然接受   3、围绕自己的兴趣爱好选择职业   4、做自己最擅长的事   5、从最容易实现的目标开始做起 二:这10年,要做哪些准备?   1、要过语言关   2、要有一样看家本领   3、掌握工作的全部   4、把知识变成能力   5、向成功的人学习

【HDU】2242 考研路茫茫——空调教室 双连通分量+树型DP

考研路茫茫——空调教室 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1978    Accepted Submission(s): 576 Problem Description 众所周知,HDU的考研教室是没

阿里十年架构师用一张图告诉你什么是系统架构师

阿里十年架构师用一张图告诉你什么是系统架构师 Java架构解析 2018-11-03 20:54:41 这张图从架构师的综合能力、岗位认识、岗位职责等方面,清楚的画出了作为一个架构的基本准则。人人都想成为架构师,可作为架构你达到了图上面的要求了吗?   系统架构师是个神奇的岗位。为什么这么说,在一个人数不多的小公司,你可能什么都需要做,身体力行,做总监兼架构师或者是主管/高级开发兼架构

一名工作十年的高级Java程序员总结出成为技术大牛所需要的知识

一名工作十年的高级Java程序员总结出成为技术大牛所需要的知识 互联网Java架构 2018-11-16 21:22:36 每个人都有大梦想,作为程序员当然是想做一个程序大牛,毕竟不想当将军的厨子不是好裁缝!那么要想成为好裁缝,不好程序员,应该需要哪些知识呢?小编搜罗了一下,还真不少呢!吓死宝宝了! maven的使用 maven的使用入门 maven私服的搭建及部署 maven坐标分析

大卫谈学习4:为何你会一年经验用十年?

转自:http://davidzhang33.blog.51cto.com/3095817/1313940/ 引子 哈德良皇帝手下有一名将军觉得自己应该被提升。“我应该晋升到更重要的岗位,因为我经验丰富,至少参加了十场重要战役。”可皇帝是位对他人才华有着高明判断力的君主,他并不这样认为。于是他随意指着绑在周围的战驴说:“亲爱的将军,好好看看这些驴子,它们至少参加过20次战役,可它

将军百战死,程序十年成

将军百战死,程序十年成 十年前的 2014.8.3 我释出了动词算子式通用代码生成器的第一个完整版本 InfinityGPGenerator 0.6.5,即无垠式通用代码生成器 0.6.5。这是一个重大的里程碑。十年后,通用代码生成器已经是一个大家族。昨天,释出了 Golang 通用代码生成器仙童 2.4.0 电音仙女尝鲜版九。此版本支持完善的数据库自动反射功能。大大完善了数据与元数据编辑器功能

未来十年美业发展方向:健康与美容的结合|美业SaaS系统收银系统源码

随着人们对健康和美容的重视不断增加,美业正在经历一场革命性的变革。未来,美业的发展将更加注重健康与美容的结合,这一趋势将在多个领域产生深远影响。 下面博弈美业为大家阐释「为什么未来美业的发展方向是健康和美容的结合」: ▶ 健康意识的崛起 近年来,全球范围内对健康生活方式和自然美容产品的需求不断增长。消费者对化学成分少、对皮肤温和的产品日益青睐。健康饮食、运动和精神健康已经成为当今社会

何新生的英语史(二)—学习了十年英语,大部分学生还不能说英语?

为什么学了十年英语,大部分学生还不能说英语?                                语言本来是世界上最简单的事情,我奶奶能讲一口流利的南方客家话,我爷爷从来 没有上过学,能讲一口流利的普通话,北京很多老爷爷奶奶也是如此,因为之前穷,没 有机会上学,但是土生土长在北京,照样讲一口漂亮的中文,但是我们学习英语时被分 解成语法、听力