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
特徵工程系列: