[Kaggle實戰] Titanic 逃生預測 (3) - Age離散化

昨天的文章大致構建了一個data matrix, 並進行了數據清理。有一個遺留問題就是,如何將連續的Age屬性離散化?

 

對於連續屬性離散化,可以參考《數據挖掘導論》 2.3.6小節。

首先,我們試着將數據圖形化,看看是否有明顯的間隔區間。 畫圖依然使用JFreeChart來進行。

從肉眼的角度來分析,雖然沒有太明顯的區間,但是從分佈上看,基本上能如下圖進行劃分:



 

再來一張書上的原圖進行對比:



這一張圖裏面的分佈區間就太明顯了。

 

除了使用圖形化的方式來進行離散化,還可以有其他的方法:

(1) 等寬: 比如Age: [0~15] [15~30] [30~45] ...

(2) 等頻率/等深 :比如前100個樣本成一個區間,101~200個成1個區間 ...

(3) K均值(K-Means) : 這個方法現在有點早~ 後面可以進一步優化的時候再採用這種方法進行Age屬性劃分

 

所以,現在Age的劃分就按照:

[0:15), [15:40) [40:+∞)

 

最後附上今天refine過的dataClean方法

public static double[][] dataClean(List<String[]> list) {
    double[][] dataMatrix = new double[list.size()][6];
    List<Double> ageList = new ArrayList<Double>();
    int startIndex = 0;
    int Survived_INDEX = startIndex++;
    int Pclass_INDEX = startIndex++;
    int Sex_INDEX = startIndex++;
    int Age_INDEX = startIndex++;
    int SibSp_INDEX = startIndex++;
    int Embarked_INDEX = startIndex++;
    
    for(int i = 0; i < list.size(); i++){
        String[] arr = list.get(i);
        // Survived
        dataMatrix[i][Survived_INDEX] = Integer.parseInt(arr[1]);
        
        // Pclass
        dataMatrix[i][Pclass_INDEX] = Integer.parseInt(arr[2]);
        
        // Sex
        if(arr[4].equals("male")) {
            dataMatrix[i][Sex_INDEX] = 1; 
        } else {
            dataMatrix[i][Sex_INDEX] = 2;
        }
        
        // Age
        if(arr[5].length() == 0) {
            dataMatrix[i][Age_INDEX] = -1;		// 首先將缺失值設置爲-1
        } else {
            dataMatrix[i][Age_INDEX] = Double.parseDouble(arr[5]);
            ageList.add(Double.parseDouble(arr[5]));
        }
        
        // SibSp  將值大於2的歸集爲同一類
        if(Integer.parseInt(arr[6]) >= 2 ) {
            dataMatrix[i][SibSp_INDEX] = 2;
        } else {
            dataMatrix[i][SibSp_INDEX] = Integer.parseInt(arr[6]);
        }
        
        // Embarked C:1 Q:2 S:3 U:4	 
        // 原始數據之中已經手動的將缺失值補充爲U,不是CQS的值,也用4來代替
        String embarked = arr[11];
        if(embarked.equals("C")) {
            dataMatrix[i][Embarked_INDEX] = 1;
        } else if(embarked.equals("Q")) {
            dataMatrix[i][Embarked_INDEX] = 2;
        } else if(embarked.equals("S")) {
            dataMatrix[i][Embarked_INDEX] = 3;
        } else  {
            dataMatrix[i][Embarked_INDEX] = 4;
        } 
        
    }
    
    // 將Age=-1的值變成中位數
    double[] ageArr = new double[ageList.size()];
    for(int i = 0; i < ageArr.length; i++) {
        ageArr[i] = ageList.get(i);
    }
    double median = StatUtils.percentile(ageArr, 50.0);	//中位數
    for(int i = 0; i < dataMatrix.length; i++) {
        if(dataMatrix[i][3] == -1) {
            dataMatrix[i][3] = median;
        }
        
        // 直接將Age離散化 [0:15), [15:40) [40:+∞)
        if(dataMatrix[i][3] < 15) dataMatrix[i][3] = 1;
        else if(dataMatrix[i][3] < 40) dataMatrix[i][3] = 2;
        else dataMatrix[i][3] = 3;
        
    }
    
    
    return dataMatrix;
}

 

至此,第一步 數據預處理基本上完成。接下來應該做的就是構建一個決策樹進行分類與預測了!

提交了一部分代碼,可以到https://gitcafe.com/rangerwolf/Kaggle-Titanic 下載

發佈了36 篇原創文章 · 獲贊 0 · 訪問量 9358
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章