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
無論是作機器學習,仍是深度學習,仍是其餘的先肯定是 分類問題仍是迴歸問題,固然這兩個能夠互相轉換的,而後拿到數據第一步確定是先觀察數據,數據是否又缺失,亂碼等。數組
這個看一下就知道是否存活,存活是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