CSV数据异常检测:如何从Sklearn Isolation Forest获混淆矩阵与评分
入门级讲解:Isolation Forest的0-1评分与混淆矩阵生成
一、获取0.0-1.0区间的算法评分
Isolation Forest默认输出的是类别标签:1代表正常样本,-1代表异常样本。如果你想得到0到1之间的连续评分(用来衡量样本的异常/正常程度),得用模型的decision_function()方法,再做简单转换。
具体操作(附代码)
- 补全数据加载与模型训练步骤
import pandas as pd from sklearn.ensemble import IsolationForest # 加载你的CSV文件 df = pd.read_csv("你的文件路径.csv") X = df.iloc[:, :4].values # 取前4列特征数据(可根据实际列位置调整) # 初始化并训练模型,contamination设为你预估的异常样本比例(比如0.05代表5%) clf = IsolationForest(n_estimators=100, contamination=0.05, random_state=42) clf.fit(X)
- 计算并转换评分
# 获取模型原始决策分数:值越小,样本越可能是异常 decision_scores = clf.decision_function(X) # 转换为【异常概率评分】(0=最正常,1=最异常) anomaly_scores = 0.5 - (decision_scores / 2) # 或者转换为【正常概率评分】(0=最异常,1=最正常) normal_scores = 0.5 + (decision_scores / 2)
- 转换逻辑:
decision_scores的取值范围约为[-1,1],通过上述公式可映射到0-1区间,直观体现样本的异常/正常程度。
二、生成混淆矩阵
混淆矩阵用来对比模型预测结果和真实情况,但前提是你必须有真实的异常/正常标签(比如CSV里有专门一列标记哪些是异常样本)。如果是无监督检测、没有真实标签,无法生成这个矩阵。
具体操作(附代码)
- 对齐真实标签与预测标签格式
# 假设CSV里有一列叫"is_anomaly",1代表异常,0代表正常(根据实际列名调整) y_true = df["is_anomaly"].values # 把模型默认输出的-1(异常)、1(正常)转成和真实标签一致的格式 y_pred = clf.predict(X) y_pred = [1 if label == -1 else 0 for label in y_pred] # 现在y_pred中1=异常,0=正常,与y_true对齐
- 计算并可视化混淆矩阵
from sklearn.metrics import confusion_matrix import seaborn as sns import matplotlib.pyplot as plt # 计算混淆矩阵 cm = confusion_matrix(y_true, y_pred) # 打印原始矩阵 print("混淆矩阵:") print(cm) # 用热力图可视化,更直观 sns.heatmap(cm, annot=True, fmt="d", cmap="Blues", xticklabels=["预测正常", "预测异常"], yticklabels=["真实正常", "真实异常"]) plt.xlabel("预测结果") plt.ylabel("真实情况") plt.show()
混淆矩阵入门解读
这是一个2x2表格,四个数值的含义:
- 左上角(TN):真实正常、模型也判对的样本数
- 右上角(FP):真实正常、但模型误判为异常的样本数(误报)
- 左下角(FN):真实异常、但模型误判为正常的样本数(漏报)
- 右下角(TP):真实异常、模型也判对的样本数
通过这四个数值,你能快速看出模型的误报、漏报情况,判断模型效果。
关键提醒
- 若CSV无真实标签,无需尝试混淆矩阵,可通过分析评分分布、可视化异常样本评估模型。
contamination参数需贴合实际异常样本占比,设置偏差会直接影响模型判断结果。
内容的提问来源于stack exchange,提问作者xredJ3
相关产品推荐
相关产品推荐

