大部分機器學習數據分析第一個kaggle項目
GitHub代碼地址:
coolcumt/monkey_analysis代碼中比較重要的內容和新知
1、機器學習的步驟
# 忽略警告提示import warningswarnings.filterwarnings(ignore)
2、理解數據欄位含義
最重要耗時的2個步驟
3.數據清洗(Data Preparation )
3.1 數據預處理
缺失值處理
在前面,理解數據階段,我們發現數據總共有1309行。 其中數據類型列:年齡(Age)、船艙號(Cabin)裡面有缺失數據。 字元串列:登船港口(Embarked)、船艙號(Cabin)裡面有缺失數據。
這為我們下一步數據清洗指明了方向,只有知道哪些數據缺失數據,我們才能有針對性的處理。
很多機器學習演算法為了訓練模型,要求所傳入的特徵中不能有空值。
- 如果是數值類型,用平均值取代
- 如果是分類數據,用最常見的類別取代
- 使用模型預測缺失值,例如:K-NN
我們發現數據總共有1309行。
其中數據類型列:年齡(Age)、船艙號(Cabin)裡面有缺失數據:
1)年齡(Age)裡面數據總數是1046條,缺失了1309-1046=263,缺失率263/1309=20%
2)船票價格(Fare)裡面數據總數是1308條,缺失了1條數據
對於數值類型,處理缺失值最簡單的方法就是用平均數來填充缺失值
print(處理前:)full.info()#年齡(Age)full[Age]=full[Age].fillna( full[Age].mean() )#船票價格(Fare)full[Fare] = full[Fare].fillna( full[Fare].mean() )print(處理紅後:)full.info()
數值統計
full[Embarked].value_counts()
缺失值較多的字元串列填充
#缺失數據比較多,船艙號(Cabin)缺失值填充為U,表示未知(Uknow) full[Cabin] = full[Cabin].fillna( U )
3.2 特徵提取
3.2.1數據分類
查看數據類型,分為3種數據類型。並對類別數據處理:用數值代替類別,並進行One-hot編碼
1.數值類型:
乘客編號(PassengerId),年齡(Age),船票價格(Fare),同代直系親屬人數(SibSp),不同代直系親屬人數(Parch)
2.時間序列:無
3.分類數據:
1)有直接類別的
乘客性別(Sex):男性male,女性female
登船港口(Embarked):出發地點S=英國南安普頓Southampton,途徑地點1:C=法國 瑟堡市Cherbourg,出發地點2:Q=愛爾蘭 昆士敦Queenstown
客艙等級(Pclass):1=1等艙,2=2等艙,3=3等艙
2)字元串類型:可能從這裡面提取出特徵來,也歸到分類數據中
乘客姓名(Name)
客艙號(Cabin)
船票編號(Ticket)
map數據替換
3.2.1 分類數據:有直接類別的
- 乘客性別(Sex): 男性male,女性female
- 登船港口(Embarked):出發地點S=英國南安普頓Southampton,途徑地點1:C=法國 瑟堡市Cherbourg,出發地點2:Q=愛爾蘭 昆士敦Queenstown
- 客艙等級(Pclass):1=1等艙,2=2等艙,3=3等艙
性別
將性別的值映射為數值男(male)對應數值1,女(female)對應數值0sex_mapDict={male:1,female:0}#map函數:對Series每個數據應用自定義的函數計算full[Sex]=full[Sex].map(sex_mapDict)
用get_dummies進行one-hot編碼
使用get_dummies進行one-hot編碼,產生虛擬變數(dummy variables),列名前綴是EmbarkedembarkedDf = pd.get_dummies( full[Embarked] , prefix=Embarked )
3.2.1 分類數據:字元串類型
字元串類型:可能從這裡面提取出特徵來,也歸到分類數據中,這裡數據有:
- 乘客姓名(Name)
- 客艙號(Cabin)
- 船票編號(Ticket)
從姓名中提取頭銜
查看姓名這一列長啥樣
注意到在乘客名字(Name)中,有一個非常顯著的特點:
乘客頭銜每個名字當中都包含了具體的稱謂或者說是頭銜,將這部分信息提取出來後可以作為非常有用一個新變數,可以幫助我們進行預測。
例如:
Braund, Mr. Owen Harris
Heikkinen, Miss. Laina
Oliva y Ocana, Dona. Fermina
Peter, Master. Michael J
定義函數:從姓名中獲取頭銜def getTitle(name): str1=name.split( , )[1] #Mr. Owen Harris str2=str1.split( . )[0]#Mr#strip() 方法用於移除字元串頭尾指定的字元(默認為空格) str3=str2.strip()return str3#存放提取後的特徵titleDf = pd.DataFrame()#map函數:對Series每個數據應用自定義的函數計算titleDf[Title] = full[Name].map(getTitle)
定義以下幾種頭銜類別: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函數:對Series每個數據應用自定義的函數計算titleDf[Title] = titleDf[Title].map(title_mapDict)#使用get_dummies進行one-hot編碼titleDf = pd.get_dummies(titleDf[Title])
3.3 特徵選擇
可以學習後面的課程後,再了解特徵選擇的方法。但是如果你已經具備了多種機器學習演算法的知識,想提前學習,可以參考這些資料:
- 如何做特徵工程?
- 如何使用sklearn進行特徵工程?
- 泰坦尼克號如何進行特徵選擇?
相關係數法:計算各個特徵的相關係數
#相關性矩陣
corrDf = full.corr()
降序排列
查看各個特徵與生成情況(Survived)的相關係數,ascending=False表示按降序排列corrDf[Survived].sort_values(ascending =False)
使用Pandas對數據進行篩選和排序
4、最後再梳理一遍流程
推薦閱讀:
※用Python進行基礎的數據分析
※恭喜你!成功由遊樂場模式升級為荒野求生模式
※NBA選秀十年記【2】—尋找相似的新秀
※SQL查詢實例
※武漢兩日游線路推薦
TAG:數據分析 |