Python中的XGBoost简介

日期: 2025-03-14 02:04:43 |浏览: 0|编号: 79348

友情提醒:信息内容由网友发布,本站并不对内容真实性负责,请自鉴内容真实性。

Python中的XGBoost简介

摘要

是所谓的奇迹制造者,是机器学习爱好者和比赛获胜者选择的武器。据说开发 是为了提高计算速度和优化模型性能。

当我们在修改 的特性和参数时,我们决定建立一个由5家公司组成的投资组合,并在其上应用 模型来创建一个交易策略。这五家公司分别是苹果(Apple)、亚马逊()、 、 和微软()。

目录什么是

是极限梯度提升的简称,是在梯度提升框架下开发的。名字的意义是极限梯度提升算法。实际上,听起来更像是一辆超级跑车而不是机器学习的模型。

但这正是它所做的,提高了普通梯度提升模型的性能。

的作者陈天奇曾说:“ 使用了更加规范化的模型形式化来控制过度拟合,这使得它具有更好的性能”。

让我们分析一下这个名称,以了解 的功能。

什么是提升?

顺序集合方法(也称为“增强”)创建了一系列模型,试图在序列中纠正它们之前的模型错误。第一个模型建立在训练数据上,第二个模型改进了第一个模型,第三个模型改进了第二个模型,依此类推。

在上面的图像示例中,训练数据集被传递给分类器1。黄色背景表示分类器预测连字符,蓝色背景表示分类器预测正。分类器1模型错误地预测了两个连字符和一个加号。这些用圆圈突出显示。这些不正确的预测数据点的权重增加,并发送到下一个分类器。这是分类器2。分类器2正确地预测了分类器1无法预测的两个连字符。但是分类器2也会产生一些其他的错误。这个过程仍在继续,我们有一个组合的最终分类器,它可以正确地预测所有的数据点。

可以添加分类器模型,直到正确预测训练数据集中的所有项目或添加最大数量的分类器模型。通过超参数整定,可以确定训练分类器模型的最佳最大数目。

在这里停顿一下。也许你不知道什么是“连续模型”。随后我们将展开介绍。

简而言之就是机器学习

早些时候,我们用来编写某种逻辑,然后将输入输入到计算机程序中。程序将使用逻辑(即算法并提供输出)。所有这些都很棒,但是随着我们理解的增加,我们的程序也是如此,直到我们意识到,对于某些问题陈述,有太多的参数需要编程。

然后一些聪明的人说,我们应该只是给计算机(机器)的问题和解决方案的样本集,然后让机器学习。

在开发机器学习算法的过程中,我们意识到我们可以将机器学习问题大致分为两类: 分类和回归。简单地说,分类问题可以是给出一张动物的照片,我们试图把它分类为一只狗或一只猫(或其他一些动物)。相反,如果我们必须预测一个城市的温度,这将是一个回归问题,因为温度可以说是有连续的数值,如40度,40.1度等。

然后我们继续讨论决策树模型、贝叶斯、聚类模型等等。所有这一切都很好,直到我们遇到另一个障碍,当我们只使用一个模型时,某些问题陈述的预测率是令人沮丧的。除此之外,对于决策树,我们意识到我们不得不忍受模型中的偏差、方差和噪声。这引出了另一个好主意,我们把模型结合起来怎么样,正所谓三个臭皮匠,顶一个诸葛亮。这就是所谓的集成学习。但在这里,我们可以使用多个模型来创建一个集合。梯度提升就是这样一种集成学习。

什么是梯度提升?

在组合模型的梯度提升中,使用梯度下降法使损失函数最小化。从技术上讲,损失函数可以说是一个误差(预测值与实际值之差)。当然,误差越小,机器学习模型越好。

梯度提升是一种创建新模型的方法,这些新模型预测先前模型的残差或误差,然后将这些残差或误差加在一起进行最终预测。

模型的目标如下:

Obj = L + Ω

其中 L 是控制预测功率的损耗函数,Ω 是控制简单性和过拟合的正则分量

需要优化的损失函数(L)可以是用于回归的根均方差、用于二进制分类的 或用于多类分类的。

正则化分量(Ω)取决于树集合模型中叶片的数量和分配给叶片的预测得分。

之所以称之为梯度提升,是因为它使用了一种梯度下降法算法,以便在添加新模型时将损失降至最低。梯度提升算法同时支持回归和分类预测建模问题。

如果你想了解梯度下降法,你可以在这里阅读。

好了,我们已经理解了机器学习是如何从简单模型演变为模型组合的。不知何故,人类不能长期满足,随着问题陈述变得越来越复杂,数据集越来越大,我们意识到我们应该更进一步。这让我们找到了 。

为什么 这么好?

是用 C + + 编写的,仔细想想,它的计算时间非常快。 的优点在于它可以很容易地导入到 中,并且由于 包装器,我们可以使用在 包中使用的相同参数名称。

虽然实际的逻辑解释起来有些冗长,但是 xgost 的一个主要特点是它能够并行化助推算法的树构建组件。这导致了处理时间的显著增加,因为我们可以使用更多的 CPU 核心,甚至可以继续使用云计算。

虽然机器学习算法支持调优,并且可以与外部程序一起工作,但是 有内置的规则化和交叉验证参数,以确保偏差和方差都保持在最小值。内置参数的优点是可以更快地实现。

Xgost 特性的重要性

简而言之,特征是我们用来预测目标变量的变量。有时,我们并不满足于仅仅知道我们的机器学习模型有多好。我想知道哪个特征具有更强的预测能力。.知道特征重要性可以帮助我们的原因有很多。让我们列出以下几点:

的好处是它包含一个内置函数来计算特性的重要性,我们不必担心在模型中编写代码。 代码部分后面将使用的示例代码如下:

from xgboost import plot_importance
# Plot feature importance
plot_importance(model)

好的,在我们继续讨论代码之前,让我们确保我们的系统上都有 。

如何在中安装 ?

是一个 环境,它使我们编写 代码变得非常简单,并且可以处理与代码相关的任何细节。因此,我指定了在阿纳康达安装 的步骤。其实只是一行代码。

您可以简单地打开 提示符并输入以下内容: pip

环境将下载所需的安装文件并为您安装它。

这就是全部内容。现在我们来看看真正的东西,即 代码。

中的

在深入研究 机器学习模型之前,让我先对它做一个总结。我们正在使用美国科技股的股票数据,如苹果,亚马逊,, 和微软在过去16年,并训练 模型,以预测第二天的回报是正面还是负面。

我们以可下载的 笔记本的形式包含了这些代码,供您稍后使用。它附在文章的最后。为了更好地理解模型,我们将把 代码划分为以下几个部分:

导入库

我们已经在评论中介绍了这个库的用法。例如,因为我们使用 库,所以我们将导入相同的代码并将 # 作为注释写入。

# Import warnings and add a filter to ignore them
import warnings
warnings.simplefilter('ignore')
# Import XGBoost
import xgboost
# XGBoost Classifier
from xgboost import XGBClassifier
# Classification report and confusion matrix
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix
# Cross validation
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
# Pandas datareader to get the data
from pandas_datareader import data
# To plot the graphs
import matplotlib.pyplot as plt
import seaborn as sn
# For data manipulation
import pandas as pd
import numpy as np

到这一步,所有的库都已经导入。现在我们进入下一环节。

定义参数

我们已经定义了股票清单,开始日期和结束日期:

# Set the stock list
stock_list = ['AAPL', 'AMZN', 'NFLX', 'NVDA','MSFT']
# Set the start date and the end date
start_date = '2004-1-1'
end_date = '2020-1-28'

只是为了使事情变得有趣,我们将在苹果,亚马逊,,和等公司上使用 模型。创建预测变量和目标变量

我们定义了一个预测指标列表,该列表将从该列表中选择最佳预测指标。在这里,我们具有以不同时间段为预测变量的百分比变化和标准偏差。

