机器学习:基于Sklearn、XGBoost框架,使用逻辑回归、支持向量机和XGBClassifier来诊断并预测一个人是否患有自闭症

在这里插入图片描述

前言

系列专栏:机器学习:高级应用与实践【项目实战100+】【2024】✨︎
在本专栏中不仅包含一些适合初学者的最新机器学习项目,每个项目都处理一组不同的问题,包括监督和无监督学习、分类、回归和聚类,而且涉及创建深度学习模型、处理非结构化数据以及指导复杂的模型,如卷积神经网络、门控递归单元、大型语言模型和强化学习模型

自闭症是一种神经系统疾病,会影响一个人与他人互动、与他人进行眼神交流、学习能力以及一个人的其他行为和社交能力的能力。但是自闭症的确诊多因患儿的表现较难确诊,需通过详细的生长发育史、病史、精神检查及排除其他广泛性发育障碍来协助诊断。运用一些筛查性的量表进行初步筛查,最后通过儿童精神科系统检查后才能确诊。但是,如果我们使用机器学习来预测一个人是否患有自闭症,会怎么样呢?这正是我们将在本文中讨论的内容。

目录

  • 1. 相关库和数据集
    • 1.1 相关库介绍
    • 1.2 数据集介绍
    • 1.3 组织并检查数据
    • 1.4 数据清理
  • 2. 探索性数据分析
    • 2.1 检查数据的平衡
    • 2.2 探索数据的地理位置
    • 2.3 检查数据的偏度
  • 3. 特征工程
    • 3.1 探讨年龄组病例数
    • 3.2 探讨临床评分病例数
    • 3.3 消除数据的偏度
  • 4. 模型训练
  • 5. 模型评估

1. 相关库和数据集

1.1 相关库介绍

Python 库使我们能够非常轻松地处理数据并使用一行代码执行典型和复杂的任务。

  • Pandas – 该库有助于以 2D 数组格式加载数据框,并具有多种功能,可一次性执行分析任务。
  • Numpy – Numpy 数组速度非常快,可以在很短的时间内执行大型计算。
  • Matplotlib/Seaborn – 此库用于绘制可视化效果。
  • Sklearn – 包含多个库,这些库具有预实现的功能,用于执行从数据预处理到模型开发和评估的任务。
  • XGBoost – 包含 eXtreme Gradient Boosting 机器学习算法,是帮助我们实现高精度预测的算法之一。
  • Imblearn – 此模块包含一个函数,可用于处理与数据不平衡相关的问题。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sb
from scipy.io import arff
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder, StandardScaler
from sklearn import metrics
from sklearn.svm import SVC
from xgboost import XGBClassifier
from sklearn.linear_model import LogisticRegression
from imblearn.over_sampling import RandomOverSamplerimport warnings
warnings.filterwarnings('ignore')

1.2 数据集介绍

现在,让我们将数据集加载到 pandas 数据框中并打印其前五行。

df = pd.read_csv('train.csv')
print(df.head())

在这里插入图片描述

df.shape
(800, 22)

该数据集包含 800 个自闭症的实例或数据,包括 22 个属性或特征的数据。我们将使用这些功能来训练我们的模型。

1.3 组织并检查数据

df.info()

在这里插入图片描述
根据上述有关每列数据的信息,我们可以观察到没有空值。

df.describe().T

在这里插入图片描述

1.4 数据清理

从主要来源获得的数据被称为原始数据,需要大量的预处理,然后才能从中得出任何结论或对其进行一些建模。这些预处理步骤称为数据清理,它包括异常值删除、空值插补以及删除数据输入中的任何类型的差异。

df['ethnicity'].value_counts()

在这里插入图片描述
在上面的两个输出中,我们可以观察到一些歧义,即有“?”、“其他”和“其他”,它们都必须相同,因为它们是未知的,或者我们可以说空值已被一些指示符替换。

df['relation'].value_counts()

在这里插入图片描述
此列的情况也是如此,因此,让我们清理此数据,然后将“yes”和“no”转换为 0 和 1。

df = df.replace({'yes':1, 'no':0, '?':'Others', 'others':'Others'})

现在,我们已经对数据进行了一些清理,以便从中获取见解。

2. 探索性数据分析

EDA是一种使用视觉技术分析数据的方法。它用于发现趋势和模式,或借助统计摘要和图形表示来检查假设。在这里,我们将看到如何检查数据的不平衡和数据的偏度。

2.1 检查数据的平衡

plt.pie(df['Class/ASD'].value_counts().values, autopct='%1.1f%%')
plt.show()

在这里插入图片描述
我们拥有的数据集是高度不平衡的。如果我们使用这些数据来训练我们的模型,那么模型将面临很难预测阳性类别的问题,这是我们在这里的主要目标,即高精度地预测一个人是否患有自闭症。

ints = []
objects = []
floats = []for col in df.columns:
if df[col].dtype == int:ints.append(col)
elif df[col].dtype == object:objects.append(col)
else:floats.append(col)

现在,我们根据列包含的数据类型对列进行隔离,因此现在我们将能够根据数据类型执行适当的分析。

ints.remove('ID')
ints.remove('Class/ASD')

“ID”列将包含每行的唯一值,对于“Class/ASD”列,我们已经分析了它的分布,因此,这就是为什么在上面的代码中删除它们的原因。

plt.subplots(figsize=(15,15))for i, col in enumerate(ints):
plt.subplot(4,3,i+1)
sb.countplot(df[col], hue=df['Class/ASD'])
plt.tight_layout()
plt.show()

在这里插入图片描述
从这些图中,我们可以得出结论,如果某个指标的分数为 0,那么该人没有自闭症的机会非常高,除非是A10_Score。

plt.subplots(figsize=(15, 30))for i, col in enumerate(objects):plt.subplot(5, 3, i+1)sb.countplot(df[col], hue=df['Class/ASD'])plt.xticks(rotation=60)
plt.tight_layout()
plt.show()

在这里插入图片描述
从上面的图中,我们可以得出以下观察结果:

  • 所有数据点的Age_desc都是一样的。
  • 这个used_app_before功能似乎没有用,否则它将成为数据泄漏的来源。
  • 在这里,男性患自闭症的几率似乎高于女性,但事实并非如此,因为我们没有相同数量的男性和女性的例子。

2.2 探索数据的地理位置

plt.figure(figsize=(15,5))
sb.countplot(data=df, x='country_of_res', hue='Class/ASD')
plt.xticks(rotation=90)
plt.show()

在这里插入图片描述
在一些地方,该国大约50%的可用数据患有自闭症,而在某些地方,这一比例相当低。这意味着一个人的地理位置也给出了患有自闭症的想法。

2.3 检查数据的偏度

plt.subplots(figsize=(15,5))for i, col in enumerate(floats):plt.subplot(1,2,i+1)sb.distplot(df[col])
plt.tight_layout()
plt.show()

在这里插入图片描述
两个连续数据都是偏斜的,左边一个是正的,右边的是一个负偏态。

plt.subplots(figsize=(15,5))for i, col in enumerate(floats):plt.subplot(1,2,i+1)sb.boxplot(df[col])
plt.tight_layout()
plt.show()

在这里插入图片描述

df = df[df['result']>-5]
df.shape
(798, 22)

所以,在这里我们只丢失了两个数据点。

3. 特征工程

特征工程有助于从现有特征中派生出一些有价值的特征。这些额外的功能有时有助于显著提高模型的性能,当然也有助于更深入地了解数据。

3.1 探讨年龄组病例数

# This functions make groups by taking
# the age as a parameter
def convertAge(age):if age < 4:return 'Toddler'elif age < 12:return 'Kid'elif age < 18:return 'Teenager'elif age < 40:return 'Young'else:return 'Senior'df['ageGroup'] = df['age'].apply(convertAge)

现在,让我们探讨每个年龄组的病例数。

sb.countplot(x=df['ageGroup'], hue=df['Class/ASD'])
plt.show()

