【機器學習】SKlearn + XGBoost 預測 Titanic 乘客倖存

Titanic 數據集是從 kaggle下載的,下載地址:https://www.kaggle.com/c/titanic/datapython

數據一共又3個文件,分別是:train.csv,test.csv,gender_submission.csvgit

 

先把須要視同的庫導入:github

import os
import datetime
import operator
import numpy as np
import pandas as pd
import xgboost as xgb
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import Imputer, scale
import matplotlib.pyplot as plt
 np.random.seed(19260817) # 設置一下種子,看一下博客園有沒有能看懂的

無論是作機器學習,仍是深度學習,仍是其餘的先肯定是 分類問題仍是迴歸問題,固然這兩個能夠互相轉換的,而後拿到數據第一步確定是先觀察數據,數據是否又缺失,亂碼等。數組

這個看一下就知道是否存活,存活是1,不然 0 ,那麼就是分類 dom

 

1,觀察下數據機器學習

先觀察一下數據,使用pandas讀取數據:工具

DataFrame.head(n=5):head 方法默認取5行數據,你能夠本身隨便傳參數,我只去10行觀察下看下學習

 

    pd_train = pd.read_csv('./data/titanic/train.csv')
    pd_test = pd.read_csv('./data/titanic/test.csv')
    pd_gender = pd.read_csv('./data/titanic/gender_submission.csv')
    print(pd_train.shape, pd_test.shape)
    print(pd_train.head(10))

根據觀察能夠看到,數據有數值類型,也有字符類型,數值類型咱們稱做連續變量,字符類型咱們稱做分類變量,連續變量是不用轉換的,而分類變量是須要轉成連續變量的,不然,沒法運算。
還能夠看到有些數據是缺失的,這部分缺失值咱們也須要處理,填充或者刪除編碼

 

2,特徵工程spa

  根據第一步觀察到的結果,咱們對數據作處理。

  1)將性別 Sex 列,作數值轉換處理,代碼以下:

    # 性別 將性別字段Sex中的值 female用0,male用1代替,類型 int
    pd_train['Sex'] = pd_train['Sex'].map({'female': 0, 'male': 1}).astype(int)
    pd_test['Sex'] = pd_test['Sex'].map({'female': 0, 'male': 1}).astype(int)

  2) 將分類變量轉換位連續變量。咱們使用 sklearn 庫下面的 LabelEncoder() 來處理

    # 將類型變量轉換位連續變量
    for f in pd_train.columns:
        if pd_train[f].dtype == 'object':
            label = LabelEncoder()
            label.fit(list(pd_train[f].values))
            pd_train[f] = label.transform(list(pd_train[f].values))

    for f in pd_test.columns:
        if pd_test[f].dtype == 'object':
            label = LabelEncoder()
            label.fit(list(pd_test[f].values))
            pd_test[f] = label.transform(list(pd_test[f].values))

 

  3)統計缺失的列那些,觀察缺失值有多少,再決定是刪除,仍是填充,若是某列值的缺失嚴重,那就不必填充了,直接刪除。

       咱們採用填充的方式,使用 Imputer類來處理缺失值,這個類提供了估算缺失值的基本策略,使用缺失值所在的行/列中的平均值、中位數或者衆數來填充。這個類也支持不一樣的缺失值編碼。

   # 統計缺失的列
    na_train = pd_train.isnull().sum().sort_values(ascending=False)
    print(na_train)

    # 使用均值填充缺失值
    train_data= pd_train.values
    imput = Imputer(missing_values="NaN", strategy="mean", axis=0)
    imput = imput.fit(train_data)
    train_data = imput.fit_transform(train_data)

    # 使用均值填充缺失值
    test_data= pd_test.values
    imput = Imputer(missing_values="NaN", strategy="mean", axis=0)
    imput = imput.fit(test_data)
    test_data = imput.fit_transform(test_data)

  

3,訓練

  通過對特徵的處理,咱們能夠訓練模型可,我使用了三個模型分別是,LogisticRegression,RandomForest,XGBClassifier

  監督學習的模型都同樣,必須擬合(fit)兩個矩陣(數組), 訓練樣本的矩陣 X,大小爲 [n_samples, n_features],和 訓練樣本目標值(標籤)的數組 Y,大小爲 [n_samples]:

 

  1)LogisticRegression :邏輯迴歸,雖然名字叫回歸,可是個分類模型

def train_logreistic():
    """
    邏輯迴歸
    """
    X_train, X_test, y_train, y_test = load_data()

    model = LogisticRegression(penalty='l2')
    model.fit(X_train, y_train)
    y_pred = model.predict(X_test)
    rfc_rate, rmse = calc_accuracy(y_pred, y_test)
    total = total_survival(y_pred)

    print("LogisticRegression acc_rate:{0:.4f},RMS:{1:.4f},存活:{2}".format( rfc_rate, rmse, total))
    return rfc_rate, rmse, total

  2)RandomForest:隨機森林,基於樹的模型,經過在分類器構造過程當中引入隨機性來建立一組不一樣的分類器。

def train_randomForster():

    X_train, X_test, y_train, y_test = load_data()
    model = RandomForestClassifier(n_estimators=300,max_depth=12,random_state=7)
    model.fit(X_train,y_train)
    y_pred = model.predict(X_test)
    rfc_rate, rmse = calc_accuracy(y_pred, y_test)
    total = total_survival(y_pred)
    print("RandomForestClassifier acc_rate:{0:.4f},RMS:{1:.4f},存活:{2}".format(rfc_rate, rmse, total))
    return rfc_rate, rmse, total

  3)XGBClassifier :大規模並行boosted tree的工具,它是目前最快最好的開源boosted tree工具包,比常見的工具包快10倍以上,kaggle 比賽的神器

 

def train_XGBoost():

    X_train, X_test, y_train, y_test = load_data()
    model = xgb.XGBClassifier(max_delta_step=6, learning_rate=0.1, n_estimators=100, objective="binary:logistic",silent=True)
    eval_data = [(X_test, y_test)]
    model.fit(X_train, y_train, eval_set=eval_data, early_stopping_rounds=30)
    y_pred = model.predict(X_test)
    rfc_rate, rmse = calc_accuracy(y_pred, y_test)
    total = total_survival(y_pred)

    print("XGBClassifier acc_rate:{0:.4f},RMS:{1:.4f},存活:{2}".format(rfc_rate, rmse, total))
    return rfc_rate, rmse, total

 

 

 

4,預測

  model.predict(X_test) 都在裏面寫了,我就不說了。

  三個模型最後的結果:

  

def train():
    
    lg_rate, lg_rmse, lg_total = train_logreistic()
    rf_rate, rf_rmse, rf_total = train_randomForster()
    xg_rate, xg_rmse, xg_total = train_XGBoost()

    print("LogisticRegression acc_rate:{0:.4f},RMS:{1:.4f},存活:{2}".format( lg_rate, lg_rmse, lg_total))
    print("RandomForestClassifier acc_rate:{0:.4f},RMS:{1:.4f},存活:{2}".format(rf_rate, rf_rmse, rf_total))
    print("XGBClassifier acc_rate:{0:.4f},RMS:{1:.4f},存活:{2}".format(xg_rate, xg_rmse, xg_total))
XGBClassifier acc_rate:80.4469,RMS:0.4422,存活:56
LogisticRegression acc_rate:74.8603,RMS:0.5014,存活:60
RandomForestClassifier acc_rate:82.6816,RMS:0.4162,存活:54
XGBClassifier acc_rate:80.4469,RMS:0.4422,存活:56

 

好了,至於怎麼調參,網格搜索我就不寫了,簡單的分析就完成了。。

 

參考:

1) http://xgboost.readthedocs.io/en/latest/

2) http://scikit-learn.org/stable/

3) https://www.kaggle.com/

 

源碼地址:https://github.com/jarvisqi/machine_learning/blob/master/ml_xgboost/titanic.py

相關文章
相關標籤/搜索