使用Python构建基于集合学习的回归模型
机器学习模型总是根据其性能使用特定的指标进行评估,如准确度、精确度、平均平方误差(MSE)等。每种类型的机器学习问题都有其评估指标。
因此,建立高性能的模型(低误差的模型),取决于评价指标的得分情况。在本教程中,我们将使用集合学习建立一个性能驱动的线性回归模型。
前提条件
要完成本教程,你需要:
- 了解Python的基础知识。
- 拥有一个Kaggle账户。
- 了解机器学习的基础知识。
简介
线性回归是一种对自变量(x)和因变量(y)之间的关系进行建模的统计方法。它使用自变量(特征)来预测因变量(目标)。
集合学习是一种机器学习技术,旨在通过结合不同模型的决策来实现更好的预测模型性能。
对于我们模型的评估,我们将使用RMSE(平均平方误差根值)。
**注:**回归问题不能用准确性指标来衡量,因为目标是衡量预测值与预期值的接近程度,而不是评估预测的正确程度。因此,我们使用误差来评估我们的模型。
设置你的环境
在建立我们的模型之前,我们将首先去Kaggle创建一个新的笔记本,并将其重命名为Create_Folds。

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

**提示:**为了完美地将你的数据上传到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
一旦完成,我们将继续读取我们的数据。
读取数据
我们将使用下面的代码块读取我们新上传的数据,Dataset2 和trainfolds 。
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_job、max_depth、learning_rate、n_estimators、colsample_bytree和subsample。
为了微调我们的模型,在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 这样的数值为目标来衡量你的模型的成功。
总结
建立一个性能驱动的模型并不是一件非常容易的事情。它涉及到一次又一次地完善我们的模型,直到我们得到理想的结果。
不管怎么说,掌握建模的艺术是非常有意义的,无论是在机器学习或数据科学项目中,还是在比赛中。