Source code for evalml.problem_types.utils
"""Utility methods for the ProblemTypes enum in EvalML."""
import pandas as pd
from pandas.api.types import is_numeric_dtype
from evalml.problem_types.problem_types import ProblemTypes
[docs]def handle_problem_types(problem_type):
    """Handles problem_type by either returning the ProblemTypes or converting from a str.
    Args:
        problem_type (str or ProblemTypes): Problem type that needs to be handled.
    Returns:
        ProblemTypes enum
    Raises:
        KeyError: If input is not a valid ProblemTypes enum value.
        ValueError: If input is not a string or ProblemTypes object.
    Examples:
        >>> assert handle_problem_types("regression") == ProblemTypes.REGRESSION
        >>> assert handle_problem_types("TIME SERIES BINARY") == ProblemTypes.TIME_SERIES_BINARY
        >>> assert handle_problem_types("Multiclass") == ProblemTypes.MULTICLASS
    """
    if isinstance(problem_type, str):
        try:
            tpe = ProblemTypes._all_values[problem_type.upper()]
        except KeyError:
            raise KeyError("Problem type '{}' does not exist".format(problem_type))
        return tpe
    if isinstance(problem_type, ProblemTypes):
        return problem_type
    raise ValueError(
        "`handle_problem_types` was not passed a str or ProblemTypes object",
    ) 
[docs]def detect_problem_type(y):
    """Determine the type of problem is being solved based on the targets (binary vs multiclass classification, regression). Ignores missing and null data.
    Args:
        y (pd.Series): The target labels to predict.
    Returns:
        ProblemType: ProblemType Enum
    Examples:
        >>> y = pd.Series([0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1])
        >>> assert detect_problem_type(y) == ProblemTypes.BINARY
        ...
        >>> y = pd.Series([1, 2, 3, 2, 1, 1, 1, 2, 2, 3, 3])
        >>> assert detect_problem_type(y) == ProblemTypes.MULTICLASS
        ...
        >>> y = pd.Series([1.6, 4.2, 3.3, 2.9, 4, 1, 5.5, 2, -2, -3.2, 3])
        >>> assert detect_problem_type(y) == ProblemTypes.REGRESSION
    Raises:
        ValueError: If the input has less than two classes.
    """
    y = pd.Series(y).dropna()
    num_classes = y.nunique()
    if num_classes < 2:
        raise ValueError("Less than 2 classes detected! Target unusable for modeling")
    if num_classes == 2:
        return ProblemTypes.BINARY
    if is_numeric_dtype(y.dtype):
        if num_classes > 10:
            return ProblemTypes.REGRESSION
    return ProblemTypes.MULTICLASS 
[docs]def is_regression(problem_type):
    """Determines if the provided problem_type is a regression problem type.
    Args:
        problem_type (str or ProblemTypes): type of supervised learning problem. See evalml.problem_types.ProblemType.all_problem_types for a full list.
    Returns:
        bool: Whether or not the provided problem_type is a regression problem type.
    Examples:
        >>> assert is_regression("Regression")
        >>> assert is_regression(ProblemTypes.REGRESSION)
        >>> assert is_regression(ProblemTypes.TIME_SERIES_REGRESSION)
    """
    return handle_problem_types(problem_type) in [
        ProblemTypes.REGRESSION,
        ProblemTypes.TIME_SERIES_REGRESSION,
        ProblemTypes.MULTISERIES_TIME_SERIES_REGRESSION,
    ] 
[docs]def is_binary(problem_type):
    """Determines if the provided problem_type is a binary classification problem type.
    Args:
        problem_type (str or ProblemTypes): type of supervised learning problem. See evalml.problem_types.ProblemType.all_problem_types for a full list.
    Returns:
        bool: Whether or not the provided problem_type is a binary classification problem type.
    Examples:
        >>> assert is_binary("Binary")
        >>> assert is_binary(ProblemTypes.BINARY)
        >>> assert is_binary(ProblemTypes.TIME_SERIES_BINARY)
    """
    return handle_problem_types(problem_type) in [
        ProblemTypes.BINARY,
        ProblemTypes.TIME_SERIES_BINARY,
    ] 
[docs]def is_multiclass(problem_type):
    """Determines if the provided problem_type is a multiclass classification problem type.
    Args:
        problem_type (str or ProblemTypes): type of supervised learning problem. See evalml.problem_types.ProblemType.all_problem_types for a full list.
    Returns:
        bool: Whether or not the provided problem_type is a multiclass classification problem type.
    Examples:
        >>> assert is_multiclass("Multiclass")
        >>> assert is_multiclass(ProblemTypes.MULTICLASS)
        >>> assert is_multiclass(ProblemTypes.TIME_SERIES_MULTICLASS)
    """
    return handle_problem_types(problem_type) in [
        ProblemTypes.MULTICLASS,
        ProblemTypes.TIME_SERIES_MULTICLASS,
    ] 
[docs]def is_classification(problem_type):
    """Determines if the provided problem_type is a classification problem type.
    Args:
        problem_type (str or ProblemTypes): type of supervised learning problem. See evalml.problem_types.ProblemType.all_problem_types for a full list.
    Returns:
        bool: Whether or not the provided problem_type is a classification problem type.
    Examples:
        >>> assert is_classification("Multiclass")
        >>> assert is_classification(ProblemTypes.TIME_SERIES_BINARY)
        >>> assert not is_classification(ProblemTypes.REGRESSION)
    """
    return is_binary(problem_type) or is_multiclass(problem_type) 
[docs]def is_time_series(problem_type):
    """Determines if the provided problem_type is a time series problem type.
    Args:
        problem_type (str or ProblemTypes): type of supervised learning problem. See evalml.problem_types.ProblemType.all_problem_types for a full list.
    Returns:
        bool: Whether or not the provided problem_type is a time series problem type.
    Examples:
        >>> assert is_time_series("time series regression")
        >>> assert is_time_series(ProblemTypes.TIME_SERIES_BINARY)
        >>> assert not is_time_series(ProblemTypes.REGRESSION)
    """
    return handle_problem_types(problem_type) in [
        ProblemTypes.TIME_SERIES_BINARY,
        ProblemTypes.TIME_SERIES_MULTICLASS,
        ProblemTypes.TIME_SERIES_REGRESSION,
        ProblemTypes.MULTISERIES_TIME_SERIES_REGRESSION,
    ] 
[docs]def is_multiseries(problem_type):
    """Determines if the provided problem_type is a multiseries time series problem type.
    Args:
        problem_type (str or ProblemTypes): type of supervised learning problem. See evalml.problem_types.ProblemType.all_problem_types for a full list.
    Returns:
        bool: Whether or not the provided problem_type is a multiseries time series problem type.
    """
    return (
        handle_problem_types(problem_type)
        == ProblemTypes.MULTISERIES_TIME_SERIES_REGRESSION
    )