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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人工智能 > pytorch >内容正文

pytorch

PyTorch深度学习实践概论笔记8练习-kaggle的Titanic数据集预测(一)数据分析

發(fā)布時(shí)間:2023/12/20 pytorch 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PyTorch深度学习实践概论笔记8练习-kaggle的Titanic数据集预测(一)数据分析 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

劉老師在第8講PyTorch深度學(xué)習(xí)實(shí)踐概論筆記8-加載數(shù)據(jù)集中留下一個(gè)練習(xí):對(duì)kaggle上的Titanic數(shù)據(jù)集,使用DataLoader類進(jìn)行分類,訓(xùn)練目標(biāo)是預(yù)測(cè)某位乘客是否活下來(Survived)。本篇文章先讀取數(shù)據(jù)和做一些簡(jiǎn)單的數(shù)據(jù)分析,熟悉一下數(shù)據(jù)集。

數(shù)據(jù)特征包含下面這些:

官網(wǎng)給的數(shù)據(jù)解釋如下。

0 Overview

數(shù)據(jù)集被劃分為訓(xùn)練集和測(cè)試集:

  • training set (train.csv)
  • test set (test.csv)

訓(xùn)練集應(yīng)該被用來建立你的機(jī)器學(xué)習(xí)模型。對(duì)于訓(xùn)練集,我們?yōu)槊總€(gè)乘客提供結(jié)果(也稱為“ground truth”)。你的模型將基于乘客的性別和階級(jí)等“特征”。您還可以使用特征工程來創(chuàng)建新的特征。

測(cè)試集應(yīng)該用來查看您的模型在不可見數(shù)據(jù)上的性能。對(duì)于測(cè)試集,我們不為每個(gè)乘客提供基本真相。你的工作就是預(yù)測(cè)這些結(jié)果。對(duì)于測(cè)試中的每一位乘客,使用你訓(xùn)練的模型來預(yù)測(cè)他們是否在泰坦尼克號(hào)沉沒時(shí)幸存下來。

還包括gender_submit .csv,這是一組假設(shè)所有且只有女性乘客能夠存活的預(yù)測(cè),作為提交文件的示例。

Data Dictionary-數(shù)據(jù)詞典

Variable(變量名)Definition(定義)Key(取值)
PassengerId乘客編號(hào)1-891
SurvivedSurvival(是否生存)0和1。0 = 死亡, 1 = 存活
PclassTicket class(票的等級(jí),社會(huì)經(jīng)濟(jì)地位(SES)的代表。)

1 = 1st, 2 = 2nd, 3 = 3rd

1 =上;2 =中間;3 =低

Name乘客姓名例如Braund,Mr. Owen Harris
SexSex(性別)male,female
AgeAge in years(年齡)數(shù)字(float64)。如果年齡小于1,則為小數(shù);如果估計(jì)年齡,是xx.5,有缺失
SibSp

# of siblings / spouses aboard the Titanic

(泰坦尼克號(hào)上的兄弟姐妹/配偶)

Sibling=兄弟,姐妹,繼兄弟,繼姐妹

pouse=丈夫,妻子(情婦和未婚夫被忽略)

0-8
Parch

# of parents / children aboard the Titanic

(泰坦尼克號(hào)上的父母/孩子)

Parent =母親,父親

Child=女兒、兒子、繼女、繼子

有些孩子外出旅行只帶了一個(gè)保姆,因此對(duì)他們來說parch=0

0-6
TicketTicket number(票號(hào))例如A/5 21171、PC 17599
FarePassenger fare(乘客票價(jià))數(shù)字(float64),有缺失
CabinCabin number(船艙號(hào)碼)例如C85,提取A/B/C/D等,有缺失
EmbarkPort of Embarkation(登船港口)C = Cherbourg, Q = Queenstown, S = Southampton,有缺失

整個(gè)數(shù)據(jù)量不大,訓(xùn)練集和測(cè)試集加起來總共891+418=1309個(gè)。

1 前期數(shù)據(jù)分析

拿到這筆數(shù)據(jù),我們先大概分析一下數(shù)據(jù),目的是初步了解數(shù)據(jù)之間的相關(guān)性,為之后的特征選擇和建模預(yù)測(cè)做準(zhǔn)備。參考知乎的一篇文章:pytorch練習(xí):泰坦尼克號(hào)生存預(yù)測(cè) - 知乎

1.1 讀取數(shù)據(jù)

