1. 程式人生 > >機器學習——畫圖方法

機器學習——畫圖方法

本篇部落格與Titanic部落格相關聯,是其第2部分內容,由於涉及大量通過視覺化圖形 進行資料預覽、分析的地方,因此獨立成篇,作為畫圖方法的筆記。

-

資料分析階段,我們要概覽資料,觀察每個特徵與標籤的關係,特徵需不要處理,比如多個特徵組合一個新特徵,無價值特徵捨棄,選擇有用特徵等等,這些前期工作比較繁瑣,但確是必須的。它讓我們更好的認識資料,對資料更加敏感。

1、預覽資料集

載入資料集

#  -*-  coding:utf-8  -*-
import numpy as np #科學計算
import pandas as pd #資料分析
from pandas import
Series, DataFrame data_train = pd.read_csv("all/train.csv") data_test = pd.read_csv('all/test.csv')

首先預覽下訓練集和測試集 先看訓練集

data_train.head(10)

這裡寫圖片描述 我們可以看到有一些特徵列,以及特徵的相應取值。 接著,總覽一下資料

data_train.info()
# 輸出
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 12
columns): PassengerId 891 non-null int64 Survived 891 non-null int64 Pclass 891 non-null int64 Name 891 non-null object Sex 891 non-null object Age 714 non-null float64 SibSp 891 non-null int64 Parch 891 non-null int64 Ticket 891
non-null object Fare 891 non-null float64 Cabin 204 non-null object Embarked 889 non-null object dtypes: float64(2), int64(5), object(5) memory usage: 83.6+ KB

我們可以看到,有891個樣本,其中Age、Cabin、Embarked三個特徵存在缺失值,這個資料處理階段要解讀此問題。 處理完缺失值後,可以再次使用data_train.info() 檢視一下進行確認。

data_train.describe()
#輸出

這裡寫圖片描述 可以看到各個樣本個數、平均值、標準差、最小值、最大值等資訊, 也可以

data_train['Age'].describe()

看到Age特徵,樣本有714個,平均年齡約為29.699歲,標準差14.52歲,最小年齡為0.42,最大年齡80。

data_train.Cabin.value_counts()
#輸出
C23 C25 C27    4
B96 B98        4
G6             4
F33            3
D              3
C22 C26        3
F2             3
E101           3
E8             2
B28            2
C83            2
C124           2
D36            2
....

可以看到Cabin特徵的一些內容資訊。

2、對每個特徵與生存率survivaled之間的關係進行分析

(1)分析Age與生存率survivaled的關係

import matplotlib.pyplot as plt
import matplotlib
# 顯示中文
from pylab import *
mpl.rcParams['font.sans-serif'] = ['SimHei'] 


fig = plt.figure()
fig.set(alpha=0.2)  # 設定圖表顏色alpha引數

plt.subplot2grid((2,3),(0,0))             # 在一張大圖裡分列幾個小圖
data_train.Survived.value_counts().plot(kind='bar')# 柱狀圖 
plt.title(u"獲救情況 (1為獲救)") # 標題
plt.ylabel(u"人數")  

plt.subplot2grid((2,3),(0,1))
data_train.Pclass.value_counts().plot(kind="bar")
plt.ylabel(u"人數")
plt.title(u"乘客等級分佈")

plt.subplot2grid((2,3),(0,2))
plt.scatter(data_train.Survived, data_train.Age)
plt.ylabel(u"年齡")                         # 設定縱座標名稱
plt.grid(b=True, which='major', axis='y') 
plt.title(u"按年齡看獲救分佈 (1為獲救)")


plt.subplot2grid((2,3),(1,0), colspan=2)
data_train.Age[data_train.Pclass == 1].plot(kind='kde')   
data_train.Age[data_train.Pclass == 2].plot(kind='kde')
data_train.Age[data_train.Pclass == 3].plot(kind='kde')
plt.xlabel(u"年齡")# plots an axis lable
plt.ylabel(u"密度") 
plt.title(u"各等級的乘客年齡分佈")
plt.legend((u'頭等艙', u'2等艙',u'3等艙'),loc='best') # sets our legend for our graph.

plt.subplot2grid((2,3),(1,2))
data_train.Embarked.value_counts().plot(kind='bar')
plt.title(u"各登船口岸上船人數")
plt.ylabel(u"人數")  

plt.show()

這裡寫圖片描述

data_train.Survived.value_counts().plot(kind='bar')# 柱狀圖 

kind =’bar’ 是柱狀圖 kind= ‘kde’ 是密度圖 我們看到了獲救人數的情況,乘客等級分佈情況、各個等級乘客年齡分佈情況、各個登船口岸登船人數的情況、年齡與生存率的關係

我們看到各個年齡段的人都有獲救和不獲救的情況存在。

(2)各個等級Pclass乘客獲救情況

#  -*-  coding:utf-8  -*-
fig = plt.figure()
fig.set(alpha=0.2)  # 設定圖表顏色alpha引數

Survived_0 = data_train.Pclass[data_train.Survived == 0].value_counts()
Survived_1 = data_train.Pclass[data_train.Survived == 1].value_counts()
df=pd.DataFrame({u'獲救':Survived_1, u'未獲救':Survived_0})
df.plot(kind='bar', stacked=True)
plt.title(u"各乘客等級的獲救情況")
plt.xlabel(u"乘客等級") 
plt.ylabel(u"人數") 
plt.show()
fig = plt.figure()

這裡寫圖片描述

明顯等級為1的乘客,獲救的概率高很多

(3)Sex與生存率的關係

#看看各性別的獲救情況
fig = plt.figure()
fig.set(alpha=0.2)  # 設定圖表顏色alpha引數

Survived_m = data_train.Survived[data_train.Sex == 'male'].value_counts()
Survived_f = data_train.Survived[data_train.Sex == 'female'].value_counts()
df=pd.DataFrame({u'男性':Survived_m, u'女性':Survived_f})
df.plot(kind='bar', stacked=True)
plt.title(u"按性別看獲救情況")
plt.xlabel(u"性別") 
plt.ylabel(u"人數")
plt.show()

這裡寫圖片描述 可以明顯看出,女性的獲救率遠高於男性,可以說是與生存率標籤聯絡非常緊密了。

#上面程式碼的部分解釋
Survived_m = data_train.Survived[data_train.Sex == 'male'].value_counts()
Survived_m
#輸出
0    468
1    109
Name: Survived, dtype: int64

(4)姓名與生存率的關係

其實在baseline的時候,我是沒有考慮姓名的,因為通常上來講,你叫什麼名字和你的生存率有個鬼關係。。如果想要看看其分析可以本篇博文最後所附的參考文獻。

但是最終,我還是選取了姓名這個特徵,並且該特徵起到了很重要的作用, 這是因為Name特徵中,如果你仔細觀察,會發現其包括對乘客的稱呼,如:Mr、Miss、Mrs等,稱呼資訊包含了乘客的年齡、性別,同時也包含了如社會地位等的稱呼,如:Dr,、Lady、Major、Master等的稱呼。 因此可以說姓名這個屬性包含極大的資訊量,不能捨棄。 其具體處理過程,在titanic這篇博文中進行了說明。 [ Kaggle——高分泰坦尼克災難生存預測詳細講解(LR、Bagging) ]

至於其他博文中說,研究名字長度與生存率的關係,emmm,怎麼說呢,從畫圖分析好像確實有影響,實際情況時,當災難發生,短名字可能更容易被別人叫? 或者短名字在災後記錄生存者的時候,更方便清點人員記錄,因此容易被記錄下來,emmm,總之,我感覺不是靠譜,因此最終模型也並未加入名字長短這個特徵,有興趣的可以點開本篇博文最後所附的參考文獻進行檢視。

(5)有無兄弟姐妹和存活與否的關係—SibSp

sibsp_df = data_train[data_train['SibSp'] != 0]
no_sibsp_df = data_train[data_train['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')

plt.show()

這裡寫圖片描述

可以看到,有兄弟姐妹的,生存率確實高一些。

(6)有無父母子女和存活與否的關係 Parch

parch_df = data_train[data_train['Parch'] != 0]
no_parch_df = data_train[data_train['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')

plt.show()

這裡寫圖片描述 通用我們可以看到,有父母的生存率稍稍比無父母的生存率高出一些。 我在實踐過程中,也將SibSp 和 Parch特徵 組合成了新特徵 Family_size,(Family_size=SibSp + Parch +1),但是結果評分反而下降了,其實通過觀察我們也能發現,有1-2個家人的,生存率會高,無家人的 和 家人過多的,生存率會低。

(7)票價分佈和存活與否的關係 Fare

首先繪製票價的分佈情況:

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

data_train.boxplot(column='Fare', by='Pclass', showfliers=False)
plt.show()

這裡寫圖片描述 這裡寫圖片描述

繪製生存與否與票價均值和方差的關係: 這裡寫圖片描述

由上圖示可知,票價與是否生還有一定的相關性,生還者的平均票價要大於未生還者的平均票價。

(8)船艙型別和存活與否的關係 Cabin

由於Cabin的缺失值較多,因此我們取有Cabin值和無Cabin值作為特這,通過畫圖分析,我們可以看到,有Cabin值的乘客生存率要大於沒有的乘客。 雖然我覺得這麼做有點扯,但也不是完全沒有道理,清點人員在災難後記錄Cabin值的時候,往往只有存活者才可以提供Cabin,死亡者Cabin隨著票一起丟失了。

(9)港口和存活與否的關係 Embarked

import seaborn as sns
sns.countplot('Embarked', hue='Survived', data=data_train)
plt.title('Embarked and Survived')
Text(0.5,1,'Embarked and Survived')

這裡寫圖片描述

sns.factorplot('Embarked', 'Survived', data=data_train, size=3, aspect=2)
plt.title('Embarked and Survived rate')
plt.show()

這裡寫圖片描述

由上可以看出,在不同的港口上船,生還率不同,C最高,Q次之,S最低。

(10)Ticket、PassengerID特徵

PassengerID 是乘客身份的唯一標識,Ticket特徵也差不多,因此,其與生存率可以說是沒有任何關係了。

至此,11個特徵分析完畢,survival特徵作為標籤。