回归分析在数据科学领域扮演着关键角色,用于预测数值型目标变量。本文深入探讨了几种常用的回归模型,包括多输出K近邻回归,决策树回归,集成算法回归,梯度提升决策树回归,随机森林回归,多输出随机森林回归,人工神经网络。
多输出K近邻回归:
多输出K近邻回归不需要使用MultiOutputRegressor作为外包装器,直接使用KNeighborsRegressor即可实现多输出回归。这种方法通过输入一个数据集X,其中包含除了目标变量(在这个例子中是’Adj Close’和’Open’)之外的所有特征,和包含两个目标变量的数据集Y。代码示例如下:
X = dataset.drop(['Adj Close', 'Open'], axis=1)
Y = dataset[['Adj Close', 'Open']]
from sklearn.neighbors import KNeighborsRegressor
model = KNeighborsRegressor()
model.fit(X, Y)
data_in = [[23.98, 22.91, 7.00, 7.00, 1.62, 1.62, 4.27, 4.25]]
yhat = model.predict(data_in)
print(yhat[0]) # 输出:[15.64999962, 16.64999962]
print(model.score(X, Y)) # 输出:1
决策树回归:
决策树是一种树状结构,每个叶子结点对应一个分类,非叶子结点对应某个属性上的划分。文章详细介绍了决策树的基本原理和生成过程。在这个例子中,使用DecisionTreeRegressor进行回归分析,代码如下:
X = dataset.drop(['Adj Close', 'Close'], axis=1)
y = dataset['Adj Close']
from sklearn.tree import DecisionTreeRegressor
regressor = DecisionTreeRegressor()
regressor.fit(X_train, y_train)
y_pred = regressor.predict(X_test)
# 输出预测结果
df = pd.DataFrame({'Actual': y_test, 'Predicted': y_pred})
print(df.head(2))
# 输出模型评价指标
print(metrics.mean_absolute_error(y_test, y_pred))
print(metrics.mean_squared_error(y_test, y_pred))
print(np.sqrt(metrics.mean_squared_error(y_test, y_pred)))
# 输出交叉验证和R2得分
dt_scores = cross_val_score(regressor, X_train, y_train, cv=5)
print("Mean cross validation score: {}".format(np.mean(dt_scores)))
print("Score without cv: {}".format(regressor.score(X_train, y_train)))
print('r2 score:', r2_score(y_test, regressor.predict(X_test)))
决策树回归是一种机器学习方法,采用树状结构来表示不同决策路径。在决策树中,每个叶子节点代表一个特定的输出值,而非叶子节点则表示对输入特征进行划分的规则。决策树的生成基于递归切割的方法,它通过寻找最佳的属性和切分点,使得在每个子区域内的输出值与实际观测值的差异最小化。在训练过程中,决策树不断地将空间区域划分为两个子区域,并确定每个子区域上的输出值,最终生成一个二叉树结构。
在实际应用中,我们可以使用Python中的DecisionTreeRegressor类来创建并训练决策树回归模型。首先,我们准备了输入特征X和对应的目标值y。模型训练完成后,可以用该模型进行预测,生成实际值和预测值的比较。为了评估模型的性能,我们使用了多个指标,包括平均绝对误差、均方差、均方根误差以及R²分数(决定系数)。此外,为了确保模型的泛化性能,我们还进行了交叉验证,检查模型在不同数据子集上的表现。
通过这些评估指标,我们可以全面了解决策树回归模型的性能,并确认它在预测任务中的准确度和可靠性。
X = dataset.drop(['Adj Close', 'Close'], axis=1)
y = dataset['Adj Close']
# 划分训练集和测试集略
# 模型实例化
from sklearn.tree import DecisionTreeRegressor
regressor = DecisionTreeRegressor()
# 训练模型
regressor.fit(X_train, y_train)
# 回归预测
y_pred = regressor.predict(X_test)
df = pd.DataFrame({'Actual':y_test, 'Predicted':y_pred})
print(df.head(2))
Actual Predicted
Date
2017-08-09 12.83 12.63
2017-11-14 11.12 11.20
模型评价
from sklearn import metrics
# 平均绝对误差
print(metrics.mean_absolute_error(
y_test, y_pred))
# 均方差
print(metrics.mean_squared_error(
y_test, y_pred))
# 均方根误差
print(np.sqrt(
metrics.mean_squared_error(
y_test, y_pred)))
0.0924680893617
0.0226966010212
0.1506539114039
交叉验证
from sklearn.model_selection import cross_val_score
dt_fit = regressor.fit(X_train, y_train)
dt_scores = cross_val_score(
dt_fit, X_train, y_train, cv = 5)
print("Mean cross validation score: {}".format(np.mean(dt_scores)))
print("Score without cv: {}".format(dt_fit.score(X_train, y_train)))
Mean cross validation score: 0.99824909037
Score without cv: 1.0
R2
from sklearn.metrics import r2_score
print('r2 score:', r2_score(y_test, dt_fit.predict(X_test)))
print('Accuracy Score:', dt_fit.score(X_test, y_test))
r2 score: 0.9989593390532074
Accuracy Score: 0.9989593390532074
集成算法回归是一种通过整合多个独立评估器的方法来提高模型性能的技术。其中,装袋法(Bagging)和提升法(Boosting)是两种常见的集成学习方法。
装袋法(Bagging):
装袋法的核心思想是构建多个相互独立的评估器,然后通过平均或多数表决的原则来决定集成评估器的结果。随机森林是装袋法的代表模型。在随机森林中,多个决策树被并行构建,最终的预测结果是所有决策树预测结果的平均值。
提升法(Boosting):
提升法中,基评估器是相关的,是按顺序一个一个构建的。其核心思想是通过结合多个弱评估器的力量,一次次对难以评估的样本进行预测,从而构成一个强评估器。Adaboost和梯度提升树(GBDT)是提升法的代表模型。在Adaboost中,每个样本的权重根据前一轮模型的错误进行调整,使得之前被错误分类的样本在下一轮中得到更多的关注,从而提高整体模型的准确性。
Adaboost基本性质
能在学习过程中不断减少训练误差,即在训练数据集上的训练误差率。且误差率是以指数数率下降的。
X = dataset[['Open', 'High', 'Low', 'Volume']].values
y = dataset['Buy_Sell'].values
# 划分训练集与测试集略
from sklearn.ensemble import AdaBoostClassifier
ada = AdaBoostClassifier(n_estimators=180, random_state=0)
ada.fit(X_train, y_train)
y_pred_proba = ada.predict_proba(X_test)[:,1]
ada.feature_importances_
array([ 0.18888889, 0.15 ,
0.26666667, 0.39444444])
模型评价
ada.predict(X_test)
ada.score(X, y)
from sklearn.metrics import roc_auc_score
ada_roc_auc = roc_auc_score(y_test, y_pred_proba)
print('ROC AUC score: {:.2f}'.format(ada_roc_auc))
在给定的示例中,使用了AdaBoostClassifier进行分类任务。首先,通过提供输入特征X和对应的目标标签y,训练了AdaBoost模型。然后,使用测试集进行预测,并计算了模型的ROC AUC分数,该分数用于评估模型在分类任务中的性能。通过不断调整基评估器的权重,AdaBoost模型能够逐渐减少训练误差,提高模型的预测准确性。
BDT(Gradient Boosting Decision Tree)简介
GBDT,又称MART(Multiple Additive Regression Tree),是一种迭代的决策树算法。该算法由多棵决策树组成,所有树的结论累加起来作为最终答案。它在提出初期就和SVM一起被认为是泛化能力较强的算法。
在GBDT中,采用平方误差损失函数时,每一棵回归树学习的是之前所有树的结论和残差,拟合得到当前的残差回归树。提升树即是整个迭代过程生成的回归树的累加。
GBDT工作原理
GBDT利用加法模型和前向分步算法实现学习的优化过程。每一步的优化很简单,例如在使用平方损失函数时,学习残差回归树。
简单来说,每一次的计算都是为了减少上一次的残差。GBDT在残差减少(负梯度)的方向上建立一个新的模型。
GBDT的特点
GBDT的优点在于可以相对少的调参时间内得到较高的准确率。它可以灵活处理各种类型的数据,包括连续值和离散值,具有广泛的应用范围。同时,GBDT具有较强的鲁棒性,对异常值的影响较小。
然而,GBDT也有其缺点。它的弱学习器之间存在依赖关系,难以并行训练数据。在使用GBDT前,通常需要先处理好缺失值。
GBDT的应用
在实际应用中,我们可以使用Scikit-Learn库中的GradientBoostingRegressor来构建GBDT模型。例如,在金融领域,我们可以使用GBDT来预测股票价格。以下是一个示例代码:
from sklearn.ensemble import GradientBoostingRegressor
# 准备数据
X = dataset[['Open', 'High', 'Low', 'Volume']].values
y = dataset['Adj Close'].values
# 划分训练集与测试集(略)
# 构建GBDT模型
gb = GradientBoostingRegressor(max_depth=4, n_estimators=200, random_state=2)
# 训练模型
gb.fit(X_train, y_train)
# 预测测试集标签
y_pred = gb.predict(X_test)
# 计算RMSE
from sklearn.metrics import mean_squared_error as MSE
mse_test = MSE(y_test, y_pred)
rmse_test = mse_test**(1/2)
print('Test set RMSE of GBDT: {:.3f}'.format(rmse_test))
随机森林回归
随机森林是一种集成学习方法,它以决策树为基础构建多个模型,并通过集体智慧做出预测。在随机森林中,样本随机采样(有放回),同时,对于每个树的节点分裂时,特征也是从全部特征中随机选择的子集。这种随机性的引入增加了模型的多样性,提高了模型的泛化性能。
算法流程
样本随机采样:从训练集中有放回地随机选择一定数量的样本,用于构建决策树。
特征随机选择:对于每个树的节点分裂,随机选择一部分特征,再从中选择最优特征进行划分。
多棵决策树构建:重复上述两个步骤,构建多棵决策树,形成随机森林。
预测:对于新数据,每棵决策树都进行预测,分类任务使用简单投票法,回归任务使用简单平均法,得到最终的预测结果。
优点
抗过拟合:样本和特征的随机性减少了模型的过拟合风险。
鲁棒性:随机性使得模型对噪声数据具有很好的鲁棒性,提高了泛化性能。
处理高维数据:不需要特征选择,能够处理高维数据,并展现哪些特征比较重要。
抗缺失值:对缺失值不敏感,即使有大量特征缺失,仍能保持准确度。
并行化训练:树与树之间独立,便于并行化训练,提高了训练速度。
缺点
相似决策树:可能生成很多相似的决策树,降低了模型的多样性。
处理小数据:在小数据或低维数据上表现可能不如其他模型。
计算速度:构建多个决策树可能较慢,尤其是树的数目很大时。
XGBoost回归
XGBoost(Extreme Gradient Boosting)是一种高效的提升树算法,属于集成学习的一部分。它通过将多个树模型集成在一起,形成一个强大的回归模型。这些树模型都是基于CART(Classification and Regression Trees)回归树构建的。
回归树生成过程
节点分裂:从根节点开始,选择最优特征和切分点进行节点分裂。
分裂条件:选择使平方误差最小的特征和切分点,直到满足停止条件(如节点样本数小于阈值)为止。
树的生长:递归地在子节点上重复上述步骤,生成完整的回归树。
XGBoost的核心思想
XGBoost不断地添加树,每次训练一个新树,该树负责拟合上次预测的残差。预测值是通过将样本落入每棵树的叶子节点,并用叶子节点的权重直接求和得到的。
与GBDT的区别
在XGBoost中,预测值不是由所有弱分类器上的预测结果加权求和得到的,而是直接由叶子节点的权重求和得到。这个权重表示了每个叶子节点上样本的回归取值。XGBoost通过目标函数,同时考虑了模型的偏差和方差,以找到最优的树模型。
优势
高效性:XGBoost具有高效的训练和预测速度,适用于大规模数据集。
灵活性:支持自定义损失函数和正则化项,能够适应不同问题类型。
准确性:通过多轮迭代,逐步改善模型性能,提供高精度的预测。
目标函数
XGBoost的目标函数包含两部分:偏差(模型误差)和方差(模型复杂度)。通过在这两者之间取得平衡,XGBoost能够生成具有良好泛化性能的回归模型。