泰坦尼克号乘客存活预测详细笔记

说明

因为自己当前在学习机器学习,而且是第一次练习kaggle上的习题,所以花费了不少的精力做了详细的笔记,每一步都有详细的结果和图像展示。但笔记是用Jupyter Notebook写的,所以没法写在博客上。目前已经上传到GitHub上,可以直接查看,欢迎给出意见。

Github笔记地址https://github.com/312885991/ai/blob/main/%E6%B3%B0%E5%9D%A6%E5%B0%BC%E5%85%8B%E5%8F%B7%E9%A2%84%E6%B5%8B.ipynb

数据集

泰坦尼克号乘客存活数据集在kaggle上,可以自行去官网下载。
这里给出下载地址:https://www.kaggle.com/c/titanic

import copy

import torch
import torch.nn as nn
import numpy as np
import pandas as pd
TRAIN_PATH = "./titanic/train.csv"
TEST_PATH = "./titanic/test.csv"
SAMPLE_SUBMISSION_PATH = "./titanic/gender_submission.csv"
SUBMISSION_PATH = "submission.csv"
import os
from matplotlib import pyplot as plt
%matplotlib inline
ID = 'PassengerId'
TARGET = 'Survived'

train_data = pd.read_csv(TRAIN_PATH)

一、查看文件中的数据,进行数据分析

train_data.head(3)

PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS1211Cumings, Mrs. John Bradley (Florence Briggs Th…female38.010PC 1759971.2833C85C2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS

train_data.info()
<class 'pandas.core.frame.dataframe'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):
 #   Column       Non-Null Count  Dtype
 0   Survived  891 non-null    int64
 1   Pclass    891 non-null    int64
 2   Sex       891 non-null    object
 3   Age       714 non-null    float64
 4   SibSp     891 non-null    int64
 5   Parch     891 non-null    int64
 6   Fare      891 non-null    float64
 7   Cabin     204 non-null    object
 8   Embarked  889 non-null    object
dtypes: float64(2), int64(4), object(3)
memory usage: 62.8+ KB
</class>

Survived(存活基本情况)


total_survived_num = train_data['Survived'].sum()
total_no_survived_num = 891 - total_survived_num
print(f"生还者总共{total_survived_num}人,死亡者总共{total_no_survived_num}人")
&#x751F;&#x8FD8;&#x8005;&#x603B;&#x5171;342&#x4EBA;&#xFF0C;&#x6B7B;&#x4EA1;&#x8005;&#x603B;&#x5171;549&#x4EBA;
plt.figure(figsize=(12, 6))

plt.subplot(1,2, 1)
plt.bar([1, 0], [total_survived_num, total_no_survived_num], width=0.5)
plt.xticks(ticks=[0, 1])
plt.title('Survival Count')
plt.xlabel('Survived')
plt.ylabel('Count')

plt.subplot(1, 2, 2)
plt.pie([total_survived_num, total_no_survived_num],
        labels=['Survived', 'No Survived'], autopct="%.1f%%")
plt.title('Survival Rate')
plt.show()

泰坦尼克号乘客存活预测详细笔记

这891名乘客中,生还和未生还的比例分别为38.4%和61.6%。

下面,分别分析 Pclass、Sex、Age、SibSp、Parch、Fare、Cabin 和 Embarked 等与”生还”的关系

Pclass(客舱等级)

不同级别客舱的人数和比例

x = train_data[['Pclass', 'Survived']].groupby(['Pclass']).count()
x

SurvivedPclass121621843491

可以看到,其中客舱等级分为1、2、3,分别有216人,184人,491人

plt.figure(figsize=(12, 5))

plt.subplot(1, 2, 1)
plt.bar([1, 2, 3], x['Survived'], width=0.5)
plt.title('Pclass Person Count')
plt.xlabel('Pclass')
plt.ylabel('Count')

plt.subplot(1, 2, 2)
plt.pie(x['Survived'], labels=[1, 2, 3], autopct='%.1f%%')
plt.title('Pclass Person Rate')
plt.show()


泰坦尼克号乘客存活预测详细笔记

海难发生前,一等舱、二等舱、三等舱的乘客分别为216、184、491人,分别占总人数的 24.2%, 20.7%, 55.1%

不同级别客舱生还人数

x = train_data[train_data['Survived'] == 1]
x = x[['Pclass', 'Survived']].groupby('Pclass').count()
x

SurvivedPclass11362873119

plt.figure(figsize=(12, 5))

plt.subplot(1, 2, 1)
plt.bar([1, 2, 3], x['Survived'], width=0.5)
plt.title('Pclass Person Count')
plt.xlabel('Pclass')
plt.ylabel('Count')

plt.subplot(1, 2, 2)
plt.pie(x['Survived'], labels=[1, 2, 3], autopct='%.1f%%')
plt.title('Pclass Person Rate')
plt.show()


泰坦尼克号乘客存活预测详细笔记

海难发生前,一等舱、二等舱、三等舱的乘客分别为216、184、491人,分别占总人数的 24.2%, 20.7%, 55.1%
海难发生后,一等舱、二等舱、三等舱的乘客分别为136、87、119人,分别占总人数的 39.8%, 25.4%, 34.8%
一等舱生还率为 63%,二等舱为 47%,三等舱为 24%。可见客舱等级越高,生还率越高。

Sex(性别)

不同性别人数比例及生还率

x = train_data[['Sex', 'Survived']].groupby('Sex').count()
x

SurvivedSexfemale314male577

x = train_data[train_data['Survived'] == 1]
x = x[['Sex', 'Survived']].groupby('Sex').count()
x

SurvivedSexfemale233male109

海难发生前,男有577人,女有314人,海难发生后,存活的男有109人,存活的女有233人

male_survived_rate = 109 / 577
female_survived_rate = 233 / 314
print("男生存活率:%.1f%%,女生存活率:%.1f%%" %(male_survived_rate*100, female_survived_rate*100))
&#x7537;&#x751F;&#x5B58;&#x6D3B;&#x7387;&#xFF1A;18.9%&#xFF0C;&#x5973;&#x751F;&#x5B58;&#x6D3B;&#x7387;&#xFF1A;74.2%

Age(年龄)

不同年龄比例及生还率

由于Age是有缺失值的,所以先处理缺失值问题。填充的年龄为年龄平均值。


nan_age_count = train_data['Age'].isnull().sum()
print(f"缺少的年龄数:{nan_age_count}")

avg_age = train_data['Age'].mean()
print(f"年龄平均值:{avg_age}")

train_data['Age'] = train_data['Age'].fillna(avg_age)
&#x7F3A;&#x5C11;&#x7684;&#x5E74;&#x9F84;&#x6570;&#xFF1A;177
&#x5E74;&#x9F84;&#x5E73;&#x5747;&#x503C;&#xFF1A;29.69911764705882
train_data['Age'].describe()
count    891.000000
mean      29.699118
std       13.002015
min        0.420000
25%       22.000000
50%       29.699118
75%       35.000000
max       80.000000
Name: Age, dtype: float64

此时年龄不缺了,可以查看年龄分布

plt.figure(figsize=(12, 5))

plt.subplot(1, 2, 1)
train_data['Age'].hist(bins = 70)
plt.xlabel('Age')
plt.ylabel('Num')

plt.subplot(1, 2, 2)
train_data.boxplot(column='Age', showfliers=False)
plt.show()


泰坦尼克号乘客存活预测详细笔记

样本的891人中,平均年龄约为30岁,标准差为13岁,最小年龄0.42岁,最大年龄80岁

按照年龄,将乘客划分为儿童,少年,成年人,老年人,分析四个群体的生还情况

