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


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

特征工程系列:

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

Titanic系列之數據變換

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM