我正在尝试检测数据集中的异常值,并找到了sklearn的Isolation Forest。我无法理解如何使用它。我将训练数据放入其中,它给了我一个带-1和1值的矢量。
任何人都可以向我解释它是如何运作的并提供一个例子吗?
我怎么知道异常值是'实际'异常值?
调整参数?
这是我的代码:
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]
答案 0 :(得分:20)
似乎你有很多问题,让我尽我所知逐一回答。 - 这个怎么运作? - >它的工作原理是任何数据集中的异常值的性质,即异常值很少且不同。这与典型的基于聚类或基于距离的算法完全不同。在顶层,它的工作原理是异常值需要较少的步骤来隔离'与普通'比较指向任何数据集。 要做到这一点,这就是IF所做的,假设你有训练数据集 X , n 数据点各有 m 功能。在训练中,IF为不同的特征创建隔离树(二叉搜索树)。对于训练,您有3个用于调整的参数,一个是隔离树的数量(' n_estimators'在sklearn_IsolationForest中),第二个是样本数量(' max_samples'在sklearn_IsolationForest中),第三个是从X中绘制以训练每个基本估算器的特征数量(' max_features'在sklearn_IF中)。 ' MAX_SAMPLE'是从原始数据集中选择用于创建隔离树的随机样本数。
在测试阶段,它从所有经过训练的隔离树中找到测试数据点的路径长度,并找到平均路径长度。路径长度越高,点越正常,反之亦然。基于平均路径长度。它会计算异常分数,sklearn_IF的 decision_function 可用于获取此值。对于sklearn_IF,降低分数,样本更加异常。根据异常分数,您可以通过在sklearn_IF对象中设置污染的正确值来确定给定样本是否异常。污染的默认值为0.1,您可以调整以确定阈值。数据集的污染量,即数据集中异常值的比例。
调整参数 培训 - > 1. n_estimators,2。max_samples,3.max_features。 测试 - >污染
答案 1 :(得分:7)
-1表示异常值(根据拟合模型)。请参阅IsolationForest example以获得有关流程的精彩描述。如果您有一些先验知识,可以提供更多参数以获得更准确的拟合。例如,如果您知道污染(数据集中异常值的比例),您可以将其作为输入提供。默认情况下,假设为0.1。请参阅参数here的说明。
答案 2 :(得分:0)
让我在阅读此问题时添加一些卡住的东西。
在大多数情况下,您将其用于二进制分类(我假设是),其中多数类为0,而离群类为1。例如,如果您想detect fraud,则您的主要类为非-欺诈(0),欺诈为(1)。
现在,如果您要进行火车训练并进行试车,则:X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)
然后您运行:
clf = IsolationForest(max_samples=10000, random_state=10)
clf.fit(x_train)
y_pred_test = clf.predict(x_test)
“正常”分类器评分的输出可能会非常混乱。如前所述,y_pred_test
将由[-1,1]组成,其中1是您的主要班级0,-1是您的次要班级1。因此,我建议您进行转换:
y_pred_test = np.where(y_pred_test == 1, 0, 1)
然后,您可以使用常规的评分功能等。