children_df = train_data[train_data['Age']  12]
juvenile_df = train_data[(train_data['Age'] > 12) & (train_data['Age'] < 18)]
adults_df = train_data[(train_data['Age'] >= 18) & (train_data['Age'] < 65)]
agedness_df = train_data[train_data['Age'] >= 65]

children_count = children_df['Survived'].count()

juvenile_count = juvenile_df['Survived'].count()

adults_count = adults_df['Survived'].count()

agedness_count = agedness_df['Survived'].count()
children_count, juvenile_count, adults_count, agedness_count
(69, 44, 767, 11)

children_survived_count = children_df['Survived'].sum()

juvenile_survived_count = juvenile_df['Survived'].sum()

adults_survived_count = adults_df['Survived'].sum()

agedness_survived_count = agedness_df['Survived'].sum()
children_survived_count, juvenile_survived_count, adults_survived_count, agedness_survived_count
(40, 21, 280, 1)
children_survived_rate = 40 / 69
juvenile_survived_rate = 21 / 44
adults_survived_rate = 280 / 767
agedness_survived_rate = 1 / 11
print("儿童存活率:%.1f%%,少年存活率:%.1f%%" %(children_survived_rate*100, juvenile_survived_rate*100))
print("成年人存活率:%.1f%%,老年人存活率:%.1f%%" %(adults_survived_rate*100, agedness_survived_rate*100))
&#x513F;&#x7AE5;&#x5B58;&#x6D3B;&#x7387;&#xFF1A;58.0%&#xFF0C;&#x5C11;&#x5E74;&#x5B58;&#x6D3B;&#x7387;&#xFF1A;47.7%
&#x6210;&#x5E74;&#x4EBA;&#x5B58;&#x6D3B;&#x7387;&#xFF1A;36.5%&#xFF0C;&#x8001;&#x5E74;&#x4EBA;&#x5B58;&#x6D3B;&#x7387;&#xFF1A;9.1%

SibSp(兄弟姐妹)

有兄弟姐妹的乘客生还人数和生还率

sibsp_df = train_data[train_data['SibSp'] != 0]
no_sibsp_df = train_data[train_data['SibSp'] == 0]

sibsp_count = sibsp_df['Survived'].count()

no_sibsp_count = no_sibsp_df['Survived'].count()
sibsp_count, no_sibsp_count
(283, 608)

sibsp_survived_count = sibsp_df['Survived'].sum()

no_sibsp_survived_count = no_sibsp_df['Survived'].sum()
sibsp_survived_count, no_sibsp_survived_count
(132, 210)
sibsp_survived_rate = 132 / 283
no_sibsp_survived_rate = 210 / 608
print("有兄弟姐妹的存活率:%.1f%%,没有兄弟姐妹的存活率:%.1f%%" %(sibsp_survived_rate*100, no_sibsp_survived_rate*100))
&#x6709;&#x5144;&#x5F1F;&#x59D0;&#x59B9;&#x7684;&#x5B58;&#x6D3B;&#x7387;&#xFF1A;46.6%&#xFF0C;&#x6CA1;&#x6709;&#x5144;&#x5F1F;&#x59D0;&#x59B9;&#x7684;&#x5B58;&#x6D3B;&#x7387;&#xFF1A;34.5%

Parch(父母子女)

有父母子女的乘客生还人数和生还率

parch_df = train_data[train_data['Parch'] != 0]
no_parch_df = train_data[train_data['Parch'] == 0]

parch_count = parch_df['Survived'].count()

no_parch_count = no_parch_df['Survived'].count()
parch_count, no_parch_count
(213, 678)

parch_survived_count = parch_df['Survived'].sum()

no_parch_survived_count = no_parch_df['Survived'].sum()
parch_survived_count, no_parch_survived_count
(109, 233)
parch_survived_rate = 109 / 213
no_parch_survived_rate = 233 / 678
print("有父母子女的存活率:%.1f%%,没有父母子女的存活率:%.1f%%" %(parch_survived_rate*100, no_parch_survived_rate*100))
&#x6709;&#x7236;&#x6BCD;&#x5B50;&#x5973;&#x7684;&#x5B58;&#x6D3B;&#x7387;&#xFF1A;51.2%&#xFF0C;&#x6CA1;&#x6709;&#x7236;&#x6BCD;&#x5B50;&#x5973;&#x7684;&#x5B58;&#x6D3B;&#x7387;&#xFF1A;34.4%

Fare(票价)

票价分布

train_data['Fare'].describe()
count    891.000000
mean      32.204208
std       49.693429
min        0.000000
25%        7.910400
50%       14.454200
75%       31.000000
max      512.329200
Name: Fare, dtype: float64

绘制所有的票价分布图

plt.figure(figsize=(12, 5))

plt.subplot(1, 2, 1)
train_data['Fare'].hist(bins = 20)
plt.xlabel('Fare')
plt.ylabel('Count')

plt.subplot(1, 2, 2)
train_data.boxplot(column='Fare', showfliers=False)
plt.show()


泰坦尼克号乘客存活预测详细笔记

绘制存活乘客的票价分布图

plt.figure(figsize=(12, 5))

plt.subplot(1, 2, 1)
train_data[train_data['Survived'] == 1]['Fare'].hist(bins = 20)
plt.xlabel('Fare')
plt.ylabel('Count')

plt.subplot(1, 2, 2)
train_data[train_data['Survived'] == 1].boxplot(column='Fare', showfliers=False)
plt.show()


泰坦尼克号乘客存活预测详细笔记

Cabin(船舱)

丢失值太多,不能用此数据分析出Cabin对生存率的影响,丢掉

train_data = train_data.drop('Cabin', axis=1)
train_data.info()
<class 'pandas.core.frame.dataframe'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 8 columns):
 #   Column    Non-Null Count  Dtype
 0   Survived  891 non-null    int64
 1   Pclass    891 non-null    int64
 2   Sex       891 non-null    object
 3   Age       891 non-null    float64
 4   SibSp     891 non-null    int64
 5   Parch     891 non-null    int64
 6   Fare      891 non-null    float64
 7   Embarked  891 non-null    object
dtypes: float64(2), int64(4), object(2)
memory usage: 55.8+ KB
</class>

填充后,各个港口登船的乘客数

train_data['Embarked'].value_counts()
S    646
C    168
Q     77
Name: Embarked, dtype: int64

海难后,各个港口登船的存活乘客数

train_data[train_data['Survived'] == 1]['Embarked'].value_counts()
S    219
C     93
Q     30
Name: Embarked, dtype: int64

统计各个港口登船的存活率

S_survived_rate = 219 / 646
C_survived_rate = 93 / 168
Q_survived_rate = 30 / 77
print("S港口存活率:%.1f%%,C港口存活率:%.1f%%,Q港口存活率:%.1f%%" %(S_survived_rate*100, C_survived_rate*100,Q_survived_rate*100))
S&#x6E2F;&#x53E3;&#x5B58;&#x6D3B;&#x7387;&#xFF1A;33.9%&#xFF0C;C&#x6E2F;&#x53E3;&#x5B58;&#x6D3B;&#x7387;&#xFF1A;55.4%&#xFF0C;Q&#x6E2F;&#x53E3;&#x5B58;&#x6D3B;&#x7387;&#xFF1A;39.0%

二、数据分析总结

