您好,登錄后才能下訂單哦!
本篇內容主要講解“如何使用python對泰坦尼克號幸存者進行數據分析與預測”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“如何使用python對泰坦尼克號幸存者進行數據分析與預測”吧!
當我們成功注冊賬號后,可以在競賽鏈接中找到泰坦尼克沉船存活的競賽鏈接,如下圖所示:
進入競賽頁面后,可以看到關于競賽的簡單介紹以及其他人的代碼等內容,在這里我們點擊Data。
注意下面的數據介紹,這里的數據介紹將會幫助我們了解數據的基本情況以及其代表的內容。
我們獲取到數據之后,打開編譯環境準備開始進行數據分析,在本文中我使用的是jupyter進行數據分析,當然可以選擇自己習慣的編譯環境進行后續的工作。
拿到數據之后,我們首先編寫代碼將其讀取進編譯環境中,代碼如下:
# 導入pandas import pandas as pd # 將訓練集數據導入 data = pd.read_csv('train.csv')
導入數據后的結果如下:
在我們拿到數據后,我們需要對數據進行初步的觀察以及數據清洗。這里介紹Kaggle大佬提出的數據清理4C原則,其分別是:
Correcting(糾正):顧名思義,糾正數據就是對數據進行異常值的處理。例如年齡如果存在100+的數據,那么這一定是不正常的值。我們將對不同的數據進行異常值的檢查以確保其是正常有效的。但是,當我們從原始的數據中修改數據的時候一定要謹慎行事,因為建立一個準確的模型的基石就是數據,數據決定了模型的好壞
Completing(補充):補充缺失值以及被我們所發現的異常值是必須的。雖然在某些模型中,可以自動的幫助我們處理缺失值兒不需要處理(例如決策樹)。在這部分中,我們通常會選擇缺失占比小的缺失值進行刪除,兒占比較大或者占比非常大的缺失值,我們會考慮在原有的數據中探尋某種規律將其進行填充。
Creating(創建):特征工程中需要我們對原有的特征進行理解并決定是否提取新的特征。例如,在本題中我們可以考慮對年齡進行分段作為一個新的特征考慮在內。當然這里的前提是,我們對問題有一個深刻的了解,探尋我們提取的特征是否真的能夠對最后的模型構建有幫助。這就需要我們反復驗證,思考進行提取特征,找尋到真正對不同問題有幫助的特征。
Converting(轉換):在針對某些特定的數據格式的時候,可能還需要我們進行數據轉換。這當然是非常重要的,例如某些字符串類型的數據,需要我們轉換為數值的形式來表示。
在這一步中,我們將調用pandas中的基本函數對數據進行初步的觀察。我們首先調用info()查看數據的類型以及基本情況,代碼如下:
data.info()
結果如下:
當我們調用該函數后,可以看到所有數據的類型以及基本情況。
這里需要注意我標注的數據,我們發現Age數據與其它數據相比數量少了很多,也就是我們說的缺失值。與此同時,可以看到Cabin以及Embarked也存在缺失的情況。
這些都需要我們關注,并在后續進行一些處理。
隨后,我們調用describe()函數進一步觀察數據的分布情況,該函數可以幫助我們計算每列數據的分布以及平均值等內容。代碼如下:
data.describe()
結果如下:
這里我們發現Parch數據的75%都是0,存在明顯的分布不均勻的情況,后續可能需要處理。
在上節中,我們發現數據存在一定的缺失情況,我們首先對其進行可視化,這能夠使得我們對數據的觀察更直觀。
在這里我們用到了missingno庫進行缺失數據的可視化,其對缺失數據的可視化更加直觀。
使用之前,請確保自己已經安裝該庫。
使用該庫進行可視化的代碼如下:
# 在數據中抽樣100個單位 data_sample = data.sample(100) msno.matrix(data_sample)
結果如下:
可以發現,Cabin的缺失值較為明顯,Age也存在一些缺失值。
因為數據中每列代表的情況不盡相同,所以我們將針對數據進行不同的處理方法。
我們再通過代碼來觀察一下缺失的數據情況,代碼與結果如下:
missing_data = data.isnull().sum() missing_data = missing_data [missing_data >0] missing_data
我們首先處理Embarked列,在上邊的數據觀察中發現其擁有兩個缺失值,因為相對于全部的一千條數據來說其量級較小,所以我們在這里直接選擇該列缺失的兩條數據進行刪除處理,代碼如下:
# 在data中尋找Embarked的缺失值 找到后在原表中將其行刪除 data.dropna(axis=0, how='any',subset=['Embarked'], inplace=True)
dropna 參數介紹:
axis: default 0指行,1為列
how: {‘any’, ‘all’}, default ‘any’指帶缺失值的所有行;'all’指清除全是缺失值的
thresh: int,保留含有int個非空值的行
subset: 對特定的列進行缺失值刪除處理
inplace: 這個很常見,True表示直接在原數據上更改
在上述觀察中,我們發現Age存在一定的缺失情況,接下來我們對其進行處理。
我們由Kaggle中的數據介紹中了解到,其表示乘客的年齡,且缺失值相對來說較多,不能夠直接采用刪除的方式。
我們首先觀察Age的分布情況,繪制年齡的直方圖,代碼如下:
data.hist(column='Age')
結果如下:
我們注意到,年齡的分布存在一定的偏態,這時候更適合采用中位數進行填充。
注意:偏態分布的大部分值都聚集在變量分布的一側,中位數可以很好的表示中心趨勢。
所以,我們對年齡的缺失值進行中位數的填充。代碼如下:
data['Age'].fillna(data['Age'].median(), inplace=True)
至此,我們對于年齡的缺失值處理完畢。
我們首先看一下Cabin的數據解釋:Cabin number(機艙號碼)
對于該特征來說,仿佛對于最終的數據幫助不大。即使其對于最后的數據是非常重要的,由于其缺失值過多且不容易探尋其中的規律,我們還是選擇對其做刪除的處理。
代碼如下:
# 這里我直接刪除了該列 del data['Cabin']
至此,所有數據的缺失值處理完畢。
在本例中,我們能夠進行檢測并處理的主要是Age特征,因為我們預先知道其大概的范圍。在這里我們繪制箱線圖觀察其數據的異常情況決定是否需要進行處理,代碼如下:
data['Age'].plot.box()
結果如下:
在這里,我們可以看到該數據的最高點在80,符合我們對于數據的預先認知,遂不進行處理。
在這部分中,要求我們對不同的特征有一定的了解以及認識,在這里我列出所有的特征含義。
特征名稱含義survival是否存活,1表示存活,0表示沒有pclass表示票的種類,分別為1,2,3等sex性別Age年齡sibsp在泰坦尼克號上的兄弟姐妹/配偶的數量parch在泰坦尼克號上的父母/子女人數ticket票號fare乘客票價cabin機艙號embarked上岸港口 ,C = Cherbourg, Q = Queenstown, S = Southampton
在這里,我們提取兩個特征,分別是乘客家庭規模,是否獨自一人,并對票價以及年齡進行分段構造兩個新的特征。
注意:針對不同的項目采取的特征提取工作并不相同,因為這需要根據具體的業務進行分析并提取。
我們首先針對家庭規模以及是否獨自一人創建新的兩個特征,代碼如下:
data['FamilySize'] = data['SibSp'] + data['Parch'] + 1 data['IsAlone'] = 1 data['IsAlone'].loc[data['FamilySize'] > 1] = 0
然后,我們對年齡和票價進行分段,代碼如下:
data['FareBin'] = pd.qcut(data['Fare'], 4) data['AgeBin'] = pd.cut(data['Age'].astype(int), 5)
這里簡單介紹一下上述兩個函數的區別與作用
qcut:根據傳入的數值進行等頻分箱,即每個箱子中含有的數的數量是相同的。
cut:根據傳入的數值進行等距離分箱,即每個箱子的間距都是相同的。
特別的,在本節中特征工程的過程要根據實際業務進行不同的特征提取,這個過程需要我們對業務有足夠的理解程度。幾個好的特征對后續的模型精確程度有很大的積極影響。
某些特定的格式在很多模型中其實是不適用的,在本例中經過上述處理后的數據如下所示:
圖中的性別等內容都為字符類型,這顯然在模型中存在一定的不兼容情況,這就需要我們進行一定程度的格式轉換。
在本部分中,我們要處理的有以下幾個部分:
PassengerId:用戶id的部分對后面的預測仿佛用處不大,我們對其進行刪除。Name:這里的名字中有MR.MISS等信息,這可能對后續的模型有幫助,我們對其進行處理保留。Sex:需要進行編碼使用,因為它是字符串類型。Ticket:仿佛用處不大,這里我們選擇刪除。Embarked:需要進行編碼使用,因為它是字符串類型。FareBin:需要進行編碼使用,因為它是一個范圍。AgeBin:需要進行編碼使用,因為它是一個范圍。
我們首先對需要刪除的兩列進行刪除的操作,代碼如下:
del data['PassengerId'] del data['Ticket']
然后我們對Name進行處理,將其中的身份信息提取出來,代碼如下:
data['Title'] = data['Name'].str.split(", ", expand=True)[1].str.split(".", expand=True)[0]
結果如下:
最后,我們對需要編碼的數據進行編碼:
from sklearn.preprocessing import OneHotEncoder, LabelEncoder label = LabelEncoder() data['Sex_Code'] = label.fit_transform(data['Sex']) data['Embarked_Code'] = label.fit_transform(data['Embarked']) data['Title_Code'] = label.fit_transform(data['Title']) data['AgeBin_Code'] = label.fit_transform(data['AgeBin']) data['FareBin_Code'] = label.fit_transform(data['FareBin'])
編碼后的結果如下:
至此,數據格式轉換已經完畢。
在本節中,我們將基于上述數據進行模型的構建,并且通過不同的評價指標進行構建。
在這里我將會使用基礎的分類模型進行模型的構建,并挑選出初步表現最好的模型進行參數調節。代碼如下:
# 處理不需要的數據列 data_x = data.copy() del data_x['Survived'] del data_x['Name'] del data_x['Sex'] del data_x['FareBin'] del data_x['AgeBin'] del data_x['Title'] del data_x['Embarked'] # 構建y data_y = data['Survived'] # 導入包 from sklearn import svm, tree, linear_model, neighbors, naive_bayes, ensemble, discriminant_analysis, gaussian_process from sklearn.model_selection import cross_val_score # 定義常用的幾種分類模型 MLA = { #隨機森林 '隨機森林':ensemble.RandomForestClassifier(), #邏輯回歸 '邏輯回歸':linear_model.LogisticRegressionCV(max_iter=3000), #SVM 'SVM':svm.SVC(probability=True), #樹模型 '樹模型':tree.DecisionTreeClassifier(), } # 進行5折交叉驗證并選擇f1作為評價指標 for model_name in MLA: scores = cross_val_score(MLA[model_name], X=data_x, y=data_y, verbose=0, cv = 5, scoring='f1') print(f'{model_name}:',scores.mean())
結果如下:
我們可以看到,目前隨機森林的效果最好,所以我們選擇隨機森林進行參數調節。
在這里我們選擇使用網格調參的方式進行參數調節,代碼如下:
from sklearn.model_selection import GridSearchCV n_estimators = [3,5,10,15,20,40, 55] max_depth = [10,100,1000] parameters = { 'n_estimators': n_estimators, 'max_depth': max_depth} model = ensemble.RandomForestClassifier() clf = GridSearchCV(model, parameters, cv=5) clf = clf.fit(data_x, data_y) clf.best_estimator_
結果如下:
在這里,我們選擇了幾個簡單的參數進行調節,可以根據自己的實際情況對不同的參數進行調節。我們再進行一次交叉驗證求平均值看一下效果,結果如下:
可以看到與剛才的效果相比有一些提升。
到此,相信大家對“如何使用python對泰坦尼克號幸存者進行數據分析與預測”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。