在这里插入图片描述
在这里,我们可以得出结论,幼儿群体患自闭症的几率较低。

3.2 探讨临床评分病例数

def add_feature(data):# Creating a column with all values zero
data['sum_score'] = 0
for col in data.loc[:,'A1_Score':'A10_Score'].columns:# Updating the 'sum_score' value with scores# from A1 to A10data['sum_score'] += data[col]# Creating a random data using the below three columns
data['ind'] = data['austim'] + data['used_app_before'] + data['jaundice']return datadf = add_feature(df)

在上面的代码块中,我们刚刚总结了从 A1 到 A10 给出的临床评分。

sb.countplot(x=df['sum_score'], hue=df['Class/ASD'])
plt.show()

在这里插入图片描述
另一个惊人的观察结果:总分越高,患自闭症的几率也越高,同样,对于低于 5 分的总分较低,该人患有自闭症的情况很少见。

3.3 消除数据的偏度

# Applying log transformations to remove the skewness of the data.
df['age'] = df['age'].apply(lambda x: np.log(x))

提供给我们的年龄数据是正偏态的。我们知道偏斜数据会影响模型的性能,因此我们将应用对数转换来消除数据的偏斜。

sb.distplot(df['age'])
plt.show()

在这里插入图片描述
现在,已成功消除数据的偏度

def encode_labels(data):for col in data.columns:# Here we will check if datatype# is object then we will encode itif data[col].dtype == 'object':le = LabelEncoder()data[col] = le.fit_transform(data[col])return datadf = encode_labels(df)# Making a heatmap to visualize the correlation matrix
plt.figure(figsize=(10,10))
sb.heatmap(df.corr() > 0.8, annot=True, cbar=False)
plt.show()

在这里插入图片描述
从上面的热图中,我们可以看到,在基于此数据训练模型之前,我们将删除一个高度相关的特征,因为高度相关的特征无助于学习数据中的有用模式。

4. 模型训练

现在,我们将特征和目标变量分开,并将它们拆分为训练和测试数据,通过这些数据,我们将选择在验证数据上表现最好的模型。

removal = ['ID', 'age_desc', 'used_app_before', 'austim']
features = df.drop(removal + ['Class/ASD'], axis=1)
target = df['Class/ASD']

让我们将数据拆分为训练数据和验证数据。此外,数据之前是不平衡的,现在我们将使用随机采样器来平衡它,在这种方法中,我们从少数类中抽取一些点并重复多次,以便两个类获得平衡。

X_train, X_val, \Y_train, Y_val = train_test_split(features, target,test_size = 0.2, random_state=10)# As the data was highly imbalanced we will balance it by adding repetitive rows of minority class.
ros = RandomOverSampler(sampling_strategy='minority',random_state=0)
X, Y = ros.fit_resample(X_train,Y_train)
X.shape, Y.shape

输出

((1026, 20), (1026,))

现在,让我们对数据进行归一化,以获得稳定和快速的训练。

# Normalizing the features for stable and fast training.
scaler = StandardScaler()
X = scaler.fit_transform(X)
X_val = scaler.transform(X_val)

现在,让我们训练一些最先进的机器学习模型,并将它们与我们的数据进行比较。

models = [LogisticRegression(), XGBClassifier(), SVC(kernel='rbf')]for model in models:model.fit(X, Y)print(f'{model} : ')print('Training Accuracy : ', metrics.roc_auc_score(Y, model.predict(X)))print('Validation Accuracy : ', metrics.roc_auc_score(Y_val, model.predict(X_val)))print()

在这里插入图片描述

5. 模型评估

从上述精度来看,我们可以说 Logistic RegressionSVC() 分类器在验证数据上表现更好,验证数据和训练数据之间的差异较小。让我们使用 Logistic 回归模型绘制验证数据的混淆矩阵。

metrics.plot_confusion_matrix(models[0], X_val, Y_val)
plt.show()

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/5005.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JAVA系列 小白入门参考资料 继承

