美文网首页
机器学习——模型构建/特征筛选(1)

机器学习——模型构建/特征筛选(1)

作者: Bioinfor生信云 | 来源:发表于2023-12-02 19:05 被阅读0次

准备

一般预测机器学习过程

"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

类别失衡

不平衡的数据会对模型预测和性能产生重大影响。大多数情况下,这涉及分类问题,其中一个类具有非常小比例的观察。已经开发了几种采样方法来帮助纠正类不平衡,其中大多数可以归类为上采样或下采样。

下采样通过减少丰富类别的大小以匹配最不普遍类别中的频率来平衡数据集。当数据量足够时使用此方法。通过将所有样本保留在稀有类中并在丰富类中随机选择相同数量的样本,可以检索一个平衡的新数据集以进行进一步建模。

相反,当数据量不足时使用上采样。它试图通过增加稀有样本的数量大小来平衡数据集。不是摆脱丰富的样本,而是通过使用重复或自举生成新的稀有样本。

欢迎关注Bioinfor 生信云!

相关文章

  • 机器学习-初-傻瓜入门系列之该怎么学?

    一个机器学习的常规套路: 1.数据收集(爬虫的用处)和预处理2.特征选择和模型构建特称选择(特征工程):将人类认识...

  • 【特征工程】特征选择与特征学习

    特征选择与特征学习 在机器学习的具体实践任务中,选择一组具有代表性的特征用于构建模型是非常重要的问题。特征选择通常...

  • 入门

    了解机器学习 标签需要通过机器学习模型判断出的结果 特征机器学习模型进行判断的条件(可以是很多的变量) 模型机器学...

  • 对抗样本生成的近期工作( 2018年9月)

    绝大多数的机器学习模型,本质上来说,都是通过抽取数据特征,构建数学判别公式,用数学模型来模拟人的判断过程。在特征抽...

  • 手把手教你用Python实现自动特征工程!Python为何这么秀

    任何参与过机器学习比赛的人,都能深深体会特征工程在构建机器学习模型中的重要性,它决定了你在比赛排行榜中的位置。 特...

  • 使用R语言进行机器学习特征选择①

    特征选择是实用机器学习的重要一步,一般数据集都带有太多的特征用于模型构建,如何找出有用特征是值得关注的内容。 使用...

  • 特征工程-指标筛选

    数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。 在数据建模前期,很重要的一步是特征工程的构建,...

  • 一文归纳Python特征选择(全)

    1 特征选择的目的 机器学习中特征选择是一个重要步骤,以筛选出显著特征、摒弃非显著特征。这样做的作用是: 减少特...

  • 特征选择与特征学习算法研究--笔记1

    特征选择与特征学习算法研究 2.1特征选择 特征选择过程特征选择是对数据进行预处理的机器学习算法,通过从数据中筛选...

  • 机器学习

    机器学习 Chapter One 样本和模型 样本 标签 特征 模型 模型定义了特征与标签之间的关系。例如,垃圾邮...

网友评论

      本文标题:机器学习——模型构建/特征筛选(1)

      本文链接:https://www.haomeiwen.com/subject/koljwdtx.html