XGBoost对比RandomForest、GBDT、决策树、SVM,XGB+LR精度还能提升

目标:对比各种模型

对比各种模型,XGBoost直接判了RandomForest、GBDT、决策树、SVM等死刑,XGB+LR精度还能提升。
XGBoost:目前树模型的天花板,所有决策树中,XGBoost的精度最高,运行速度也还不错,所以竞赛中,结构化数据的比赛,基本都是用它了。
另外,实验表明,XGBoost+LR精度还能进一步提升。


对比内容:

模型对比
具体:
1、 比较在测试集上的AUC表现
2、 比较模型完成端到端训练预测的时间
3、 了解算法的优缺点


最终对比结果:

结果如下:
40万条数据。

模型测试精度AUC运行时间(秒)
Xgboost0.96887.5972
Xgboost + LR0.972413.1655
RF+LR0.924322.3115
GDBT+LR0.9624918.1669
LR0.93370.3479
SVM0.87031104.25

可以看到:

  • XGBoost模型的准确度高过GDBT等树模型,运行速度也尚可接受,另外如果想进一步提升XGBoost的准确度,可以采用XGBoost+LR的方式,还能进一步提升,在数据挖掘比赛中可以试试。
  • LR模型的训练和响应速度真实很不错,0.3秒就搞定了40万条数据,模型准确度不算高。
  • SVM最费时。所以目前估计慢慢也被淘汰了。

代码:

这里用到了一个装饰器,来统计每个函数的运行时间,装饰器这样避免了很多重复性代码

#!/usr/bin python
# -*- coding:utf-8 -*-

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import (RandomTreesEmbedding, RandomForestClassifier,
                              GradientBoostingClassifier)
from sklearn.preprocessing import OneHotEncoder
from sklearn.model_selection import train_test_split
from sklearn.metrics import roc_curve, roc_auc_score
from sklearn import svm
from sklearn.pipeline import make_pipeline
import xgboost as xgb
from xgboost.sklearn import XGBClassifier

# 打印运行时间,装饰器
import functools
import time
def runtime_decorator(function):
    @functools.wraps(function)
    def wrapper(*args, **kwargs):
        start = time.time()
        result = function(*args, **kwargs)
        end = time.time()
        print("function runtime is", end - start ,'S')
        return result

    return wrapper


np.random.seed(10000)
n_estimator = 10

X, y = make_classification(n_samples=400000, n_features=100, shuffle=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.8)
# To avoid overfitting
X_train, X_train_lr, y_train, y_train_lr = train_test_split(X_train, y_train, test_size=0.5)


@runtime_decorator
def RandomForestLR():
    rf = RandomForestClassifier(max_depth=3, n_estimators=n_estimator)
    rf_enc = OneHotEncoder()
    rf_lr = LogisticRegression()
    rf.fit(X_train, y_train)
    rf_enc.fit(rf.apply(X_train))
    rf_lr.fit(rf_enc.transform(rf.apply(X_train_lr)), y_train_lr)
    y_pred_rf_lr = rf_lr.predict_proba(rf_enc.transform(rf.apply(X_test)))[:, 1]
    fpr_rf_lr, tpr_rf_lr, _ = roc_curve(y_test, y_pred_rf_lr)
    auc = roc_auc_score(y_test, y_pred_rf_lr)
    print("RF+LR:", auc)
    return fpr_rf_lr, tpr_rf_lr


@runtime_decorator
def GdbtLR():
    grd = GradientBoostingClassifier(n_estimators=n_estimator)
    grd_enc = OneHotEncoder()
    grd_lr = LogisticRegression()
    grd.fit(X_train, y_train)
    grd_enc.fit(grd.apply(X_train)[:, :, 0])
    grd_lr.fit(grd_enc.transform(grd.apply(X_train_lr)[:, :, 0]), y_train_lr)
    y_pred_grd_lr = grd_lr.predict_proba(grd_enc.transform(grd.apply(X_test)[:, :, 0]))[:, 1]
    fpr_grd_lr, tpr_grd_lr, _ = roc_curve(y_test, y_pred_grd_lr)
    auc = roc_auc_score(y_test, y_pred_grd_lr)
    print("GDBT+LR:", auc)
    return fpr_grd_lr, tpr_grd_lr


@runtime_decorator
def Gdbt():
    grd = GradientBoostingClassifier(n_estimators=n_estimator)
    grd.fit(X_train, y_train)
    y_pred_grd = grd.predict_proba(X_test)
    fpr_grd, tpr_grd, _ = roc_curve(y_test, y_pred_grd)
    auc = roc_auc_score(y_test, y_pred_grd)
    print("GDBT:", auc)
    return fpr_grd, tpr_grd


@runtime_decorator
def Xgboost():
    xgboost = xgb.XGBClassifier(nthread=4, learning_rate=0.08, \
                                n_estimators=50, max_depth=5, gamma=0, subsample=0.9, colsample_bytree=0.5)
    xgboost.fit(X_train, y_train)
    y_xgboost_test = xgboost.predict_proba(X_test)[:, 1]
    fpr_xgboost, tpr_xgboost, _ = roc_curve(y_test, y_xgboost_test)
    auc = roc_auc_score(y_test, y_xgboost_test)
    print("Xgboost:", auc)
    return fpr_xgboost, tpr_xgboost


@runtime_decorator
def Lr():
    # lm = LogisticRegression(n_jobs=4, C=0.1, penalty='l2')
    lm = LogisticRegression()
    lm.fit(X_train, y_train)
    y_lr_test = lm.predict_proba(X_test)[:, 1]
    fpr_lr, tpr_lr, _ = roc_curve(y_test, y_lr_test)
    auc = roc_auc_score(y_test, y_lr_test)
    print("LR:", auc)
    return fpr_lr, tpr_lr


@runtime_decorator
def XgboostLr():
    xgboost = xgb.XGBClassifier(nthread=4, learning_rate=0.08, \
                                n_estimators=50, max_depth=5, gamma=0, subsample=0.9, colsample_bytree=0.5)
    xgb_enc = OneHotEncoder()
    xgb_lr = LogisticRegression(n_jobs=4, C=0.1, penalty='l2')   # Xgboost + LR: 0.973,function runtime is 8.22S
    # xgb_lr = LogisticRegression()    # Xgboost + LR: 0.9723809376004443,function runtime is 7.22S
    xgboost.fit(X_train, y_train)

    xgb_enc.fit(xgboost.apply(X_train)[:, :])
    xgb_lr.fit(xgb_enc.transform(xgboost.apply(X_train_lr)[:, :]), y_train_lr)
    y_xgb_lr_test = xgb_lr.predict_proba(xgb_enc.transform(xgboost.apply(X_test)[:, :]))[:, 1]
    fpr_xgb_lr, tpr_xgb_lr, _ = roc_curve(y_test, y_xgb_lr_test)
    auc = roc_auc_score(y_test, y_xgb_lr_test)
    print("Xgboost + LR:", auc)
    return fpr_xgb_lr, tpr_xgb_lr


@runtime_decorator
def Svm():
    Svc = svm.SVC()
    Svc.fit(X_train, y_train)
    y_svm_test = Svc.predict(X_test)
    fpr_svm, tpr_svm, _ = roc_curve(y_test, y_svm_test)
    auc = roc_auc_score(y_test, y_svm_test)
    print("SVM:", auc)
    return fpr_svm, tpr_svm


if __name__ == '__main__':
    fpr_rf_lr, tpr_rf_lr = RandomForestLR()
    fpr_grd_lr, tpr_grd_lr = GdbtLR()
    fpr_xgboost, tpr_xgboost = Xgboost()
    fpr_lr, tpr_lr = Lr()
    fpr_xgb_lr, tpr_xgb_lr = XgboostLr()
    fpr_svm, tpr_svm = Svm()

    plt.figure(1)
    plt.plot([0, 1], [0, 1], 'k--')
    plt.plot(fpr_rf_lr, tpr_rf_lr, label='RF + LR')
    plt.plot(fpr_grd_lr, tpr_grd_lr, label='GBT + LR')
    plt.plot(fpr_xgboost, tpr_xgboost, label='XGB')
    plt.plot(fpr_lr, tpr_lr, label='LR')
    plt.plot(fpr_xgb_lr, tpr_xgb_lr, label='XGB + LR')
    plt.plot(fpr_svm, tpr_svm, label='SVM')
    plt.xlabel('False positive rate')
    plt.ylabel('True positive rate')
    plt.title('ROC curve')
    plt.legend(loc='best')
    plt.show()

    plt.figure(2)
    plt.xlim(0, 0.2)
    plt.ylim(0.8, 1)
    plt.plot([0, 1], [0, 1], 'k--')
    plt.plot(fpr_rf_lr, tpr_rf_lr, label='RF + LR')
    plt.plot(fpr_grd_lr, tpr_grd_lr, label='GBT + LR')
    plt.plot(fpr_xgboost, tpr_xgboost, label='XGB')
    plt.plot(fpr_lr, tpr_lr, label='LR')
    plt.plot(fpr_xgb_lr, tpr_xgb_lr, label='XGB + LR')
    plt.plot(fpr_svm, tpr_svm, label='SVM')
    plt.xlabel('False positive rate')
    plt.ylabel('True positive rate')
    plt.title('ROC curve (zoomed in at top left)')
    plt.legend(loc='best')
    plt.show()

### 泰坦尼克号幸存者预测使用的九大机器学习模型及其性能比较 #### 1. 逻辑回归 (Logistic Regression) 逻辑回归是一种广泛应用于二元分类问题的基础算法。该方法简单易懂,计算成本低,在许多实际应用中表现出良好的效果。 ```python from sklearn.linear_model import LogisticRegression model_lr = LogisticRegression() model_lr.fit(X_train, y_train) accuracy_lr = model_lr.score(X_test, y_test) print(f"Accuracy of Logistic Regression: {accuracy_lr}") ``` 此代码展示了如何创建并评估一个基于逻辑回归的分类器[^1]。 #### 2. 支持向量机 (Support Vector Machine) 支持向量机通过寻找最优超平面来区分不同类别的样本点,适用于高维空间中的线性和非线性分类任务。 ```python from sklearn.svm import SVC model_svm = SVC(kernel='linear') model_svm.fit(X_train, y_train) accuracy_svm = model_svm.score(X_test, y_test) print(f"Accuracy of SVM with linear kernel: {accuracy_svm}") ``` #### 3. K近邻算法 (K-Nearest Neighbors) KNN属于实例化学习的一种形式,它依据最接近待测对象的一组已知类别标签的对象来进行决策。 ```python from sklearn.neighbors import KNeighborsClassifier model_knn = KNeighborsClassifier(n_neighbors=5) model_knn.fit(X_train, y_train) accuracy_knn = model_knn.score(X_test, y_test) print(f"Accuracy of KNN Classifier: {accuracy_knn}") ``` #### 4. 决策树 (Decision Tree) 决策树利用一系列条件判断构建一棵或多棵树结构,从而完成对未知数据的分类或数值预测。 ```python from sklearn.tree import DecisionTreeClassifier model_dt = DecisionTreeClassifier() model_dt.fit(X_train, y_train) accuracy_dt = model_dt.score(X_test, y_test) print(f"Accuracy of Decision Tree: {accuracy_dt}") ``` #### 5. 随机森林 (Random Forest) 随机森林是由多个决策树组成的集成学习方法,能够有效提高单棵决策树的表现力和泛化能力。 ```python from sklearn.ensemble import RandomForestClassifier model_rf = RandomForestClassifier(n_estimators=100) model_rf.fit(X_train, y_train) accuracy_rf = model_rf.score(X_test, y_test) print(f"Accuracy of Random Forest: {accuracy_rf}") ``` #### 6. 梯度提升决策树 (Gradient Boosting Decision Trees) GBDT采用逐步优化的方式迭代地增加弱分类器,最终形成强大的组合模型。 ```python from sklearn.ensemble import GradientBoostingClassifier model_gbt = GradientBoostingClassifier() model_gbt.fit(X_train, y_train) accuracy_gbt = model_gbt.score(X_test, y_test) print(f"Accuracy of GBDT: {accuracy_gbt}") ``` #### 7. AdaBoost AdaBoost也是一种增强型集成学习技术,特别之处在于每次迭代都会调整权重分布使得错误率较高的样本获得更多的关注。 ```python from sklearn.ensemble import AdaBoostClassifier model_adb = AdaBoostClassifier() model_adb.fit(X_train, y_train) accuracy_adb = model_adb.score(X_test, y_test) print(f"Accuracy of AdaBoost: {accuracy_adb}") ``` #### 8. XGBoost XGBoost作为梯度提升框架的一个高效实现版本,不仅速度快而且精度更高,成为近年来竞赛中最受欢迎的选择之一。 ```python import xgboost as xgb model_xgb = xgb.XGBClassifier(use_label_encoder=False, eval_metric='logloss') model_xgb.fit(X_train, y_train) accuracy_xgb = model_xgb.score(X_test, y_test) print(f"Accuracy of XGBoost: {accuracy_xgb}") ``` #### 9. LightGBM LightGBM由微软开发,旨在解决大规模稀疏特征场景下的快速训练需求,具有优秀的内存管理和高效的并行处理机制。 ```python import lightgbm as lgb train_data = lgb.Dataset(X_train, label=y_train) params = {'objective': 'binary'} model_lgb = lgb.train(params, train_data) y_pred_prob = model_lgb.predict(X_test) accuracy_lgb = sum(y_pred_prob.round() == y_test) / len(y_test) print(f"Accuracy of LightGBM: {accuracy_lgb}") ``` 上述每一种模型都有各自的特点以及适用范围,具体选择哪一种取决于实际情况和个人偏好。通常情况下,可以通过交叉验证等手段进一步对比各模型之间的优劣差异,进而挑选出最适合当前任务的最佳方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值