数据挖掘(四)甲状腺疾病检测

这篇具有很好参考价值的文章主要介绍了数据挖掘(四)甲状腺疾病检测。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

注:参考多篇文章与代码所得,在某些过程处可能存在一些理解错误,请大家批评指正。

一、实验内容

利用异常检测方法对甲状腺疾病进行检测。

二、数据介绍

数据集包含16个类别属性,5个数据属性和1个目标属性,共22个属性。

1、 类别属性:

age: continuous.

sex: categorical, M, F.

on thyroxine: categorical, f, t.

query on thyroxine: categorical, f, t.

on antithyroid medication: categorical, f, t.

sick: categorical, f, t.

pregnant: categorical, f, t.

thyroid surgery: categorical, f, t.

I131 treatment: categorical, f, t.

query hypothyroid: categorical, f, t.

query hyperthyroid: categorical, f, t.

lithium: categorical, f, t.

goitre: categorical, f, t.

tumor: categorical, f, t.

hypopituitary: categorical, f, t.

psych: categorical, f, t.

其中年龄标准化为(0,1), 类别变量对应方式: {"M" -> 0 , "F" -> 1}, or {"f" ->0, "t" -> 1}.

2、 数值属性:

TSH: continuous.

T3: continuous.

TT4: continuous.

T4U: continuous.

FTI: continuous.

3、 目标属性:

outlierlabel(target): categorical, o, n。"o" 为离群点and "n" 为正常。最后一列为空,可删除。

实验过程

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
# 一、导入数据集
data = pd.read_csv("D:/班级作业/数据挖掘/实验报告/甲状腺疾病数据/annthyroid_unsupervised_anomaly_detection.csv")
data.head()

#二、数据探索性分析
import seaborn as sns
# 1.查看数据规模
print(data.shape)
# 2.粗略查看数据集
print (data.describe())
# 3.查看缺失情况(发现无缺失)
print (data.isnull().sum())
# 4.直方图查看各特征的分布
data.hist(figsize=(15,10))
plt.show()
# 5. 皮尔逊相关性分析可视化
plt.rcParams['font.sans-serif'] = ['SimHei']    # 显示中文
plt.rcParams['axes.unicode_minus'] = False		# 显示负号
corr = data.corr(method="pearson")
plt.figure(figsize=(10,10))
sns.heatmap(corr,annot=True)
plt.show()

#三、特征分析
# 标签编码
data.iloc[:,21] = data.iloc[:,21].map({'o': -1, 'n': 1})  #o是离群点,n是正常点
data[["Outlier_label "]]
# 划分训练集和测试集
from sklearn.model_selection import train_test_split
X = data.iloc[:,0:21]
y = data[["Outlier_label "]]
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.3,random_state=42)
X_test
# 建模分析
np.random.seed(42)
plt.rcParams['font.sans-serif']=['SimHei']  #中文和负数的显示
plt.rcParams['axes.unicode_minus'] = False

#1.LOF
from sklearn.metrics import accuracy_score
from sklearn.metrics import recall_score
from sklearn.neighbors import LocalOutlierFactor
rate_of_accuracy = []     # 记录不同参数下的准确率
rate_of_recall = []       # 记录不同参数下的召回率
for i in range(1,31):
    clf = LocalOutlierFactor(n_neighbors=i, novelty=True)
    clf.fit(X_train)
    y_pred_test = clf.predict(X_test)                       # 得到模型的预测结果
    accuracy = accuracy_score(y_test, y_pred_test)      # 得到模型预测出来正确值比例
    rate_of_accuracy.append(accuracy)               # 记录准确率
    recall = recall_score(y_test, y_pred_test)   # 得到模型召回率
    rate_of_recall.append(recall)             # 记录召回率

