日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

泰坦尼克号分析是否获救

發(fā)布時(shí)間:2023/12/18 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 泰坦尼克号分析是否获救 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1.從kaggle獲取數(shù)據(jù)


kaggle網(wǎng)站

Competions泰坦尼克號(hào)鏈接

點(diǎn)擊date,然后點(diǎn)擊Download ALL即可獲得數(shù)據(jù),解壓后可以得到3個(gè)csv文件,分別是:

  • gender_submission.csv?分析女性全部獲救概率
  • test.csv 測(cè)試文本,沒(méi)有Survived,根據(jù)訓(xùn)練生成的模型預(yù)測(cè)其他人的存活狀況。
  • train.csv 訓(xùn)練文本,有一些乘客的個(gè)人信息以及存活狀況,要嘗試根據(jù)它生成合適的模型。

得到了數(shù)據(jù)后可以開(kāi)始根據(jù)train.csv分析出一個(gè)baseline的model出來(lái),再進(jìn)行后續(xù)的分析步驟


2.分析步驟

  • 認(rèn)識(shí)數(shù)據(jù)
  • 分析和處理數(shù)據(jù)中的特殊點(diǎn)/離群點(diǎn)
  • 特征工程(feature engineering)
  • 模型融合(model ensemble)

2.1在kaggle中瀏覽數(shù)據(jù)字典(Data Dictionary)情況

數(shù)據(jù)字典翻譯

變量定義鑰匙
survival生存0=否,1=是
pclass客位等級(jí)1=1,2=2,3=3
sex性別
age歲數(shù)
Sibsp泰坦尼克號(hào)上的兄弟姐妹/配偶
parch泰坦尼克號(hào)上的父母/孩子
ticket船票信息
fare船費(fèi)
cabin船艙號(hào)
embarked從那個(gè)港口上船C=瑟堡,q=昆斯敦,S=南安普敦

2.2添加相關(guān)的包import

import pandas as pd import numpy as np import seaborn as sns import matplotlib.pyplot as plt# machine learning from sklearn.ensemble import RandomForestRegressor from sklearn.linear_model import LogisticRegression from sklearn.svm import SVC, LinearSVC

2.3數(shù)據(jù)分析

導(dǎo)入數(shù)據(jù)

train_df = pd.read_csv(r'E:\2345下載\kaggle\泰坦尼克號(hào)\train.csv') #r為絕對(duì)路徑,相對(duì)路徑直接輸入 test_df = pd.read_csv(r'E:\2345下載\kaggle\泰坦尼克號(hào)\test.csv') combine = [train_df, test_df]

數(shù)據(jù)導(dǎo)入后可以查看一下,print(combine),由于數(shù)據(jù)過(guò)多,可以看一下它的info

train_df.info() test_df.info()

結(jié)果如下:

train_df? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?test_df

? ? ? ? ? ? ?

我們可以發(fā)現(xiàn)train樣本中有891條數(shù)據(jù),其中Age,Cabin,Embarked有缺失,在test樣本中,Age和Cabin有缺失

查看測(cè)試樣本的特征分布(describe方法)

train_df.describe()

結(jié)果如下:

我們可以發(fā)現(xiàn):

  • 訓(xùn)練樣本有891
  • 獲救率為38.84%
  • 大部分人的Pclass為3
  • 平均年齡為29.7歲
  • 大部分人的票價(jià)低于平均值32

綜上所述,我們可以總結(jié)一下,做出一下分析假設(shè):

  • 是否獲救可能和性別,年齡有關(guān)。畢竟逃生的話(huà),小孩老人女士?jī)?yōu)先嘛。
  • 是否獲救可能和Parch,SibSp有關(guān),逃生可能和家庭有關(guān)系
  • 可以探究一下船票等級(jí)(Pclass),有錢(qián)人可能優(yōu)先
  • 探究一下Embarked,登船港口可能和地位有關(guān)
  • 雖然cabin缺失太多,但是可能與獲救有關(guān)
  • fare船票費(fèi)用可能貴的先逃生

3.繪制圖表,可視化分析?

3.1Age和Sex與Survived的關(guān)系

m = sns.FacetGrid(train_df, col='Survived',row='Sex') #col為列,row為行 m.map(plt.hist, 'Age', bins=25)

?結(jié)果如下:

?很明顯可以看出女士和小孩的獲救概率要高

3.2探究Parch,SibSp與Survived的關(guān)系

m = sns.FacetGrid(train_df, col='Survived') m.map(plt.hist, 'Parch') m = sns.FacetGrid(train_df, col='Survived') m.map(plt.hist, 'SibSp')

結(jié)果如下:

結(jié)果有些復(fù)雜,基本看不出來(lái)Parch,SibSp與Survived有聯(lián)系,暫時(shí)放在這里,可能將Parch+SibSp組成一個(gè)新特征Family后與Survived有關(guān)系。

3.3Pclass與Survived的關(guān)系

grid = sns.FacetGrid(train_df, col='Survived', row='Pclass', aspect=1.5) grid.map(plt.hist, 'Age', alpha=.5, bins=25)

