Menu
CoddyTech

Isolation Forest

Parte da seção Aprendizado não supervisionado do Journey de Machine Learning da Coddy. Lição 35 de 51.

Pontos fora do padrão são fáceis de isolar. Divida os dados aleatoriamente, repetidas vezes, até que um ponto fique sozinho:

O mesmo gráfico de dispersão duas vezes, dividido por cortes aleatórios cinza. À esquerda: um ponto distante no canto superior fica sozinho após 2 cortes. À direita: um ponto no meio da multidão precisa de 8 cortes

O ponto mais distante precisou de 2 cortes; o ponto mais aglomerado, de 8. Uma floresta de isolamento calcula a média dos cortes em 100 árvores aleatórias:

from sklearn.ensemble import IsolationForest
forest = IsolationForest(contamination=0.02, random_state=0)
flags = forest.fit_predict(X)

fit_predict retorna -1 para as linhas incomuns e 1 para as demais. contamination é a proporção de linhas que você espera que sejam incomuns.

challenge icon

Desafio

Médio

Um porto registrou 160 turnos de guindaste: movimentações por hora e energia por movimentação. Quais turnos foram estranhos?

  1. Sinalize os turnos com uma floresta de isolamento, contamination=0.03, random_state=0. Imprima a contagem como abaixo.
  2. Mostre os turnos normais como pontos, identificados como normal.
  3. Circule os sinalizados: s=150, facecolors="none", edgecolors="red", identificados como flagged. Adicione uma legenda e exiba o gráfico.

Para outro porto, com 200 turnos:

Flagged: 6 of 200 shifts

Turnos de guindaste como pontos em uma nuvem descendente; guindastes mais rápidos usam menos energia por movimentação, e seis turnos isolados estão circulados em vermelho, com uma legenda

Em seguida, Coddy descreve seu gráfico.

Experimente você mesmo

import pandas as pd
import matplotlib.pyplot as plt
from sklearn.ensemble import IsolationForest

# Uma linha por turno de guindaste no porto: velocidade e consumo de energia
shifts = pd.read_csv("cranes.csv")
X = shifts[["moves_per_hour", "kwh_per_move"]]

# Não altere as linhas abaixo
fig, ax = plt.subplots()
ax.set_title("Crane Shifts")
ax.set_xlabel("Moves per hour")
ax.set_ylabel("Energy per move (kWh)")

# Escreva seu código abaixo
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Aprendizado não supervisionado

Pratique por conta própria: Compilador de Python online