Kaggle實戰項目:泰坦尼克號預測
機器學習步驟
Kaggle實戰項目:泰坦尼克號預測
1、提出問題:泰坦尼克號人員是否生存預測
2、理解數據:
#導入數據import numpy as npimport pandas as pd
讀取數據
#訓練數據集train=pd.read_csv("./train.csv")#測試數據集test=pd.read_csv("./test.csv")print(訓練數據集:,train.shape,測試數據集:,test.shape)
數據讀取失敗的解決辦法:
import osos.getcwd()
使用以上代碼查看運行路徑,將要讀取的文件拖拽到結果文件夾
合併數據集一起處理更高效
#合併數據集,方便同時兩個數據集進行清洗full=train.append(test,ignore_index=True)print(合併後的數據集:,full.shape)
查看數據
full.head()獲取數據描述統計信息full.describe()
#查看每一列的數據類型,和數據總數full.info()
數據清洗
- 選擇子集
- 列名重命名
- 缺失值處理
- 數據排序
- 異常值處理
缺失值處理
1、數值缺失值處理:fillna() 填充平均數
#數據預處理#數據類型確實處理#年齡(Age)full[Age]=full[Age].fillna(full[Age].mean()) #用平均值填充#船票價格(Ticket)full[Fare]=full[Fare].fillna(full[Fare].mean())
2、字元串類型缺失值處理:fillna() 填充最頻繁的值
#登船港口(Embarked),查看裡面數據full[Embarked].head()full[Embarked]=full[Embarked].fillna(S)
缺失值較多的情況下,填充為U,表未知
#船艙號(Cabin),查看數據full[Cabin].head()#缺失值較多,船艙號(Cabin)缺失值填充為U,表示未知full[Cabin]=full[Cabin].fillna(U)
特徵工程
特徵工程就是最大限度地從原始數據中提取特徵以供機器學習演算法模型使用
- 特徵提取
- 特徵選擇和特徵降維
特徵提取
- 數值類型 直接使用
- 時間序列 專程單獨年、月、日
- 分類數據 用數值代替類別 (One-hot編碼)
One-hot編碼案例
#one-hot編碼 用數值表示分類將性別的值映射為數值男(male)對應數值1,女(female)對應數值0#分類數據特徵提取:性別sex_mapDict={male:1, female:0}#map函數:對Series每個數據應用自定義的函數計算full[Sex]=full[Sex].map(sex_mapDict)full[Sex].head()
#分類數據特徵提取:登船港口#查看原數據類型full[Embarked].head()#存放提取後的特徵embarkedDf=pd.DataFrame()#使用get_dummies進行one-hot編碼,列明前綴是EmbarkedembarkedDf=pd.get_dummies(full[Embarked],prefix=Embarked)embarkedDf.head()
#把one-hot編碼產生的虛擬變數dummy Variable添加到泰坦尼克數據集fullfull=pd.concat([full,embarkedDf],axis=1)
船艙等級同上
#分類數據特徵提取:客艙等級#存放提取後特徵pclassDf=pd.DataFrame()#使用get_dummies進行oe-hot編碼,列名前綴是pclasspclassDf=pd.get_dummies(full[Pclass],prefix=Pclass)pclassDf.head()#把one-hot編碼產生的虛擬變數dummy Variable添加到泰坦尼克數據集fullfull=pd.concat([full,pclassDf],axis=1)
分類數據特徵提取:名字
查看數據
#分類數據特徵提取:姓名full[Name].head()
字元串格式:名,頭銜.姓
#字元串格式:名,頭銜.姓#Mr.Owen Harrisname1=Braund,Mr. Owen Harrisstr1=name1.split(,)[1]#Mr.Str2=str1.split(.)[0]#strip()用於移除字元串頭尾指定的字元(默認為空格)Str3=Str2.strip()
定義函數:從姓名中獲取頭銜def getTitle(name): str1=name.split(,)[1] #Mr.OwenHarris str2=str1.split(.)[0] #Mr #strip()方法用於移除字元串頭尾指定的字元(默認為空格) str3=str2.strip() return str3#存放提取後的特徵titleDf=pd.DataFrame()#map函數:對Series每個數據應用自定義的函數計算titleDf[Title]=full[Name].map(getTitle)titleDf.head()
#姓名中頭銜映射字元串與定義頭銜類別的映射關係title_mapDict= { Capt: Officer, col: Officer, Major: Officer, Jonkheer: Royalty, Don: Royalty, Sir: Royalty, Dr: Officer, Rev: Office, the Countess:Royalty, Dona: Royalty, Mme: Mrs, Mlle: Miss, Ms: Mrs, Mr: Mr, Mrs: Mrs, Miss: Miss, Master: Master, Lady: Royalty }#map函數:對Series每個數據應用自定義的函數計算titleDf[Title]=titleDf[Title].map(title_mapDict)#使用函數get_dummies進行one-hot編碼titleDf=pd.get_dummies(titleDf[Title])titleDf.head()
分類數據特徵提取:客艙號
#查看客艙號的內容full[Cabin].head()
匿名函數語法
匿名函數語法:lambda參數1,參數2:函數體#定義匿名函數:對兩個數相加sum=lambda a,b:a+b#調用sum函數print(相加後的值為:,sum(10,20))
#存放客艙號信息cabinDf=pd.DataFrame()客場號的類別值是首字母,例如:C85 類別映射首字母full[Cabin]=full[Cabin].map(lambda c:c[0])#使用get_dummies進行one-hot編碼,列名前綴為CabincabinDf=pd.get_dummies(full[Cabin],prefix=Cabin)cabinDf.head()
分類數據特徵提取:家庭類別
#存放家庭信息familyDf=pd.DataFrame()家庭人數=同代直系親屬數(parch)+不同代直系親屬數(sibSp)+乘客自己(因為乘客自己也是家庭成員的一個,所以這裡加1)familyDf[FamilySize]=full[Parch]+full[SibSp]+1家庭類別:小家庭:family_single:家庭人數=1中家庭:family_small:2<=家庭人數<=4大家庭:family_large:家庭人數>=5#if條件為真時返回if前內容,否則返回0familyDf[Family_Single]=familyDf[FamilySize].map(lambda s:1 if s==1 else 0)familyDf[Family_Small]=familyDf[FamilySize].map(lambda s:1 if 2<=s<=4 else 0)familyDf[Family_large]=familyDf[FamilySize].map(lambda s:1 if s>=5 else 0)familyDf.head()
#相關性矩陣corrDf=full.corr()corrDf查看各個特徵與生成情況(Survived)的相關係數,ascending=False表示按降序排列corrDf[Survived].sort_values(ascending=False)
特徵選擇
#特徵選擇full_X=pd.concat( [titleDf, #頭銜 pclassDf, #客艙等級 familyDf, #家庭大小 full[Fare], #船票價格 cabinDf, #船艙號 embarkedDf, #登船港口 full[Sex], #性別 ] , axis=1 )full_X.head()
構建模型
#構建模型#原始數據集有891行sourceRow=891#原始數據集:特徵source_X=full_X.loc[0:sourceRow-1,:]#原始數據集:標籤source_y=full.loc[0:sourceRow-1,Survived]#預測數據集:特徵pred_X=full_X.loc[sourceRow:,:]
from sklearn.cross_validation import train_test_split #建議模型用的訓練數據集和測試數據集train_X,test_X,train_y,test_y=train_test_split(source_X,#原始數據特徵 source_y,#原始數據標籤 train_size=0.8)#輸出數據集大小print(原始數據集特徵:,source_X.shape, 訓練數據集特徵:,train_X.shape, 測試數據集特徵:,test_X.shape)print(原始數據集標籤:,source_y.shape, 訓練數據集標籤:,train_y.shape, 測試數據集標籤:,test_y.shape)
#建立模型from sklearn.linear_model import LogisticRegressionmodel=LogisticRegression()#訓練數據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.cvs,index=False)
總結:數據分析的全過程已經基本學完,接下來實踐實踐再實踐,擼起袖子加油干!
推薦閱讀:
※終於,SciPy 1.0 版發布了
※Flask中的請求上下文和應用上下文
※純 Python 製作 GIF 迷宮動畫 (不使用任何第三方庫) 演示 Wilson 演算法 + DFS 演算法 + LZW 編碼演算法
※vn.py發布v1.6.2