本次分析主要寻找了泰坦尼克号上的生还率与各因素(客舱等级、年龄、性别、上船港口等)的关系。

  1. 样本数量为891,海难发生后,生还者还剩342人,生还率为38.4%。
  2. 泰坦尼克号上有一、二、三等舱三种船舱类型。
    海难发生前,一等舱有 216 人,二等舱 184 人,三等舱 491 人,分别占总人数的 24%, 21%, 55%。
    海难发生后,一等舱、二等舱、三等舱的乘客人数变为136、87、119人,分别占总人数的 40%, 25%, 35%。
    一等舱生还率为 63%,二等舱为 47%,三等舱为 24%。可见客舱等级越高,生还率越高。
  3. 海难发生前,男性共577人,女性314人,男女比例为 65% 和 35%。
    海难发生后,男性变为109人,女性变为233人,男女比例变为 32% 和 68%。
    男性生还109人,生还率仅为19%。女性生还233人,生还率为74%,远远高于男性的19%。可见女性比男性在这次事故中更容易生还,表明”女士优先”的原则在本次事故中得到了发扬。
  4. 样本的891人中,平均年龄约为30岁, 标准差15岁,最小年龄为0.42,最大年龄80。按照儿童(0-12)、少年(12-18)、成人(18-65)、老年人(65及以上)划分为四类。
    四类人的生还率分别为58%,48%,39% 和9%。可见年龄越大,生还率越低。”尊老爱幼”的原则在本次事故中没有很好体现。
  5. 有兄弟姐妹的乘客有283人,生还132人,生还率为47%,
    而没有兄弟姐妹的乘客,有608人,生还210人,生还率为35%。可见有兄弟姐妹同船的生还率比没有兄弟姐妹同船的生还率要高。
  6. 有父母或子女同船的乘客有213人,生还109人,生还率为51%。
    没有父母子女同船的乘客有678人,生还233人,生还率仅为34%。
    可见有父母或子女同船的生还率比没有的生还率要高。综合前一条分析,可以得出推论,有家人在船上的比没有家人在船上的生还概率要大。
  7. 票价与生还有一定相关性,生还者的平均票价要比未生还的高。
  8. S港口生还人数最多,C次之,Q最少。从生还率来看,C港上船的生还率最高,Q次之,S生还率最低。

三、构建模型训练

1.处理数据缺失值

train_data = pd.read_csv(TRAIN_PATH)
test_data = pd.read_csv(TEST_PATH)

full = pd.concat([train_data, test_data], axis=0, ignore_index=True)
full.info()
<class 'pandas.core.frame.dataframe'>
RangeIndex: 1309 entries, 0 to 1308
Data columns (total 12 columns):
 #   Column       Non-Null Count  Dtype
 0   Survived  891 non-null    float64
 1   Pclass    1309 non-null   int64
 2   Sex       1309 non-null   object
 3   Age       1046 non-null   float64
 4   SibSp     1309 non-null   int64
 5   Parch     1309 non-null   int64
 6   Fare      1308 non-null   float64
 7   Embarked  1307 non-null   object
dtypes: float64(3), int64(3), object(2)
memory usage: 81.9+ KB
</class>

full['Age'] = full['Age'].fillna(full['Age'].mean())

full['Fare'] = full['Fare'].fillna(full['Fare'].mean())
full.info()
<class 'pandas.core.frame.dataframe'>
RangeIndex: 1309 entries, 0 to 1308
Data columns (total 8 columns):
 #   Column    Non-Null Count  Dtype
 0   Survived  891 non-null    float64
 1   Pclass    1309 non-null   int64
 2   Sex       1309 non-null   object
 3   Age       1309 non-null   float64
 4   SibSp     1309 non-null   int64
 5   Parch     1309 non-null   int64
 6   Fare      1309 non-null   float64
 7   Embarked  1309 non-null   object
dtypes: float64(3), int64(3), object(2)
memory usage: 81.9+ KB
</class>

2.处理字符串和类别

2.1 处理性别

full['Sex'].head()
0      male
1    female
2    female
3    female
4      male
Name: Sex, dtype: object

sex_2_dict = {"male": 0, "female":1}
full['Sex'] = full['Sex'].map(sex_2_dict)
full['Sex'].head()
0    0
1    1
2    1
3    1
4    0
Name: Sex, dtype: int64

2.2 处理客舱类别

full['Pclass'].head()
0    3
1    1
2    3
3    1
4    3
Name: Pclass, dtype: int64

pClassDf = pd.DataFrame()

pClassDf = pd.get_dummies(full['Pclass'], prefix='Pclass')
pClassDf.head()

Pclass_1Pclass_2Pclass_300011100200131004001


full = pd.concat([full, pClassDf], axis=1)

full = full.drop('Pclass', axis=1)
full.head()

SurvivedSexAgeSibSpParchFareEmbarkedPclass_1Pclass_2Pclass_300.0022.0107.2500S00111.0138.01071.2833C10021.0126.0007.9250S00131.0135.01053.1000S10040.0035.0008.0500S001

2.3 处理港口类别

full['Embarked'].head()
0    S
1    C
2    S
3    S
4    S
Name: Embarked, dtype: object

embarkedDf = pd.DataFrame()

embarkedDf = pd.get_dummies(full['Embarked'], prefix='Embarked')
embarkedDf.head()

Embarked_CEmbarked_QEmbarked_S00011100200130014001


full = pd.concat([full, embarkedDf], axis=1)

full = full.drop('Embarked', axis=1)
full.head()

SurvivedSexAgeSibSpParchFarePclass_1Pclass_2Pclass_3Embarked_CEmbarked_QEmbarked_S00.0022.0107.250000100111.0138.01071.283310010021.0126.0007.925000100131.0135.01053.100010000140.0035.0008.0500001001

full.info()
<class 'pandas.core.frame.dataframe'>
RangeIndex: 1309 entries, 0 to 1308
Data columns (total 12 columns):
 #   Column      Non-Null Count  Dtype
 0   PassengerId  418 non-null    int64
 1   Pclass       418 non-null    int64
 2   Name         418 non-null    object
 3   Sex          418 non-null    object
 4   Age          332 non-null    float64
 5   SibSp        418 non-null    int64
 6   Parch        418 non-null    int64
 7   Ticket       418 non-null    object
 8   Fare         417 non-null    float64
 9   Cabin        91 non-null     object
 10  Embarked     418 non-null    object
dtypes: float64(2), int64(4), object(5)
memory usage: 36.0+ KB
&#x8BFB;&#x53D6;&#x7684;&#x6D4B;&#x8BD5;&#x6587;&#x4EF6;&#xFF1A;
None
</class>

passenger_id = test_data['PassengerId'].to_numpy()
print(f"id数据的大小:{passenger_id.shape}, 数据:\n{passenger_id}")
id&#x6570;&#x636E;&#x7684;&#x5927;&#x5C0F;&#xFF1A;(418,), &#x6570;&#x636E;&#xFF1A;
[ 892  893  894  895  896  897  898  899  900  901  902  903  904  905
  906  907  908  909  910  911  912  913  914  915  916  917  918  919
  920  921  922  923  924  925  926  927  928  929  930  931  932  933
  934  935  936  937  938  939  940  941  942  943  944  945  946  947
  948  949  950  951  952  953  954  955  956  957  958  959  960  961
  962  963  964  965  966  967  968  969  970  971  972  973  974  975
  976  977  978  979  980  981  982  983  984  985  986  987  988  989
  990  991  992  993  994  995  996  997  998  999 1000 1001 1002 1003
 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017
 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031
 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045
 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059
 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073
 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087
 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101
 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115
 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129
 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143
 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157
 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171
 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185
 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199
 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213
 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227
 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241
 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255
 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269
 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283
 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297
 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309]

data = zip(passenger_id, predict)
result = pd.DataFrame(data=data, columns=['PassengerId', 'Survived'])
result.to_csv(SUBMISSION_PATH, index=None)

在kaggle上提交了一次,不出所料,结果和训练集准确率差不多,成绩为0.765,但毕竟是本人的第一次在kaggle上做题,心里还是满足的,熟悉了kaggle的一整套流程。

泰坦尼克号乘客存活预测详细笔记

Original: https://blog.csdn.net/L28298129/article/details/124737428
Author: 执笔画红颜丶
Title: 泰坦尼克号乘客存活预测详细笔记

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/693898/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球