?結(jié)果如下:

?由圖可得,Pclass等于1和2時(shí)的獲救率明顯大于Pclass等于3時(shí)。有錢(qián)人果然優(yōu)先逃生。

3.4在不同的Embarked中Fare與Survived的關(guān)系

grid = sns.FacetGrid(train_df, col='Embarked',hue='Survived') grid.map(plt.hist,'Fare',bins=10) grid.add_legend()

結(jié)果如下:

我們可以明顯看出S港的獲救率沒(méi)有C港和Q港高,而且C港的Fare比較高,結(jié)合整個(gè)圖可以分析出Fare高的獲救率高,C港和Q港的人比較有錢(qián),S港的船票費(fèi)用低且獲救率低。

小小分析一下,有cabin 的獲救率高,但是cabin缺失太多,不能得出什么結(jié)果,我希望放棄cabin。


4.數(shù)據(jù)預(yù)處理

目前為止,Survived可能與Sex,Age,Fare,Embarked,Pclass,Family(Parch+SibSp)有關(guān)

我們目前放棄了?Ticket(太亂了,沒(méi)有規(guī)律)和cabin。

我們希望能夠?yàn)锳ge和Embarked補(bǔ)齊數(shù)據(jù),我們可以考慮種倆方法來(lái)填補(bǔ)數(shù)值連續(xù)特征:

  • 手動(dòng)設(shè)置方法補(bǔ)充(1.在均值和標(biāo)準(zhǔn)偏差之間生成隨機(jī)數(shù)2.使用其他相關(guān)特征,猜測(cè)相關(guān)值)
  • 用scikit-learn中的RandomForest來(lái)擬合一下缺失的數(shù)據(jù)

由于本人比較懶,我希望使用scikit-learn中的RandomForest來(lái)擬合一下缺失的數(shù)據(jù)。

# 填補(bǔ)缺少值或空值 def set_missing_ages(df):# 把已有的數(shù)值型特征取出來(lái)丟進(jìn)Random Forest Regressor中age_df = df[['Age', 'Fare', 'Parch', 'SibSp', 'Pclass']]# 乘客分成已知年齡和未知年齡兩部分known_age = age_df[age_df.Age.notnull()].valuesunknown_age = age_df[age_df.Age.isnull()].values# y即目標(biāo)年齡y = known_age[:, 0]# X即特征屬性值X = known_age[:, 1:]# fit到RandomForestRegressor之中rfr = RandomForestRegressor(random_state=0, n_estimators=2000, n_jobs=-1)rfr.fit(X, y)# 用得到的模型進(jìn)行未知年齡結(jié)果預(yù)測(cè)predictedAges = rfr.predict(unknown_age[:, 1::])# 用得到的預(yù)測(cè)結(jié)果填補(bǔ)原缺失數(shù)據(jù)df.loc[(df.Age.isnull()), 'Age'] = predictedAgesreturn df, rfr# 補(bǔ)充train的age,依據(jù)train的age補(bǔ)充test train_df, rfr = set_missing_ages(train_df) tmp_df = test_df[['Age','Fare', 'Parch', 'SibSp', 'Pclass']] null_age = tmp_df[test_df.Age.isnull()].values # 根據(jù)特征屬性X預(yù)測(cè)年齡并補(bǔ)上 X = null_age[:, 1:] predictedAges = rfr.predict(X) test_df.loc[ (test_df.Age.isnull()), 'Age' ] = predictedAges combine=[train_df,test_df]

Age補(bǔ)充完畢,由于小孩優(yōu)先逃生,所以Age基于16的將Age的數(shù)值分割。

for dataset in combine:dataset.loc[ dataset['Age'] <= 16, 'Age'] = 0dataset.loc[(dataset['Age'] > 16) & (dataset['Age'] <= 32), 'Age'] = 1dataset.loc[(dataset['Age'] > 32) & (dataset['Age'] <= 48), 'Age'] = 2dataset.loc[(dataset['Age'] > 48) & (dataset['Age'] <= 64), 'Age'] = 3dataset.loc[ dataset['Age'] > 64, 'Age']

然后補(bǔ)充Embarked,由于Embarked缺陷非常少,所以用均值填充。

freq_port = train_df.Embarked.dropna().mode()[0] for dataset in combine:dataset['Embarked'] = dataset['Embarked'].fillna(freq_port)

順便將Embarked數(shù)字化

# 將embarked轉(zhuǎn)化為數(shù)字 for dataset in combine:dataset['Embarked'] = dataset['Embarked'].map( {'S': 0, 'C': 1, 'Q': 2} ).astype(int)

特征工程

特征工程

特征工程

接下來(lái)是最重要的特征工程

首先分析Name,將Name按26個(gè)英文字母排序

for dataset in combine:dataset['Title'] = dataset.Name.str.extract(' ([A-Za-z]+)\.', expand=False) # 參數(shù)expand=false 標(biāo)志返回一個(gè)df pd.crosstab(train_df['Title'], train_df['Sex'])

