我有一个包含10.000个条目和4列的csv文件。我需要检测这些数据中的异常值,我正在使用Sklearn的隔离森林。我得到了不错的结果,但我不知道如何打印/计算得分(在0.0和1.0之间),也不知道如何绘制混淆矩阵。我将在这里发布代码,以便您可以看到我的隔离森林实现。
请尽量保持你的解释在一个较低的水平,因为我的技能与机器学习是最低限度的。谢谢。
此外,我的代码是从一个Jupyter日志,所以我可能贴错了,但这是代码。
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.ensemble import IsolationForest
from sklearn.metrics import accuracy_score
from sklearn.metrics import confusion_matrix
from sklearn.metrics import plot_confusion_matrix
from sklearn import model_selection
from sklearn.neighbors import KNeighborsClassifier
#Reading CSV
df = pd.read_csv('usecase999.csv')
df.info()
df
anomaly_inputs = ['c0', 'ya0'] #name of the columns, ya0 shows if the value(c0) is an anomaly or not(not reliable enough)
model_IF = IsolationForest(contamination=0.01,random_state=37)
model_IF.fit(df[anomaly_inputs])
df['anomaly_scores'] = model_IF.decision_function(df[anomaly_inputs])
df['anomaly'] = model_IF.predict(df[anomaly_inputs])
df.loc[:, ['c0', 'ya0', 'anomaly_scores', 'anomaly']]
#plotting fucntion
def outlier_plot(data, name, x_var, y_var, xaxis=[0,1], yaxis=[0,1])
print(f'Algorithm: {name}')
method = f'{name}_anomaly'
print(f"Nr of anomalies {len(data[data['anomaly']==-1])}")
print(f"Nr of non anomalies {len(data[data['anomaly']==1])}")
print(f"Nr of values {len(data)}")
g = sns.FacetGrid(data, col='anomaly', height=4, hue='anomaly', hue_order=[1,-1])
g.map(sns.scatterplot, x_var, y_var)
g.fig.suptitle(f'Algorithm: {name}', y=1.10, fontweight='bold')
g.set(xlim=xaxis, ylim=yaxis)
axes=g.axes.flatten()
axes[0].set_title(f"Outliers\n{len(data[data['anomaly']==-1])} points")
axes[1].set_title(f"Inliers\n{len(data[data['anomaly']==1])} points")
return g
outlier_plot(df, "Isolation Forest", "c0", "ya0", [0, 5], [0,1.5])
plt.show(sns)
我还没有尝试任何东西,因为我不知道如何访问混淆矩阵和算法得分。
1条答案
按热度按时间ccrfmcuu1#
孤立森林算法是一种无监督算法,这意味着它没有真实标签和预测标签的概念,因此,常用的评估指标如准确率、精确度、召回率、F1评分等不适用。
你可以使用confusion_matrix()方法:
让我知道它是否工作。你也可以计算平均值、标准差和异常得分的直方图:
用于使用roc_auc_score()函数计算AUC(您需要在数据中有真实标签的概念,否则无法计算AUC):