Kaggle項目--Titanic生存率預測

Kaggle項目--Titanic生存率預測

來自專欄 小數據,大世界

機器學習的流程

提出問題-->理解數據-->數據清理(特徵工程)-->構建模型-->模型評估-->方案實施


泰坦尼克號生存率預測案例,數據來源於kaggle。

一、提出問題:

從kaggle提供的數據,預測得出Titanic上乘客生存率。

二、理解數據:

  • 同代直系親屬數:兄弟數+姐妹數+配偶數
  • 不同代直系親屬數:父母數+子女數

三、數據清洗:

  • 將kaggle提供的train數據集和test數據集合併在一起,便於將數據一起清洗。

#讀入Train數據train = pd.read_csv(rC:UsersAdministratorDesktop rain.csv)#讀入Test數據test = pd.read_csv(rC:UsersAdministratorDesktop est.csv)#輸出對應數據集的大小print(訓練數據集:,train.shape,測試數據集:,test.shape)#合併數據集full = train.append(test,ignore_index=True)full.head()

注意:ignore_index=True與False的區別

  • 查看數據是否異常

1.用describe函數查看描述統計信息(describe方法只能查看數據信息,無法查看字元串數據信息)

從上面可以發現:

  • Age列缺失值比較多,後面需要處理。
  • Fare列的最小票價為0,這不符合常識。

2.用info方法查看數據

紅框中的數據都有缺失

(一)數據清洗:缺失數據的處理

數據清洗步驟:

選擇子集-->列名重命名-->缺失數據處理-->數據類轉換-->數據排序-->異常值處理


數據清洗第一步:缺失數據的處理


1、對Age列的空值進行填充

#age空值填充full[Age]=full[Age].fillna(full[Age].mean())

2、對Fare列的空值進行填充和最小值0進行處理

#fare的空值填充full[Fare]=full[Fare].fillna(full[Fare].mean())

  • 對Fare中的最小值0進行處理

#將Fare中值為0,替換為Fare的均值:方法1full[Fare]=np.where(full[Fare]==0,full[Fare].mean(),full[Fare])

使用了where的方法進行處理。

#將Fare中值為0,替換為Fare的均值:方法2full[Fare].replace({0:full[Fare].mean()},inplace=True)

使用replace的方法,參數傳入一個對應字典。

3、對Embarked的缺失值處理

  • 查看哪個港口上船的較多

登船港口:缺失值處理。S-英國南安普頓C-法國瑟堡市Q-愛爾蘭昆士敦full[Embarked].head()

  • 將登船港口較多的英國南安普頓(S)作為缺失值填充

#登船港口只確失2個值,將其填充為Sfull[Embarked]=full[Embarked].fillna(S)

4、將船艙號Cabin進行填充,由於缺失較多,填充為"U",表示未知。

#船艙號缺失較多,將其填充為U,表示未知full[Cabin]=full[Cabin].fillna(U)


數據清洗第二步:特徵工程


(二)數據清洗:特徵工程

特徵工程:最大限度地從原始數據中提取特徵,以供機器學習演算法和模型進行使用。

特徵工程的步驟:特徵提取-->特徵選擇、特徵降維

特徵提取:

  • 數值數據-->直接使用
  • 時間序列數據-->轉化為單獨年、月、日
  • 分類數據:用數據代替分類(1--男,0--女),超過2個類別使用One-hot編碼。one-hot編碼後我們稱其為虛變數或啞變數,通常用數字1和0表示不同屬性。

對各種數據類型分類(圖片來自猴子學習社區)

(一)特徵工程:特徵提取

1、分類數據特徵提取:性別

將性別映射為數值男(male)映射為1,女(female)映射為0sex_mapDic = {male:1, female:0}full[Sex] = full[Sex].map(sex_mapDic)full.head()

使用map函數

2、分類數據特徵提取:登船港口

#使用One-hot對登船港口Embarked元素進行編碼embarkDf = pd.get_dummies(full[Embarked],prefix = Embarked)#將embarkDf連接到full中full = pd.concat([full,embarkDf],axis = 1)#刪除full中的『Embarked』full.drop(Embarked,axis =1 ,inplace = True)full.head()

使用get_dummies進行one-hot編碼

3、分類數據特徵提取:船艙等級

#使用get_dummies對PClass的船艙等級進行one-hot編碼pclassDf = pd.get_dummies(full[Pclass],prefix=Pclass)#將pclassDf連接到full中full = pd.concat([full,pclassDf],axis=1)#刪除full中的『Pclass』full.drop(Pclass,axis=1,inplace = True)full.head()

4、分類數據特徵提取:姓名

自定義一個函數:從姓名中獲取頭銜參數:姓名』字元串返回:姓名的Ttiledef getTitle(name): str1 = name.split(,)[1] str2 = str1.split(.)[0] #strip去除字元串中頭尾中指定的字元(默認為空格) str3 = str2.strip() return str3titleDf = full[Name].map(getTitle)titleDf.head()

定義以下幾種頭銜類別:Officer政府官員Royalty王室(皇室)Mr已婚男士Mrs已婚婦女Miss年輕未婚女子Master有技能的人/教師#姓名中頭銜字元串與定義頭銜類別的映射關係title_mapDict = { "Capt": "Officer", "Col": "Officer", "Major": "Officer", "Jonkheer": "Royalty", "Don": "Royalty", "Sir" : "Royalty", "Dr": "Officer", "Rev": "Officer", "the Countess":"Royalty", "Dona": "Royalty", "Mme": "Mrs", "Mlle": "Miss", "Ms": "Mrs", "Mr" : "Mr", "Mrs" : "Mrs", "Miss" : "Miss", "Master" : "Master", "Lady" : "Royalty" }#用map函數對titleDf的進行計算titleDf=titleDf.map(title_mapDict)#使用one-hot編碼titleDf=pd.get_dummies(titleDf)titleDf.head()

#將titleDf連接到full中full = pd.concat([full,titleDf],axis=1)#將full中的Name去除full.drop(Name,axis=1,inplace=True)full.head()

5、分類數據特徵提取:船艙號

使用lambda函數lambda 參數1,參數2:函數體或者表達式full[Cabin]=full[Cabin].map(lambda c:c[0])#使用one-hot編碼cabinDf = pd.get_dummies(full[Cabin],prefix=Cabin)#將cabinDf連接起來full = pd.concat([full,cabinDf],axis=1)#刪除full中的Cabinfull.drop(Cabin,axis=1,inplace=True)full.head()

6、分類數據特徵提取:家庭類別

家庭人數=Parch + SibSp + 乘客自己(因為乘客自己也是家庭成員的一個,所以這裡加1)familyDf = pd.DataFrame()familyDf[FamilySize] = full[Parch]+full[SibSp]+1小家庭:family_Small 家庭人數= 1中家庭:family_Median 家庭人數 <=4大家庭:family_Large 家庭人數 >4familyDf[family_Small]=familyDf[FamilySize].map(lambda s :1 if s ==1 else 0)familyDf[family_Median]=familyDf[FamilySize].map(lambda s: 1 if 1 <s <=4 else 0)familyDf[family_Large]=familyDf[FamilySize].map(lambda s: 1 if s > 4 else 0)familyDf.head()

(二)特徵工程:特徵選擇

1、用相關係數決定選擇哪些係數

#計算相關係數方法決定選擇哪些特徵corrDf=full.corr()corrDf

2、將CorrDf中的『Survived』按降序排列

查看各個特徵與生成情況(Survived)的相關係數,ascending=False表示按降序排列corrDf[Survived].sort_values(ascending=False)

3、選擇特診

#特徵選擇full_X = pd.concat( [titleDf,#頭銜 pclassDf,#客艙等級 familyDf,#家庭大小 full[Fare],#船票價格 cabinDf,#船艙號 embarkedDf,#登船港口 full[Sex]#性別 ] , axis=1 )#使用reset_index將新的DataFrame的行號回歸默認值full_X.reset_index()


四、構建模型

1、將數據分成三部分:原始數據集(包括Train數據集和Test數據集)和預測數據集(predic)

我們使用kaggle提供的train數據作為我們的原始數據集,kaggle提供的test數據作為預測數據集(predic)我們從kaggle的原始數據集分辨出train數據和test數據sourceRow=891#原始數據特徵source_X = full_X.loc[0:sourceRow-1,:]#原始數據標籤Source_y=full.loc[0:sourceRow-1,Survived]#預測數據集Pred_X = full_X.loc[sourceRow:,:]

2、將原始數據集分成:Train數據集和Test數據集

從source中分出訓練數據集(train)和測試數據集(test)from sklearn.cross_validation import train_test_splittrain_X,test_X,train_y,test_y = train_test_split(source_X, Source_y, train_size = 0.8)

3、選擇機器學習演算法:

#導入演算法from sklearn.linear_model import LogisticRegressionmodel = LogisticRegression()model.fit(train_X,train_y)

4、訓練模型

#第3步:訓練模型model.fit( train_X , train_y )

五、評估模型

# 分類問題,score得到的是模型的正確率model.score(test_X , test_y )

六、方案實施

#使用機器學習模型,對預測數據集中的生存情況進行預測pred_Y = model.predict(pred_X)生成的預測值是浮點數(0.0,1,0)但是Kaggle要求提交的結果是整型(0,1)所以要對數據類型進行轉換pred_Y=pred_Y.astype(int)#乘客idpassenger_id = full.loc[sourceRow:,PassengerId]#數據框:乘客id,預測生存情況的值predDf = pd.DataFrame( { PassengerId: passenger_id , Survived: pred_Y } )predDf.shapepredDf.head()#保存結果predDf.to_csv( titanic_pred.csv , index = False )

以上是我第一個泰坦尼克項目完成情況,如有不對之處,請大家批評指出。

推薦閱讀:

導讀 | 導圖規則、文章主題與如何下載
用Cython來提高Python代碼速度 [一]
從微積分和線性代數角度看線性最小二乘原理
跨行之痛
Teradata SQL基礎:從已有表創建新表

TAG:數據科學 | 機器學習 |