目录
一、前言
二、任务准备
(1)库准备:
import excelReader
import gspread
import xlrd
import pandas as pd
from sklearn import metrics
import numpy as np
(2)数据准备:
data = pd.read_excel("D:\\dataspace\\已结束项目任务数据.xls")
data=pd.DataFrame(data)
print(data)
pd.set_option('display.max_rows',None)
pd.set_option('display.max_columns', None)
print("维度:",data.shape)
print("信息展示\n",data.info)
print("数据类型\n",data.dtypes)
x=data.iloc[:,[1,2]].values
#切分经度纬度两列数据作为异常检测的目标数据
三、采用DBSCAN聚类进行异常检测
(1)首先引入DBSCAN的算法原理。
注:在编写代码时,可使用DBSCAN函数来构建模型,其中eps表示邻域半径。设置参数时考虑eps 的取值是否过大覆盖了特征的所有区域。
(2)调整eps参数,确定最优的min_samples的范围。
from sklearn.cluster import DBSCAN
score1list = []
for i in range(1,11):
model_dbs = DBSCAN(eps=0.2, min_samples=i)
labels1 = model_dbs.fit_predict(x)
score1 = metrics.silhouette_score(x, labels1)
score1list.append(score1)
print('轮廓系数\n',score1list)
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['KaiTi']
plt.plot(range(1,11),score1list,'o-')
plt.title('silhouette score')
plt.xlabel('min_samples',size=12)
plt.ylabel('轮廓系数',size=12)
plt.show()
(3)设定最优参数,绘制DBSCAN分类法散点图。
model_dbs = DBSCAN(eps=0.2,min_samples=2)
Ypred2 = model_dbs.fit_predict(x)
print(Ypred2)
Y1=pd.DataFrame(Ypred2).value_counts().sort_index()
print(Y1)
import matplotlib.pyplot as plt
plt.title("DBSCAN 分类法散点图")
plt.scatter(x[Ypred2==0,0],x[Ypred2==0,-1],c="blue",label='0')
plt.scatter(x[Ypred2==-1,0],x[Ypred2==-1,-1],c='yellow',label='1')
plt.legend()
plt.show()
(4) 统计异常点检测结果:
print('DBscan 异常点检测结果',data[Ypred2==-1])
print(data[Ypred2==-1]["任务执行情况"].value_counts())
根据 DBscan 异常点的检测结果,可得出以下结果: