使用R语言构建机器学习模型

在当今的商业世界中,机器学习正在改变企业处理数据的方式。无论是大型企业还是小型企业,都渴望从其存储和定期处理的大量数据中发现洞察力。预测未来的愿望激励着商业分析师和数据科学家在从市场营销到医疗保健的各个领域开展工作。在本文中,将使用R语言来创建第一个用于分类的机器学习模型。

为什么选择R语言

R是一种流行的开源数据科学编程语言。它具有强大的可视化功能,这对于在应用任何机器学习算法之前探索数据以及评估其输出是必要的。许多R的机器学习包都可以商业获取,并且许多现代统计学习方法都在R中实现。

探索性数据分析(EDA)

将使用一个包含中风风险患者和非中风风险患者的信息的数据集。在这里,使用Kaggle上的Stroke Prediction Dataset来进行预测。任务是检查训练集中现有的患者记录,并利用这些知识预测评估集中的患者是否有中风的可能。

数据集包括分析所需的各种医疗数据:

  • id:代表唯一的标识符
  • gender:表示性别(“Male”,“Female”或“Other”)
  • age:表示年龄
  • hypertension:表示是否有高血压(1 = 是,0 = 否)
  • heart_disease:表示是否有心脏病(1 = 是,0 = 否)
  • ever_married:表示婚姻状况(“No”或“Yes”)
  • work_type:表示工作类型(“children”,“Govt_job”,“Never_worked”,“Private”或“Self-employed”)
  • Residence_type:表示居住类型(“Rural”或“Urban”)
  • avg_glucose_level:表示血液中的平均血糖水平
  • bmi:个人的体重指数
  • smoking_status:表示吸烟状况(“formerly smoked”,“never smoked”,“smokes”,或“Unknown”)
  • stroke:是试图预测的变量。如果患者可能会中风,它是逻辑值TRUE;如果患者不会,它是FALSE。

首先,加载所需的库。对于这个教程,使用了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)

所有这些图表和图形提供了关于数据集的许多有用信息,例如——

  • 不到10%的人有高血压
  • 数据集中大约有5%的人有心脏病
  • 特征‘居住类型’的均等分割,即50%的人口来自农村地区,50%来自城市
  • 57%的人在私营部门工作,超过65%的人已婚

可以创建一些额外的条形图,以查看这些变量中的每一个如何与目标变量相关,即个人的中风可能性。

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进行机器学习的逐步方法,并构建了一个简单的中风疾病预测模型。涵盖了模型的端到端设置,从加载数据到生成预测。通过这种方式,人们可以轻松熟悉新的数据科学工具。

以下是本文的一些关键要点——

  • R语言是一种同样强大且流行的开源工具,与Python一样。
  • R由于其统计能力而受到许多数据科学家的青睐。
  • R的语法与Python不同,但对于初学者来说,代码更容易理解。
  • 可以使用R中的随机森林快速构建一个分类机器学习模型。

就是这样!如果是初学者,希望觉得本文关于机器学习模型的介绍有趣。继续前进,并使用本文中提到的代码构建一个分类模型。可以在GitHub仓库中找到本教程的完整代码。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485