在当今的商业世界中,机器学习正在改变企业处理数据的方式。无论是大型企业还是小型企业,都渴望从其存储和定期处理的大量数据中发现洞察力。预测未来的愿望激励着商业分析师和数据科学家在从市场营销到医疗保健的各个领域开展工作。在本文中,将使用R语言来创建第一个用于分类的机器学习模型。
R是一种流行的开源数据科学编程语言。它具有强大的可视化功能,这对于在应用任何机器学习算法之前探索数据以及评估其输出是必要的。许多R的机器学习包都可以商业获取,并且许多现代统计学习方法都在R中实现。
将使用一个包含中风风险患者和非中风风险患者的信息的数据集。在这里,使用Kaggle上的Stroke Prediction Dataset
来进行预测。任务是检查训练集中现有的患者记录,并利用这些知识预测评估集中的患者是否有中风的可能。
数据集包括分析所需的各种医疗数据:
首先,加载所需的库。对于这个教程,使用了Rstudio。也可以在Kaggle或Google Colab中使用R环境。使用R中的library()
命令。如果缺少以下任何库,可以使用install.packages('library name')
命令安装它们,如下所示。
# 安装包
install.packages("tidyverse")
install.packages("caret")
install.packages("randomForest")
安装完成后,可以使用以下命令导入库:
# 导入库
library(tidyverse)
library(caret)
library(randomForest)
下一步是使用以下命令导入和预览数据:
# 读取数据
df_stroke <- read.csv("../input/stroke-prediction-dataset/healthcare-dataset-stroke-data.csv")
# 描述数据
glimpse(df_stroke)
数据预览显示有5110个观测值和12个变量。接下来,将使用‘summary()’函数,这将给一个关于数据的统计分布的总体视角。
summary(df_stroke)
由于摘要显示‘Other’性别只有一行,可以使用以下命令删除这一行:
# 删除'Other'列(因为只有1行)
df_stroke = df_stroke[!df_stroke$gender == 'Other',]
发现表明bmi变量有缺失数据(NA)。使用以下命令也可以找到数据中缺失值的总数:
# 检查缺失值
sum(is.na(df_stroke))
虽然可以使用个人的身高和体重估算bmi值,但这个数据集中没有提供这些参数。然而,删除或替换缺失的bmi值可能更好。因为201个缺失值占列中总条目的5%,用平均值替换缺失值可能是有益的,假设平均值不会改变发现。将使用以下语法替换bmi列中的缺失值:
# 数据集插补
df_stroke$bmi[is.na(df_stroke$bmi)] <- mean(df_stroke$bmi, na.rm = TRUE)
再次使用‘is.na’命令检查,确认数据集中没有更多的缺失值。因为数据框有各种数据类型的列,让使用以下代码将所有字符列转换为因子:
df_stroke$stroke <- factor(df_stroke$stroke, levels = c(0,1), labels = c("No", "Yes"))
df_stroke$gender <- as.factor(df_stroke$gender)
df_stroke$hypertension <- factor(df_stroke$hypertension, levels = c(0,1), labels = c("No", "Yes"))
df_stroke$heart_disease <- factor(df_stroke$heart_disease, levels = c(0,1), labels = c("No", "Yes"))
df_stroke$ever_married <- as.factor(df_stroke$ever_married)
df_stroke$work_type <- as.factor(df_stroke$work_type)
df_stroke$Residence_type <- as.factor(df_stroke$Residence_type)
df_stroke$smoking_status <- as.factor(df_stroke$smoking_status)
df_stroke$bmi <- as.numeric(df_stroke$bmi)
由于缺失值和数据类型已经正确配置,现在是时候从数据中生成一些图表以获得洞察力了。将为特征绘制分布图——性别、高血压、心脏病和已婚。
p1 <- ggplot(df_stroke, aes(x="", y=gender, fill=gender)) + geom_bar(stat="identity", width=1) + coord_polar("y", start=0)
p2 <- ggplot(df_stroke, aes(x="", y=hypertension, fill=hypertension)) + geom_bar(stat="identity", width=1) + coord_polar("y", start=0)
p3 <- ggplot(df_stroke, aes(x="", y=heart_disease, fill=heart_disease)) + geom_bar(stat="identity", width=1) + coord_polar("y", start=0)
p4 <- ggplot(df_stroke, aes(x="", y=ever_married, fill=ever_married)) + geom_bar(stat="identity", width=1) + coord_polar("y", start=0)
grid.arrange(p1, p2, p3, p4, ncol= 2)
此外,可以可视化下一组特征的分布——居住类型和中风。
ggplot(df_stroke, aes(x="", y=Residence_type, fill=Residence_type)) + geom_bar(stat="identity", width=1) + coord_polar("y", start=0)
ggplot(df_stroke, aes(x="", y=stroke, fill=stroke)) + geom_bar(stat="identity", width=1) + coord_polar("y", start=0)
所有这些图表和图形提供了关于数据集的许多有用信息,例如——
可以创建一些额外的条形图,以查看这些变量中的每一个如何与目标变量相关,即个人的中风可能性。
library(gridExtra)
p1 <- ggplot(data = df_stroke) + geom_bar(mapping = aes(x = gender, fill=stroke))
p2 <- ggplot(data = df_stroke) + geom_bar(mapping = aes(x = hypertension, fill=stroke))
p3 <- ggplot(data = df_stroke) + geom_bar(mapping = aes(x = heart_disease, fill=stroke))
p4 <- ggplot(data = df_stroke) + geom_bar(mapping = aes(x = ever_married, fill=stroke))
grid.arrange(p1, p2, p3, p4, ncol= 2)
p5 <- ggplot(data = df_stroke) + geom_bar(mapping = aes(x = work_type, fill=stroke))
p6 <- ggplot(data = df_stroke) + geom_bar(mapping = aes(x = Residence_type, fill=stroke))
p7 <- ggplot(data = df_stroke) + geom_bar(mapping = aes(x = smoking_status, fill=stroke))
grid.arrange(p5, p6, p7, ncol= 1)
在探索性数据分析(EDA)之后,下一步是将数据分割成训练和测试数据集。使用以下代码——
# 将最终数据集分割为训练和测试数据
n_obs <- nrow(df_stroke)
split <- round(n_obs * 0.7)
train <- df_stroke[1:split,]
# 创建测试
test <- df_stroke[(split + 1):nrow(df_stroke),]
dim(train)
dim(test)
使用随机森林算法来解决这个问题,因为它通常用于监督学习,因为问题只有两种可能的结果。要设置模型,首先使用‘set.seed’选择一个随机种子,使模型可重现。接下来,调用随机森林分类器,将其指向‘stroke’列作为结果,并提供‘train’集作为输入。
# 建模
set.seed(123)
rf_model <- randomForest(formula= stroke~., data = train)
rf_model
运行上述代码将训练模型。由于这是一个小数据集,训练应该相当快。可以轻松地查看模型对训练集的结果——
从混淆矩阵中获得信息,以及错误率的Out-of-Bag(OOB)估计(7.13%),树的数量(500),每个分割的变量(3),以及用于构建分类器的函数(randomForest)。必须在训练集上训练模型后,在类似数据上评估模型的性能。将为此使用测试数据集。让打印出混淆矩阵,看看分类模型在测试数据上的表现如何——
confusionMatrix(predict(rf_model, test), test$stroke)
可以看到,准确率接近100%,这表明模型在训练数据上训练得很好。
在本文中,学习了如何使用R进行机器学习的逐步方法,并构建了一个简单的中风疾病预测模型。涵盖了模型的端到端设置,从加载数据到生成预测。通过这种方式,人们可以轻松熟悉新的数据科学工具。
以下是本文的一些关键要点——
就是这样!如果是初学者,希望觉得本文关于机器学习模型的介绍有趣。继续前进,并使用本文中提到的代码构建一个分类模型。可以在GitHub仓库中找到本教程的完整代码。