目标变量是第二天的回报。如果第二天的回报为正,我们将其标记为1,如果是负数,则将其标记为-1。您也可以尝试使用三个标签(例如1、0和-1)创建目标变量,而无需位置和短职位。

让我们立即查看代码。

# Create a placeholder to store the stock data
stock_data_dictionary = {}
for stock_name in stock_list:
# Get the data
df = data.get_data_yahoo(stock_name, start_date, end_date)
# Calculate the daily percent change
df['daily_pct_change'] = df['Adj Close'].pct_change()
# create the predictors
predictor_list = []
for r in range(10, 60, 5):
df['pct_change_'+str(r)] = df.daily_pct_change.rolling(r).sum()
df['std_'+str(r)] = df.daily_pct_change.rolling(r).std()
predictor_list.append('pct_change_'+str(r))
predictor_list.append('std_'+str(r))
# Target Variable
df['return_next_day'] = df.daily_pct_change.shift(-1)
df['actual_signal'] = np.where(df.return_next_day > 0, 1, -1)
df = df.dropna()
# Add the data to dictionary
stock_data_dictionary.update({stock_name: df})

在我们继续讨论 模型的实现之前,让我们首先绘制存储在字典中的 Apple 的每日返回值,看看是否一切正常。

# Set the figure size
plt.figure(figsize=(10, 7))
# Access the dataframe of AAPL from the dictionary 
# and then compute and plot the returns
(stock_data_dictionary['AAPL'].daily_pct_change+1).cumprod().plot()
# Set the title and axis labels and plot grid
plt.title('AAPL Returns')
plt.ylabel('Cumulative Returns')
plt.grid()
plt.show()

您将得到如下输出:

看起来很精确。

将数据分割成训练集和测试集

由于 毕竟是一个机器学习模型,我们将把数据集划分为测试集和训练集。

# Create a placeholder for the train and test split data
X_train = pd.DataFrame()
X_test = pd.DataFrame()
y_train = pd.Series()
y_test = pd.Series()
for stock_name in stock_list:
# Get predictor variables
X = stock_data_dictionary[stock_name][predictor_list]
# Get the target variable
y = stock_data_dictionary[stock_name].actual_signal
# Divide the dataset into train and test
train_length = int(len(X)*0.80)
X_train = X_train.append(X[:train_length])
X_test = X_test.append(X[train_length:])
y_train = y_train.append(y[:train_length])
y_test = y_test.append(y[train_length:])

初始化 机器学习模型

我们将初始化分类器模型。我们将设置两个超参数,即 max _ deep 和 n _ 估计量。这些都设置在较低的一面,以减少过拟合。

# Initialize the model and set the hyperparameter values
model = XGBClassifier(max_depth=2, n_estimators=30)
model

输出如下:

训练数据集的交叉验证

# Initialize the KFold parameters
kfold = KFold(n_splits=5, random_state=7)
# Perform K-Fold Cross Validation
results = cross_val_score(model, X_train, y_train, cv=kfold)
# Print the average results
print("Accuracy: %.2f%% (%.2f%%)" % (results.mean()*100, results.std()*100))

产出如下:

准确度略高于半数。这可以通过调整超参数和将类似的股票组合在一起来进一步改进。

训练模型

我们将使用拟合方法训练 分类器。

# 符合模型

model.fit(X_train, y_train)

输出如下:

特征重要性

我们已经绘制了前7个特性,并根据其重要性进行了排序。

# Plot the top 7 features
xgboost.plot_importance(model, max_num_features=7)
# Show the plot
plt.show()

模型告诉我们,pct _ _ 40是其他模型中最重要的特性。因为我们提到我们只需要7个特性,所以我们收到了这个列表。这里有一个有趣的想法,你为什么不增加这个数字,看看其他功能如何叠加,当谈到他们的 f 值。您还可以删除不重要的特性,然后重新训练模型。这会提高模型的准确性吗?我留给你去验证。

预测和分类报告

# Predict the trading signal on test dataset
y_pred = model.predict(X_test)
# Get the classification report
print(classification_report(y_test, y_pred))

让我们看看 现在告诉我们什么:

长边的 f1得分比短边的强大得多。我们可以修改这个模型,使其成为一个只做长线的策略。

让我们尝试另一种方法来表述 的执行情况。

混合矩阵

array = confusion_matrix(y_test, y_pred)
df = pd.DataFrame(array, index=['Short', 'Long'], columns=[
'Short', 'Long'])
plt.figure(figsize=(5, 4))
sn.heatmap(df, annot=True, cmap='Greens', fmt='g')
plt.xlabel('Predicted')
plt.ylabel('Actual')
plt.show()

输出如下图所示:

这是一个简单的矩阵,它向我们展示了 预测“买入”或“卖出”的准确与否的次数。例如,在预测“ Long”时, 正确预测了1926次,而错误预测了1608次。

另一种解释是, 倾向于预测“长期”多于“短期”。

个股表现

让我们看看基于 的策略收益率如何与正常的日收益率(买入并持有策略)相比较。我们将绘制一张比较图,将我们之前提到的所有公司的战略收益和日收益进行比较。代码如下:

# Create an empty dataframe to store the strategy returns of individual stocks
portfolio = pd.DataFrame(columns=stock_list)
# For each stock in the stock list, plot the strategy returns and buy and hold returns
for stock_name in stock_list:
# Get the data
df = stock_data_dictionary[stock_name]
# Store the predictor variables in X
X = df[predictor_list]
# Define the train and test dataset
train_length = int(len(X)*0.80)
# Predict the signal and store in predicted signal column
df['predicted_signal'] = model.predict(X)
# Calculate the strategy returns
df['strategy_returns'] = df.return_next_day * df.predicted_signal
# Add the strategy returns to the portfolio dataframe
portfolio[stock_name] = df.strategy_returns[train_length:]
# Plot the stock strategy and buy and hold returns
print(stock_name)
# Set the figure size
plt.figure(figsize=(10, 7))
# Calculate the cumulative strategy returns and plot
(df.strategy_returns[train_length:]+1).cumprod().plot()
# Calculate the cumulative buy and hold strategy returns
(stock_data_dictionary[stock_name][train_length:].daily_pct_change+1).cumprod().plot()
# Set the title, label and grid
plt.title(stock_name + ' Returns')
plt.ylabel('Cumulative Returns')
plt.legend(labels=['Strategy Returns', 'Buy and Hold Returns'])
plt.grid()
plt.show()

你觉得这个比较怎么样?请在评论中告诉小Q你的观点或想法~

投资组合表现

我们很享受这个过程,以至于我们不能停留在主观层面。因此,我们认为,如果我们平等地投资于所有公司,并根据 模型采取行动,会产生意想不到的效果。

# Drop missing values
portfolio.dropna(inplace=True)
# Set the figure size
plt.figure(figsize=(10, 7))
# Calculate the cumulative portfolio returns by assuming equal allocation to the stocks
(portfolio.mean(axis=1)+1).cumprod().plot()
# Set the title and label of the chart
plt.title('Portfolio Strategy Returns')
plt.ylabel('Cumulative Returns')
plt.grid()
plt.show()

请记住,这些是累积回报,因此它应该给您一个关于 模型性能的概念。

如果需要关于测试集的更详细的反馈,请尝试以下代码。

import pyfolio as pf
pf.create_full_tear_sheet(portfolio.mean(axis=1))

虽然生成的输出有些冗长,但我们附加了一个快照方便阅读:

能看到这里的都是勇士!小Q相信你一定能理解这样的增强型模型是如何帮助我们产生信号和创建交易策略的。

结论

我们从基础开始(机器学习算法的出现及其下一个层次,即集成学习)。我们学习了梯度提升树,以及它们如何帮助我们做出更好的预测。最后我们得到了机器学习模型以及它是如何优于常规的增强算法的。然后,我们浏览了一个简单的 代码,并根据该代码创建的交易信号创建了一个投资组合。在此期间,我们还列出了 中包含的特性重要性以及某些参数。

提醒:请联系我时一定说明是从旅游网上看到的!