Anomaly and change-point detection in time series
Before this lesson: decomposition and the remainder (lesson 01), forecasts and residuals (lesson 03), the Kalman filter and its innovations on the Nile data (lesson 07), and prediction intervals (lesson 10). From the probability-and-statistics track: the normal distribution, quantiles and the idea of a hypothesis test; from the ml-fundamentals track: precision and recall. Related: drift of feature distributions in mlops lesson 07. Time: about 90 minutes, plus the notebook.
Why this matters #
- Operations. Server latency, error rates, payments and sensor readings are monitored by detectors that run every minute. Twitter published a detector based on seasonal decomposition and a robust test (S-H-ESD; Hochenbaum, Vallis and Kejariwal, 2017). Every false alarm costs an engineer's time; every missed event costs money.
- ML systems. A model in production sees inputs whose distribution changes. Monitoring its inputs, outputs and errors over time is anomaly and change detection (mlops lesson 07, mlops lesson 08).
- Industry and science. Sensor faults and machine failures (predictive maintenance), unusual heartbeats in ECG recordings, breaks in climate station records after an instrument change, and changes of regime in river flows are all anomalies or change points. The worked example finds the 1899 drop of the Nile flow.
- Forecasting. Anomalies distort model fitting and evaluation. Detecting them and treating them as missing values (the Kalman filter skips the update) makes forecasts more robust.
1. Predict first #
2. The picture #
Four kinds of anomalies #
| Kind | What it is | Example |
|---|---|---|
| point anomaly | one value far from all normal values | a spike of latency to 10 s |
| contextual anomaly | a value that is normal in general, but not at this time | high heating demand in July |
| collective anomaly | a group of values that is unusual together, though each value is normal | a missing heartbeat in an ECG; a day without the daily cycle |
| change point | a lasting change of level, variance, trend or season | a new dam lowers the river flow from then on |
The first three are short events. A change point is different: after it, the new behaviour is normal. A detector that treats a change point as a series of outliers raises alarms for ever (or until the model adapts). The classical survey is Chandola, Banerjee and Kumar (2009); for change points see Truong, Oudre and Vayatis (2020).
Expected value, residual, threshold #
The figure shows a series with a daily cycle (24 hours) and three injected anomalies: a point anomaly at hour 30, a contextual anomaly at hours 137–139 (a peak-level value at night) and a collective anomaly at hours 190–201 (half a day without the cycle).
Switch the expected value, then move the threshold . The aqua line is the expected value, the blue line the data. Shaded magenta bands are the true anomalies; magenta rings are alarms where the robust z-score of the residual (lower panel) leaves . With the global median, only the spike is found: the contextual and collective anomalies stay inside the normal range of values. The seasonal profile (the median of each hour of the day) finds all three. The seasonal naive forecast also finds them, but notice the false alarms exactly one day later: the anomaly has become the forecast.
This answers question 1 of section 1: a global quantile rule misses the July value, because 300 MW is a normal value in winter. The expected value must know the season.
A robust scale #
To turn residuals into scores, we divide by a scale. The mean and the standard deviation are a bad choice when anomalies are present: each outlier pulls the mean towards itself and makes the standard deviation larger, so the band "mean ± 3 sd" grows and the outliers hide inside it. This is masking. The median and the median absolute deviation (MAD) hardly move.
Add outliers with the slider. Blue points are 60 normal values; magenta points are outliers (filled when the robust rule flags them, open when it misses them). The orange band is mean ± 3 sd, the aqua band is median ± 3 · 1.4826 · MAD. Notice how the orange band widens with every outlier until it covers them, while the aqua band stays where the normal data are.
The residuals are . What are the median and the MAD?
The median of the sorted values is the middle value 2. The absolute deviations from 2 are ; sorted , their median is 1. The outlier 100 changes neither number. The mean (21.6) and the standard deviation (43.8) are pulled far by it.
3. Definitions and main results #
3.1 Detectors, scores and thresholds #
A detector computes an anomaly score for each time (or each window) from the data up to (online) or from the whole series (offline), and raises an alarm when for a threshold . Online detection may only use the past: a two-sided smoother or a centred moving average (lesson 01) uses future values and cannot run in real time.
A change point of a series is a time at which its distribution changes, for example for and for . Online change detection wants an alarm soon after and few alarms before it.
3.2 The residual recipe and robust scores #
- Expected value . Options: the trend plus season of a decomposition (STL, lesson 01); a one-step forecast from exponential smoothing, ARIMA or an ML model (lessons 04–09); the predicted observation of a Kalman filter (lesson 07).
- Residual .
- Robust score , where . Use for anomalies in both directions.
- Alarm when (section 3.3 chooses ).
With a forecaster, the score of a Kalman filter has a direct form: the standardised innovation of lesson 07, which is when the model is right. A prediction interval (lesson 10) is the same idea: alarm when falls outside the 99 % interval.
Why the factor 1.4826. For , the median of is the number with . Since , we need , so . Hence estimates for Gaussian data, and the robust score is on the same scale as an ordinary z-score.
Why robust. The breakdown point of an estimator is the share of data that can be moved to infinity before the estimate also goes to infinity. It is 0 for the mean and the standard deviation (one bad value is enough) and 50 % for the median and the MAD. Two failures follow from a non-robust scale: masking (outliers inflate the standard deviation and are no longer flagged) and swamping (outliers shift the mean, so normal values on the other side get flagged).
Practical points.
- Use the past only. For online detection, the expected value at must come from data before : a one-step forecast or the filter, never the smoother of lesson 07 (it has seen and later values, and it partly follows the anomaly).
- Echoes. A forecaster that uses the anomalous value later (the seasonal naive forecast, an AR model) makes new residuals when it does. Replace a detected anomaly by its expected value (or treat it as missing in a Kalman filter) before you forecast on.
- Local scale. If the noise level changes with the season or the level, compute the median and MAD in a rolling window, or use the standardised innovations of a model whose variance changes.
3.3 Thresholds and the false-alarm budget #
Each value that is checked is a small hypothesis test of "this value is normal". With many tests, false alarms add up. If a detector checks normal values with a false-alarm probability each, the expected number of false alarms is . With one value per minute, per day, and gives false alarms per day. This answers question 2 of section 1. The chance of at least one false alarm in a day is .
Choose from a budget, not from habit. Say you accept one false alarm per week from a detector that checks one value per minute: values, so . For a Gaussian score and a two-sided rule, . Real residuals have heavier tails than the Gaussian, so it is safer to set as an upper quantile of scores from a clean past period. With past scores, the -th smallest one gives a false-alarm rate of at most when the scores are exchangeable: this is split conformal prediction from lesson 10.
The trade-off. A higher threshold gives fewer false alarms but later or missed detections. Report both: false alarms per day (or the average time between false alarms) and the detection delay or recall.
A rule checks one value per minute, and each normal value has a 1 % chance to raise a false alarm. About how many false alarms per day should you expect?
There are 1440 minutes in a day, and the expected number of false alarms is . A per-point rate that sounds small is large when it is multiplied by the number of tests. For about one false alarm per week, the per-point rate must be near .
3.4 Change points and the CUSUM #
A threshold on single values is weak for small lasting shifts. If the mean moves up by one standard deviation, a single value exceeds only with probability , so the one-sided rule "" needs about steps on average to notice. The CUSUM (cumulative sum; Page, 1954) adds up the small evidence of many values.
Definition (upper CUSUM for standardised data). Let with the in-control mean and standard deviation . With a reference value and a decision threshold :
For a downward shift, use : . After an alarm, restart at . We write so that it is not confused with the forecast horizon .
How it works. Before the change, : the sum drifts down and the keeps it near 0. After a shift of standard deviations, : the sum grows like a ramp with slope and crosses after about steps. The usual choice is , half the shift that you want to detect.
Why : the CUSUM is a likelihood-ratio test.
- Compare "no change", , with "shift ", . The log likelihood ratio of one value is .
- For a change at time , the log likelihood ratio of the values is the sum .
- We do not know , so we take the largest of these sums over (or 0 for "no change yet"). This maximum satisfies the recursion : either the best start is before (then we add the new term to ) or there is no evidence (0).
- Dividing by gives the CUSUM with .
The CUSUM is also optimal in a minimax sense: among all detectors with the same false-alarm rate, it has the smallest worst-case detection delay for a shift of exactly (Lorden, 1971; Moustakides, 1986).
Average run length. Detectors of changes are compared by the average run length (ARL): the mean number of steps until an alarm. is the ARL with no change (the mean time between false alarms; large is good). is the ARL after a shift of a given size (the mean detection delay; small is good). For a shift of one standard deviation:
| Detector | (no change) | () |
|---|---|---|
| single value (one-sided) | ||
| CUSUM, , | ||
| CUSUM, , |
With , the CUSUM has fewer false alarms than the 3-sigma rule and finds the shift four times faster. (The CUSUM values come from a simulation of the one-sided CUSUM. Montgomery's Introduction to Statistical Quality Control gives tables for the two-sided version, which watches both directions and therefore has about half the .)
Move the shift , the reference and the threshold , then press Run 200 times. The upper panel shows standardised data with a shift at the yellow time and the true mean; magenta rings mark values above 3. The lower panel shows the CUSUM statistic, the threshold, and the alarms (after each alarm restarts at 0). Notice that before the statistic stays near 0, and after it climbs like a ramp, while single values rarely pass 3. A smaller or detects faster but gives more false alarms before ; the simulation shows and the mean delay.
When did the change start? At an alarm at time , the last time before at which is a natural estimate of the change time: the evidence has been growing since .
The mean of a standardised series shifts up by . Why does the CUSUM detect it much sooner than the rule "alarm if "?
After the shift each step adds on average (with ), so grows steadily. A single value exceeds 3 only with probability . With a suitable the CUSUM can have fewer false alarms than the 3-sigma rule and a much shorter delay; it does not need .
Offline segmentation. When the whole series is available, change points can be placed by minimising a
cost: the sum over segments of a within-segment cost (for example the squared deviations from the segment
mean) plus a penalty per change point. Binary segmentation finds the best single split, then splits
the parts again; it is fast but approximate. PELT (Killick, Fearnhead and Eckley, 2012) finds the exact
optimum by dynamic programming and prunes candidates, with a linear expected cost under mild conditions. The
Python library ruptures implements both (Truong, Oudre and Vayatis, 2020).
Bayesian online change-point detection
Adams and MacKay (2007) track the run length , the time since the last change point. A hazard function gives the prior probability of a change at each step. The posterior is updated by a recursion: either the run grows (, weight times the predictive density of given the current run) or a new run starts (, weight ). With conjugate models (for example a normal model with unknown mean), the predictive densities have closed forms, and the method gives the probability of a recent change at every step. It is popular for streams with several changes of mean or variance.
3.5 Windows, shapes and machine learning #
Collective anomalies are unusual shapes, not unusual values. Three families of methods look at windows of length :
- Features plus an outlier detector. Describe each window by features (mean, standard deviation, slope, seasonal strength, autocorrelations) and score the windows with an isolation forest (Liu, Ting and Zhou, 2008). It grows random trees that split on random features at random values; anomalies are isolated after few splits, so a short average path length means a high anomaly score.
- Distance to the nearest neighbour. The matrix profile (Yeh et al., 2016) stores, for every window, the z-normalised Euclidean distance to its most similar window elsewhere in the series (not overlapping it). A window whose nearest neighbour is far away has no similar shape anywhere: it is a discord, the classic collective anomaly. The z-normalisation (subtract the window mean, divide by its standard deviation) compares shapes, not levels. The distance of two z-normalised windows is , with their correlation, so it lies between 0 and .
- Neural models. Train a forecaster or an autoencoder on normal data and use its forecast or reconstruction error as the score (lesson 09). This is the residual recipe with a learned expected value.
Change the window length . The blue series repeats a cycle of 30 steps; the violet band marks one abnormal cycle whose values all stay inside the normal range. The lower panel is the matrix profile: for each window start, the distance to the nearest other window. Its maximum, the discord, lands on the abnormal cycle. Notice that the profile is near 0 everywhere else, because every normal cycle has a twin. Try half a cycle and two cycles: the discord stays on the anomaly, but the peak changes its shape.
3.6 Evaluating detectors honestly #
Labels in time series are usually events: segments of anomalous time steps. Useful measures:
- Event recall: the share of true events with at least one alarm inside (or within a tolerance after the start).
- Precision of alarms: the share of alarms that fall inside a true event (or near one).
- Detection delay: the time from the start of an event to its first alarm.
- False alarms per day (or per 1000 points) on normal data.
The point-adjust trap. Many papers compute a point-wise F1 score after point adjustment: if at least one point of a true segment is flagged, all points of that segment count as detected. Kim et al. (2022) showed that this makes a detector with random scores reach a high F1. With one segment of 200 points out of 1000 and a random 5 % alarm rate, almost surely at least one alarm falls inside the segment, so all 200 points count as true positives while only about 40 false alarms remain: F1 . This answers question 3 of section 1.
Move the alarm rate of a random detector and draw again. Shaded magenta blocks are the true segments, orange ticks are the random alarms, and aqua blocks are the points that count as detected after point adjustment. Notice that the point-wise F1 stays low (near the share of anomalous points), while the adjusted F1 is high for almost any rate. The long segment is almost always "found".
Flawed benchmarks. Wu and Keogh (2021) showed that several popular benchmark data sets have problems: many anomalies can be found with one line of code (they are trivial), some labels are wrong, anomalies are very dense, and many anomalies sit near the end of the series. Results on such data say little.
A checklist.
- Report event-level recall, precision of alarms, delay and false alarms per day; never only point-adjusted F1.
- Always include a simple baseline: a robust z-score on the residuals of a seasonal decomposition or a seasonal naive forecast, and a random detector with the same alarm rate.
- Choose thresholds on training or calibration data, not on the test labels.
- Use benchmarks with few, clearly labelled anomalies per series, such as the UCR anomaly archive (Wu and Keogh, 2021).
A paper reports F1 = 0.93 for a new deep anomaly detector, computed with point adjustment. What should you check first?
Point adjustment can give a random detector a high F1 on data with long anomaly segments. Compare with a random detector and a simple robust baseline under the same protocol, and look at event recall, alarm precision, delay and false alarms per day. Point adjustment changes the true positives, so it changes both recall and precision.
4. Worked example #
The annual flow of the Nile at Aswan, 1871–1970 (100 values, the series of lesson 07; data: Durbin and Koopman, 2012, via statsmodels). Two questions: was there a lasting change, and which single years are anomalous?
(a) The level shift, found by CUSUM. We look for a drop in level.
- Reference period. Take the first 20 years, 1871–1890, as "normal": mean , standard deviation . Standardise all years: .
- Lower CUSUM with and : . Up to 1898, goes back to 0 again and again (it is 0 in each year from 1895 to 1898).
- 1899: , , so .
- 1900: , , so .
- 1901: , , so .
- 1902: , , so : alarm in 1902.
- Change time. The last year with before the alarm is 1898, so the estimated start of the change is 1899, with a delay of 3 years. The mean flow is 1097.75 for 1871–1898 and 849.97 for 1899–1970.
This agrees with the history: the first Aswan dam was built from 1898 to 1902, and lesson 07 saw the filtered level drop at the same time. Note that no single year here is extreme: the standardised innovation of the local level filter in 1899 is , below a typical threshold of 3. The CUSUM finds the change because it adds up four moderately low years.
(b) The 1913 low flow, a point anomaly. The smallest value of the series is 456, in 1913.
- Against the regime after the change (1899–1970): median , , so the robust score is .
- Against the whole series (median 893.5, robust scale 179.4) it is only : the level shift inflates the scale. Compare regimes, not the whole mixed series.
- The local level filter of lesson 07 (with its maximum-likelihood variances , ) gives a standardised innovation of in 1913, the largest in absolute value of all years (next: in 1916 and in 1899).
So 1913 is the clearest point anomaly, and 1899 starts a change point. A detector with on the filter innovations would flag neither: on this short and noisy series, the change needs CUSUM, and the point anomaly needs the right regime.
5. In code #
NumPy checks the masking example and the worked example; the notebook adds the seasonal detectors, the average run length and the point-adjust experiment.
import numpy as np
NILE = np.array([1120, 1160, 963, 1210, 1160, 1160, 813, 1230, 1370, 1140, 995, 935, 1110, 994, 1020, 960, 1180, 799, 958, 1140,
1100, 1210, 1150, 1250, 1260, 1220, 1030, 1100, 774, 840, 874, 694, 940, 833, 701, 916, 692, 1020, 1050, 969,
831, 726, 456, 824, 702, 1120, 1100, 832, 764, 821, 768, 845, 864, 862, 698, 845, 744, 796, 1040, 759,
781, 865, 845, 944, 984, 897, 822, 1010, 771, 676, 649, 846, 812, 742, 801, 1040, 860, 874, 848, 890,
744, 749, 838, 1050, 918, 986, 797, 923, 975, 815, 1020, 906, 901, 1170, 912, 746, 919, 718, 714, 740], float)
years = np.arange(1871, 1971)
def robust_z(x):
med = np.median(x)
return (x - med) / (1.4826 * np.median(np.abs(x - med)))
# (a) masking: the classical z-score of the outlier is small, the robust one is large
x = np.array([1., 2., 2., 3., 100.])
print(np.median(x), np.median(np.abs(x - np.median(x)))) # 2.0 1.0
print(np.round((x - x.mean()) / x.std(ddof=1), 2)) # [-0.47 -0.45 -0.45 -0.42 1.79]
print(np.round(robust_z(x), 2)) # [-0.67 0. 0. 0.67 66.1 ]
# (b) the 1913 low flow, against the regime after 1899
after = NILE[years >= 1899]
z1913 = (456 - np.median(after)) / (1.4826 * np.median(np.abs(after - np.median(after))))
print(round(z1913, 2)) # -3.36
# (c) lower CUSUM for a drop in level, reference period 1871-1890
ref = NILE[:20]
z = (NILE - ref.mean()) / ref.std(ddof=1)
k, h_c, C = 0.5, 4.0, 0.0
for t in range(len(z)):
C = max(0.0, C - z[t] - k) # adds up the evidence for a drop
if C > h_c:
print("alarm in", years[t], "C =", round(C, 2)) # alarm in 1902 C = 5.66
break
6. Where it shows up #
- Monitoring of services. Alert rules on latency, error rates and traffic use seasonal baselines and robust thresholds; S-H-ESD (Hochenbaum et al., 2017) combines an STL-like decomposition with the median, the MAD and a generalised ESD test. Forecast intervals of time-series models (lesson 10) are used the same way.
- ML in production. Drift of input features, predictions and errors is a change-point problem; CUSUM-type rules and two-sample tests over windows are standard (mlops lesson 07).
- Manufacturing and quality control. CUSUM and Shewhart charts (statistical process control) watch the mean and the variance of a production process; the ARL tables come from this field.
- Health and science. The matrix profile finds unusual heartbeats in ECGs and unusual cycles in sensor data; change-point methods find breaks in climate station records (homogenisation) and regime shifts in hydrology, as in the Nile example.
- Finance and payments. Fraud detection combines per-customer expected behaviour (a contextual baseline) with robust scores and models over windows of transactions.
7. Common mistakes #
- A global threshold on seasonal data. It misses contextual anomalies and flags normal peaks. Remove the season first (decomposition, seasonal forecast, filter).
- Mean and standard deviation on contaminated data. They are pulled by the anomalies (masking, swamping). Use the median and , or estimate the scale on a clean period.
- Using future data in an online detector. Centred moving averages and smoothers look ahead. Use one-step forecasts or the filter.
- A threshold without a false-alarm budget. checked every minute gives about 4 false alarms a day even for perfect Gaussian data ().
- Treating a change point as many outliers. After a lasting shift every value looks anomalous until the model adapts. Detect the change, then refit or reset the model.
- Forgetting echoes. A seasonal naive or AR forecast uses the anomaly later and creates false alarms one season later. Replace detected anomalies before forecasting on.
- Reporting point-adjusted F1. It rewards random alarms. Report event recall, alarm precision, delay and false alarms, with a random and a simple baseline.
8. Check yourself #
- Give one example each of a point, a contextual and a collective anomaly in hourly electricity demand.
Answer
Point: a meter error gives 5000 MW for one hour. Contextual: a demand level that is normal at 18:00 appears at 03:00. Collective: on one day the evening peak is missing although each hourly value is in the normal range. - Compute the robust z-score of 13 in the data .
Answer
Sorted: ; median . Absolute deviations: ; sorted , MAD . Robust z . - You want at most one false alarm per day from a two-sided Gaussian rule that checks one value every 10
minutes. Which threshold do you need?
Answer
checks per day, so . Two-sided: . - Run the upper CUSUM with , on . When is the first alarm?
Answer
; ; ; : alarm at . - Why does a z-normalised distance find a collective anomaly that a threshold on the values misses?
Answer
Each value of the abnormal window is inside the normal range, so no value-based threshold fires. The z-normalised distance compares the shape of the whole window with all other windows; an abnormal shape has no close neighbour, so its matrix profile value is the largest. - A random detector flags 5 % of the points. The data have one anomalous segment of 200 points among 1000.
Estimate its point-wise F1 without adjustment.
Answer
About true positives, false positives and false negatives. Precision , recall , F1 .
Name the four kinds of anomalies in time series.
Point anomaly, contextual anomaly (normal value at the wrong time), collective anomaly (unusual group or shape), and change point (lasting change of the distribution).
What are the four steps of a residual-based detector?
Expected value , residual , robust score, alarm when the score crosses a threshold.
Why is the MAD multiplied by 1.4826?
For Gaussian data the MAD is , so estimates .
What is masking?
Outliers inflate the standard deviation (and move the mean), so the band mean ± 3 sd grows and the outliers are no longer flagged.
A rule checks one value per minute with a false-alarm rate of 1 % per value. How many false alarms per day?
About .
Write the upper CUSUM recursion and its alarm rule.
with ; alarm when , then restart at 0.
How should you choose the reference value of a CUSUM, and why?
, half the shift to detect: then is proportional to the log-likelihood ratio of "shift " against "no shift".
What are and ?
The average number of steps until an alarm with no change (mean time between false alarms) and after a shift (mean detection delay).
What is a discord in the matrix profile?
The window whose z-normalised distance to its nearest non-overlapping neighbour is the largest: a shape with no close match in the series.
Why is point-adjusted F1 misleading?
One alarm anywhere in a true segment counts the whole segment as detected, so random alarms reach a high F1 on long segments.
9. Interview angle #
- "How would you detect anomalies in a metric with daily and weekly seasonality?" — Model the expected value with the season (STL or a seasonal forecaster, one step ahead), compute robust z-scores of the residuals (median, MAD, maybe in a rolling window), set the threshold from a false-alarm budget on a clean period, and replace flagged values before forecasting on. Add a CUSUM on the residuals for slow shifts.
- "Mean and standard deviation or median and MAD?" — Median and MAD: breakdown point 50 % against 0 %, no masking; multiply the MAD by 1.4826 to get the Gaussian scale.
- "Explain CUSUM." — Running sum of standardised deviations minus a reference , floored at 0; alarm above . It is the maximised log-likelihood ratio for a shift ; tune for the wanted .
- "A vendor claims F1 = 0.95 on a public benchmark. What do you ask?" — Which protocol (point adjustment?), event-level metrics and delay, false alarms per day, the score of a random detector and of a robust residual baseline on the same data, and whether the threshold was chosen on the test labels.
10. Practice #
The notebook for this lesson runs in Colab or in the browser. It has five exercises, each with a check cell and a folded solution:
- Write
robust_zscore(r)with the median and the MAD, and test it on data with outliers. - Build a detector from the seasonal naive forecast and robust z-scores on a series with injected anomalies; measure event recall and precision, and find the echoes.
- Write
cusum(z, k, h)and estimate and the delay for a shift of 1 by simulation, for two values of . - Find the Nile level shift with the lower CUSUM, and the 1913 anomaly with the standardised innovations of the local level filter.
- Write
point_adjust_f1and compare it with the point-wise F1 for a random detector.
11. Watch and read #
- Chandola, Banerjee and Kumar (2009), Anomaly detection: A survey, ACM Computing Surveys 41(3): the kinds of anomalies and the main families of methods.
- Page (1954), Continuous inspection schemes, Biometrika 41: the CUSUM. Montgomery, Introduction to Statistical Quality Control: CUSUM and Shewhart charts with ARL tables.
- Hochenbaum, Vallis and Kejariwal (2017), Automatic anomaly detection in the cloud via statistical learning (S-H-ESD).
- Truong, Oudre and Vayatis (2020), Selective review of offline change point detection methods
(binary segmentation, PELT, the
ruptureslibrary). - Adams and MacKay (2007), Bayesian online changepoint detection.
- The UCR matrix profile page: papers, code and tutorials (Yeh et al., 2016).
- Wu and Keogh (2021), Current time series anomaly detection benchmarks are flawed and are creating the illusion of progress.
- Kim et al. (2022), Towards a rigorous evaluation of time-series anomaly detection (AAAI): the point-adjust problem.
- Liu, Ting and Zhou (2008), Isolation forest, ICDM: the isolation forest.
Runs in your browser with nothing to install. The notebook repeats the key demos and has exercises with checks; solutions are inside, folded.
No Google account needed: Python runs inside your browser. The first start downloads about 40 MB; your changes are saved in this browser only.