讀取數(shù)據(jù)的代碼如下:

#導(dǎo)入需要的庫 import re import numpy as np import pandas as pd import seaborn as sns import matplotlib.pyplot as plt# 讀取數(shù)據(jù)的地址修改成自己的地址 train = pd.read_csv("./titanic/train.csv") test = pd.read_csv("./titanic/test.csv") print("train.shape:",train.shape,"test.shape:",test.shape)#輸出訓(xùn)練集和測(cè)試集大小 total_data = train.append(test,sort=False,ignore_index=True)#合并訓(xùn)練集和測(cè)試集 print("total_data.shape",total_data.shape) total_data.head() #查看前5行數(shù)據(jù)

輸出訓(xùn)練集train.shape為(891, 12),測(cè)試集test.shape為(418, 11),合并之后的數(shù)據(jù)total_data.shape為(1309, 12)。前5行數(shù)據(jù)如下:

查看train和test數(shù)據(jù)集的基本信息:

train.info() print("*"*50) test.info()

輸出如下:

可以看到訓(xùn)練集的AgeCabinEmbarked存在丟失數(shù)據(jù);測(cè)試集的AgeFareCabin存在丟失數(shù)據(jù)(這些變量之后都需要做缺失值處理)。

1.2 特征分析

接下來我們進(jìn)行數(shù)據(jù)分析,由于該練習(xí)是預(yù)測(cè)乘客的存活情況,因此主要分析特征Survived和其他特征的關(guān)系。?

1.2.1 總體生存率情況(Survived)

total_data['Survived'].value_counts().plot.pie(autopct="%1.2f%%")

整個(gè)數(shù)據(jù)集(訓(xùn)練集)中存活342人,死亡549人,存活率38.38%,死亡率61.62%。

1.2.2?不同性別的人員存活率分析(Sex、Survived)

print(total_data.groupby(['Sex'])['Survived'].agg(['count','mean'])) plt.figure(figsize=(10,5)) sns.countplot(x='Sex',hue='Survived',data=total_data) plt.title('Sex vs Survived')
countmean
female3140.742038
male5770.188908

圖像如下:

整個(gè)數(shù)據(jù)集中男性人數(shù)577,女性314人,男性占比64.75%,但女性的存活率74.2%遠(yuǎn)高于男性存活率18.8%,這讓我想到電影《泰坦尼克號(hào)》中讓婦女和兒童先上救生艇,是否有關(guān)聯(lián)?(存活率與性別有關(guān))。

1.2.3?不同登船港的人員存活率分析(Embarked、Survived)

首先,查看Embarked的分布。

total_data.Embarked.value_counts()

輸出:

由于該特征存在缺失,下面做缺失值處理,用眾數(shù)填充。

total_data['Embarked'].fillna(total_data.Embarked.mode().values[0],inplace=True)

缺失值處理之后輸出:

查看不同登船港人員的存活率。

print(total_data.groupby(['Embarked'])['Survived'].agg(['count','mean'])) plt.figure(figsize=(10,5)) sns.countplot(x='Embarked',hue='Survived',data=total_data) plt.title('Embarked vs Survived')

可以看到,C地登船的存活率最高、其次為Q地登船、S地登船人數(shù)最多但存活率僅有1/3(存活率與登船港有關(guān))。

1.2.4?不同船艙號(hào)的人員存活率分析(Cabin、Survived)

由于Cabin缺失比較嚴(yán)重,用Unknown替代缺失值。先做缺失值處理。

total_data['Cabin'].fillna('U',inplace=True)

查看不同船艙號(hào)人員的存活率,代碼如下:

total_data['Cabin'] = total_data['Cabin'].map(lambda x:re.compile('([a-zA-Z]+)').search(x).group()) print(total_data.groupby(['Cabin'])['Survived'].agg(['count','mean'])) plt.figure(figsize=(10,5)) sns.countplot(x='Cabin',hue='Survived',data=total_data) plt.title('Cabin vs Survived')

不同船艙號(hào)人員的存活情況圖像如下:

結(jié)合之前的分析,有船艙號(hào)信息的人員占(204+91)/1309=22.54%,缺失船艙號(hào)的群體占比77.5%,但是存活率僅僅29.99%。?船艙號(hào)B/D/E存活率較高,均超過70%(存活率與船艙號(hào)有關(guān))。

1.2.5?不同票等級(jí)的人員存活率分析(Pclass、Survived)

查看不同票等級(jí)人員的存活率情況。

print(total_data.groupby(['Pclass'])['Survived'].agg(['count','mean'])) plt.figure(figsize=(10,5)) sns.countplot(x='Pclass',hue='Survived',data=total_data) plt.title('Pclass vs Survived')

數(shù)據(jù)表明,票等級(jí)越高存活率就越高;等級(jí)1的人存活率62.96%;等級(jí)3的人數(shù)占比超50%,但存活率不到1/3(0.242363)(存活率與票等級(jí)有關(guān))。

1.2.6?不同票等級(jí)的男女存活率分析(Pclass、Sex、Survived)

考慮不同票等級(jí)中男女生存的幾率。

print(total_data[['Sex','Pclass','Survived']].groupby(['Pclass','Sex']).agg(['count','mean'])) total_data[['Sex','Pclass','Survived']].groupby(['Pclass','Sex']).mean().plot.bar(figsize=(10,5)) plt.xticks(rotation=0) plt.title('Sex,Pclass vs Survived')

結(jié)果表明,不同票等級(jí)下女性的存活率均高于男性,在票等級(jí)1和2中女性存活率均超過90%。

1.2.7?不同票價(jià)的人員存活率分析(Fare、Survived)

由于票價(jià)有缺失,首先結(jié)合Pclass的平均票價(jià),對(duì)Fare進(jìn)行缺失值處理。首先看一下不同票等級(jí)的票價(jià),代碼如下:

total_data[['Pclass','Fare']].groupby(['Pclass'], as_index=False).mean() #total_data['Fare'].groupby(by=total_data['Pclass']).mean()

缺失值處理:?

total_data['Fare'] = total_data[['Fare']].fillna(total_data.groupby('Pclass').transform(np.mean)) total_data['Fare'].describe()

處理之后的輸出結(jié)果:

查看票價(jià)分布情況,畫直方圖。

plt.figure(figsize=(10,5)) total_data['Fare'].hist(bins=70) plt.title('Fare Distribution')

?直方圖說明數(shù)據(jù)集的票價(jià)集中在低價(jià)區(qū)。進(jìn)一步分析票價(jià)和存活率的關(guān)系:

total_data.boxplot(column='Fare',by='Survived',showfliers=False,figsize=(10,5))

上述箱線圖表明,存活群體的票價(jià)均值要高于死亡群體,而且存活的群體中票價(jià)分布差異更大。

更進(jìn)一步分析,我們劃分票價(jià)區(qū)間,查看票價(jià)區(qū)間的存活率情況。

1.2.8?不同票價(jià)區(qū)間的人員存活率分析(Fare_bin、Survived)

將票價(jià)劃分為四個(gè)區(qū)間。

bins_fare = [0,8,14,31,515] total_data['Fare_bin'] = pd.cut(total_data['Fare'], bins_fare, right=False)#畫圖 print(total_data[['Fare_bin', 'Survived']].groupby('Fare_bin')['Survived'].agg(['count', 'mean'])) plt.figure(figsize=(10, 5)) sns.countplot(x='Fare_bin', hue='Survived', data=total_data) plt.title('Fare and Survived')

隨著票價(jià)的升高,票價(jià)區(qū)間的存活率越來越高,[31,515)的存活率為58.2%(存活率與票價(jià)有關(guān))。

1.2.9?不同票等級(jí)[細(xì)分]的人員存活率分析(Pclass_Fare_Category、Survived)

對(duì)票等級(jí)按不同價(jià)格細(xì)分:

total_data.boxplot(column='Fare', by='Pclass',showfliers=False, figsize=(10, 5))

上圖說明票等級(jí)越高,票價(jià)相對(duì)更貴,但是同一個(gè)票等級(jí)的票價(jià)差異較大,進(jìn)一步對(duì)同一票價(jià)等級(jí)按照價(jià)格進(jìn)行細(xì)分。

def pclass_fare_category(df, pclass1_mean_fare, pclass2_mean_fare, pclass3_mean_fare):if df['Pclass'] == 1:if df['Fare'] <= pclass1_mean_fare:return 'Pclass1_Low'else:return 'Pclass1_High'elif df['Pclass'] == 2:if df['Fare'] <= pclass2_mean_fare:return 'Pclass2_Low'else:return 'Pclass2_High'elif df['Pclass'] == 3:if df['Fare'] <= pclass3_mean_fare:return 'Pclass3_Low'else:return 'Pclass3_High'Pclass_mean = total_data['Fare'].groupby(by=total_data['Pclass']).mean() Pclass1_mean_fare = Pclass_mean[1] Pclass2_mean_fare = Pclass_mean[2] Pclass3_mean_fare = Pclass_mean[3] total_data['Pclass_Fare_Category'] = total_data.apply(pclass_fare_category, args=(Pclass1_mean_fare, Pclass2_mean_fare, Pclass3_mean_fare), axis=1)print(total_data[['Pclass_Fare_Category', 'Survived']].groupby('Pclass_Fare_Category')['Survived'].agg(['count', 'mean'])) plt.figure(figsize=(10, 5)) sns.countplot(x='Pclass_Fare_Category', hue='Survived', data=total_data) plt.title('Pclass_Fare_Category and Survived')

根據(jù)同一票等級(jí)的均值劃分,最終得到6個(gè)票等級(jí),Pclass_Fare_Category的生存率結(jié)果如下:

數(shù)據(jù)說明,同一票等級(jí)的高價(jià)格區(qū)間的存活率高于低價(jià)格區(qū)間。

1.2.10 不同title[name中提取]的人員存活率分析(Title、Survived)

名字中出現(xiàn)了一些Dr、Officer、Lady等一些title,我們提取name中的title,對(duì)title進(jìn)行歸類,主要有這六類:

代碼如下:

def sub_title(x):return re.search('([A-Za-z]+)\.', x).group()[:-1]total_data['Title'] = total_data['Name'].apply(lambda x: sub_title(x))# 對(duì)title進(jìn)行歸類 title_Dict = {} title_Dict.update(dict.fromkeys(['Capt', 'Col', 'Major', 'Dr', 'Rev'], 'Officer')) title_Dict.update(dict.fromkeys(['Don', 'Sir', 'Countess', 'Dona', 'Lady'], 'Royalty')) title_Dict.update(dict.fromkeys(['Mme', 'Ms', 'Mrs'], 'Mrs')) title_Dict.update(dict.fromkeys(['Mlle', 'Miss'], 'Miss')) title_Dict.update(dict.fromkeys(['Mr'], 'Mr')) title_Dict.update(dict.fromkeys(['Master', 'Jonkheer'], 'Master'))total_data['Title'] = total_data['Title'].map(title_Dict)

不同title的存活率情況:

total_data[['Title', 'Survived']].groupby(['Title']).mean().plot.bar(figsize=(10, 5)) plt.title('Title vs Survived')

Mr和Officer的人員存活率明顯更低,Mrs title的群體存活率最高(存活率與title有關(guān))。

1.2.11 不同name長(zhǎng)度的人員存活率分析(Name_length、Survived)

提取name的長(zhǎng)度信息。

plt.figure(figsize=(18, 5)) total_data['Name_length'] = total_data['Name'].apply(len) name_length = total_data[['Name_length', 'Survived']].groupby(['Name_length'], as_index=False).mean() sns.barplot(x='Name_length', y='Survived', data=name_length) plt.title('Name length vs Survived')

名字長(zhǎng)度小于35的群體的存活率相對(duì)較低,名字長(zhǎng)度越長(zhǎng),存活率整體越高。但是看了一下,后面名字長(zhǎng)度長(zhǎng)的人數(shù)基本是個(gè)位數(shù)的(存活率與名字長(zhǎng)度有關(guān))。

1.2.12 區(qū)分有無兄弟姐妹/配偶在船上的人員存活率分析(SibSp、Survived)

區(qū)分有無兄弟姐妹/配偶在船上的兩個(gè)群體進(jìn)行數(shù)據(jù)對(duì)比。

sibsp_df = total_data[total_data['SibSp'] != 0] #有兄弟姐妹/配偶 no_sibsp_df = total_data[total_data['SibSp'] == 0] #無plt.figure(figsize=(10, 5)) plt.subplot(121) sibsp_df['Survived'].value_counts().plot.pie(labels=['No Survived', 'Survived'], autopct='%1.1f%%') plt.xlabel('sibsp')plt.subplot(122) no_sibsp_df['Survived'].value_counts().plot.pie(labels=['No Survived', 'Survived'], autopct='%1.1f%%') plt.xlabel('no_sibsp')

餅圖如下:

明顯看出,(左側(cè))有兄弟姐妹/配偶在船上的存活率更高,為46.6%(存活率與SibSp有關(guān))。

1.2.13 區(qū)分有無父母/子女在船上的人員存活率分析(Parch、Survived)

區(qū)分有無父母/子女在船上在船上的兩個(gè)群體進(jìn)行數(shù)據(jù)對(duì)比。

parch_df = total_data[total_data['Parch'] != 0] #有父母/子女 no_parch_df = total_data[total_data['Parch'] == 0] #無plt.figure(figsize=(10, 5)) plt.subplot(121) parch_df['Survived'].value_counts().plot.pie(labels=['No Survived', 'Survived'], autopct='%1.1f%%') plt.xlabel('Parch')plt.subplot(122) no_parch_df['Survived'].value_counts().plot.pie(labels=['No Survived', 'Survived'], autopct='%1.1f%%') plt.xlabel('no_Parch')

明顯看出,(左側(cè))有父母/子女在船上的成活率更高,為48.8%(存活率與Parch有關(guān))。

1.2.14 不同家庭人數(shù)[合并]的人員存活率分析(Family_Size、Survived)

查看不同家庭人數(shù)的存活率,首先Parch和SibSp分開查看。

fig, ax = plt.subplots(1, 2, figsize=(18, 8)) total_data[['Parch', 'Survived']].groupby(['Parch']).mean().plot.bar(ax=ax[0]) ax[0].set_title('Parch vs Survived') total_data[['SibSp', 'Survived']].groupby(['SibSp']).mean().plot.bar(ax=ax[1]) ax[1].set_title('SibSp vs Survived')

然后,合并家庭人數(shù)。

total_data['Family_Size'] = total_data['Parch'] + total_data['SibSp'] + 1 total_data[['Family_Size', 'Survived']].groupby(['Family_Size']).mean().plot.bar(figsize=(10, 5)) plt.title('Family size vs Survived')

上圖說明有家庭成員的存活率大概率比無家庭成員的存活率高,家庭人員=4時(shí)存活率最高,但隨著人數(shù)越高存活率降低。

根據(jù)上述結(jié)果重新劃分家庭大小,家庭人員以4為界。

def family_size_category(family_size):if family_size <= 1:return 'Single'elif family_size <= 4:return 'Small_Family'else:return 'Large_Family'total_data['Family_Size_Category'] = total_data['Family_Size'].map(family_size_category) total_data[['Family_Size_Category','Survived']].groupby(['Family_Size_Category']).mean().plot.bar(figsize=(10,5))

??

上述直方圖說明,家庭總?cè)藬?shù)大于4的家庭存活率最低,總?cè)藬?shù)等于1的高一些,總?cè)藬?shù)小于4的家庭存活率最高,57.9%。

1.2.15 不同年齡的人員存活率分析(Age、Survived)

Age(年齡)也有缺失值,這里我們使用隨機(jī)森林預(yù)測(cè)缺失的年齡。首先,將將分類變量轉(zhuǎn)化為數(shù)值,使用pd.factorize()函數(shù)。

#pd.factorize()做的是“因式分解”,把常見的字符型變量分解為數(shù)字 total_data['Embarked'], uniques_embarked = pd.factorize(total_data['Embarked']) total_data['Sex'], uniques_sex = pd.factorize(total_data['Sex']) total_data['Cabin'], uniques_cabin = pd.factorize(total_data['Cabin']) total_data['Fare_bin'], uniques_fare_bin = pd.factorize(total_data['Fare_bin']) total_data['Pclass_Fare_Category'], uniques_pclass_fare_category = pd.factorize(total_data['Pclass_Fare_Category']) total_data['Title'], uniques_title = pd.factorize(total_data['Title']) total_data['Family_Size_Category'], uniques_family_size_category = pd.factorize(total_data['Family_Size_Category'])

接著,訓(xùn)練隨機(jī)森林模型進(jìn)行年齡預(yù)測(cè),代碼如下:

import sklearn from sklearn.ensemble import RandomForestRegressorageDf = total_data[['Age', 'Pclass', 'Title', 'Name_length','Sex', 'Family_Size', 'Fare', 'Cabin', 'Embarked']] ageDf_notnull = ageDf.loc[ageDf['Age'].notnull()] ageDf_isnull = ageDf.loc[ageDf['Age'].isnull()]X = ageDf_notnull.values[:, 1:] y = ageDf_notnull.values[:, 0]RFR = RandomForestRegressor(n_estimators=1000, n_jobs=-1)# 訓(xùn)練 RFR.fit(X, y)predictAges = RFR.predict(ageDf_isnull.values[:, 1:]) total_data.loc[total_data['Age'].isnull(), 'Age'] = predictAges