結(jié)果如下:

我們可以將Name合并為Mr,Miss,Mrs,Master,Other(其他),再將其數(shù)字化

for dataset in combine:dataset['Title'] = dataset['Title'].replace(['Lady', 'Countess','Capt', 'Col',\'Don', 'Dr', 'Major', 'Rev', 'Sir', 'Jonkheer', 'Dona'], 'Other')dataset['Title'] = dataset['Title'].replace('Mlle', 'Miss')dataset['Title'] = dataset['Title'].replace('Ms', 'Miss')dataset['Title'] = dataset['Title'].replace('Mme', 'Mrs')title_mapping = {"Mr": 1, "Miss": 2, "Mrs": 3, "Master": 4, "Other": 5} for dataset in combine:dataset['Title'] = dataset['Title'].map(title_mapping)dataset['Title'] = dataset['Title'].fillna(0)

最后在將原特征刪除,這里不僅刪除Name,還有多余的無(wú)關(guān)特征Ticket, Cabin,順便將Sex數(shù)字化

#刪除無(wú)關(guān)特征 train_df = train_df.drop(['Ticket', 'Cabin'], axis=1) test_df = test_df.drop(['Ticket', 'Cabin'], axis=1) combine = [train_df, test_df]# 刪除名字 train_df = train_df.drop(['Name', 'PassengerId'], axis=1) test_df = test_df.drop(['Name'], axis=1) combine = [train_df, test_df]# sex轉(zhuǎn)換數(shù)字 for dataset in combine:dataset['Sex'] = dataset['Sex'].map( {'female': 1, 'male': 0} ).astype(int)

我們可以為 Family創(chuàng)建一個(gè)新特征,它結(jié)合了 Parch 和 SibS,再創(chuàng)建一個(gè)輔助特征叫做 isAlone。最后可以刪除原特征。

# 設(shè)置新特征家庭 for dataset in combine:dataset['Family'] = dataset['SibSp'] + dataset['Parch'] + 1 # 設(shè)置輔助特征 for dataset in combine:dataset['IsAlone'] = 0dataset.loc[dataset['Family'] == 1, 'IsAlone'] = 1 # 刪除原特征 train_df = train_df.drop(['Parch', 'SibSp', 'Family'], axis=1) test_df = test_df.drop(['Parch', 'SibSp', 'Family'], axis=1) combine = [train_df, test_df]

最后,我們給Fare分類(lèi)

先查看一下Fare的分布

train_df['Fare'].describe()

結(jié)果如下:

count ? ?891.000000
mean ? ? ?32.204208
std ? ? ? 49.693429
min ? ? ? ?0.000000
25% ? ? ? ?7.910400
50% ? ? ? 14.454200
75% ? ? ? 31.000000
max ? ? ?512.329200

我們?nèi)?.91(25%),14.45(50%),31(75%)

#Fare分類(lèi) test_df['Fare'].fillna(test_df['Fare'].dropna().median(), inplace=True) train_df['Fare'].fillna(train_df['Fare'].dropna().median(), inplace=True) for dataset in combine:dataset.loc[ dataset['Fare'] <= 7.91, 'Fare'] = 0dataset.loc[(dataset['Fare'] > 7.91) & (dataset['Fare'] <= 14.45), 'Fare'] = 1dataset.loc[(dataset['Fare'] > 14.45) & (dataset['Fare'] <= 31), 'Fare'] = 2dataset.loc[ dataset['Fare'] > 31, 'Fare'] = 3dataset['Fare'] = dataset['Fare'].astype(int) combine = [train_df, test_df]

5.模型,預(yù)測(cè)和解決

我們準(zhǔn)備訓(xùn)練模型并預(yù)測(cè)所需的解決方案。 有60多種預(yù)測(cè)建模算法可供選擇。 我們必須了解問(wèn)題的類(lèi)型和解決方案要求,以縮小到我們可以評(píng)估的少數(shù)幾個(gè)模型。

這里我選擇Logistic回歸和SVM訓(xùn)練算法

# ------------------------------------------ # # 模型 X_train = train_df.drop("Survived", axis=1) Y_train = train_df["Survived"] X_test = test_df.drop("PassengerId", axis=1).copy()# Logistic Regression 邏輯回歸 logreg = LogisticRegression() logreg.fit(X_train, Y_train) Y_test = logreg.predict(X_test)# 保存 save= pd.DataFrame({"PassengerId": test_df["PassengerId"],"Survived": Y_test}) save.to_csv(r'E:\2345下載\kaggle\test_result.csv', index=False)# svm訓(xùn)練算法 svc = SVC() svc.fit(X_train, Y_train) Y_pred = svc.predict(X_test)save= pd.DataFrame({"PassengerId": test_df["PassengerId"],"Survived": Y_pred}) save.to_csv(r'E:\2345下載\kaggle\test_result2.csv', index=False)

最后得到的csv文件就可以在Kaggle的Make a submission頁(yè)面

總結(jié)

以上是生活随笔為你收集整理的泰坦尼克号分析是否获救的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。