异常值检测

一、分位数法

Q3就是四分之三分位数,Q1就是四分之一分位数

# 设置分位数,例如四分位数
Q1 = df['column_name'].quantile(0.25)  # 第一四分位数(25%)
Q3 = df['column_name'].quantile(0.75)  # 第三四分位数(75%)

# 计算四分位数范围(IQR)
IQR = Q3 - Q1

# 定义下界和上界来识别异常值
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
# 标记异常值
df['outlier'] = df['column_name'].apply(lambda x: 'Yes' if x < lower_bound or x > upper_bound else 'No')

# 打印出被标记为异常值的行
df[df['outlier'] == 'Yes']

二、Z-score

标准后的值大于阈值就不正常

三、DBSCAN

DBSCAN是一种密度聚类算法,把数据分为核心点、边界点、噪声点,通过计算每个数据点周围密度来确定核心点。两个重要参数是半径和半径内的最小样本数。

这些红色的就是核心点,以他们为圆心,半径内大于等于5个点那就是核心点,那么圆内的黑色的点就是边界点,以他们为圆心的半径内至少有一个核心点。噪声点就是除了核心点和边界点之外的点。代码:

from sklearn.cluster import DBSCAN
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import DBSCAN
from sklearn.datasets import make_blobs

# 生成样本数据
n_samples = 1500
random_state = 170
X, y = make_blobs(n_samples=n_samples, random_state=random_state) #y没有用,因为我们是找异常值,不需要标签

print(X.shape)
print('-'*50)
# 增加一些噪声点,往X中拼接噪声点
rng = np.random.RandomState(74)
X = np.concatenate([X, rng.uniform(low=-10, high=10, size=(100, 2))])
print(X.shape) #1600个样本,2列特征,100个噪声点
# 可视化生成的数据
plt.scatter(X[:, 0], X[:, 1], s=5)
plt.title("Generated Data with Noise")
plt.show()
# 使用DBSCAN算法
db = DBSCAN(eps=0.5, min_samples=5).fit(X) # eps是半径,min_samples是最少包含几个点才会被认为是核心点
labels = db.labels_ # 得到每个点的类别
print(np.unique(labels)) # 得到类别有-1 0 1 2 总计4个类别
# 标签为-1的点是噪声点
noise_mask = (labels == -1)
print(noise_mask[0:5])
print(np.sum(noise_mask)) # 噪声点的数量
print(np.unique(labels[~noise_mask])) # 得到了核心点和边界点的类别
# 可视化聚类结果
plt.scatter(X[~noise_mask, 0], X[~noise_mask, 1], c=labels[~noise_mask], s=5, cmap='viridis') # 正常点(包含核心点和边界点)用彩色标注
plt.scatter(X[noise_mask, 0], X[noise_mask, 1], c='red', s=5, label='Noise') # 噪声点用红色标注
plt.title("DBSCAN Clustering")
plt.legend()
plt.show()

 

四、孤立森林

步骤:

构建随机树,从数据集中随机选择一个属性和一个随机分割点,将数据集一分为二,并递归的对子节点进行相同的操作,直到每个叶节点只包含一个数据点或最大深度。重复多次,得到多颗随机树

深度越低越可能是异常点

 异常点更容易被分割到单独的叶节点上也就是更浅的深度,异常分数更低。

代码:

import numpy as np
from sklearn.ensemble import IsolationForest
import matplotlib.pyplot as plt

# 随机生成50个数据点
np.random.seed(42)  # 为了结果的可重复性设置随机种子
X = np.random.rand(50, 2)  # 2维数据,2列好画图来解释

# 初始化Isolation Forest模型,contamination参数表示异常值比例,默认0.1,random_state参数表示随机种子,因为要设置随机分割点
iso_forest = IsolationForest(random_state=42, contamination=0.1)

# 训练模型,随机建树的过程
iso_forest.fit(X)

# 预测每个点的异常分数,在树中的高度越低,越可能是异常点
scores = iso_forest.decision_function(X)

# print(scores)
# 将异常分数转换为1(正常)和-1(异常)的标签
labels = iso_forest.predict(X)
print(np.unique(labels))
# 绘制数据点和异常点
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap=plt.cm.bwr, edgecolor='k', s=50)
plt.title('Isolation Forest Anomaly Detection')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.show()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

何仙鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值