如何使用Python构建基于集合学习的回归模型

122 阅读6分钟

使用Python构建基于集合学习的回归模型

机器学习模型总是根据其性能使用特定的指标进行评估,如准确度、精确度、平均平方误差(MSE)等。每种类型的机器学习问题都有其评估指标。

因此,建立高性能的模型(低误差的模型),取决于评价指标的得分情况。在本教程中,我们将使用集合学习建立一个性能驱动的线性回归模型。

前提条件

要完成本教程,你需要:

  1. 了解Python的基础知识。
  2. 拥有一个Kaggle账户。
  3. 了解机器学习的基础知识。

简介

线性回归是一种对自变量(x)和因变量(y)之间的关系进行建模的统计方法。它使用自变量(特征)来预测因变量(目标)。

集合学习是一种机器学习技术,旨在通过结合不同模型的决策来实现更好的预测模型性能。

对于我们模型的评估,我们将使用RMSE(平均平方误差根值)。

**注:**回归问题不能用准确性指标来衡量,因为目标是衡量预测值与预期值的接近程度,而不是评估预测的正确程度。因此,我们使用误差来评估我们的模型。

设置你的环境

在建立我们的模型之前,我们将首先去Kaggle创建一个新的笔记本,并将其重命名为Create_Folds

Notebook

之后,从Kaggle下载数据,使用添加数据按钮将其添加到你的环境中,并将下载的数据作为数据集上传。

data

**提示:**为了完美地将你的数据上传到Kaggle,请压缩数据集。

创建k-folds

一旦完成了环境设置,我们将继续为我们的数据集创建k-folds。

交叉验证是一种验证技术,用于在有限的数据集上评估机器学习模型。它相当受欢迎,因为它更容易理解,而且与其他方法(如训练/测试分割)相比,预测的偏差更小。

每当你开始处理一个机器学习问题时,你最好创建你将在整个建模过程中使用的折叠,这也是最好的。

导入必要的库

在继续进行之前,我们需要导入以下必要的库。

import numpy as np 
import pandas as pd 
from sklearn import model_selection

读取数据

现在我们将着手将我们的数据集加载到我们的笔记本中。我们将使用pandas库的read_csv() 函数来读取数据,因为它们构成为csv 文件。

其代码如下所示。

train_data = pd.read_csv('/kaggle/input/Dataset/train.csv')
test_data = pd.read_csv('/kaggle/input/Dataset/test.csv')
submission = pd.read_csv('/kaggle/input/Dataset/sample_submission.csv')

创建褶皱

如下图所示,让我们在最后一列创建一个名为kfold的新列。

train_data['kfold'] = -1

然后我们将使用下面的代码块来创建5个折页。

kf  = model_selection.KFold(n_splits= 5,shuffle = True, random_state=42)

for fold, (train_indicies,valid_indicies)in enumerate(kf.split(X=train_data)):
    train_data.loc[valid_indicies, "kfold"]=fold

运行上面的单元格后,我们将通过运行下面的代码块输出带有kfolds的csv文件(train_kfolds.csv)。

train_data.to_csv('train_kfolds.csv', index=False)

这里是Kaggle笔记本,你可以复制和编辑。

建立一个回归模型

创建kfolds后,我们将从输出数据中下载train_kfolds.csv ,在我们的Create_kFolds笔记本上。

然后,我们将按照同样的步骤设置你的环境,创建一个名为RegressionModel的新笔记本,并上传数据集train_kfolds.csv数据。

在完成环境设置后,我们将继续构建我们的模型。

导入必要的库

为了建立我们的回归模型,我们需要导入以下库。

import pandas as pd
import  numpy  as  np
from  sklearn.preprocessing  import  OrdinalEncoder
from  sklearn.model_selection  import  train_test_split
from  sklearn.ensemble  import  RandomForestRegressor
from  sklearn.metrics  import  mean_squared_error
from  xgboost  import  XGBRegressor