目录 1. 为什么需要继承 2. 继承的概念 3. 继承的语法 4. 父类成员访问 4.1 子类中访问父类的成员变量 1. 子类和父类不存在同名成员变量 2. 子类和父类成员变量同名 4.2 子类中访问父类的成员方法 1. 成员方法名字不同 2. 成员方法名字相同 ​5. super关键字 …

Kubernetes学习笔记06

第十六章、Kubernetes容器交付介绍 如何在k8s集群中部署Java项目 容器交付流程 开发代码阶段 编写代码编写Dockerfile【打镜像做准备】持续交付/集成 代码编译打包制作镜像上传镜像仓库应用部署 环境准备PodServiceIngress运维 监控故障排查应用升级 k8s部署Java项目流程 …

使用Github+Picgo+npm实现免费图床

本文参考自 Akilar&#xff0c;原文地址&#xff1a;https://akilar.top/posts/3e956346/ Picgo的配置 Github图床仓库内容不能超过1GB&#xff0c;因为Github原则上是反对仓库图床化的&#xff0c;超过1GB之后会由人工审核仓库内容&#xff0c;如果仓库被发现用来做图床&…

H266 编码标准开源编码器 VVenC 介绍

H266 H.266&#xff0c;也称为VVC&#xff08;Versatile Video Coding&#xff09;&#xff0c;是最新的国际视频编码标准&#xff0c;由MPEG&#xff08;Moving Picture Experts Group&#xff09;和ITU&#xff08;International Telecommunication Union&#xff09;联合开…

MySQL CRUD操作

前言&#x1f440;~ 上一章我们介绍了数据库的一些基础操作&#xff0c;关于如何去创建一个数据库&#xff0c;还有使用数据库&#xff0c;删 除数据库以及对表进行的一些基础操作&#xff0c;今天我们学习CRUD操作 俗称&#xff08;增删改查&#xff09; 如果各位对文章的内…

IDM下载器安装cmd注册

一、下载注册 安装包去IDM官网下载最新的试用版即可 或者直达百度网盘下载&#xff08;担心被河蟹&#xff0c;放在txt中了&#xff09;包含IDM下载器安装包和注册软件 IDM下载器安装包和注册软件下载地址链接 https://download.csdn.net/download/qq_31237581/89215452 如果…

【STM32+HAL】SDIO模式读写SD卡

一、准备工作 有关CUBEMX的初始化配置&#xff0c;参见我的另一篇blog&#xff1a;【STM32HAL】CUBEMX初始化配置 二、所用工具 1、芯片&#xff1a; STM32F407ZGT6 2、IDE&#xff1a; MDK-Keil软件 3、库文件&#xff1a;STM32F4xxHAL库 三、实现功能 实现用DMA读写SD卡内…

人工原生动物优化器(APO)-2024年SCI一区新算法-公式原理详解与性能测评 Matlab代码免费获取

声明&#xff1a;文章是从本人公众号中复制而来&#xff0c;因此&#xff0c;想最新最快了解各类智能优化算法及其改进的朋友&#xff0c;可关注我的公众号&#xff1a;强盛机器学习&#xff0c;不定期会有很多免费代码分享~ 目录 原理简介 一、觅食行为 (1)自养模式 (2)异…

xss漏洞学习

1.xss漏洞简介 跨站脚本&#xff08;Cross-Site Scripting&#xff09;&#xff0c;本应该缩写为CSS&#xff0c;但是该缩写已被层叠样式脚本Cascading Style Sheets所用&#xff0c;所以改简称为XSS。也称跨站脚本或跨站脚本攻击。 原理&#xff1a;跨站脚本攻击XSS通过将恶…

项目文档:基于JavaFX + Maven的桌面扫雷软件打包exe【小白可做,文章末尾有包教安装有源代码可运行,可打包】

微信公众号: 科研小条 前言 用于学习javafx做桌面软件&#xff0c;熟悉maven构建项目的最佳选择 效果展示&#xff1a; 1. 项目概述 本项目是一个基于Java和JavaFX构建的桌面扫雷游戏软件。扫雷游戏是一种经典的单人益智游戏&#xff0c;玩家需要根据已知的雷区信息&…

Golang Colly爬取图片gorm存储数据

语言:Golang 库:Iris/Colly/gorm 运行结果 text/html; charset=utf-8 It is image 20240429222029_0_0.jpg Saved file: images\20240429222029_0_0.jpg text/html; charset=utf-8 It is image 20240429222030_1_0.jpg Saved file: images\20240429222030_1_0.jpg It is ima…

动态切换数据源的最佳实践

序言 本文和大家聊聊在开发中&#xff0c;动态切换多数据源的方案。 一、多数据源需求 随着应用程序的发展和复杂性增加&#xff0c;对于多数据源的需求也变得越来越普遍。在某些场景下&#xff0c;一个应用程序可能需要连接和操作多个不同的数据库或数据源。常见的场景包括…

Qt QThreadPool线程池

1.简介 QThreadPool类管理一个QThread集合。 QThreadPool管理和重新设计单个QThread对象&#xff0c;以帮助降低使用线程的程序中的线程创建成本。每个Qt应用程序都有一个全局QThreadPool对象&#xff0c;可以通过调用globalInstance来访问该对象。 要使用其中一个QThreadPool…

深度学习入门(4)

神经网络的构建 import numpy as np import matplotlib.pyplot as plt def sigmoid(x):return 1/(1np.exp(-x)) def identity_function(x):#恒等函数return x def init_network():#进行权重和偏置的初始化&#xff0c;并保存到字典中network{}network[W1]np.array([[0.1,0.3,0…

ezplot--Matlab学习

目录 一、代码 二、效果 ​编辑 三、ezplot讲解 四、如何自定义一个函数 一、代码 clc; clear; t0:32; x4(t) cos(2*pi*t/4).*sin(2*pi*t/4); x8(t) cos(2*pi*t/8).*sin(2*pi*t/8); x16(t) cos(2*pi*t/16).*sin(2*pi*t/16); subplot(3,1,1) ezplot(x4,[0,32]); subplot…

POCEXP编写—多线程

POC&EXP编写—多线程 1. 前言2. 多进程&多线程2.1. 多进程2.1.1. 案例 2.2. 多线程2.2.1. 案例&#xff1a; 2.3. POC的案例&#xff08;模板&#xff09; 3. UA头设置3.1. 随机UA头3.1.1. 案例3.1.2. 模板拼接 4. 代理Proxy4.1. 单代理案例4.2. 多代理案例4.2.1. 请求…

【AI心理咨询应用】继Woebot之后,国内诞生的“LLM+CBT”应用:白小喵

导言 AI认知行为疗法&#xff08;Cognitive Behavioral Therapy&#xff0c;CBT&#xff09;早在2017年便有了首例&#xff0c;即美国知名CBT治疗机器人Woebot。 然而&#xff0c;Woebot在CBT的完整落地上仍有缺陷问题&#xff0c;LLM的出现促进了对该问题的解决&#xff0c;…

【机器学习基础1】什么是机器学习、预测模型解决问题的步骤、机器学习的Python生态圈

文章目录 一. 什么是机器学习1. 概念2. 机器学习算法分类 二. 利用预测模型解决问题的步骤三. 机器学习的Python生态圈 一. 什么是机器学习 1. 概念 机器学习&#xff08;Machine Learning&#xff0c;ML&#xff09;是一门多领域的交叉学科&#xff0c;涉及概率论、统计学、…

服务器数据恢复—Storwize V3700存储数据恢复案例

服务器存储数据恢复环境&#xff1a; 某品牌Storwize V3700存储&#xff0c;10块硬盘组建了2组Mdisk加入到一个存储池中&#xff0c;一共创建了1个通用卷来存放数据&#xff0c;主要数据为oracle数据库。 服务器存储故障&#xff1a; 其中一组Mdisk中两块磁盘出现故障离线&…

【每日刷题】Day28

【每日刷题】Day28 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; ​ 1. 121. 买卖股票的最佳时机 - 力扣&#xff08;LeetCode&#xff09; 2. 205. 同构字符串 - 力扣…