Simply examining a model’s performance metrics is not enough to select a model and promote it for use in a production setting. While developing an ML algorithm, it is important to understand how the model behaves on the data, to examine the key factors influencing its predictions and to consider where it may be deficient. Determination of what “success” may mean for an ML project depends first and foremost on the user’s domain expertise.
EvalML includes a variety of tools for understanding models, from graphing utilities to methods for explaining predictions.
** Graphing methods on Jupyter Notebook and Jupyter Lab require ipywidgets to be installed.
** If graphing on Jupyter Lab, jupyterlab-plotly required. To download this, make sure you have npm installed.
First, let’s train a pipeline on some data.
[1]:
import evalml class DTBinaryClassificationPipeline(evalml.pipelines.BinaryClassificationPipeline): component_graph = ['Simple Imputer', 'Decision Tree Classifier'] X, y = evalml.demos.load_breast_cancer() pipeline_dt = DTBinaryClassificationPipeline({}) pipeline_dt.fit(X, y)
DTBinaryClassificationPipeline(parameters={'Simple Imputer':{'impute_strategy': 'most_frequent', 'fill_value': None}, 'Decision Tree Classifier':{'criterion': 'gini', 'max_features': 'auto', 'max_depth': 6, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0},})
We can visualize the structure of the Decision Tree that was fit to that data, and save it if necessary.
[2]:
from evalml.model_understanding.graphs import visualize_decision_tree visualize_decision_tree(pipeline_dt.estimator, max_depth=2, rotate=False, filled=True, filepath=None)
Lets replace the Decision Tree Classifier with a Random Forest Classifier.
[3]:
class RFBinaryClassificationPipeline(evalml.pipelines.BinaryClassificationPipeline): component_graph = ['Simple Imputer', 'Random Forest Classifier'] pipeline = RFBinaryClassificationPipeline({}) pipeline.fit(X, y) print(pipeline.score(X, y, objectives=['log loss binary']))
OrderedDict([('Log Loss Binary', 0.038403828027876195)])
We can get the importance associated with each feature of the resulting pipeline
[4]:
pipeline.feature_importance
We can also create a bar plot of the feature importances
[5]:
pipeline.graph_feature_importance()