<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def evaluate(self, dataset, metric='auto', max_neighbors=10, radius=None):
 """ Evaluate the model's predictive accuracy. This is done by predicting the target class for instances in a new dataset and comparing to known target values. Parameters dataset : SFrame Dataset of new observations. Must include columns with the same names as the target and features used for model training. Additional columns are ignored. metric : str, optional Name of the evaluation metric. Possible values are: - 'auto': Returns all available metrics. - 'accuracy': Classification accuracy. - 'confusion_matrix': An SFrame with counts of possible prediction/true label combinations. - 'roc_curve': An SFrame containing information needed for an roc curve (binary classification only). max_neighbors : int, optional Maximum number of neighbors to consider for each point. radius : float, optional Maximum distance from each point to a neighbor in the reference dataset. Returns ------- out : dict Evaluation results. The dictionary keys are *accuracy* and *confusion_matrix* and *roc_curve* (if applicable). See also -------- create, predict, predict_topk, classify Notes ----- - Because the model randomly breaks ties between predicted classes, the results of repeated calls to `evaluate` method may differ. Examples -------- | target_label | predicted_label | count | | cat | dog | 1 | | dog | dog | 2 | | fossa | dog | 1 | """


        ## Validate the metric name
        _raise_error_evaluation_metric_is_valid(metric,
                    ['auto', 'accuracy', 'confusion_matrix', 'roc_curve'])

        ## Make sure the input dataset has a target column with an appropriate
        #  type.
        target = self.target
        _raise_error_if_column_exists(dataset, target, 'dataset', target)

        if not dataset[target].dtype == str and not dataset[target].dtype == int:
            raise TypeError("The target column of the evaluation dataset must "
                            "contain integers or strings.")

        if self.num_classes != 2:
            if (metric == 'roc_curve') or (metric == ['roc_curve']):
                err_msg  = "Currently, ROC curve is not supported for "
                err_msg += "multi-class classification in this model."
                raise _ToolkitError(err_msg)
            else:
                warn_msg  = "WARNING: Ignoring `roc_curve`. "
                warn_msg += "Not supported for multi-class classification."
                print(warn_msg)

        ## Compute predictions with the input dataset.
        ystar = self.predict(dataset, output_type='class',
                             max_neighbors=max_neighbors, radius=radius)
        ystar_prob = self.predict(dataset, output_type='probability',
                             max_neighbors=max_neighbors, radius=radius)


        ## Compile accuracy metrics
        results = {}

        if metric in ['accuracy', 'auto']:
            results['accuracy'] = _evaluation.accuracy(targets=dataset[target],
                                                          predictions=ystar)

        if metric in ['confusion_matrix', 'auto']:
            results['confusion_matrix'] = \
                _evaluation.confusion_matrix(targets=dataset[target],
                                                predictions=ystar)

        if self.num_classes == 2:
            if metric in ['roc_curve', 'auto']:
                results['roc_curve'] = \
                      _evaluation.roc_curve(targets=dataset[target],
                                               predictions=ystar_prob)
        return results