Нужно ли разбивать данные для изоляции леса? - PullRequest
2 голосов
/ 13 февраля 2020

У меня есть база данных, которая состоит из 10049972 строк x 19 столбцов. Я использовал Isolation Forest для обнаружения выбросов, затем создал дополнительный столбец, в котором выбросы установлены как -1, я отбросил все строки, содержащие выбросы, как -1, а затем удалил столбец.

Мой вопрос: нужно ли обучать, тестировать и проверять работоспособность изолированного леса? Также кто-то может подтвердить, если мой код действителен?

Вот мой код.

import numpy as np

import pandas as pd

import matplotlib.pyplot as plt

%matplotlib inline

from sklearn.ensemble import IsolationForest


df = pd.read_csv('D:\\Project\\database\\4-Final\\Final After.csv',low_memory=True)


iForest = IsolationForest(n_estimators=100,  contamination=0.1 , random_state=42, max_samples=200)


iForest.fit(df.values.reshape(-1,1))

pred = iForest.predict(df.values.reshape(-1,1))

pred=df['anomaly']

df=df.drop(df['anomaly'==-1],inplace=True)

df.to_csv('D:\\Project\\database\\4-Final\\IF TEST.csv', index=False) 

Спасибо.

1 Ответ

2 голосов
/ 13 февраля 2020

У меня вопрос: нужно ли мне пройти тестовый тренинг и проверить работоспособность изолированного леса?

Вы хотите обнаружить выбросы только в этом пакетном файле, верно? В этом случае ваше решение может быть в порядке, , но в большинстве случаев вы должны разделиться.

Но, пожалуйста, попытайтесь понять, когда вам нужно сделать раскол. Чтобы объяснить это, давайте перейдем к реальному сценарию.

Предположим, вы пытаетесь предсказать аномальное поведение различных двигателей. Вы создаете модель, используя данные, доступные в вашей базе данных до сегодняшнего дня, и начинаете прогнозировать поступающие данные. Возможно, что предсказанные данные не равны данным, использованным для обучения, верно? Тогда, как вы можете смоделировать эту ситуацию при настройке вашей модели? Использование train-test-validate и оценка с правильными метриками.

Редактировать: Позвольте мне добавить пример. Я постараюсь сделать это очень просто.

Если ваш двигатель база данных данные:

+----+-------------+--------------+
| id | engine_type | engine_value |
+----+-------------+--------------+
|  1 |           0 | 0.25         |
|  2 |           0 | 0.40         |
|  3 |           1 | 0.16         |
|  4 |           1 | 0.30         |
|  5 |           0 | 5.3          | <- anomaly
|  6 |           1 | 14.4         | <- anomaly
|  7 |           0 | 16.30        | <- anomaly
+----+-------------+--------------+

И использовать все это для обучения модели, модели будет использовать три аномальных значения для тренировки, верно? Алгоритм создаст лес, используя эти 3 аномальные значения, поэтому модели будет проще их прогнозировать.

Теперь, что произойдет с этими производственными данными:

+----+-------------+--------------+
| id | engine_type | engine_value |
+----+-------------+--------------+
|  8 |           1 | 3.25         | <- anomaly
|  9 |           1 | 4.40         | <- anomaly
| 10 |           0 | 2.16         |
+----+-------------+--------------+

Вы передаете его своей модели, и он говорит, что точки не аномальные, а обычные данные, потому что он думает, что ваш «порог» для значений больше 5.

Этот «порог» Продукт гиперпараметров алгоритма, возможно, с другой конфигурацией, модель могла бы предсказать значения как аномальные, но вы не тестируете модель обобщение .

Итак, как вы можете улучшить эту конфигурацию? Разделение данных, которые у вас есть на данный момент. Вместо того чтобы тренироваться со всеми данными базы данных, вы могли бы тренироваться только с одной его частью и использовать другую часть для тестирования, например, использовать эту часть как данные поезда:

+----+-------------+--------------+
| id | engine_type | engine_value |
+----+-------------+--------------+
|  1 |           0 | 0.25         |
|  2 |           0 | 0.40         |
|  3 |           1 | 0.16         |
|  4 |           1 | 0.30         |
|  7 |           0 | 16.30        | <- anomaly
+----+-------------+--------------+

И это как данные теста :

+----+-------------+--------------+
| id | engine_type | engine_value |
+----+-------------+--------------+
|  5 |           0 | 5.3          | <- anomaly
|  6 |           1 | 14.4         | <- anomaly
+----+-------------+--------------+

И установите комбинацию гиперпараметров, которая заставит этот алгоритм правильно прогнозировать данные теста. Гарантирует ли это, что в будущем прогнозы будут идеальными? Нет, это не так, но это не то же самое, что просто подгонка данных без оценки того, насколько хорошо модель обобщает.

Также кто-то может подтвердить, если мой код действителен?

Да, но позвольте мне добавить рекомендацию, изменив это:

iForest.fit(df.values.reshape(-1,1))

pred = iForest.predict(df.values.reshape(-1,1))

pred=df['anomaly']

На это:

df['anomaly'] = iForest.fit_predict(df.values.reshape(-1,1))

Кроме того, если вы используете новую версию pandas , используйте:

df['anomaly'] = iForest.fit_predict(df.to_numpy().reshape(-1,1))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...