Estoy tratando de detectar los valores atípicos en mi conjunto de datos y encuentro el bosque de aislamiento de sklearn. No puedo entender cómo trabajar con él. Encajo mis datos de entrenamiento y me devuelve un vector con valores -1 y 1.
¿Alguien puede explicarme cómo funciona y dar un ejemplo?
¿Cómo puedo saber que los valores atípicos son valores atípicos "reales"?
¿Parámetros de sintonización?
Aquí está mi código:
clf = IsolationForest(max_samples=10000, random_state=10) clf.fit(x_train) y_pred_train = clf.predict(x_train) y_pred_test = clf.predict(x_test) [1 1 1 ..., -1 1 1]Parece que tiene muchas preguntas, permítame tratar de responderlas una por una según mi leal saber y entender.
¿Cómo funciona?
Funciona debido al hecho de que la naturaleza de los valores atípicos en cualquier conjunto de datos, que son valores atípicos, es poca y diferente , lo cual es bastante diferente del algoritmo típico basado en agrupamiento o basado en la distancia. En el nivel superior, funciona con la lógica de que los valores atípicos toman menos pasos para 'aislar' en comparación con el punto 'normal' en cualquier conjunto de datos. Para hacerlo, esto es lo que hace IF; suponga que tiene un conjunto de datos de entrenamiento X con n puntos de datos, cada uno con m características. En el entrenamiento, IF crea árboles de aislamiento (árboles de búsqueda binaria) para diferentes características.
Para el entrenamiento, tienes 3 parámetros para ajustar durante la fase de entrenamiento :
n_estimators en sklearn_IsolationForest)max_samples en sklearn_IsolationForest)max_features en sklearn_IF). max_samples es el número de muestras aleatorias que seleccionará del conjunto de datos original para crear árboles de aislamiento.
Durante la fase de prueba :
sklearn_IF encuentra la longitud de ruta del punto de datos bajo prueba de todos los árboles de aislamiento entrenados y encuentra la longitud de ruta promedio. Cuanto mayor sea la longitud de la trayectoria, más normal será el punto y viceversa.
Basado en la longitud de ruta promedio. Calcula la puntuación de anomalía, se puede usar decision_function de sklearn_IF para obtener esto. Para sklearn_IF, cuanto más baja es la puntuación, más anómala es la muestra.
En función de la puntuación de anomalía, puede decidir si la muestra dada es anómala o no estableciendo el valor adecuado de contamination en el objeto sklearn_IF. El valor predeterminado de contamination es 0,1, que puede ajustar para decidir el umbral. La cantidad de contaminación del conjunto de datos, es decir, la proporción de valores atípicos en el conjunto de datos.
Parámetros de ajuste
Entrenamiento -> n_estimators , max_samples , max_features .
Pruebas -> contamination
-1 representa los valores atípicos (según el modelo ajustado). Consulte el ejemplo de IsolationForest para ver una buena descripción del proceso. Si tiene algún conocimiento previo, podría proporcionar más parámetros para obtener un ajuste más preciso. Por ejemplo, si conoce la contaminación (proporción de valores atípicos en el conjunto de datos), podría proporcionarla como entrada. Por defecto se supone que es 0.1. Ver descripción de los parámetros aquí .
Permítanme agregar algo, que me quedé atascado, cuando leí esta pregunta.
La mayoría de las veces lo usa para la clasificación binaria (supongo), donde tiene una clase mayoritaria 0 y una clase atípica 1. Por ejemplo, si desea detectar fraude , entonces su clase principal es sin fraude (0) y el fraude es (1).
Ahora, si tiene una división de entrenamiento y prueba: X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)
y corres:
clf = IsolationForest(max_samples=10000, random_state=10) clf.fit(x_train) y_pred_test = clf.predict(x_test) La salida para la puntuación del clasificador "normal" puede ser bastante confusa. Como ya se mencionó, y_pred_test constará de [-1,1], donde 1 es su clase mayoritaria 0 y -1 es su clase menor 1. Entonces, puedo recomendarle que lo convierta:
y_pred_test = np.where(y_pred_test == 1, 0, 1)Entonces puede usar sus funciones de puntuación normales, etc.