Model Performance Insights
DataRobot provides several insights to help you understand and evaluate model performance:
ROC Curve: Receiver Operating Characteristic curve showing the trade-off between true positive rate and false positive rate at various classification thresholds. Available for binary classification models.
Lift Chart: Depicts how well a model segments the target population and how well the model performs for different ranges of values of the target variable. Available for classification and regression models.
Residuals: Displays the distribution of prediction errors for regression models.
These insights can be computed for different data partitions (validation, cross-validation, holdout) and can be filtered by data slices.
The following example code assumes that you have a trained model object called model.
ROC Curve
The following example shows how to compute and retrieve ROC curves for a binary classification model.
import datarobot as dr
from datarobot.insights.roc_curve import RocCurve
model_id = model.id # or model_id = 'YOUR_MODEL_ID'
# Compute a new ROC curve and wait for it to complete
roc = RocCurve.create(entity_id=model_id) # default source is 'validation'
# Access ROC curve properties
print(roc.auc)
>>> 0.85
print(roc.kolmogorov_smirnov_metric)
>>> 0.42
print(roc.roc_points[:2])
>>> [{'accuracy': 0.539375, 'f1_score': 0.0, 'false_negative_score': 737, ...}, ...]
# Compute ROC curve on a different partition, and return immediately with job reference
job = RocCurve.compute(entity_id=model_id, source='holdout')
# Wait for the job to complete
roc_holdout = job.get_result_when_complete()
print(roc_holdout.auc)
>>> 0.83
# Get a pre-existing ROC curve (if already computed)
existing_roc = RocCurve.get(entity_id=model_id, source='validation')
# List all available ROC curves for a model
roc_list = RocCurve.list(entity_id=model_id)
print(roc_list)
>>> [<datarobot.insights.roc_curve.RocCurve object at 0x7fc0a7549f60>, ...]
print([(r.source, r.auc) for r in roc_list])
>>> [('validation', 0.85), ('holdout', 0.83)]
ROC Curve with data slices
You can compute ROC curves for specific data slices:
from datarobot.insights.roc_curve import RocCurve
# Get a pre-existing ROC curve for a specific data slice
roc_sliced = RocCurve.get(entity_id=model_id, source='validation', data_slice_id='slice_id_here')
# Or compute a new one
job = RocCurve.compute(entity_id=model_id, source='validation', data_slice_id='slice_id_here')
roc_sliced = job.get_result_when_complete()
Lift chart
Lift charts depict how well a model segments the target population and how well the model performs for different ranges of values of the target variable.
import datarobot as dr
from datarobot.insights.lift_chart import LiftChart
model_id = model.id # or model_id = 'YOUR_MODEL_ID'
# Compute a new lift chart and wait for it to complete
lift = LiftChart.create(entity_id=model_id) # default source is 'validation'
# Access lift chart bins
print(lift.bins[:3])
>>> [{'actual': 0.4, 'predicted': 0.227, 'bin_weight': 5.0}, ...]
# Compute lift chart on a different partition, and return immediately with job reference
job = LiftChart.compute(entity_id=model_id, source='holdout')
# Wait for the job to complete
lift_holdout = job.get_result_when_complete()
# Get a pre-existing lift chart (if already computed)
existing_lift = LiftChart.get(entity_id=model_id, source='validation')
# List all available lift charts for a model
lift_list = LiftChart.list(entity_id=model_id)
print(lift_list)
>>> [<datarobot.insights.lift_chart.LiftChart object at 0x7fe242eeaa10>, ...]
print([l.source for l in lift_list])
>>> ['validation', 'holdout', 'crossValidation']
# Get lift chart for a specific data slice
lift_sliced = LiftChart.get(entity_id=model_id, source='validation', data_slice_id='slice_id_here')
Residuals
The residuals charts show the distribution of prediction errors for regression models.
import datarobot as dr
from datarobot.insights.residuals import Residuals
model_id = model.id # or model_id = 'YOUR_MODEL_ID'
# Compute a new residuals chart and wait for it to complete
residuals = Residuals.create(entity_id=model_id) # default source is 'validation'
# Access residuals properties
print(residuals.coefficient_of_determination)
>>> 0.85
print(residuals.residual_mean)
>>> 0.023
print(residuals.standard_deviation)
>>> 1.42
# Access histogram data
print(residuals.histogram[:3])
>>> [{'interval_start': -33.37, 'interval_end': -32.52, 'occurrences': 1}, ...]
# Access raw chart data (actual, predicted, residual, row number)
print(residuals.chart_data[:3])
>>> [[45.2, 43.8, -1.4, 0], [52.1, 51.9, -0.2, 1], ...]
# Compute residuals on a different partition, and return immediately with job reference
job = Residuals.compute(entity_id=model_id, source='holdout')
# Wait for the job to complete
residuals_holdout = job.get_result_when_complete()
# Get a pre-existing residuals chart (if already computed)
existing_residuals = Residuals.get(entity_id=model_id, source='validation')
# List all available residuals charts for a model
residuals_list = Residuals.list(entity_id=model_id)
print(residuals_list)
>>> [<datarobot.insights.residuals.Residuals object at 0x7fbce8305ae0>, ...]
print([r.source for r in residuals_list])
>>> ['validation', 'holdout']
# Get residuals for a specific data slice
residuals_sliced = Residuals.get(entity_id=model_id, source='validation', data_slice_id='slice_id_here')