一旦完成,我们将继续读取我们的数据。

读取数据

我们将使用下面的代码块读取我们新上传的数据,Dataset2trainfolds

data = pd.read_csv('/kaggle/input/trainfolds/train_kfolds.csv')
test_data = pd.read_csv('/kaggle/input/Dataset2/test.csv')
submission = pd.read_csv('/kaggle/input/Dataset2/sample_submission.csv')

特征选择

我们将从我们的数据集中选择有用的特征,并删除不那么有用/有影响的特征。在这个数据集中不那么有用的特征是:id,target, 和kfold

为了选择有用的特征,运行下面的代码块。

useful_features = [i for i in data.columns if i not in ("id", "target","kfold")]
object_cols = [col for col in useful_features if "cat" in col]
test_data = test_data[useful_features]

建模

为了建立我们的模型,我们将运行下面的代码块。

final_predictions =[]

for fold in range(5):
    xtrain = data[data.kfold != fold].reset_index(drop=True)
    xvalid = data[data.kfold == fold].reset_index(drop=True)
    xtest = test_data.copy()
    
    ytrain = xtrain.target
    yvalid = xvalid.target
    
    xtrain = xtrain[useful_features]
    xvalid = xvalid[useful_features]
    
    # Data Encoding 
    oe = OrdinalEncoder()
    xtrain[object_cols] = oe.fit_transform(xtrain[object_cols])
    xvalid[object_cols] = oe.transform(xvalid[object_cols])
    xtest[object_cols] = oe.transform(xtest[object_cols])
    
    # Model Training
    model = XGBRegressor(random_state = fold, n_jobs=5)
    model.fit(xtrain, ytrain)
    preds_valid = model.predict(xvalid)
    preds_test = model.predict(xtest)
    final_predictions.append(preds_test)
    print(fold, mean_squared_error(yvalid, preds_valid, squared=False))

对于每个折叠,我们将对数据进行编码,然后使用XGBoost(极限梯度提升)训练模型,这是一种集合学习技术,可以提高我们模型的性能。

XGBoost是一种正则化的提升技术,具有很高的预测能力,而且比其他提升技术更快。然后,我们将单独评估每个折叠,并打印出模型的结果。

模型评估

在单独评估每个折叠后,我们现在将通过获得测试数据的平均预测值来评估我们模型的性能。

要做到这一点,请使用下面的代码块。

preds = np.mean(np.column_stack(final_predictions), axis=1)

为了看到我们模型的表现,我们将使用以下代码输出我们模型的预测结果。

submission.target =preds
submission.to_csv("submission1.csv", index=False)

要看到我们的提交文件的输出,请运行以下代码。

sub = pd.read_csv('/kaggle/output/submission1.csv')
sub

奖励:你可以向30天ML Kaggle挑战赛提交一个迟到的提交文件,看看你的模型表现如何,也就是说,如果你早点报名参加挑战赛。

超参数优化

在这个过程中,我们将对模型的算法参数进行微调和优化,直到达到预期效果。

几个常见的对模型性能有很大影响的XGBoost参数包括:n_jobmax_depthlearning_raten_estimatorscolsample_bytreesubsample

为了微调我们的模型,在XGBoost回归器中加入以下改动。

model = XGBRegressor(random_state = fold, n_jobs=5, learning_rate =0.1, subsample=0.8,
                         max_depth = 5, min_child_weight = 1, gamma = 0, scale_pos_weight = 1)

一旦你运行上述代码,你会看到我们模型的结果比第一个例子稍有改善。你可以继续改变参数,直到它达到预期目标。例如,你可以以0.7100 这样的数值为目标来衡量你的模型的成功。

总结

建立一个性能驱动的模型并不是一件非常容易的事情。它涉及到一次又一次地完善我们的模型,直到我们得到理想的结果。

不管怎么说,掌握建模的艺术是非常有意义的,无论是在机器学习或数据科学项目中,还是在比赛中。