摘要:背景知識泰坦尼克號年月從英國南安普頓出發,途徑法國,愛爾蘭在美國大西洋碰觸冰山沉沒,一部分人幸免于難,一部分人沒有生存,這個案例中就是要通過機器學習的算法來預測一下中人的生存狀況。
背景知識:
泰坦尼克號1912年4月從英國南安普頓出發,途徑法國,愛爾蘭在美國大西洋碰觸冰山沉沒,一部分人幸免于難,一部分人沒有生存,這個案例中就是要通過機器學習的算法來預測一下test.csv中418人的生存狀況。案例詳細內容可以訪問網站:https://www.kaggle.com/c/titanic。通過這個案例你可以大致掌握一個機器學習的基本步驟,本文最后附上案例的源碼。
一、提出問題首先我們從kaggle上下載了泰坦尼克號案例的train.csv和test.csv兩個數據,這里我為大家已經下好,大家可以在百度網盤里下載,地址:鏈接:https://pan.baidu.com/s/1RV-U... 密碼:zlkj。
二、理解數據首先導入數據,可以看到訓練數據集train.csv中有891行,12列數據,而測試數據集中有418行,11列數據;缺少的這一列數據正是我們要預測的生存狀況數據。
import numpy as np import pandas as pd #導入訓練集 train = pd.read_csv("train.csv") #導入測試集 test = pd.read_csv("test.csv") #查看測試數據集合訓練數據集的形狀 # print("訓練數據集:",train.shape) # print("測試數據集:",test.shape) full = train.append(test,ignore_index=True) # print("合并后的數據集:",full.shape) # print(full.head(10))
通過實驗結果我們可以知道,每一名乘客都對應著一個12維數據,其含義是:
1.Age:乘客年齡 2.Cabin:乘客船艙座位號 3.Embarked:乘客登船的港口,有三個可選值:S:南安普頓,C:法國瑟堡 Q:愛爾蘭昆士敦 4.Fare:船票費用 5.Name:乘客姓名 6.parch:乘客的父母與子女數量 7.PassengerId:乘客ID 8.Pclass:乘客所在的船艙等級,1;一等,2;二等;3:三等 9.sex:乘客性別 10.SibSp:乘客的兄弟姐妹以及配偶數量 11.Survived:乘客是否存活標志;1:活著的 0:死亡 12.Ticket:票的編號
總數據有1309行,Age、Cabin、Embarked、Fare這四列數據中有缺失的情況,接下來的第三步就是要清洗數據,填補缺失值。
三、清洗數據首先處理一下缺失的數據,如果缺失的數據是數字類型的,可以用平均數代替,如果是字符串類型的,可以用出現最多的數(眾數)來替代。
# 填充年齡缺失值 full.Age = full.Age.fillna(full.Age.mean()) # 填充船票價格缺失值 full.Fare = full.Fare.fillna(full.Fare.mean()) # #填充登船的港口,因為最多的為s,故將所有的缺失值填充為S full.Embarked = full.Embarked.fillna("S") # 由于船票號這一欄缺失值過多,故將其填充為U full.Cabin = full.Cabin.fillna("U")
在做好這一步之后,數據還需要對一些列的字符串數據類型進行編碼,比如Sex性別的分類數據,需要進行one-hot編碼,方便機器學習識別。這里需要對性別、港口和姓名、船艙等級這些分類數據,進行重新編碼。應用map函數可以對一列數據做同一個操作:
sexDict = {"male":1,"female":0} sex = full.Sex.map(sexDict) print(sex.head())
登船的港口有三個,分別是英國南安普頓、法國瑟堡、愛爾蘭昆士敦,分別用首字母S、C、Q表示。
embarked = pd.DataFrame() embarked = pd.get_dummies(full.Embarked,prefix="Embarked") print(embarked.head()) #對船艙等級采取同樣的方法 pclass = pd.DataFrame() pclass = pd.get_dummies(full.Pclass,prefix="Pclass") print(pclass.head())
接下來我們看一下名字這一列的數據字符串格式:名,頭銜,姓,我們需要從名字里面獲取頭銜來判定是否對生存情況的影響。通過定義一個函數:
第一步獲取name1剔除名字中逗號前面的名,
第二步剔除名字中冒號后面的姓,
第三步用strip函數剔除字符串頭尾指定的字符(默認為空格)然后返回中間的頭銜。
第四步應用函數,用一個表格型數據Df存放提取后的頭銜,
第五步講姓名中的頭銜字符串與定義頭銜類別的映射關系,再把頭銜進行one-hot編碼,
def title1(name): name1 = name.split(",")[1] name2 = name1.split(".")[0] #使用strip函數提出姓名列的頭尾,獲得頭銜 name3 = name2.strip() return name3 titleDf = pd.DataFrame() titleDf["Title"] = full.Name.map(title1) titleDict = { "Capt":"officer", "Col":"officer", "Major":"officer", "Dr":"officer", "Rev":"officer", "Jonkheer":"Royalty", "Don":"Royalty", "Sir":"Royalty", "the Countess":"Royalty", "Dona":"Royalty", "Lady":"Royalty", "Mlle":"Miss", "Miss":"Miss", "Mr":"Mr", "Mme":"Mrs", "Ms":"Mrs", "Mrs":"Mrs", "Master":"Master" } titleDf["Title"] = titleDf["Title"].map(titleDict) titleDf = pd.get_dummies(titleDf["Title"]) print(titleDf.head())
接著從座位號提取坐席類別,用seat存放客艙號的信息坐席類別就是座位號的首字母,比如C85,類別映射為首字母C,用U代表不知道的數據。使用lambda匿名函數提取Cabin中的首字母:
seat = pd.DataFrame() seat["seat"] = full["Cabin"] seat.seat = seat.seat.map(lambda a:a[0]) #使用one-hot編碼 seat = pd.get_dummies(seat.seat,prefix="Cabin") #print(seat.head())
對船上每一個乘客的家庭成員數量進行一個統計。分別將原始數據中的SibSp列和Parch中的數據相加,再加上被統計者自身。
#對船上每一個乘客的家庭成員數量進行一個統計 family = pd.DataFrame() family["family"] = full.SibSp + full.Parch + 1 #print(family.head())
最后就是將原始數據復制一份,刪除我們剛剛對其中重新編碼的列(Cabin、Name、Sex、Pclass、Embarked、Parch、SibSp;還有票的編號Ticket這一列沒有關系的數據。
最后合并的列包括了剛剛處理產生的新列名比如:da、family、seat、titleDf、pclass、embarked、sex。我們發現新的數據da有1309行,27列。
刪除我們剛剛對其中重新編碼的列(Cabin、Name、Sex、Pclass、Embarked、Parch、SibSp; 還有票的編號Ticket這一列沒有關系的數據.最后合并的列包括了剛剛處理產生的新列名比如:da、family、seat、titleDf、pclass、embarked、sex.我們發現新的數據da有1309行,27列
da = train.append(test,ignore_index=True) #采取同樣的方式填充缺失值 da.Age = da.Age.fillna(da.Age.mean()) da.Fare = da.Fare.fillna(da.Fare.mean()) da.Embarked = da.Embarked.fillna("S") da.Cabin = da.Cabin.fillna("U") #提出不需要的列 da = da.drop(["Name","Pclass","Cabin","Parch","Embarked","SibSp","Ticket","Sex"],axis=1) #合并修改后的列 da = pd.concat([titleDf,seat,family,pclass,embarked,da,sex],axis=1) #print(da.shape) #print(da.head())四、模型建立與評估 第一步:用數據框corr()得到相關系數矩陣, 第二步:講相關系數矩陣的生存情況的列提取出來,分別按照降序排列和升序排列
#使用數據框corr獲取相關系數矩陣,將相關系數提取出來,按照升序和降序排列 corrDf = da.corr() #print(corrDf["Survived"].sort_values(ascending=False)) #print(corrDf["Survived"].sort_values(ascending=True))
我們發現相關系數大于0的列中:頭銜、客艙等級、船票價格、船艙號都與生存狀況呈現正線性關系在相關系數小于0的列中:頭銜、性別、客艙等級、客艙號與生存情況呈現負線性相關。這些特征其實與我們在數據清洗過程中處理的列非常相關,這里我們直接采用上一步最后形成的新數據da
第三步:我們在原始訓練數據中有891行,選取特征和標簽,然后對這個數據進行拆分訓練集和測試集,#將原始數據集拆分為訓練集合評估集 sourceRow = 891 source_X = da.loc[0:sourceRow-1,:] source_X = source_X.drop(["Survived"],axis =1) source_y =da.loc[0:sourceRow-1,"Survived"] #拆分訓練集和測試集 train_X,test_X,train_y,test_y = train_test_split(source_X,source_y,train_size=0.8) #輸出數據集大小 # print("原始數據集特征:",source_X.shape) # print("訓練集特征:",train_X.shape) # print("測試集特征:",test_X.shape) # print("原始數據集標簽:",source_y.shape) # print("訓練數據集標簽:",train_y.shape) # print("測試數據集標簽:",test_y.shape)第四步是導入算法,訓練模型:
導入訓練數據的特征train_X712條,包括性別,頭銜等,導入標簽train_y712條生存狀況,得到正確率0.87:
#使用邏輯回歸模型 model = LogisticRegression() #使用數據,訓練模型 model.fit(train_X,train_y) # print(model.fit(train_X,train_y)) # print(model.score(test_X,test_y))第五步:方案實施
用機器學習模型,對預測數據集中的生存情況進行預測,這里用乘客的ID,數據框Df保存預測情況的值。
#方案實施,對預測數據集中的數據進行預測 predict_X = da.loc[sourceRow:,:] predict_X = da.drop(["Survived"],axis=1) pred_Y = model.predict(predict_X) pred_Y = pred_Y.astype(int) #乘客ID passenger_id = da.loc[sourceRow,"PassengerId"] predDf = pd.DataFrame({"PassengerId":passenger_id,"Survived":pred_Y}) print(predDf.shape) print(predDf)
最后附上源碼:鏈接:https://pan.baidu.com/s/1cb60... 密碼:y12u。
有興趣的可以在閱讀本文點贊,歡迎評論哦!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/41454.html
摘要:背景知識泰坦尼克號年月從英國南安普頓出發,途徑法國,愛爾蘭在美國大西洋碰觸冰山沉沒,一部分人幸免于難,一部分人沒有生存,這個案例中就是要通過機器學習的算法來預測一下中人的生存狀況。 背景知識: 泰坦尼克號1912年4月從英國南安普頓出發,途徑法國,愛爾蘭在美國大西洋碰觸冰山沉沒,一部分人幸免于難,一部分人沒有生存,這個案例中就是要通過機器學習的算法來預測一下test.csv中418人的...
摘要:通用性一種新的基于數據類型的深度學習模型設計方法,使該工具可以跨許多不同的應用領域使用。可理解性深度學習模型內部通常被認為是黑匣子,但是該庫提供標準的可視化來理解它們的性能并比較它們的預測。 昨日,Uber官網重磅宣布新開源深度學習框架Ludwig,不需要懂編程知識,讓專家能用的更順手,讓非專業人士也可以玩轉人工智能,堪稱史上最簡單的深度學習框架!Ludwig是一個建立在TensorFlow...
??蘇州程序大白一文從基礎手把手教你Python數據可視化大佬??《??記得收藏??》 目錄 ????開講啦!!!!????蘇州程序大白?????博主介紹前言數據關系可視化散點圖 Scatter plots折線圖強調連續性 Emphasizing continuity with line plots同時顯示多了圖表 數據種類的可視化 Plotting with categorical da...
閱讀 1438·2021-09-22 15:43
閱讀 2154·2019-08-30 15:54
閱讀 1154·2019-08-30 10:51
閱讀 2082·2019-08-29 18:35
閱讀 426·2019-08-26 11:58
閱讀 2476·2019-08-26 11:38
閱讀 2432·2019-08-23 18:35
閱讀 3627·2019-08-23 18:33