csv 如何从sklearn的隔离森林中获取混淆矩阵和算法得分

pepwfjgg  于 2023-01-18  发布在  其他
关注(0)|答案(1)|浏览(172)

我有一个包含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)

我还没有尝试任何东西,因为我不知道如何访问混淆矩阵和算法得分。

ccrfmcuu

ccrfmcuu1#

孤立森林算法是一种无监督算法,这意味着它没有真实标签和预测标签的概念,因此,常用的评估指标如准确率、精确度、召回率、F1评分等不适用。
你可以使用confusion_matrix()方法:

true_labels = df['ya0']  # true labels
pred_labels = df['anomaly']  # predicted labels
conf_matrix = confusion_matrix(true_labels, pred_labels)
print(conf_matrix)

让我知道它是否工作。你也可以计算平均值、标准差和异常得分的直方图:

import numpy as np

# mean anomaly scores
mean_scores = np.mean(df['anomaly_scores'])
print("Mean of anomaly scores: ", mean_scores)

# standard deviation
std_scores = np.std(df['anomaly_scores'])
print("Standard deviation of anomaly scores: ", std_scores)

# histogram 
plt.hist(df['anomaly_scores'], bins=50)
plt.xlabel('Anomaly Scores')
plt.ylabel('Frequency')
plt.show()

用于使用roc_auc_score()函数计算AUC(您需要在数据中有真实标签的概念,否则无法计算AUC):

from sklearn.metrics import roc_auc_score

# true labels
y_true = df['ya0']

# predicted scores
y_scores = df['anomaly_scores']

# calculate the AUC
auc = roc_auc_score(y_true, y_scores)
print("AUC: ", auc)

相关问题