Titanic是kaggle上的一道just for fun的題,沒有獎金,但是數據整潔,拿來練手最好不過啦。
這道題給的數據是泰坦尼克號上的乘客的信息,預測乘客是否幸存。這是個二元分類的機器學習問題,但是由於數據樣本相對較少,在當時慌亂的情況下幸存者有一定的隨機性,還是有一定挑戰的。https://www.kaggle.com/c/titanic-gettingStarted/
一 載入數據
首先,我們要先看一看數據,分析數據的一些較為直觀的特征。代碼使用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-三等艙,從一定程度上反應了這個乘客經濟情況和社會地位。
從基本的數據信息可以看到,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分析也得到相近的結果。
二 缺失值處理
一些機器學習算法能夠處理缺失值,比如神經網絡,一些則不能。對於缺失值,一般有以下幾種處理方法:
(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
特征工程系列:
