首先,点击下载数据文件
今天学习的是基于天气数据集的XGBoost分类实战。
XGBoost并不是一种模型,而是一个可供用户轻松解决分类、回归或排序问题的软件包。它内部实现了梯度提升树(GBDT)模型,并对模型中的算法进行了诸多优化,在取得高精度的同时又保持了极快的速度。
## 基础函数库
import numpy as np
import pandas as pd
## 绘图函数库
import matplotlib.pyplot as plt
## 数据集划分
from sklearn.model_selection import train_test_split
## 导入XGBoost模型
from xgboost.sklearn import XGBClassifier
英语学习时间:category:类别,范畴
# 先纪录数字特征与非数字特征:
numerical_features = [x for x in data.columns if data[x].dtype == np.float]
category_features = [x for x in data.columns if data[x].dtype != np.float and x != 'RainTomorrow']
## 对离散变量进行编码
## 把所有的相同类别的特征编码为同一个值
def get_mapfunction(x):
mapp = dict(zip(x.unique().tolist(),
range(len(x.unique().tolist()))))
def mapfunction(y):
if y in mapp:
return mapp[y]
else:
return -1
return mapfunction
for i in category_features:
data[i] = data[i].apply(get_mapfunction(data[i]))
# 编码后的字符串特征变成了数字
data['Location'].unique()
## 选择其类别为0和1的样本 (不包括类别为2的样本)
data_y = data['RainTomorrow']
data_X = data[[x for x in data.columns if x != 'RainTomorrow']]
## 测试集大小为20%
x_train, x_test, y_train, y_test = train_test_split(data_X, data_y, test_size = 0.2, random_state = 2022)
## 定义 XGBoost模型
clf = XGBClassifier()
# 在训练集上训练XGBoost模型
clf.fit(x_train, y_train)
## 测试准确率
trainAccu = clf.score(x_train, y_train)
testAccu = clf.score(x_test, y_test)
print(f"训练集准确率={trainAccu}\n"
f"测试集准确率={testAccu}")
'''
训练集准确率=0.8985407021039676
测试集准确率=0.8599559285479863
'''
plt.barh(data_X.columns, clf.feature_importances_)
从图中我们可以发现下午3点的湿度与今天是否下雨是决定第二天是否下雨最重要的因素
除此之外,我们还可以使用XGBoost中的下列重要属性来评估特征的重要性。
## 从sklearn库中导入网格调参函数
from sklearn.model_selection import GridSearchCV
## 定义参数取值范围
learning_rate = [0.1, 0.3, 0.6]
subsample = [0.8, 0.9]
colsample_bytree = [0.6, 0.8]
max_depth = [3,5,8]
parameters = { 'learning_rate': learning_rate,
'subsample': subsample,
'colsample_bytree':colsample_bytree,
'max_depth': max_depth}
model = XGBClassifier(n_estimators = 50)
## 进行网格搜索
clf = GridSearchCV(model, parameters, cv=3, scoring='accuracy',verbose=1,n_jobs=-1)
clf = clf.fit(x_train, y_train)
clf.best_params_
clf.best_params_给出的结果即为最佳参数,看看效果吧
## 定义带参数的 XGBoost模型
clf = XGBClassifier(colsample_bytree = 0.6, learning_rate = 0.3,
max_depth= 8, subsample = 0.9)
# 在训练集上训练XGBoost模型
clf.fit(x_train, y_train)
## 测试准确率
trainAccu = clf.score(x_train, y_train)
testAccu = clf.score(x_test, y_test)
print(f"训练集准确率={trainAccu}\n"
f"测试集准确率={testAccu}")
#训练集准确率=0.9435503721502667
#测试集准确率=0.8585025083220029
准确率提高了!
pd.isnull(data).any()就可以查看缺失值啦。
数据集除了用wget来下载外,也可以直接下载的
关于“数据不平衡”问题,到时候写一篇R语言的博客来说吧
XGBoost的重要参数
eta[默认0.3]
通过为每一颗树增加权重,提高模型的鲁棒性。
典型值为0.01-0.2。
min_child_weight[默认1]
决定最小叶子节点样本权重和。
这个参数可以避免过拟合。当它的值较大时,可以避免模型学习到局部的特殊样本。
但是如果这个值过高,则会导致模型拟合不充分。
max_depth[默认6]
这个值也是用来避免过拟合的。max_depth越大,模型会学到更具体更局部的样本。
典型值:3-10
max_leaf_nodes
树上最大的节点或叶子的数量。
可以替代max_depth的作用。
这个参数的定义会导致忽略max_depth参数。
gamma[默认0]
在节点分裂时,只有分裂后损失函数的值下降了,才会分裂这个节点。Gamma指定了节点分裂所需的最小损失函数下降值。 这个参数的值越大,算法越保守。这个参数的值和损失函数息息相关。
max_delta_step[默认0]
这参数限制每棵树权重改变的最大步长。如果这个参数的值为0,那就意味着没有约束。如果它被赋予了某个正值,那么它会让这个算法更加保守。
但是当各类别的样本十分不平衡时,它对分类问题是很有帮助的。
subsample[默认1]
这个参数控制对于每棵树,随机采样的比例。
减小这个参数的值,算法会更加保守,避免过拟合。但是,如果这个值设置得过小,它可能会导致欠拟合。
典型值:0.5-1
colsample_bytree[默认1]
用来控制每棵随机采样的列数的占比(每一列是一个特征)。
典型值:0.5-1
colsample_bylevel[默认1]
用来控制树的每一级的每一次分裂,对列数的采样的占比。
subsample参数和colsample_bytree参数可以起到相同的作用,一般用不到。
lambda[默认1]
权重的L2正则化项。(和Ridge regression类似)。
这个参数是用来控制XGBoost的正则化部分的。虽然大部分数据科学家很少用到这个参数,但是这个参数在减少过拟合上还是可以挖掘出更多用处的。
alpha[默认1]
权重的L1正则化项。(和Lasso regression类似)。
可以应用在很高维度的情况下,使得算法的速度更快。
scale_pos_weight[默认1]
在各类别样本十分不平衡时,把这个参数设定为一个正值,可以使算法更快收敛。。