Driverless AI:信用卡演示¶
本 notebook 提供了 H2OAI 客户端的模型构建和评分工作流,此工作流与 Driverless AI 工作流并行执行。
点击此处,获取 Python 客户端文档资料 .
工作流步骤¶
通过 Python API 创建实验:
登录
导入训练和测试集/新数据
指定实验参数
启动实验
检查实验
下载预测结果
在 Web UI 中构建实验并通过 Python 进行访问:
获取指向实验的指针
对新数据进行评分:
通过 H2OAI 模型对新数据进行评分
对新数据进行模型诊断:
通过 H2OAI 模型对新数据运行模型诊断
运行模型解释
对原始特征运行模型解释
对外部模型预测结果运行模型解释
构建评分管道
构建 Python 评分管道
构建 MOJO 评分管道
通过 Python API 构建实验¶
1. 登录¶
导入所需模块并登录。
通过客户端类传入凭证,此客户端类将创建一个身份验证令牌并发送至 Driverless AI 服务器。简单来说:登录至 Driverless AI web 页面 (随后会将请求发送至 Driverless 服务器),通过您的 Driverless AI 地址和登录凭证将客户端类实例化。
[2]:
import driverlessai
import matplotlib.pyplot as plt
import pandas as pd
[3]:
address = 'http://ip_where_driverless_is_running:12345'
username = 'username'
password = 'password'
dai = driverlessai.Client(address = address, username = username, password = password)
# make sure to use the same user name and password when signing in through the GUI
2. 上传数据集¶
上传 Driverless AI /data 文件夹中的训练和测试数据集。
您可以提供训练、验证和测试数据集并将其用于实验中。验证和测试数据集为可选项。在此示例中,我们将仅提供训练和测试数据集。
[4]:
train_path = 's3://h2o-public-test-data/smalldata/kaggle/CreditCard/creditcard_train_cat.csv'
test_path = 's3://h2o-public-test-data/smalldata/kaggle/CreditCard/creditcard_test_cat.csv'
train = dai.datasets.create(data=train_path, data_source='s3')
test = dai.datasets.create(data=test_path, data_source='s3')
Complete 100.00% - [4/4] Computing column statistics
Complete 100.00% - [4/4] Computing column statistics
Driverless 中的等效步骤:上传训练和测试 CSV 文件¶
3. 设置实验参数¶
我们现在将设置实验参数。其中包括:
目标列:我们将尝试预测的列。
删除列:我们不想用作预测因子的列,例如 ID 列、存在数据泄露的列等。
权重列:显示每行观测值权重的列。如果
无
权重列,则每行的观测值权重为 1。折叠列:显示折叠的列。如果
无
折叠列,则将由 Driverless AI 来确定折叠数。是时间序列:实验是否为时间序列用例。
请参阅 实验设置 ,了解关于实验设置的信息。
在此示例中,我们将预测 ``下个月的默认付款`` 。控制实验进程的参数为:准确度
、时间
和 可解释性
. 我们可使用 get_experiment_preview_sync
函数来了解实验期间将会发生什么。
我们首先将 准确度
、时间
和 可解释性
均设置为 5,查看实验会得到什么结果。
[5]:
target = "DEFAULT_PAYMENT_NEXT_MONTH"
exp_preview = dai.experiments.preview(train_dataset=train,
task='classification',
target_column=target,
enable_gpus=False,
accuracy=5,
time=5,
interpretability=5,
config_overrides=None)
exp_preview
ACCURACY [5/10]:
- Training data size: *23,999 rows, 25 cols*
- Feature evolution: *[Constant, LightGBM, XGBoostGBM]*, *1/4 validation split*
- Final pipeline: *Ensemble (8 models), 4-fold CV*
TIME [5/10]:
- Feature evolution: *4 individuals*, up to *66 iterations*
- Early stopping: After *10* iterations of no improvement
INTERPRETABILITY [5/10]:
- Feature pre-pruning strategy: None
- Monotonicity constraints: disabled
- Feature engineering search space: [CVCatNumEncode, CVTargetEncode, CatOriginal, Cat, ClusterDist, ClusterTE, Frequent, Interactions, NumCatTE, NumToCatTE, NumToCatWoE, Original, TextLinModel, Text, TruncSVDNum, WeightOfEvidence]
[Constant, LightGBM, XGBoostGBM] models to train:
- Model and feature tuning: *16*
- Feature evolution: *104*
- Final pipeline: *8*
Estimated runtime: *minutes*
Auto-click Finish/Abort if not done in: *1 day*/*7 days*
通过以上设置,Driverless AI 实验将训练约 124 个模型:* 16 个用于模型和特征调优 * 104 个用于特征演变 * 8 个用于最终管道
在启动实验时,我们可以:
指定参数
使用 Driverless AI 建议参数
Driverless AI 可基于数据集和目标列来建议参数。接下来我们将使用 ``get_experiment_tuning_suggestion`` 来查看 Driverless AI 建议的设置。
Driverless AI 发现最佳参数是 ``accuracy = 5``、``time = 4`` 和 ``interpretability = 6`` 。已选择 ``AUC`` 作为评分器(此评分器为二项式问题的默认评分器)。
Driverless 中的等效步骤:设置旋钮、配置和启动¶
4. 启动实验:特征工程 + 最终模型训练¶
使用 Driverless AI 建议的参数和添加的测试集、评分器和种子来启动实验。我们可以使用建议参数启动实验或创建自己的参数。
[7]:
ex = dai.experiments.create(train_dataset=train,
test_dataset=test,
target_column=target,
task='classification',
accuracy=5,
time=4,
interpretability=6,
scorer="AUC",
enable_gpus=True,
seed=1234,
cols_to_drop=['ID'])
Experiment launched at: http://localhost:12345/#experiment?key=b7aba0d4-e235-11ea-9088-0242ac110002
Complete 100.00% - Status: Complete
5. 检查实验¶
查看验证数据集的最终模型评分。特征工程完成后,可根据准确度设置构建整体模型。实验对象还包含对此整体模型的验证和测试数据的评分。在此示例中,验证评分是训练交叉验证预测结果的分数。
[11]:
metrics = ex.metrics()
print("Final model Score on Validation Data: " + str(round(metrics['val_score'], 3)))
Final model Score on Validation Data: 0.774
6. 下载结果¶
实验完成后,我们可看到 UI 中会显示下载以下内容的选项:
预测
(维持)训练数据
测试数据
实验摘要 – 实验的摘要信息,包括特征重要性
我们将在下方展示一个下载测试预测结果的示例。请注意,也可运行等效命令,以下载训练(维持)预测结果。
[12]:
ex.artifacts.download(only=['test_predictions'], dst_dir='', overwrite=True,)
Downloaded 'test_preds.csv'
[12]:
{'test_predictions': 'test_preds.csv'}
[13]:
test_preds = pd.read_csv("./test_preds.csv")
test_preds.head()
[13]:
DEFAULT_PAYMENT_NEXT_MONTH.0 | DEFAULT_PAYMENT_NEXT_MONTH.1 | |
---|---|---|
0 | 0.299739 | 0.700261 |
1 | 0.862815 | 0.137185 |
2 | 0.958172 | 0.041828 |
3 | 0.599148 | 0.400852 |
4 | 0.882068 | 0.117932 |
在 Web UI 中创建实验并通过 Python 进行访问¶
还可使用 Python API 检查通过实验密钥在 Web UI 中启动的实验。
1. 获取指向实验的指针¶
您可以通过在 Web UI 中引用实验密钥来获取指向实验的指针。
[14]:
# Get list of experiments
experiment_list = dai.experiments.list()
experiment_list
[14]:
[<class 'driverlessai._experiments.Experiment'> b7aba0d4-e235-11ea-9088-0242ac110002 nivufeke,
<class 'driverlessai._experiments.Experiment'> aed84080-e234-11ea-9088-0242ac110002 sewateru]
[12]:
# Get pointer to experiment
exp = experiment_list[0]
exp
对新数据进行评分¶
您可使用 Python API 对新数据进行评分,这相当于使用 Web UI 上 对另一数据集进行评分 按钮。下方示例对测试数据进行了评分,并下载了预测结果。
传入与原始训练集具有相同列的任何数据集。如果您在构建 H2OAI 模型时已传入测试集,则预测结果就已经存在。
1. 使用 H2OAI 模型进行评分¶
下图显示测试中每项记录的默认预测概率。
[15]:
# Get unlabeled data to make predictions on
data = dai.datasets.create(data='s3://h2o-public-test-data/smalldata/kaggle/CreditCard/creditcard_test_cat.csv',
data_source='s3',
force=True)
target = "DEFAULT_PAYMENT_NEXT_MONTH"
prediction = ex.predict(data, [target])
pred_path = prediction.download('.')
pred_table = pd.read_csv(pred_path)
pred_table.head()
Complete 100.00% - [4/4] Computing column statistics
Complete
Downloaded './b7aba0d4-e235-11ea-9088-0242ac110002_preds_01963cda.csv'
[15]:
DEFAULT_PAYMENT_NEXT_MONTH.0 | DEFAULT_PAYMENT_NEXT_MONTH.1 | |
---|---|---|
0 | 0.299739 | 0.700261 |
1 | 0.862815 | 0.137185 |
2 | 0.958172 | 0.041828 |
3 | 0.599148 | 0.400852 |
4 | 0.882068 | 0.117932 |
我们还可通过设置 pred_contribs = True
获取每个特征对最终预测结果的贡献值,有助于我们了解每个特征对预测结果的影响。
[16]:
prediction = ex.predict(data, [target], include_shap_values=True)
pred_contributions_path = prediction.download('.')
pred_contributions_table = pd.read_csv(pred_contributions_path)
pred_contributions_table.head()
Complete
Downloaded 'b7aba0d4-e235-11ea-9088-0242ac110002_preds_e92e68d4.csv'
[16]:
DEFAULT_PAYMENT_NEXT_MONTH.0 | DEFAULT_PAYMENT_NEXT_MONTH.1 | contrib_0_AGE | contrib_10_PAY_3 | contrib_11_PAY_4 | contrib_12_PAY_5 | contrib_13_PAY_6 | contrib_14_PAY_AMT1 | contrib_15_PAY_AMT2 | contrib_16_PAY_AMT3 | ... | contrib_45_CVTE:PAY_1:PAY_2:PAY_4.0 | contrib_46_WoE:AGE:LIMIT_BAL:PAY_1:PAY_2:PAY_3:PAY_5.0 | contrib_47_WoE:PAY_3:PAY_5:PAY_6.0 | contrib_48_ClusterTE:ClusterID20:PAY_1:PAY_4:PAY_5:PAY_AMT1:PAY_AMT6.0 | contrib_4_BILL_AMT4 | contrib_5_BILL_AMT5 | contrib_6_BILL_AMT6 | contrib_7_LIMIT_BAL | contrib_8_PAY_1 | contrib_bias | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0.299739 | 0.700261 | -0.051685 | 0.017082 | -0.012476 | -0.023556 | -0.007033 | 0.016873 | 0.062995 | -0.037905 | ... | 1.314687 | 0.019138 | -0.039752 | -0.004087 | 0.043153 | -0.014567 | -0.024331 | 0.024522 | 0.526365 | -1.34867 |
1 | 0.862815 | 0.137185 | 0.044812 | 0.017206 | 0.001976 | 0.002324 | -0.001514 | 0.030999 | -0.087150 | -0.092674 | ... | -0.437666 | -0.079960 | -0.119075 | 0.008777 | 0.052826 | 0.019449 | 0.061261 | 0.138121 | -0.015459 | -1.34867 |
2 | 0.958172 | 0.041828 | -0.054909 | 0.003906 | -0.003241 | 0.002495 | -0.003469 | 0.087790 | -0.315745 | -0.047180 | ... | -0.455067 | 0.007856 | -0.103681 | 0.036041 | -0.032951 | 0.021452 | -0.060518 | -0.161278 | -0.015956 | -1.34867 |
3 | 0.599148 | 0.400852 | -0.003953 | 0.016077 | 0.002315 | 0.040801 | 0.007007 | 0.024191 | -0.020707 | 0.147297 | ... | 1.342796 | 0.066763 | 0.025450 | 0.003859 | -0.020837 | -0.050288 | 0.019743 | -0.096786 | 0.371450 | -1.34867 |
4 | 0.882068 | 0.117932 | 0.000450 | -0.038284 | -0.013007 | -0.001538 | -0.003652 | 0.036131 | 0.219968 | 0.124056 | ... | -0.519380 | -0.006065 | -0.109650 | -0.029302 | -0.116205 | 0.007022 | 0.004275 | 0.031202 | -0.016736 | -1.34867 |
5 rows × 53 columns
我们将更仔细地检查对第一个记录的贡献。
[17]:
contrib = pd.DataFrame(pred_contributions_table.iloc[0][1:])
contrib.columns = ["contribution"]
contrib["abs_contribution"] = contrib.contribution.abs()
contrib.sort_values(by="abs_contribution", ascending=False)[["contribution"]].head()
[17]:
contribution | |
---|---|
contrib_bias | -1.348670 |
contrib_45_CVTE:PAY_1:PAY_2:PAY_4.0 | 1.314687 |
DEFAULT_PAYMENT_NEXT_MONTH.1 | 0.700261 |
contrib_8_PAY_1 | 0.526365 |
contrib_21_CVTE:EDUCATION.0 | 0.140235 |
自定义用户的 PAY_0
、PAY_2
和 LIMIT_BAL
聚类对其预测结果影响最大。由于贡献值为正,我们便可得知其默认概率会增大。
构建评分管道¶
在最后一节中,我们将根据实验构建评分管道。有两种评分管道选项:
Python 评分管道:需要 Python 运行时
MOJO 评分管道:需要 Java 运行时
关于评分管道的文档,请访问:http://docs.h2o.ai/driverless-ai/latest-stable/docs/userguide/python-mojo-pipelines.html。
实验屏幕中显示两个评分管道按钮:下载 Python 评分管道 或 构建 MOJO 评分管道 。Driverless AI 将确定是否应基于 config.toml 文件自动构建任何评分管道。在此示例中,我们将通过以下设置运行 Driverless AI:
# Whether to create the Python scoring pipeline at the end of each experiment
make_python_scoring_pipeline = true
# Whether to create the MOJO scoring pipeline at the end of each experiment
# Note: Not all transformers or main models are available for MOJO (e.g. no gblinear main model)
make_mojo_scoring_pipeline = false
因此,默认仅构建 Python 评分管道。
1. 构建 Python 评分管道¶
默认已基于 config.toml 设置构建 Python 评分管道,但是如果我们愿意,也可重新构建 – 如果将 ``make_python_scoring_pipeline`` 选项设置为 false,即可重新构建。
[18]:
ex.artifacts.create('python_pipeline')
Building Python scoring pipeline...
现在将下载评分管道 zip 文件。
[19]:
ex.artifacts.download(only='python_pipeline',
dst_dir='.',
overwrite=True)
Downloaded './scorer.zip'
[19]:
{'python_pipeline': './scorer.zip'}
2. 构建 MOJO 评分管道¶
由于 config.toml 设置的原因,未默认构建 MOJO 评分管道。我们可使用 Python 客户端构建 MOJO 评分管道。这相当于在实验屏幕上选择 构建 MOJO 评分管道 。
[61]:
ex.artifacts.create('mojo_pipeline')
现在可下载评分管道 zip 文件。
[63]:
ex.artifacts.download(only='mojo_pipeline', dst_dir='.', overwrite=True)
[63]:
'./mojo.zip'
构建 MOJO 评分管道后,构建 MOJO 评分管道 将变为 下载 MOJO 评分管道 。
[ ]: