准备
一般预测机器学习过程"h2o" 在机器学习中通常指的是 H2O.ai 公司开发的开源软件 h2o。h2o 提供了一个用于构建、训练和部署机器学习模型的平台。以下是 h2o 在机器学习中的一些主要作用:
1.数据处理和清洗: h2o 提供了一套强大的工具,帮助用户进行数据清理和处理。这包括处理缺失值、异常值、数据类型转换等。
2.特征工程: h2o 支持特征工程,帮助用户选择、转换和创建特征,以提高模型性能。
3。模型选择: h2o 提供了多种机器学习算法,包括深度学习、梯度提升机、随机森林等。用户可以根据任务选择最合适的模型。
4.模型训练: h2o 提供了分布式计算和并行处理的能力,可以加速大规模数据集上的模型训练。
5.自动化调参: h2o 具有自动调参的功能,可以通过搜索超参数的组合来优化模型性能,减少手动调参的工作负担。
6.模型解释和可视化: h2o 提供了模型解释和可视化的工具,帮助用户理解模型的预测结果,分析特征的重要性等。
7.部署和集成: h2o支持将训练好的模型部署到生产环境中,也可以通过 API 进行集成,使模型能够与其他系统进行交互。
# 加载工具包,没有请提前安装
library(dplyr) # 用于数据处理
library(ggplot2) # 用于作图
# 建模程序包
#install.packages("resample","h2o","caret")
library(rsample) # 用于重采样程序
library(caret) # 用于重采样和模型训练
library(h2o) # 用于重采样和模型训练
# h2o set-up
h2o.no_progress()
Sys.setenv(JAVA_HOME="C:/jdk-19.0.2") # 设置java环境
h2o.init() # 加载 h2
#install.packages("devtools")
#library(devtools)
#devtools::install_github("topepo/AmesHousing")
ames <- AmesHousing::make_ames()
ames.h2o <- as.h2o(ames) # 加载数据集到ames中
# 员工流失的数据
#install.packages("modeldata")
library(modeldata)
churn <- attrition %>%
mutate_if(is.ordered, .funs = factor, ordered = FALSE)
head(churn)
churn.h2o <- as.h2o(churn)
数据拆分
为了准确理解最终最优模型的普遍性,可以将数据分成训练和测试数据集:
训练集:这类数据用于开发特征集、训练算法、调整超参数、比较模型以及选择最终模
型(例如,我们要投入生产的模型)所需的所有其他活动。
测试集:选择了最终模型后,这些数据用于估计模型性能的无偏评估,称为泛化误差。
有偏估计(Biased Estimation)指的是在估计参数时由于采样或建模方法的选择而引入的系统性误差,导致估计值在平均意义上与真实值有一定的偏离。与有偏估计相对的是无偏估计,即在大量重复抽样或实验的情况下,估计值的期望值等于真实参数值。
无偏估计:在统计学中,一个估计量如果其期望值等于被估计参数的真实值,那么它被称为是无偏估计。换句话说,无偏估计的期望值等于被估计参数的真实值。无偏估计的意义是在多次重复下,它们的平均数接近所估计的参数真值。
简单随机抽样
抽样是一个随机过程,因此使用公共种子设置随机数生成器可以实现可重现的结果。在课程中,我们经常使用种子123来表示可重复性,但数字本身没有特殊含义。
#简单随机抽样
# Using base R
set.seed(123) # 设置种子数
index_1 <- sample(1:nrow(ames), round(nrow(ames) * 0.7))
train_1 <- ames[index_1, ]
test_1 <- ames[-index_1, ]
# Using caret package
set.seed(123) # 设置种子数
index_2 <- createDataPartition(ames$Sale_Price, p = 0.7,
list = FALSE)
train_2 <- ames[index_2, ]
test_2 <- ames[-index_2, ]
# Using rsample package
set.seed(123) # 设置种子数
split_1 <- initial_split(ames, prop = 0.7)
train_3 <- training(split_1)
test_3 <- testing(split_1)
# Using h2o package
split2 <- h2o.splitFrame(ames.h2o, ratios = 0.7,
seed = 123)
train_4 <- split2[[1]]
test_4 <- split2[[2]]
######plot抽样分布结果####
p1 <- ggplot(train_1, aes(x = Sale_Price)) +
geom_density(trim = TRUE) +
geom_density(data = test_1, trim = TRUE, col = "red") +
ggtitle("Base R")
p2 <- ggplot(train_2, aes(x = Sale_Price)) +
geom_density(trim = TRUE) +
geom_density(data = test_2, trim = TRUE, col = "red") +
theme(axis.title.y = element_blank(),
axis.ticks.y = element_blank(),
axis.text.y = element_blank()) +
ggtitle("caret")
p3 <- ggplot(train_3, aes(x = Sale_Price)) +
geom_density(trim = TRUE) +
geom_density(data = test_3, trim = TRUE, col = "red") +
theme(axis.title.y = element_blank(),
axis.ticks.y = element_blank(),
axis.text.y = element_blank()) +
ggtitle("rsample")
p4 <- ggplot(as.data.frame(train_4), aes(x = Sale_Price)) +
geom_density(trim = TRUE) +
geom_density(data = as.data.frame(test_4), trim = TRUE, col = "red") +
theme(axis.title.y = element_blank(),
axis.ticks.y = element_blank(),
axis.text.y = element_blank()) +
ggtitle("h2o")
# 拼图
library(gridExtra)
gridExtra::grid.arrange(p1, p2, p3, p4, nrow = 1)
如果样本量足够大,这种抽样方法通常会在你的训练和测试集之间有类似的分布。(其中训练集是黑色,测试集是红色)
分层抽样
分层抽样(stratified sampling)。将抽样单位按某种特征或某种规则划分为不同的层,然后从不同的层中独
立、随机地抽取样本。从而保证样本的结构与总体的结构比较相近,从而提高估计的精度。
对响应变量执行分层抽样的最简单方法是使用rsample 包
##分层抽样
table(churn$Attrition) %>% prop.table()
##
## No Yes
## 0.8387755 0.1612245
# stratified sampling with the resample package
set.seed(123)
split_strat <- initial_split(churn, prop = 0.7,
strata = "Attrition")
train_strat <- training(split_strat)
test_strat <- testing(split_strat)
# consistent response ratio between train & test
table(train_strat$Attrition) %>% prop.table()
##
## No Yes
## 0.838835 0.161165
table(test_strat$Attrition) %>% prop.table()
##
## No Yes
## 0.8386364 0.1613636
类别失衡
不平衡的数据会对模型预测和性能产生重大影响。大多数情况下,这涉及分类问题,其中一个类具有非常小比例的观察。已经开发了几种采样方法来帮助纠正类不平衡,其中大多数可以归类为上采样或下采样。
下采样通过减少丰富类别的大小以匹配最不普遍类别中的频率来平衡数据集。当数据量足够时使用此方法。通过将所有样本保留在稀有类中并在丰富类中随机选择相同数量的样本,可以检索一个平衡的新数据集以进行进一步建模。
相反,当数据量不足时使用上采样。它试图通过增加稀有样本的数量大小来平衡数据集。不是摆脱丰富的样本,而是通过使用重复或自举生成新的稀有样本。
网友评论