XGBoost数据训练小例子

部署运行你感兴趣的模型镜像

1. 前言

XGBoost是很好的数据处理工具,可以在各大赛事中见到它的影子。本篇博客就主要针对对XGBoost的原理、相关Python API较为熟悉等的前提下将这些分散的内容串起来,从数据生成(已经准备好的数据,忽略数据预处理、特征选择之类的-_-||)、训练模型、预测测试数据进行说明。希望能够对刚入手XGBoost的朋友有所帮助。

2. 完整过程

2.1 步骤分解

  1. 训练数据生成:这里直接采用的是生成标准的训练数据,其它的操作不考虑-_-||。本例子中生成的是两个服从高斯分布的数据集
  2. 训练模型:调用xgboost.train()实现
  3. 数据预测:调用xgboost.predict()实现

2.2 完整代码

# -*- coding=utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
import xgboost as xgb


# train data
def get_train_data(data_size=100):
    data_label = np.zeros((2*data_size, 1))
    # class 1
    x1 = np.reshape(np.random.normal(3, 1, data_size), (data_size, 1))
    y1 = np.reshape(np.random.normal(4, 1, data_size), (data_size, 1))
    data_train = np.concatenate((x1, y1), axis=1)
    data_label[0:data_size, :] = 0
    # class 2
    x2 = np.reshape(np.random.normal(1, 1, data_size), (data_size, 1))
    y2 = np.reshape(np.random.normal(0.5, 1, data_size), (data_size, 1))
    data_train = np.concatenate((data_train, np.concatenate((x2, y2), axis=1)), axis=0)
    data_label[data_size:2*data_size, :] = 1

    return data_train, data_label


# test data
def get_test_data(start, end, data_size=100):
    data1 = (end - start) * np.random.random((data_size, 1)) + start
    data2 = (end - start) * np.random.random((data_size, 1)) + start
    data_test = np.concatenate((data1, data2), axis=1)
    return data_test


# show data distribution
def plot_data(train_data, data_size, test_data):
    plt.figure()
    plt.plot(train_data[0:data_size, 0], train_data[0:data_size, 1], 'g.',
             train_data[data_size:2*data_size, 0], train_data[data_size:2*data_size, 1], 'b*',
             test_data[:, 0], test_data[:, 1], 'rs')
    plt.legend(['class1', 'class 2', 'test_data'])
    plt.title('Distribution')
    plt.grid(True)
    plt.xlabel('axis1')
    plt.ylabel('axis2')
    plt.show()


# plot predict res
def plot_predict_data(train_data, data_size, test_data, predict_res1, predict_res2):
    plt.figure()
    plt.subplot(1, 2, 1)
    plt.plot(train_data[0:data_size, 0], train_data[0:data_size, 1], 'g.',
             train_data[data_size:2*data_size, 0], train_data[data_size:2*data_size, 1], 'b*',
             test_data[:, 0], test_data[:, 1], 'ms')
    plt.legend(['class1', 'class2', 'test_data'])
    plt.title('Distribution')
    plt.grid(True)
    plt.xlabel('axis1')
    plt.ylabel('axis2')

    plt.subplot(1, 2, 2)
    plt.plot(train_data[0:data_size, 0], train_data[0:data_size, 1], 'g.',
             train_data[data_size:2 * data_size, 0], train_data[data_size:2 * data_size, 1], 'b*',
             predict_res1[:, 0], predict_res1[:, 1], 'ro',
             predict_res2[:, 0], predict_res2[:, 1], 'rs')
    plt.legend(['class1', 'class2', 'predict1', 'predict2'])
    plt.title('Predict res')
    plt.grid(True)
    plt.xlabel('axis1')
    plt.ylabel('axis2')
    plt.show()

# main function
if __name__ == '__main__':
    data_size = 100
    train_data0, label_data = get_train_data(data_size)  # train data generate
    test_data0 = get_test_data(-1, 5, 10)  # test data
    plot_data(train_data0, data_size, test_data0)  # plot
    # data convert
    train_data = xgb.DMatrix(train_data0, label=label_data)
    test_data = xgb.DMatrix(test_data0)

    # data training
    num_round = 50
    param = {'booster': 'gbtree', 'eta': 0.1, 'max_depth': 5, 'objective': 'binary:logistic'}
    bst = xgb.train(param, train_data, num_round)

    # make prediction
    predict_res = bst.predict(test_data)
    print predict_res
    index1 = predict_res > 0.5
    res1 = test_data0[index1, :]
    res2 = test_data0[~index1, :]

    # plot prediction result
    plot_predict_data(train_data0, data_size, test_data0, res1, res2)

2.3 结果

在左图中是训练数据和测试数据的分布;右边是预测得到的结果,分别用红色实心圆和红色实心矩形表示不同的类别划分。
结果

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

### XGBoost 回归预测示例 以下是基于 Python 的 XGBoost 回归预测模型的一个完整示例代码,其中包括数据准备、模型训练以及参数调整的部分。 #### 数据加载与预处理 在实际应用中,通常需要先对数据集进行清洗和标准化处理。这里假设已经准备好了一个名为 `data.csv` 的文件,其中包含特征列和目标变量列。 ```python import pandas as pd from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler # 加载数据 df = pd.read_csv('data.csv') # 特征与标签分离 X = df.drop(columns=['target']).values # 替换'target'为目标列名 y = df['target'].values # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 标准化特征值 scaler = StandardScaler() X_train = scaler.fit_transform(X_train) X_test = scaler.transform(X_test) ``` #### 构建并训练 XGBoost 模型 通过设置初始超参数来构建基础的 XGBoost 回归器,并对其进行拟合操作。 ```python import xgboost as xgb from sklearn.metrics import mean_squared_error # 初始化模型 model = xgb.XGBRegressor(objective='reg:squarederror', n_estimators=100, max_depth=6, learning_rate=0.1, min_child_weight=1) # 训练模型 model.fit(X_train, y_train) # 预测 predictions = model.predict(X_test) # 输出均方误差(MSE) mse = mean_squared_error(y_test, predictions) print(f'Mean Squared Error: {mse}') ``` 上述代码展示了如何利用默认参数快速建立一个简单的回归模型[^1]。 #### 使用网格搜索优化超参数 为了进一步提升性能,可以采用网格搜索方法自动寻找最佳组合。 ```python from sklearn.model_selection import GridSearchCV # 定义待调优的参数范围 parameters = { 'n_estimators': [50, 100, 150], 'max_depth': [3, 5, 7], 'learning_rate': [0.01, 0.1, 0.2], 'min_child_weight': [1, 3, 5] } # 创建GridSearch对象 grid_search = GridSearchCV(estimator=xgb.XGBRegressor(), param_grid=parameters, scoring='neg_mean_squared_error', cv=3, verbose=1, n_jobs=-1) # 执行搜索过程 grid_search.fit(X_train, y_train) # 查看最优得分及对应配置 best_score = grid_search.best_score_ best_params = grid_search.best_params_ print(f"Best Score: {-best_score}") for key, value in best_params.items(): print(f"\t{key}: {value}") # 应用最优参数重新评估效果 optimized_model = grid_search.best_estimator_ final_predictions = optimized_model.predict(X_test) final_mse = mean_squared_error(y_test, final_predictions) print(f'Final Mean Squared Error with Optimized Parameters: {final_mse}') ``` 此部分实现了更精细的控制以提高模型准确性[^2]。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值