在本节我们将开发一个机器学习模型来预测客户是否会注册存款证 (certificate of deposit - CD
)。该模型将在marketing数据集上进行训练,其中包含有关客户统计、对营销事件的响应和外部因素的信息。将使用XGBoost ML算法
为了方便,数据已被标记,数据集中的一列标识客户是否注册了银行提供的产品。由于数据已标记,我们使用监督学习。
有 3 个选项可以对数据集执行特征工程
:
使用SageMaker Data Wrangler
和Feature Store
使用Numpy + Pandas
使用SageMaker Processing
进入到SageMaker Studio Classic页面,创建一个新的Notebook:
设置kernel,使用默认选项:
将进入Untitled.ipynb笔记本,可以通过右键单击名称来重命名笔记本:
在 SageMaker 笔记本中,启动终端(内核必须完全启动,Share按钮右侧的圆圈必须为空):
在终端中,键入以下命令:
git clone https://github.com/aws-samples/amazon-sagemaker-immersion-day.git
左侧面板中会出现amazon-sagemaker-immersion-day
文件夹:
单击“amazon-sagemaker-immersion-day”
文件夹,然后双击笔记本xgboost_direct_marketing_sagemaker.ipynb
。
如果提示选择内核,请选择“Python 3 (Data Science 3.0)”
内核并单击“选择”。
然后将打开笔记本,在每个单元中按Shift+Enter
执行前四个单元。此代码将导入一些库并在 Jupyter Notebook 环境中定义一些环境变量。
现在,让我们通过运行第 5 个单元来下载数据集:
# cell 05
!wget https://sagemaker-sample-data-us-west-2.s3-us-west-2.amazonaws.com/autopilot/direct_marketing/bank-additional.zip
with zipfile.ZipFile('bank-additional.zip', 'r') as zip_ref:
zip_ref.extractall('.')
在下一个单元中,把数据集加载到 pandas dataframe中,并使用sagemaker_datawrangler
库来探索数据并了解每个特征的数据分布:
我们可以看到:
用户特性:
age
:顾客的年龄(数字)job
:工作类型(类别:“admin”、“services”……)marital
:婚姻状况(类别:“已婚”、“单身”……)education
:教育水平(类别:‘basic.4y’、‘high.school’、…)过去的客户活动:
default
: 信用有违约吗?(分类:“否”、“未知”……)housing
: 有房贷吗?(分类:“否”、“是”……)loan
: 有个人贷款吗?(分类:“否”、“是”……)过去的直接营销联系人:
contact
:联系通信类型(类别:“蜂窝”、“电话”……)month
:一年中最后一次联系的月份(类别:“五月”、“十一月”……)day_of_week
:一周中的最后联系日(类别:“周一”、“周五”……)duration
:上次联系持续时间,以秒为单位(数字)。重要提示:如果持续时间 = 0,则y
=“否”。campaign信息:
campaign
:在此活动期间为此客户进行的联系次数(数字,包括最后一次联系)pdays
:上次活动中最后一次联系客户后经过的天数(数字)previous
:在此活动之前以及为此客户进行的联系次数(数字)poutcome
:之前营销活动的结果(类别:“不存在”、“成功”、……)外部环境因素:
emp.var.rate
:就业变化率-季度指标(数字)cons.price.idx
:消费者价格指数-月度指标(数字)cons.conf.idx
:消费者信心指数-月度指标(数字)euribor3m
:Euribor 3 个月利率 - 每日指标(数字)nr.employed
:员工人数 - 季度指标(数字)目标变量:
y
:客户是否办理了定期存款?(二进制:“是”、“否”)现在让我们看看我们的特征如何与尝试预测的目标相关。首先,让我们了解一下特征是如何分布的。
请注意:
y
“否”,因此大多数客户没有办理定期存款。pdays
对于几乎所有客户都是999。可能是一个占位符值,表示以前没有联系过。接下来,让我们看看我们的特征与我们尝试预测的目标有何关系。
清理数据几乎是每个机器学习项目的一部分。如果做得不正确,它可以带来最大的风险。几种常见的技术包括:
现在我们将使用一种热编码转换所有分类变量:
# cell 09
# Note: These transformations can be done through the graphical widget that we generated above. The data prep widget will automatically generate code for transformations that you do.
data['no_previous_contact'] = np.where(data['pdays'] == 999, 1, 0) # Indicator variable to capture when pdays takes a value of 999
data['not_working'] = np.where(np.in1d(data['job'], ['student', 'retired', 'unemployed']), 1, 0) # Indicator for individuals not actively employed
# cell 10
model_data = pd.get_dummies(data) # Convert categorical variables to sets of indicators
get_dummies 是利用pandas实现one hot encode的方式,例如:
数据在one-hot编码后,将由原来的23列变为67列:
在构建模型之前要问自己的另一个问题是某些feature是否会在最终用例中增加价值。
按照这个逻辑,让我们去掉经济特征和duration
,因为它们需要进行高精度预测才能用作未来预测的输入。
我们将删除一些不需要的功能:
我们将数据集分为 3 个通道:训练集、测试集、验证集:
Amazon SageMaker XGBoost 算法要求数据采用 libSVM 或 CSV 格式(无标题),并且第一列必须是目标变量。所以在这一步我们相应地转换数据
# cell 13
pd.concat([train_data['y_yes'], train_data.drop(['y_no', 'y_yes'], axis=1)], axis=1).to_csv('train.csv', index=False, header=False)
pd.concat([validation_data['y_yes'], validation_data.drop(['y_no', 'y_yes'], axis=1)], axis=1).to_csv('validation.csv', index=False, header=False)
现在我们将最终数据上传到 Amazon S3 存储桶中:
现在通过控制台检查 S3 存储桶,确保已上传 train.csv 和 validation.csv。
单击“sagemaker/”,然后单击“DEMO-xgboost-dm/”。将看到“train/”和“validation/”文件夹。
现在已成功准备好数据来训练 XGBoost 模型。
在本实验中,我们已经完成了所需的环境设置和数据工程的过程,以清理和准备用于模型构建和训练的数据。在下一个实验中,我们将学习如何使用 SageMaker 的内置 XGBoost 算法训练、调整和部署 XGBoost 模型。