# skmultiflow.drift_detection.DDM¶

class skmultiflow.drift_detection.DDM(min_num_instances=30, warning_level=2.0, out_control_level=3.0)[source]

Drift Detection Method.

Parameters
• min_num_instances (int (default=30)) – The minimum required number of analyzed samples so change can be detected. This is used to avoid false detections during the early moments of the detector, when the weight of one sample is important.

• warning_level (float (default=2.0)) – Warning Level

• out_control_level (float (default=3.0)) – Out-control Level

Notes

DDM (Drift Detection Method) 1 is a concept change detection method based on the PAC learning model premise, that the learner’s error rate will decrease as the number of analysed samples increase, as long as the data distribution is stationary.

If the algorithm detects an increase in the error rate, that surpasses a calculated threshold, either change is detected or the algorithm will warn the user that change may occur in the near future, which is called the warning zone.

The detection threshold is calculated in function of two statistics, obtained when (pi + si) is minimum:

• $$p_{min}$$: The minimum recorded error rate.

• s_{min}: The minimum recorded standard deviation.

At instant $$i$$, the detection algorithm uses:

• $$p_i$$: The error rate at instant i.

• $$s_i$$: The standard deviation at instant i.

The conditions for entering the warning zone and detecting change are as follows:

• if $$p_i + s_i \geq p_{min} + 2 * s_{min}$$ -> Warning zone

• if $$p_i + s_i \geq p_{min} + 3 * s_{min}$$ -> Change detected

References

1

João Gama, Pedro Medas, Gladys Castillo, Pedro Pereira Rodrigues: Learning with Drift Detection. SBIA 2004: 286-295

Examples

>>> # Imports
>>> import numpy as np
>>> from skmultiflow.drift_detection import DDM
>>> ddm = DDM()
>>> # Simulating a data stream as a normal distribution of 1's and 0's
>>> data_stream = np.random.randint(2, size=2000)
>>> # Changing the data concept from index 999 to 1500, simulating an
>>> # increase in error rate
>>> for i in range(999, 1500):
...     data_stream[i] = 0
>>> # Adding stream elements to DDM and verifying if drift occurred
>>> for i in range(2000):
...     if ddm.detected_warning_zone():
...         print('Warning zone has been detected in data: ' + str(data_stream[i]) + ' - of index: ' + str(i))
...     if ddm.detected_change():
...         print('Change has been detected in data: ' + str(data_stream[i]) + ' - of index: ' + str(i))

__init__(min_num_instances=30, warning_level=2.0, out_control_level=3.0)[source]

Initialize self. See help(type(self)) for accurate signature.

Methods

 __init__([min_num_instances, warning_level, …]) Initialize self. add_element(prediction) Add a new element to the statistics This function returns whether concept drift was detected or not. If the change detector supports the warning zone, this function will return whether it’s inside the warning zone or not. Collects and returns the information about the configuration of the estimator Returns the length estimation. get_params([deep]) Get parameters for this estimator. Resets the change detector parameters. set_params(**params) Set the parameters of this estimator.

Attributes

 estimator_type
add_element(prediction)[source]

Add a new element to the statistics

Parameters

prediction (int (either 0 or 1)) – This parameter indicates whether the last sample analyzed was correctly classified or not. 1 indicates an error (miss-classification).

Notes

After calling this method, to verify if change was detected or if the learner is in the warning zone, one should call the super method detected_change, which returns True if concept drift was detected and False otherwise.

detected_change()[source]

This function returns whether concept drift was detected or not.

Returns

Whether concept drift was detected or not.

Return type

bool

detected_warning_zone()[source]

If the change detector supports the warning zone, this function will return whether it’s inside the warning zone or not.

Returns

Whether the change detector is in the warning zone or not.

Return type

bool

get_info()[source]

Collects and returns the information about the configuration of the estimator

Returns

Configuration of the estimator.

Return type

string

get_length_estimation()[source]

Returns the length estimation.

Returns

The length estimation

Return type

int

get_params(deep=True)[source]

Get parameters for this estimator.

Parameters

deep (boolean, optional) – If True, will return the parameters for this estimator and contained subobjects that are estimators.

Returns

params – Parameter names mapped to their values.

Return type

mapping of string to any

reset()[source]

Resets the change detector parameters.

set_params(**params)[source]

Set the parameters of this estimator.

The method works on simple estimators as well as on nested objects (such as pipelines). The latter have parameters of the form <component>__<parameter> so that it’s possible to update each component of a nested object.

Returns

Return type

self