Python代码XGBoost算法项目实战

【投稿赢 iPhone 17】「我的第一个开源项目」故事征集:用代码换C位出道! 10w+人浏览 1.7k人参与

XGBoost(eXtreme Gradient Boosting)是一种基于梯度提升框架的机器学习算法,专为高效、灵活和可扩展性设计。它通过集成多个弱学习器(通常是决策树)并优化损失函数来提升模型性能,广泛应用于分类、回归和排序任务。接下来我们用代码实操XGBoost:

1、导入数据

import numpy as np

import pandas as pd

data = pd.read_excel(r'训练数据.xlsx')

data=data.set_index(keys='id')   #将数据框data中的'id'列设置为索引(index)

print(data.shape)

data.head()

data.describe()

对于数值型数据,describe() 默认返回以下统计信息:

    count:非空值的数量

    mean:平均值

    std:标准差

    min:最小值

    25%:第一四分位数(25% 的数据小于等于该值)

    50%:第二四分位数(中位数,50% 的数据小于等于该值)

    75%:第三四分位数(75% 的数据小于等于该值)

    max:最大值

如果数据包含对象(例如字符串)或分类数据,describe() 会返回不同的统计信息:

    count:非空值的数量

    unique:唯一值的数量

    top:最常出现的值(众数)

    freq:最常出现的值的频率

2、数据预处理

data.iloc[:,6:]=data.iloc[:,6:].replace(0,1) 

iloc[:,6:] 表示选取所有行,以及从第6列(包括第6列,索引从0开始)到最后一列的所有列。调整系数为0可能表示无效值,用1替换(即无调整)可能是一种处理方式。

data=data.drop(data[data['E']==0].index)   # 删了它

data=data.drop(data[(data['A']<0.7)|(data['A']>1.3)].index)

data=data.drop(data[(data['B']<0.7)|(data['B']>1.3)].index)

data=data.drop(data[(data['C']<0.7)|(data['C']>1.3)].index)

print(data.shape)

data.describe()

3、划分训练集

from sklearn.model_selection import train_test_split

from sklearn.preprocessing import MinMaxScaler  #用于将特征缩放到指定范围(通常为0-1)消除不同特征之间量纲和数值范围的差异。

scaler_x= MinMaxScaler(feature_range=(0,1))

# 划分训练集和测试集

X=data.iloc[:,:5]

y=data.iloc[:,5:]

print(X.shape)

print(y.shape)

.shape 是为了查看数据的维度信息

print("x 的列名:", X.columns.tolist())

print("y 的列名:", y.columns.tolist())

不算id列

X_train,X_test,y_train,y_test=train_test_split(X, y, test_size=0.2)

X_train=scaler_x.fit_transform(X_train)

X_test=scaler_x.transform(X_test)

    训练集使用 fit_transform:从训练数据学习缩放参数

    测试集使用 transform:使用训练集学到的参数进行转换

    fit():计算数据的统计参数

        对于 MinMaxScaler:计算每个特征的最小值和最大值

        这些参数会保存在 scaler 对象中

    transform():应用转换

        使用 fit() 阶段计算出的参数,实际缩放数据

        将数据转换到指定范围 [0, 1]

4、xgboost预测

import matplotlib.pyplot as plt   #用于绘图

from matplotlib import rcParams #用于设置字体等图形参数。

from sklearn.metrics import mean_squared_error  #均方误差

from sklearn.metrics import mean_absolute_error  #平均绝对误差

from math import sqrt   #用于计算平方根

from sklearn.multioutput import MultiOutputRegressor  #多输出回归器

import xgboost  as xgb

other_params = {'learning_rate': 0.1,

 'n_estimators': 300,

 'max_depth': 11,

 'min_child_weight': 1,

'seed': 0,

'subsample': 1,

'colsample_bytree': 0.8,

'gamma': 0,

 'reg_alpha': 0,

 'reg_lambda': 1}


model =MultiOutputRegressor(xgb.XGBRegressor(objective='reg:squarederror',**other_params)).fit(X_train, y_train)

model.fit(X_train, y_train)

y_pred= model.predict(X_test)

y_pred=np.array(y_pred)

y_test=np.array(y_test)

#将预测值和测试集真实值转换为numpy数组

wucha_1=y_pred-y_test

常用代码需要在XGBClassifier中调参:

XGBoost是一个强大的机器学习库,尤其适用于表格数据。默认参数通常可以工作,但为了获得更好的性能,我们通常需要通过交叉验证来调整超参数。

#部分参数解释:

n_estimators基学习器(树)的数量,即模型要构建多少棵决策树。

作用: 控制模型复杂度:树越多,模型越复杂,学习能力越强

影响性能:值太小:模型可能欠拟合,学习不充分

值太大:可能过拟合,训练时间变长

通常与 learning_rate 配合调整: 小学习率 + 多树;大学习率 + 少树

booster='gbtree'(常用)   

含义:指定使用的基学习器类型。XGBoost提供了三种基学习器:gbtree(树模型)、gblinear(线性模型)和dart(带Dropout的树模型)。

作用:这里选择gbtree的是基于树的模型,也就是我们通常使用的决策树作为基学习器。树模型可以处理非线性关系,并且对特征缩放不敏感。

如果选择gblinear,则使用线性模型,适用于线性关系的数据。dart则是树模型的一种变体,它引入了Dropout来防止过拟合。

objective='binary:logistic', # 对于二分类问题,多分类使用'multi:softmax' 'multi:softprob'

二分类是是否问题,只有两个结果

多分类的特征:目标变量有3个或更多不同的值,预测结果在多个类别中选择

y = ['AD', 'CN', 'EMCI', 'LMCI', 'SMC'] → 5分类问题

使用 'multi:softmax',模型会直接输出类别标签(需要设置num_class参数)这里num_class=5

使用'multi:softprob' 则会输出每个类别的概率

5、评价预测系数

# 计算MSE

mse = mean_squared_error(y_test[:,0], y_pred[:,0])

print('mse',mse)

#计算RMSE均方根误差

rmse = sqrt(mean_squared_error(y_test[:,0], y_pred[:,0]))

print('rmse',rmse)

#计算MAE平均绝对误差

mae=mean_absolute_error(y_test[:,0], y_pred[:,0])

print('mae',mae)

def mape(y_true, y_pred):

    return np.mean(np.abs((y_pred - y_true) / y_true)) * 100

mape=mape(y_test[:,0],y_pred[:,0])

print('mape',mape)

#画出真实值和预测值对比图

plt.figure(figsize=(20,6))

rcParams['font.sans-serif'] = 'SimHei'

plt.plot(np.array(y_test[:,0]),color="blue", linewidth=1, linestyle="-")

plt.plot(np.array(y_pred[:,0]),color="red", linewidth=1, linestyle="-.")

plt.legend(['真实值','预测值'])

plt.show()

plt.figure(figsize=(20,6))

rcParams['font.sans-serif'] = 'SimHei'

plt.rcParams['axes.unicode_minus'] = False

plt.hist(wucha_1[:,0],30)

plt.show()

本文介绍了XGBoost算法及的应用。通过Python代码演示了完整流程:1)数据导入与预处理;2)异常值处理;3)特征标准化;4)构建XGBoost多输出回归模型;5)模型评估。重点分析了XGBoost参数调优方法,并展示了预测结果的可视化对比。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值