东莞seo建站,做婚礼logo免费的网站,企业免费网站优化方案,中企动力企业邮箱手机app1. XGBoost的介绍
XGBoost是2016年由华盛顿大学陈天奇老师带领开发的一个可扩展机器学习系统。严格意义上讲XGBoost并不是一种模型#xff0c;而是一个可供用户轻松解决分类、回归或排序问题的软件包。它内部实现了梯度提升树(GBDT)模型#xff0c;并对模型中的算法进行了诸…1. XGBoost的介绍
XGBoost是2016年由华盛顿大学陈天奇老师带领开发的一个可扩展机器学习系统。严格意义上讲XGBoost并不是一种模型而是一个可供用户轻松解决分类、回归或排序问题的软件包。它内部实现了梯度提升树(GBDT)模型并对模型中的算法进行了诸多优化在取得高精度的同时又保持了极快的速度在一段时间内成为了国内外数据挖掘、机器学习领域中的大规模杀伤性武器。
更重要的是XGBoost在系统优化和机器学习原理方面都进行了深入的考虑。毫不夸张的讲XGBoost提供的可扩展性可移植性与准确性推动了机器学习计算限制的上限该系统在单台机器上运行速度比当时流行解决方案快十倍以上甚至在分布式系统中可以处理十亿级的数据。
XGBoost的主要优点
简单易用。相对其他机器学习库用户可以轻松使用XGBoost并获得相当不错的效果。高效可扩展。在处理大规模数据集时速度快效果好对内存等硬件资源要求不高。鲁棒性强。相对于深度学习模型不需要精细调参便能取得接近的效果。XGBoost内部实现提升树模型可以自动处理缺失值。
XGBoost的主要缺点
相对于深度学习模型无法对时空位置建模不能很好地捕获图像、语音、文本等高维数据。在拥有海量训练数据并能找到合适的深度学习模型时深度学习的精度可以遥遥领先XGBoost。
2.算法实战 基于天气数据集的XGBoost分类实战 数据集网址https://tianchi-media.oss-cn-beijing.aliyuncs.com/DSW/7XGBoost/train.csv
Step1函数库导入
## 基础函数库
import numpy as np
import pandas as pd## 绘图函数库
import matplotlib.pyplot as plt
import seaborn as sns
本次我们选择天气数据集进行方法的尝试训练现在有一些由气象站提供的每日降雨数据我们需要根据历史降雨数据来预测明天会下雨的概率。样例涉及到的测试集数据test.csv与train.csv的格式完全相同但其RainTomorrow未给出为预测变量。
Step2数据读取/载入
## 我们利用Pandas自带的read_csv函数读取并转化为DataFrame格式data pd.read_csv(train.csv)
Step3数据信息简单查看
## 利用.info()查看数据的整体信息
data.info()## 进行简单的数据查看我们可以利用 .head() 头部.tail()尾部
data.head() 这里我们发现数据集中存在NaN一般的我们认为NaN在数据集中代表了缺失值可能是数据采集或处理时产生的一种错误。这里我们采用-1将缺失值进行填补还有其他例如“中位数填补、平均数填补”的缺失值处理方法有兴趣的同学也可以尝试。
data data.fillna(-1) ## 利用value_counts函数查看训练集标签的数量
pd.Series(data[RainTomorrow]).value_counts() 我们发现数据集中的负样本数量远大于正样本数量这种常见的问题叫做“数据不平衡”问题在某些情况下需要进行一些特殊处理。
## 对于特征进行一些统计描述
data.describe() Step4:可视化描述
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]
## 选取三个特征与标签组合的散点可视化
sns.pairplot(datadata[[Rainfall,
Evaporation,
Sunshine] [RainTomorrow]], diag_kindhist, hue RainTomorrow)
plt.show() 从上图可以发现在2D情况下不同的特征组合对于第二天下雨与不下雨的散点分布以及大概的区分能力。相对的Sunshine与其他特征的组合更具有区分能力
for col in data[numerical_features].columns:if col ! RainTomorrow:sns.boxplot(xRainTomorrow, ycol, saturation0.5, palettepastel, datadata)plt.title(col)plt.show() 利用箱型图我们也可以得到不同类别在不同特征上的分布差异情况。我们可以发现Sunshine,Humidity3pm,Cloud9am,Cloud3pm的区分能力较强
tlog {}
for i in category_features:tlog[i] data[data[RainTomorrow] Yes][i].value_counts()
flog {}
for i in category_features:flog[i] data[data[RainTomorrow] No][i].value_counts()plt.figure(figsize(10,10))
plt.subplot(1,2,1)
plt.title(RainTomorrow)
sns.barplot(x pd.DataFrame(tlog[Location]).sort_index()[Location], y pd.DataFrame(tlog[Location]).sort_index().index, color red)
plt.subplot(1,2,2)
plt.title(Not RainTomorrow)
sns.barplot(x pd.DataFrame(flog[Location]).sort_index()[Location], y pd.DataFrame(flog[Location]).sort_index().index, color blue)
plt.show() 从上图可以发现不同地区降雨情况差别很大有些地方明显更容易降雨
Step5:对离散变量进行编码
由于XGBoost无法处理字符串类型的数据我们需要一些方法讲字符串数据转化为数据。一种最简单的方法是把所有的相同类别的特征编码成同一个值例如女0男1狗狗2所以最后编码的特征值是在[0,特征数量−1][0,特征数量−1]之间的整数。除此之外还有独热编码、求和编码、留一法编码等等方法可以获得更好的效果。
## 把所有的相同类别的特征编码为同一个值
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 -1return mapfunction
for i in category_features:data[i] data[i].apply(get_mapfunction(data[i]))
Step6利用 XGBoost 进行训练与预测
## 为了正确评估模型性能将数据划分为训练集和测试集并在训练集上训练模型在测试集上验证模型性能。
from sklearn.model_selection import train_test_split## 选择其类别为0和1的样本 不包括类别为2的样本
data_target_part data[RainTomorrow]
data_features_part data[[x for x in data.columns if x ! RainTomorrow]]## 测试集大小为20% 80%/20%分
x_train, x_test, y_train, y_test train_test_split(data_features_part, data_target_part, test_size 0.2, random_state 2020)## 导入XGBoost模型
from xgboost.sklearn import XGBClassifier
## 定义 XGBoost模型
clf XGBClassifier()
# 在训练集上训练XGBoost模型
clf.fit(x_train, y_train)## 在训练集和测试集上分布利用训练好的模型进行预测
train_predict clf.predict(x_train)
test_predict clf.predict(x_test)
from sklearn import metrics## 利用accuracy准确度【预测正确的样本数目占总预测样本数目的比例】评估模型效果
print(The accuracy of the Logistic Regression is:,metrics.accuracy_score(y_train,train_predict))
print(The accuracy of the Logistic Regression is:,metrics.accuracy_score(y_test,test_predict))## 查看混淆矩阵 (预测值和真实值的各类情况统计矩阵)
confusion_matrix_result metrics.confusion_matrix(test_predict,y_test)
print(The confusion matrix result:\n,confusion_matrix_result)# 利用热力图对于结果进行可视化
plt.figure(figsize(8, 6))
sns.heatmap(confusion_matrix_result, annotTrue, cmapBlues)
plt.xlabel(Predicted labels)
plt.ylabel(True labels)
plt.show() 我们还可以使用XGBoost中的下列重要属性来评估特征的重要性。
weight:是以特征用到的次数来评价gain:当利用特征做划分的时候的评价基尼指数cover:利用一个覆盖样本的指标二阶导数具体原理不清楚有待探究平均值来划分。total_gain:总基尼指数total_cover:总覆盖 from sklearn.metrics import accuracy_score
from xgboost import plot_importancedef estimate(model,data):#sns.barplot(data.columns,model.feature_importances_)ax1plot_importance(model,importance_typegain)ax1.set_title(gain)ax2plot_importance(model, importance_typeweight)ax2.set_title(weight)ax3 plot_importance(model, importance_typecover)ax3.set_title(cover)plt.show()
def classes(data,label,test):modelXGBClassifier()model.fit(data,label)ansmodel.predict(test)estimate(model, data)return ansansclasses(x_train,y_train,x_test)
preaccuracy_score(y_test, ans)
print(acc,accuracy_score(y_test,ans)) Step8: 通过调整参数获得更好的效果 XGBoost中包括但不限于下列对模型影响较大的参数
learning_rate: 有时也叫作eta系统默认值为0.3。每一步迭代的步长很重要。太大了运行准确率不高太小了运行速度慢。subsample系统默认为1。这个参数控制对于每棵树随机采样的比例。减小这个参数的值算法会更加保守避免过拟合, 取值范围零到一。colsample_bytree系统默认值为1。我们一般设置成0.8左右。用来控制每棵随机采样的列数的占比(每一列是一个特征)。max_depth 系统默认值为6我们常用3-10之间的数字。这个值为树的最大深度。这个值是用来控制过拟合的。max_depth越大模型学习的更加具体。
调节模型参数的方法有贪心算法、网格调参、贝叶斯调参等。这里我们采用网格调参它的基本思想是穷举搜索在所有候选的参数选择中通过循环遍历尝试每一种可能性表现最好的参数就是最终的结果
## 从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, cv3, scoringaccuracy,verbose1,n_jobs-1)
clf clf.fit(x_train, y_train)## 网格搜索后的最好参数为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)train_predict clf.predict(x_train)
test_predict clf.predict(x_test)## 利用accuracy准确度【预测正确的样本数目占总预测样本数目的比例】评估模型效果
print(The accuracy of the Logistic Regression is:,metrics.accuracy_score(y_train,train_predict))
print(The accuracy of the Logistic Regression is:,metrics.accuracy_score(y_test,test_predict))## 查看混淆矩阵 (预测值和真实值的各类情况统计矩阵)
confusion_matrix_result metrics.confusion_matrix(test_predict,y_test)
print(The confusion matrix result:\n,confusion_matrix_result)# 利用热力图对于结果进行可视化
plt.figure(figsize(8, 6))
sns.heatmap(confusion_matrix_result, annotTrue, cmapBlues)
plt.xlabel(Predicted labels)
plt.ylabel(True labels)
plt.show()
原本有2470 790个错误现在有 2112 939个错误带来了明显的正确率提升。
3. 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] 在各类别样本十分不平衡时把这个参数设定为一个正值可以使算法更快收敛。
GBoost底层实现了GBDT算法并对GBDT算法做了一系列优化
对目标函数进行了泰勒展示的二阶展开可以更加高效拟合误差。提出了一种估计分裂点的算法加速CART树的构建过程同时可以处理稀疏数据。提出了一种树的并行策略加速迭代。为模型的分布式算法进行了底层优化。
XGBoost是基于CART树的集成模型它的思想是串联多个决策树模型共同进行决策