【机器学习】基于天气数据集的XGBoost分类与预测

目录

  • 一、学习知识点概要
  • 二、学习内容
    • 代码
      • 1.导入库
      • 2.对离散变量进行编码
      • 3.利用 XGBoost 进行训练与测试
      • 4.利用 XGBoost 进行特征选择
      • 5.模型调参
  • 三、学习问题与解答
  • 四、学习思考与总结

一、学习知识点概要

首先,点击下载数据文件
今天学习的是基于天气数据集的XGBoost分类实战。
XGBoost并不是一种模型,而是一个可供用户轻松解决分类、回归或排序问题的软件包。它内部实现了梯度提升树(GBDT)模型,并对模型中的算法进行了诸多优化,在取得高精度的同时又保持了极快的速度。

二、学习内容

代码

1.导入库

##  基础函数库
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

2.对离散变量进行编码

  • 分别记录取值为数值(numerical)与非数值的变量
    (或着说特征或着列,都是一种概念)
  • 对离散变量进行编码:XGBoost无法处理字符串类型的数据,我们需要将字符串数据转化为数据。一种方法是把所有的相同类别的特征编码成同一个值,例如女=0,男=1,狗狗=2,所以最后编码的特征值是在 [0,特征数量−1]之间的整数

英语学习时间: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()

3.利用 XGBoost 进行训练与测试

## 选择其类别为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
'''

4.利用 XGBoost 进行特征选择

plt.barh(data_X.columns, clf.feature_importances_)

【机器学习】基于天气数据集的XGBoost分类与预测_第1张图片
从图中我们可以发现下午3点的湿度与今天是否下雨是决定第二天是否下雨最重要的因素
除此之外,我们还可以使用XGBoost中的下列重要属性来评估特征的重要性。

  • weight:是以特征用到的次数来评价
  • gain:当利用特征做划分的时候的评价基尼指数
  • cover:利用一个覆盖样本的指标二阶导数(具体原理不清楚有待探究)平均值来划分。
  • total_gain:总基尼指数
  • total_cover:总覆盖

5.模型调参

## 从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

准确率提高了!

三、学习问题与解答

  1. pd.isnull(data).any()就可以查看缺失值啦。

  2. 数据集除了用wget来下载外,也可以直接下载的

  3. 关于“数据不平衡”问题,到时候写一篇R语言的博客来说吧

四、学习思考与总结

XGBoost的重要参数

  1. eta[默认0.3]
    通过为每一颗树增加权重,提高模型的鲁棒性。
    典型值为0.01-0.2。

  2. min_child_weight[默认1]
    决定最小叶子节点样本权重和。
    这个参数可以避免过拟合。当它的值较大时,可以避免模型学习到局部的特殊样本。
    但是如果这个值过高,则会导致模型拟合不充分。

  3. max_depth[默认6]
    这个值也是用来避免过拟合的。max_depth越大,模型会学到更具体更局部的样本。
    典型值:3-10

  4. max_leaf_nodes
    树上最大的节点或叶子的数量。
    可以替代max_depth的作用。
    这个参数的定义会导致忽略max_depth参数。

  5. gamma[默认0]
    在节点分裂时,只有分裂后损失函数的值下降了,才会分裂这个节点。Gamma指定了节点分裂所需的最小损失函数下降值。 这个参数的值越大,算法越保守。这个参数的值和损失函数息息相关。

  6. max_delta_step[默认0]
    这参数限制每棵树权重改变的最大步长。如果这个参数的值为0,那就意味着没有约束。如果它被赋予了某个正值,那么它会让这个算法更加保守。
    但是当各类别的样本十分不平衡时,它对分类问题是很有帮助的。

  7. subsample[默认1]
    这个参数控制对于每棵树,随机采样的比例。
    减小这个参数的值,算法会更加保守,避免过拟合。但是,如果这个值设置得过小,它可能会导致欠拟合。
    典型值:0.5-1

  8. colsample_bytree[默认1]
    用来控制每棵随机采样的列数的占比(每一列是一个特征)。
    典型值:0.5-1

  9. colsample_bylevel[默认1]
    用来控制树的每一级的每一次分裂,对列数的采样的占比。
    subsample参数和colsample_bytree参数可以起到相同的作用,一般用不到。

  10. lambda[默认1]
    权重的L2正则化项。(和Ridge regression类似)。
    这个参数是用来控制XGBoost的正则化部分的。虽然大部分数据科学家很少用到这个参数,但是这个参数在减少过拟合上还是可以挖掘出更多用处的。

  11. alpha[默认1]
    权重的L1正则化项。(和Lasso regression类似)。
    可以应用在很高维度的情况下,使得算法的速度更快。

  12. scale_pos_weight[默认1]
    在各类别样本十分不平衡时,把这个参数设定为一个正值,可以使算法更快收敛。。

你可能感兴趣的:(机器学习,机器学习,分类,python,boost,数据分析)