• 【机器学习】SKlearn + XGBoost 预测 Titanic 乘客幸存


    Titanic 数据集是从 kaggle下载的,下载地址:https://www.kaggle.com/c/titanic/data

    数据一共又3个文件,分别是:train.csv,test.csv,gender_submission.csv

    先把需要视同的库导入:

    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 ,那么就是分类

    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,特征工程

      根据第一步观察到的结果,我们对数据做处理。

      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

  • 相关阅读:
    docker安装dvwa
    新版recon-ng安装模块
    docker多段构建nessus镜像
    docker安装Nessus
    docker快速安装openvas
    pyinstaller打包一些三方库后,报资源不存在
    python解决“failed to execute pyi_rth_pkgres”问题
    Proxmox6.2简单配置
    JavaScript全面学习(koa2.0)/MVC实现登录
    windows下react-native环境配置的那些坑
  • 原文地址:https://www.cnblogs.com/softmax/p/8320708.html
Copyright © 2020-2023  润新知