# 模型效果可视化
plt.title("LOF模型正确情况")
plt.plot(list(range(1,31)),rate_of_accuracy, 'ro-', color='#4169E1', alpha=0.8, linewidth=1, label='LOF模型')
plt.legend(loc="best")
plt.xlabel('簇的个数')
plt.ylabel('正确率')
plt.grid()
plt.show()
print("最优结果为:")
print(max(rate_of_accuracy))
#查看召回率
plt.title("LOF模型召回率")
plt.plot(list(range(1,31)),rate_of_recall, 'ro-', color='#4169E1', alpha=0.8, linewidth=1, label='LOF模型')
plt.legend(loc="best")
plt.xlabel('簇的个数')
plt.ylabel('召回率')
plt.grid()
plt.show()
print("最优结果为:")
print(max(rate_of_recall))

#2.iForest
from sklearn.ensemble import IsolationForest
from sklearn.metrics import accuracy_score
from sklearn.metrics import recall_score
rate_of_accuracy = []     # 记录不同参数下的准确率
rate_of_recall = []       # 记录不同参数下的召回率

for i in np.arange(50,201,5):
    IF = IsolationForest(n_estimators=i)
    IF.fit(X_train)
    y_pred_test = IF.predict(X_test)                       # 得到模型的预测结果

    accuracy = accuracy_score(y_test, y_pred_test)      # 得到模型预测出来正确值比例
    rate_of_accuracy.append(accuracy)              # 记录准确率

    recall = recall_score(y_test, y_pred_test)   # 得到模型召回率
    rate_of_recall.append(recall)             # 记录召回率

# 模型效果可视化
plt.title("iForest模型正确情况")
plt.plot(list(np.arange(50,201,5)),rate_of_accuracy, 'ro-', color='#4169E1', alpha=0.8, linewidth=1, label='iForest模型')
plt.legend(loc="best")
plt.xlabel('树的棵数')
plt.ylabel('正确率')
plt.grid()
plt.show()

print("最优结果为:")
print(max(rate_of_accuracy))

#查看召回率
plt.title("iForest模型召回率")
plt.plot(list(np.arange(50,201,5)),rate_of_recall, 'ro-', color='#4169E1', alpha=0.8, linewidth=1, label='iForest模型')
plt.legend(loc="best")
plt.xlabel('树的棵数')
plt.ylabel('召回率')
plt.grid()
plt.show()

print("最优结果为:")
print(max(rate_of_recall))

#3.one-class SVM
from sklearn import svm

rate_of_accuracy3 = []     # 记录不同参数下的准确率
rate_of_recall3 = []       # 记录不同参数下的召回率

for i in np.arange(0.05,1.05,0.05):
    osvm3 = svm.OneClassSVM(nu=i, kernel="sigmoid", gamma='scale').fit(X_train)
    y_pred_test3 = osvm3.predict(X_test)                       # 得到模型的预测结果

    accuracy3 = accuracy_score(y_test, y_pred_test3)      # 得到模型预测出来正确值比例
    rate_of_accuracy3.append(accuracy3)              # 记录准确率

    recall3 = recall_score(y_test, y_pred_test3)   # 得到模型召回率
    rate_of_recall3.append(recall3)             # 记录召回率

# 模型效果可视化
plt.title("one-class SVM模型正确情况")
plt.plot(list(np.arange(0.05,1.05,0.05)),rate_of_accuracy3, 'ro-', color='mediumblue', alpha=0.8, linewidth=1, label='sigmoid')
plt.legend(['sigmoid'],loc="best")
plt.xlabel('nu参数的值')
plt.ylabel('正确率')
plt.grid()
plt.show()

#查看召回率
plt.title("one-class SVM模型召回率")
plt.plot(list(np.arange(0.05,1.05,0.05)),rate_of_recall3, 'ro-', color='mediumblue', alpha=0.8, linewidth=1, label='sigmoid')
plt.legend(['sigmoid'],loc="best")
plt.xlabel('nu参数的值')
plt.ylabel('召回率')
plt.grid()
plt.show()
print("最优结果为:")
print(max(rate_of_accuracy3))
print("最优结果为:")
print(max(rate_of_recall3))

1.数据导入

2.数据探索性分析

1)数据分列:将22个属性值分为22列

数据挖掘(四)甲状腺疾病检测

2)查看数据规模、缺失情况 

数据挖掘(四)甲状腺疾病检测

3)直方图查看各特征的分布 

数据挖掘(四)甲状腺疾病检测

4)皮尔逊相关性分析可视化 

数据挖掘(四)甲状腺疾病检测

3.特征分析 

1 )LOF:

思想:

是一种基于距离的异常检测算法。通过比较每个点p和其邻域的密度来判断该点是否为异常点,如果点p的密度越低,越有可能被认为是异常点。至于密度,是通过点和点之间的距离来进行计算的,点和点之间的距离越小,则密度越高;反之则就越低。

步骤:

(1)指定离群异常检测算法的k值大小和离群因子大小判断的阈值大小epsilon;

(2)结合指定k值,计算出每一个原始数据的局部离群因子大小大小;

(3)输出局部离群因子大于1的点,即判读为异常点,小于1的点判断输出为正常点。

结果:

数据挖掘(四)甲状腺疾病检测

数据挖掘(四)甲状腺疾病检测 

数据挖掘(四)甲状腺疾病检测 

2 )iForest 

思想:

孤立森林是一个基于Ensemble的快速离群点检测方法,适用于连续数据的异常检测,通过对样本点的孤立来检测异常值。具体来说,该算法利用孤立树(iTree)的二叉搜索树结构来孤立样本。由于异常值的数量较少且与大部分样本的疏离性,因此,异常值会被更早的孤立出来,也即异常值会距离iTree的根节点更近,而正常值则会距离根节点有更远的距离。此外,相较于LOF,K-means等传统算法,孤立森林算法对高纬数据有较好的鲁棒性。

步骤:

该算法大致可以分为两个阶段,第一个阶段我们需要训练出 t 颗孤立树,组成孤立森林。随后我们将每个样本点带入森林中的每棵孤立树,计算平均高度,之后再计算每个样本点的异常值分数

结果:

数据挖掘(四)甲状腺疾病检测

数据挖掘(四)甲状腺疾病检测 

数据挖掘(四)甲状腺疾病检测 

3 )one-class SVM 

思想:

给定给一个包含正例和反例的样本集合,svm的目的是寻找一个超平面来对样本根据正例和反例进行分割。在one-class classification中,仅仅只有一类的信息是可以用于训练,其他类别的(总称outlier)信息是缺失的,也就是区分两个类别的边界线是通过仅有的一类数据的信息学习得到的。思路是寻找一个超平面将样本中的正例圈出来,预测就是用这个超平面做决策,在圈内的样本就认为是正样本。

步骤:

可用SVDD,期望最小化超球体的体积,从而最小化异常点数据的影响

结果:

数据挖掘(四)甲状腺疾病检测

数据挖掘(四)甲状腺疾病检测 

数据挖掘(四)甲状腺疾病检测 

四、实验结果及分析 

使用LOF、 iForest、one-class SVM分别获得的准确率和召回率的最优结果是:0.9103614457831325、0.9382219989954796;

0.9306024096385542、0.9663485685585133;

0.9166265060240963、0.952787543947765

由此可得,相比iForest的准确率最高,召回率也最高;而LOF的准确率和召回率最低;而one-class SVM模型的召回率与核函数的选取有关,上述代码选择了sigmod核为核函数。因此我们在选择模型的时候要选择适合的模型以及参数,这样才能得到更加准确的效果。文章来源地址https://www.toymoban.com/news/detail-459882.html

到了这里,关于数据挖掘(四)甲状腺疾病检测的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【数据挖掘算法与应用】——数据挖掘导论

    【数据挖掘算法与应用】——数据挖掘导论

    数据挖掘技术背景 大数据如何改变我们的生活 1.数据爆炸但知识贫乏   人们积累的数据越来越多。但是,目前这些数据还仅仅应用在数据的录入、查询、统计等功能,无法发现数据中存在的关系和规则,无法根据现有的数据预测未来的发展趋势,导致了“数据爆炸但知识

    2023年04月09日
    浏览(45)
  • 关联规则挖掘(上):数据分析 | 数据挖掘 | 十大算法之一

    ⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ 🐴作者: 秋无之地 🐴简介:CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作,主要擅长领域有:爬虫、后端、大数据开发、数据分析等。 🐴欢迎小伙伴们 点赞👍🏻、收藏

    2024年02月07日
    浏览(15)
  • 【数据挖掘竞赛】零基础入门数据挖掘-二手汽车价格预测

    【数据挖掘竞赛】零基础入门数据挖掘-二手汽车价格预测

    目录 一、导入数据  二、数据查看 可视化缺失值占比  绘制所有变量的柱形图,查看数据 查看各特征与目标变量price的相关性 三、数据处理  处理异常值 查看seller,offerType的取值 查看特征 notRepairedDamage   异常值截断  填充缺失值   删除取值无变化的特征 查看目标变量p

    2023年04月27日
    浏览(12)
  • 数据挖掘-实战记录(一)糖尿病python数据挖掘及其分析

    数据挖掘-实战记录(一)糖尿病python数据挖掘及其分析

    一、准备数据 1.查看数据 二、数据探索性分析 1.数据描述型分析 2.各特征值与结果的关系 a)研究各个特征值本身类别 b)研究怀孕次数特征值与结果的关系 c)其他特征值 3.研究各特征互相的关系 三、数据预处理 1.去掉唯一属性 2.处理缺失值 a)标记缺失值 b)删除缺失值行数  c

    2024年02月11日
    浏览(12)
  • 数据挖掘(3.1)--频繁项集挖掘方法

    数据挖掘(3.1)--频繁项集挖掘方法

    目录 1.Apriori算法 Apriori性质 伪代码 apriori算法 apriori-gen(Lk-1)【候选集产生】 has_infrequent_subset(c,Lx-1)【判断候选集元素】 例题 求频繁项集: 对于频繁项集L={B,C,E},可以得到哪些关联规则: 2.FP-growth算法 FP-tree构造算法【自顶向下建树】 insert_tree([plP],T) 利用FP-tree挖掘频繁项集

    2023年04月09日
    浏览(10)
  • 数据仓库与数据挖掘

    数据挖掘(Data mining),又译为资料探勘、数据采矿。它是数据库知识发现(Knowledge-Discovery in Databases,KDD)中的一个步骤。 数据挖掘一般是指从大量的数据中通过算法搜索隐藏于其中的信息的过程。 数据挖掘通常与计算机科学有关,并通过统计、在线分析处理、情报检索、

    2024年02月06日
    浏览(10)
  • 《数据挖掘基础》实验:Weka平台实现关联规则挖掘

    《数据挖掘基础》实验:Weka平台实现关联规则挖掘

    进一步理解关联规则算法(Apriori算法、FP-tree算法),利用weka实现数据集的挖掘处理,学会调整模型参数,读懂挖掘规则,解释规则的含义 (1)随机选取数据集为对象,完成以下内容:(用两种方法:Apriori算法、FP-tree算法) 文件导入与编辑; 参数设置说明; 结果截图;

    2024年02月02日
    浏览(39)
  • 数据挖掘|序列模式挖掘及其算法的python实现

    序列(sequence)模式挖掘也称为序列分析。 序列模式发现(Sequential Patterns Discovery)是由R.Agrawal于1995年首先提出的。 序列模式寻找的是事件之间在顺序上的相关性。 例如,“凡是买了喷墨打印机的顾客中,80%的人在三个月之后又买了墨盒”,就是一个序列关联规则。对于保险

    2024年04月09日
    浏览(15)
  • 数据挖掘与图像挖掘:计算机视觉的创新

    计算机视觉是人工智能领域的一个重要分支,它涉及到计算机对图像和视频数据进行分析和理解。数据挖掘则是数据科学领域的一个核心技术,它涉及到从大量数据中发现隐藏的模式和规律。随着数据量的增加,数据挖掘技术在计算机视觉领域得到了广泛应用,以提高计算机

    2024年04月17日
    浏览(13)
  • 数据挖掘与数据分析

    目录 数据挖掘与数据分析 一.数据的本质 二.什么是数据挖掘和数据分析 三.数据挖掘和数据分析有什么区别 案例及应用 1. 基于分类模型的案例 2. 基于预测模型的案例 3. 基于关联分析的案例 4. 基于聚类分析的案例 5. 基于异常值分析的案例 6. 基于协同过滤的案例 7. 基于

    2024年04月28日
    浏览(14)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包