XGBoost调参技巧(二)Titanic实战Top9%

学习Kaggle的第一个比赛就是Titanic,断断续续的半年时间,从小白到杀入9%。XGBoost果真是Kaggle杀器,帮我在Titanic中进入9%、zillow进入22%。

简介

Titanic是Kaggle竞赛里的入门比赛之一,要求参赛者根据乘客的属性来预测是否幸存,是典型的二分类(Binary Classifier)问题。解决二分类问题的算法有很多:决策树、随机森林、GBM,而XGBoost是GBM的优化实现。因此本文以Titanic幸存者预测竞赛为例,介绍XGBoost的调参技巧。

一、读取数据,清洗数据

1.读取数据

#coding:utf-8
import numpy as np
import pandas as pd
from xgboost import XGBClassifier
from sklearn.cross_validation import KFold
from sklearn.grid_search import GridSearchCV
from sklearn.metrics import accuracy_score

#read data
train = pd.read_csv("../data/train.csv")
test = pd.read_csv("../data/test.csv")

导入需要用到的包,注意我导入的是xgboost下的XGBClassifier包,可以结合sciket-learn下的grid_search来对参数进行暴力猜解。

2.清洗数据

def clean_data(titanic):#填充空数据 和 把string数据转成integer表示
    titanic["Age"] = titanic["Age"].fillna(titanic["Age"].median())
    # child
    titanic["child"] = titanic["Age"].apply(lambda x: 1 if x < 15 else 0)

    # sex
    titanic["sex"] = titanic["Sex"].apply(lambda x: 1 if x == "male" else 0)

    titanic["Embarked"] = titanic["Embarked"].fillna("S")
    # embark
    def getEmbark(Embarked):
        if Embarked == "S":
            return 1
        elif Embarked == "C":
            return 2
        else:
            return 3
    titanic["embark"] = titanic["Embarked"].apply(getEmbark)

    # familysize
    titanic["fimalysize"] = titanic["SibSp"] + titanic["Parch"] + 1

    # cabin
    def getCabin(cabin):
        if cabin == "N":
            return 0
        else:
            return 1
    titanic["cabin"] = titanic["Cabin"].apply(getCabin)

    # name
    def getName(name):
        if "Mr" in str(name):
            return 1
        elif "Mrs" in str(name):
            return 2
        else:
            return 0
    titanic["name"] = titanic["Name"].apply(getName)

    titanic["Fare"] = titanic["Fare"].fillna(titanic["Fare"].median())

    return titanic
# 对数据进行清洗
train_data = clean_data(train)
test_data = clean_data(test)

二、特征工程

Kaggle竞赛的三个核心步骤:特征工程、调参、模型融合。俗话说:数据和特征决定机器学习的上限,而算法只是用来逼近这个上限,所以特征工程是机器学习能否成功的关键。我们在每个比赛中需要花大量时间来反复完成这个工作。

features = ["Pclass", "sex", "child", "fimalysize", "Fare", "embark", "cabin"]

三、模型选择

1.构造模型

# 简单初始化xgb的分类器就可以
clf =XGBClassifier(learning_rate=0.1, max_depth=2, 
silent=True, objective='binary:logistic')

2.交叉验证kfold

利用skean提供的grid_search来进行交叉验证选择参数。

# 设置boosting迭代计算次数
param_test = {
    'n_estimators': range(30, 50, 2),
    'max_depth': range(2, 7, 1)
}
grid_search = GridSearchCV(estimator = clf, param_grid = param_test, 
scoring='accuracy', cv=5)
grid_search.fit(train[features], train["Survived"])
grid_search.grid_scores_, grid_search.best_params_, grid_search.best_score_

out:

后面是跑出来的结果。这里我也是非常意外,之前试过各种方法,都没有超过0.8,看来XGBoost的效果确实非常不错。

四、提交结果

进步还是非常大的,进入了9%。做到0.8的话对这个比较的数据集基本上算是比较好的了,再往上提高也没有太大的意义,Titanic暂时告一段落。


欢迎关注个人微信公众号:kaggle数据分析

### 关于XGBoost分类的实际应用案例或教程 XGBoost 是一种高效的梯度提升框架,在处理分类问题方面表现出色。以下是几个实际的应用案例和教程,帮助理解和实践 XGBoost 的分类功能。 #### 1. 官方文档中的分类示例 XGBoost 官方文档提供了一个简单的元分类示例[^1],展示了如何加载数据集、训练模型以及评估性能。该示例使用了内置的数据集 `agaricus.txt.train` 和 `agaricus.txt.test` 来演示基本流程: ```python import xgboost as xgb from sklearn.metrics import accuracy_score # 加载数据 dtrain = xgb.DMatrix(&#39;data/agaricus.txt.train&#39;) dtest = xgb.DMatrix(&#39;data/agaricus.txt.test&#39;) # 设置参数 param = { &#39;max_depth&#39;: 2, &#39;eta&#39;: 1, &#39;objective&#39;: &#39;binary:logistic&#39; } num_round = 2 # 训练模型 bst = xgb.train(param, dtrain, num_round) # 预测并计算准确率 preds = bst.predict(dtest) labels = dtest.get_label() print(f&#39;Accuracy: {accuracy_score(labels, preds.round())}&#39;) ``` 此代码片段清晰地展示了一个完整的分类工作流,适合初学者学习基础操作。 --- #### 2. Kaggle竞赛中的经典分类任务 Kaggle 平台上有许多基于 XGBoost 的分类项目,其中最著名的之一是 **泰坦尼克号生存预测** 数据集[^2]。这个任务的目标是从乘客特征中预测他们是否能在沉船事故中幸存下来。以下是一个简化版的实现过程: ```python import pandas as pd import numpy as np import xgboost as xgb from sklearn.model_selection import train_test_split from sklearn.metrics import roc_auc_score # 导入数据 df = pd.read_csv(&#39;titanic_train.csv&#39;) # 替换为您的文件路径 df[&#39;Age&#39;].fillna(df[&#39;Age&#39;].median(), inplace=True) # 处理缺失值 df[&#39;Sex&#39;] = df[&#39;Sex&#39;].map({&#39;male&#39;: 0, &#39;female&#39;: 1}) # 转换性别列 features = [&#39;Pclass&#39;, &#39;Sex&#39;, &#39;Age&#39;] X = df[features] y = df[&#39;Survived&#39;] # 划分训练集与测试集 X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=42) # 构建DMatrix对象 dtrain = xgb.DMatrix(X_train, label=y_train) dval = xgb.DMatrix(X_val, label=y_val) # 参数设置 params = {&#39;objective&#39;: &#39;binary:logistic&#39;, &#39;eval_metric&#39;: &#39;auc&#39;} model = xgb.train(params, dtrain, num_boost_round=100, evals=[(dval, &#39;validation&#39;)], early_stopping_rounds=10) # 测试AUC分数 predictions = model.predict(dval) print(f&#39;AUC Score on Validation Set: {roc_auc_score(y_val, predictions)}&#39;) ``` 这段代码不仅实现了模型构建,还通过 AUC 指标验证了模型的表现。 --- #### 3. 使用 Scikit-Learn 接口进行多分类 除了传统的 DMatrix 方法外,XGBoost 还支持类似于 scikit-learn 的接口调用方式,这使得它更容易集成到现有的机器学习流水线中。下面的例子展示了如何利用 Iris 数据集完成一个多类别分类任务: ```python from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from xgboost import XGBClassifier from sklearn.metrics import classification_report # 获取Iris数据集 iris = load_iris(as_frame=True) X = iris.data y = iris.target # 划分训练集与测试集 X_train, X_test, y_train, y_test = train_test_split( X, y, stratify=y, random_state=42, test_size=0.2 ) # 初始化XGBClassifier clf = XGBClassifier(objective=&#39;multi:softprob&#39;, n_estimators=100, learning_rate=0.1, max_depth=3) clf.fit(X_train, y_train) # 输出报告 y_pred = clf.predict(X_test) print(classification_report(y_test, y_pred)) ``` 上述代码采用软概率输出形式来解决三类别的分类问题,并打印出精确率、召回率和其他指标。 --- #### 4. 更复杂的超参数优化实例 为了提高模型表现力,可以引入网格搜索或者贝叶斯优化方法调整最佳超参数组合。这里给出一个 GridSearchCV 结合 XGBoost 的例子: ```python from sklearn.model_selection import GridSearchCV from xgboost.sklearn import XGBClassifier parameters = { &#39;n_estimators&#39;: [50, 100], &#39;learning_rate&#39;: [0.01, 0.1], &#39;max_depth&#39;: [3, 5] } grid_search = GridSearchCV(estimator=XGBClassifier(use_label_encoder=False), param_grid=parameters, scoring=&#39;f1_macro&#39;, cv=3, verbose=1, n_jobs=-1) grid_search.fit(X_train, y_train) best_params = grid_search.best_params_ print(best_params) ``` 这种技术能够显著改善最终结果的质量,尤其是在面对复杂业务需求时显得尤为重要。 ---
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值