然后,查看填充后的年齡數(shù)據(jù):

total_data['Age'].describe()

最后,分析是否存活群體的年齡差異:

# 查看年齡分布 plt.figure(figsize=(18, 5)) plt.subplot(131) total_data['Age'].hist(bins=70) plt.xlabel('Age') plt.ylabel('Num')plt.subplot(132) total_data.boxplot(column='Age', showfliers=False)# 查看是否存活群體的年齡差異 plt.subplot(133) sns.boxplot(x='Survived', y='Age', data=total_data)

箱形圖顯示是否存活群體的年齡差異并不大,最大值、最小值和平均值大小都差不多,而且都存在異常值(定義為小于Q1-1.5IQR或大于Q3+1.5IQR的值)。

進(jìn)一步分析票等級(jí)和性別不同年齡的存活分布:

fig, ax = plt.subplots(1, 2, figsize=((18, 8))) # 查看不同票等級(jí)不同年齡的存活分布 ax[0].set_title('Pclass and Age vs Survived') ax[0].set_yticks(range(0, 110, 10)) sns.violinplot(x='Pclass', y='Age', hue='Survived',data=total_data, split=False, linewidth=2, ax=ax[0])# 查看不同性別不同年齡的存活分布 ax[1].set_title('Sex and Age vs Survived') ax[1].set_yticks(range(0, 110, 10)) sns.violinplot(x="Sex", y="Age", hue="Survived",data=total_data, split=False, linewidth=2, ax=ax[1])

圖像如下:

小提琴圖 (Violin Plot)是用來顯示多組數(shù)據(jù)的分布狀態(tài)以及概率密度,它結(jié)合了箱形圖和密度圖的特征,主要用來顯示數(shù)據(jù)的分布形狀,在數(shù)據(jù)量很大的時(shí)候小提琴圖特別適用。通過上面分組小提琴圖,我們發(fā)現(xiàn)在不同票等級(jí)中存活下來的人員年齡相對(duì)更小(左),不同性別人員的存活與否年齡差異并不大(右)。

1.2.16 不同年齡分層的人員存活率分析(Age_group、Survived)

查看不同年齡的存活分布:

facet = sns.FacetGrid(total_data, hue='Survived', aspect=4) facet.map(sns.kdeplot, 'Age', shade=True) facet.set(xlim=(0, total_data['Age'].max())) facet.add_legend()

進(jìn)一步,對(duì)年齡分層處理:

bins = [0, 12, 18, 65, 100] total_data['Age_group'] = pd.cut(total_data['Age'], bins) print(total_data.groupby('Age_group')['Survived'].agg(['count', 'mean']))plt.figure(figsize=(10, 5)) sns.countplot(x='Age_group', hue='Survived', data=total_data) plt.title('Age group vs Survived')

可以看到年幼群體的群體的存活率最高,超過一半,為56.4%。

1.3 相關(guān)性分析

接下來,整體看一下數(shù)據(jù)的相關(guān)性。

total_data['Age_group'], uniques_age_group = pd.factorize(total_data['Age_group'])Correlation = pd.DataFrame(total_data[['Survived', 'Embarked', 'Sex', 'Title', 'Name_length', 'Family_Size', 'Family_Size_Category','Fare', 'Fare_bin', 'Pclass', 'Pclass_Fare_Category', 'Age', 'Age_group', 'Cabin' ]])# 查看數(shù)據(jù)相關(guān)性 colormap = plt.cm.viridis plt.figure(figsize=(14, 12)) plt.title('Pearson Correlation of Features', y=1.05, size=15) sns.heatmap(Correlation.astype(float).corr(method='kendall'),linewidths=0.1,vmax=1.0,square=True,cmap=colormap,linecolor='white',annot=True)

特征的皮爾遜相關(guān)系數(shù)圖如下:

變量關(guān)系組圖的代碼如下:

g = sns.pairplot(total_data[['Survived', 'Pclass', 'Sex', 'Age', 'Fare', 'Embarked', 'Family_Size','Title', 'Cabin']],hue='Survived',palette='seismic',height=1.2,diag_kind='kde',diag_kws=dict(shade=True),plot_kws=dict(s=10)) g.set(xticklabels=[])

圖像如下:

1.4 數(shù)據(jù)預(yù)處理

為了之后的預(yù)測(cè)能更好地構(gòu)建模型,將變量進(jìn)行one-hot編碼處理和數(shù)據(jù)標(biāo)準(zhǔn)化處理。

1.4.1?one-hot編碼處理

# 對(duì)分類變量進(jìn)行獨(dú)熱編碼 pclass_dummies = pd.get_dummies(total_data['Pclass'], prefix='Pclass') total_data = total_data.join(pclass_dummies)title_dummies = pd.get_dummies(total_data['Title'], prefix='Title') total_data = total_data.join(title_dummies)sex_dummies = pd.get_dummies(total_data['Sex'], prefix='Sex') total_data = total_data.join(sex_dummies)cabin_dummies = pd.get_dummies(total_data['Cabin'], prefix='Cabin') total_data = total_data.join(cabin_dummies)embark_dummies = pd.get_dummies(total_data['Embarked'], prefix='Embarked') total_data = total_data.join(embark_dummies)bin_dummies_df = pd.get_dummies(total_data['Fare_bin'], prefix='Fare_bin') total_data = total_data.join(bin_dummies_df)family_size_dummies = pd.get_dummies(total_data['Family_Size_Category'], prefix='Family_Size_Category') total_data = total_data.join(family_size_dummies)pclass_fare_dummies = pd.get_dummies(total_data['Pclass_Fare_Category'], prefix='Pclass_Fare_Category') total_data = total_data.join(pclass_fare_dummies)age_dummies = pd.get_dummies(total_data['Age_group'], prefix='Age_group') total_data = total_data.join(age_dummies)

1.4.2?標(biāo)準(zhǔn)化處理

from sklearn.preprocessing import StandardScalerscale_age_fare = StandardScaler().fit(total_data[['Age', 'Fare', 'Name_length']]) total_data[['Age', 'Fare', 'Name_length']] = scale_age_fare.transform(total_data[['Age', 'Fare', 'Name_length']])total_data_backup = total_data.drop(['PassengerId', 'Pclass', 'Name', 'Sex', 'SibSp', 'Parch','Ticket', 'Fare', 'Cabin', 'Embarked', 'Fare_bin', 'Pclass_Fare_Category', 'Title','Family_Size', 'Family_Size_Category', 'Age_int', 'Age_group'], axis=1, errors='ignore')total_data_backup.columns

輸出如下:

Index(['Survived', 'Age', 'Name_length', 'Pclass_1', 'Pclass_2', 'Pclass_3','Title_0', 'Title_1', 'Title_2', 'Title_3', 'Title_4', 'Title_5','Sex_0', 'Sex_1', 'Cabin_0', 'Cabin_1', 'Cabin_2', 'Cabin_3', 'Cabin_4','Cabin_5', 'Cabin_6', 'Cabin_7', 'Cabin_8', 'Embarked_0', 'Embarked_1','Embarked_2', 'Fare_bin_0', 'Fare_bin_1', 'Fare_bin_2', 'Fare_bin_3','Family_Size_Category_0', 'Family_Size_Category_1','Family_Size_Category_2', 'Pclass_Fare_Category_0','Pclass_Fare_Category_1', 'Pclass_Fare_Category_2','Pclass_Fare_Category_3', 'Pclass_Fare_Category_4','Pclass_Fare_Category_5', 'Age_group_0', 'Age_group_1', 'Age_group_2','Age_group_3'],dtype='object')

1.4.3 保存處理好的數(shù)據(jù)文件

為了下次的建模,注意保存處理好的數(shù)據(jù)文件,分開保存train和test數(shù)據(jù)集的代碼如下:

train_data = total_data_backup[:891] train_data.to_csv("./titanic/titanic_train.csv") test_data = total_data_backup[891:] test_data.to_csv("./titanic/titanic_test.csv")

由于篇幅有點(diǎn)長(zhǎng),建模預(yù)測(cè)部分放在另外一篇文章,鏈接請(qǐng)看評(píng)論區(qū)。

說明:記錄學(xué)習(xí)筆記,如果錯(cuò)誤歡迎指正!寫文章不易,轉(zhuǎn)載請(qǐng)聯(lián)系我。

總結(jié)

以上是生活随笔為你收集整理的PyTorch深度学习实践概论笔记8练习-kaggle的Titanic数据集预测(一)数据分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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