kaggle數據挖掘競賽初步--Titanic<原始數據分析&缺失值處理>

Titanic是kaggle上的一道just for fun的題,沒有獎金,可是數據整潔,拿來練手最好不過啦。html

這道題給的數據是泰坦尼克號上的乘客的信息,預測乘客是否倖存。這是個二元分類的機器學習問題,可是因爲數據樣本相對較少,在當時慌亂的狀況下倖存者有必定的隨機性,仍是有必定挑戰的。https://www.kaggle.com/c/titanic-gettingStarted/ git

一 載入數據github

首先,咱們要先看一看數據,分析數據的一些較爲直觀的特徵。代碼使用numpy pandas和scikit-learn。算法

1 import numpy as np
2 import pandas as pd
3 #read data from train.csv
4 df = pd.read_csv('train.csv',header=0)
5 df.info()

 read_csv函數讀入csv文件返回一個DataFrame對象,每一列都依據讀入的數據肯定其類型,int64 object諸如此類。df.info()顯示原始數據屬性的基本信息,df.describe()則顯示屬性的一些統計信息,好比均值 方差等。網絡

             

ps:Pclass屬性表明船艙等級,1-一等艙,2-二等艙,3-三等艙,從必定程度上反應了這個乘客經濟狀況和社會地位。dom

從基本的數據信息能夠看到,Age Carbin Emarked屬性有缺失值,須要後續處理;有5個屬性是字符串類型的,而sklearn只能處理數字類型的數據,若是不用這些屬性顯然會丟掉一些可能有價值的信息,因此須要用必定的方法將這些值轉爲數據。從統計數據中能夠看出,有38.3%的倖存率。通常來說,女性 孩子和高社會階層的人更有可能倖存下來,能夠用代碼分析一下這個假設成不成立。機器學習

對於女性倖存率:函數

1 x=[df[(df.Sex=='male')]['Sex'].size,df[(df.Sex=='female')]['Sex'].size]
2 y=[df[(df.Sex=='male') & (df.Survived == 1)]['Sex'].size,\
3    df[(df.Sex=='female') & (df.Survived == 1)]['Sex'].size]
4 print 'male number:'+str(x[0])+'    '+'female number:'+str(x[1])
5 print 'male survive:'+str(y[0])+'    '+'female survive:'+str(y[1])

能夠看出75%的女性倖存。學習

對於Age和Pclass分析也獲得相近的結果。spa

二 缺失值處理

一些機器學習算法可以處理缺失值,好比神經網絡,一些則不能。對於缺失值,通常有如下幾種處理方法:

(1)若是數據集不少,但有不多的缺失值,能夠刪掉帶缺失值的行

(2)若是該屬性相對學習來講不是很重要,能夠對缺失值賦均值或者衆數。好比在哪兒上船Embarked這一屬性(共有三個上船地點),缺失倆值,能夠用衆數賦值

1 #replace missing values with mode
2 df.Embarked[df.Embarked.isnull()] = df.Embarked.dropna().mode().values

(3)對於標稱屬性,能夠賦一個表明缺失的值,好比‘U0’。由於缺失自己也可能表明着一些隱含信息。好比船艙號Cabin這一屬性,缺失可能表明並無船艙。

1 #replace missing value with U0
2 df.Cabin[df.Cabin.isnull()]='U0'

(4)使用迴歸 隨機森林等模型來預測缺失屬性的值。由於年齡在該數據集裏是一個至關重要的特徵,因此保證必定的缺失值填充準確率是很是重要的,對結果也會產生較大影響。通常狀況下,會使用數據完整的條目做爲模型的訓練集,以此來預測缺失值。對於當前的這個數據,可使用隨機森林來預測也可使用線性迴歸預測。我使用的是隨機森林預測模型,選取當期數據集中的數值屬性做爲特徵(由於sklearn的模型只能處理數值屬性阿,固然後面會把其餘屬性都處理成數值屬性,而後就能夠更新這塊預測年齡的代碼啦)。

 1     #choose training data to predict age
 2     age_df = df[['Age','Survived','Fare', 'Parch', 'SibSp', 'Pclass']]
 3     age_df_notnull = age_df.loc[(df.Age.notnull())]
 4     age_df_isnull = age_df.loc[(df.Age.isnull())]
 5     X = age_df_notnull.values[:,1:]
 6     Y = age_df_notnull.values[:,0]
 7     #use RandomForestRegressor to train data
 8     rfr = RandomForestRegressor(n_estimators=1000,n_jobs=-1)
 9     rfr.fit(X,Y)
10     predictAges = rfr.predict(age_df_isnull.values[:,1:])
11     df.loc[(df.Age.isnull()),'Age'] = predictAges

 

完整代碼: https://github.com/cindycindyhi/kaggle-Titanic

特徵工程系列:

Titanic系列之原始數據分析和數據處理

Titanic系列之數據變換

Titanic系列之派生屬性&維歸約

相關文章
相關標籤/搜索