【R: mlr3:超参数调优】

 

本次分享官网教程地址

https://mlr3book.mlr-org.com/chapters/chapter4/hyperparameter_optimization.html

型调优
当你对你的模型表现不满意时,你可能希望调高你的模型表现,可通过超参数调整或者尝试一个更加适合你的模型,本篇将介绍这些操作。本章主要包括3个部分的内容:超参数调整机器学习模型都有默认的超参数,但是这些超参数不能根据数据自动调整,往往不能得到更好的性能表现。但是手动调整往往也不能获得最佳的表现,mlr3包含自动调参的策略,在此包中实现自动调参,需要指定:搜索空间(search_space),优化算法(调参方法),评估方法(重抽样策略),评价指标。特征选择主要是通过mlr3filter和mlr3select包进行。嵌套重抽样调整超参数
很多人戏称调参的过程就像是"炼丹"!确实差不多,而且很多时候你调整后的结果可能还不如默认的结果好!这就好比打游戏,“一顿操作猛如虎,一看战绩0比5”!模型调优一定要基于对算法和数据的理解进行,不是随便调的。我们使用著名的糖尿病数据集进行演示,首先创建任务library(mlr3verse)
## 载入需要的程辑包:mlr3
task <- tsk("pima")
print(task)
## <TaskClassif:pima> (768 x 9)
## * Target: diabetes
## * Properties: twoclass
## * Features (8):
##   - dbl (8): age, glucose, insulin, mass, pedigree, pregnant, pressure,
##     triceps选择算法,查看算法支持的超参数learner <- lrn("classif.rpart")
learner$param_set
## <ParamSet>
##                 id    class lower upper nlevels        default value
##  1:             cp ParamDbl     0     1     Inf           0.01      
##  2:     keep_model ParamLgl    NA    NA       2          FALSE      
##  3:     maxcompete ParamInt     0   Inf     Inf              4      
##  4:       maxdepth ParamInt     1    30      30             30      
##  5:   maxsurrogate ParamInt     0   Inf     Inf              5      
##  6:      minbucket ParamInt     1   Inf     Inf <NoDefault[3]>      
##  7:       minsplit ParamInt     1   Inf     Inf             20      
##  8: surrogatestyle ParamInt     0     1       2              0      
##  9:   usesurrogate ParamInt     0     2       3              2      
## 10:           xval ParamInt     0   Inf     Inf             10     0
1
在这里我们选择调整复杂度参数cp和最小分支参数minsplit,并设定超参数的调整范围:search_space <- ps(cp = p_dbl(lower = 0.001, upper = 0.1),minsplit = p_int(lower = 1, upper = 10)
)
search_space
## <ParamSet>
##          id    class lower upper nlevels        default value
## 1:       cp ParamDbl 0.001   0.1     Inf <NoDefault[3]>      
## 2: minsplit ParamInt 1.000  10.0      10 <NoDefault[3]>然后选择重抽样方法和性能指标hout <- rsmp("holdout", ratio = 0.7)
measure <- msr("classif.ce")
1
2
接下来进行调参有两种方法。方法一:通过tuninginstancesinglecrite和tuner训练模型
library(mlr3tuning)
## 载入需要的程辑包:paradoxevals20 <- trm("evals", n_evals = 20) # 设定何时停止训练# 统一放入instance中
instance <- TuningInstanceSingleCrit$new(task = task,learner = learner,resampling = hout,measure = measure,terminator = evals20,search_space = search_space
)
instance
## <TuningInstanceSingleCrit>
## * State:  Not optimized
## * Objective: <ObjectiveTuning:classif.rpart_on_pima>
## * Search Space:
## <ParamSet>
##          id    class lower upper nlevels        default value
## 1:       cp ParamDbl 0.001   0.1     Inf <NoDefault[3]>      
## 2: minsplit ParamInt 1.000  10.0      10 <NoDefault[3]>      
## * Terminator: <TerminatorEvals>
## * Terminated: FALSE
## * Archive:
## <ArchiveTuning>
## Null data.table (0 rows and 0 cols)关于何时停止训练,mlr3给出了5种方法:Terminate after a given time:一定时间后停止
Terninate after a given number of iterations:特定迭代次数后停止
Terminate after a specific performance has been reached:达到特定性能指标后停止
Terminate when tuning dose find a better configuration for a given number of iterations:在给定迭代次数中确实找到表现很好的参数组合后停止
A combination of above in ALL or ANY fashon:上面几种方法组合
然后还需要设置超参数搜索的方法:mlr3tuning目前支持以下超参数搜索的方法:Grid search:网格搜索
Random search:随机搜索
Generalized simulated annealing
Non-Linear optimization

# 这里选择网格搜索
tuner <- tnr("grid_search", resolution = 5) # 网格搜索
1
2
接下来就是进行训练模型,上面我们设置了网格搜索的分辨率是5,我们有2个超参数需要调整,所以理论上一共有5 * 5 = 25个组合,但是在前面的停止搜索的方法中我们选择了n_evals = 20,所有实际上在评价完20个组合后就会停止了!#lgr::get_logger("mlr3")$set_threshold("warn") 
#lgr::get_logger("bbotk")$set_threshold("warn")   # 减少屏幕打印内容tuner$optimize(instance)
## INFO  [20:51:28.312] [bbotk] Starting to optimize 2 parameter(s) with '<TunerGridSearch>' and '<TerminatorEvals> [n_evals=20, k=0]' 
## INFO  [20:51:28.331] [bbotk] Evaluating 1 configuration(s) 
## 省略输出
## INFO  [20:51:29.306] [bbotk]                                 uhash 
## INFO  [20:51:29.306] [bbotk]  58eb421d-f0ed-4246-8430-3c1832ae615c 
## INFO  [20:51:29.309] [bbotk] Finished optimizing after 20 evaluation(s) 
## INFO  [20:51:29.310] [bbotk] Result: 
## INFO  [20:51:29.310] [bbotk]       cp minsplit learner_param_vals  x_domain classif.ce 
## INFO  [20:51:29.310] [bbotk]  0.02575        3          <list[3]> <list[2]>  0.2130435
##         cp minsplit learner_param_vals  x_domain classif.ce
## 1: 0.02575        3          <list[3]> <list[2]>  0.2130435查看调整好的超参数:instance$result_learner_param_vals
## $xval
## [1] 0
## 
## $cp
## [1] 0.02575
## 
## $minsplit
## [1] 3查看模型性能:
instance$result_y
## classif.ce 
##  0.2130435
1查看每一次迭代的结果,只有20个:instance$archive
## <ArchiveTuning>
##        cp minsplit classif.ce runtime_learners           timestamp batch_nr
##  1: 0.026        3       0.21             0.02 2022-02-27 20:51:28        1
##  2: 0.075        8       0.21             0.00 2022-02-27 20:51:28        2
##  3: 0.050        5       0.21             0.00 2022-02-27 20:51:28        3
##  4: 0.001        1       0.30             0.00 2022-02-27 20:51:28        4
##  5: 0.100        3       0.21             0.02 2022-02-27 20:51:28        5
##  6: 0.026        5       0.21             0.02 2022-02-27 20:51:28        6
##  7: 0.100        8       0.21             0.01 2022-02-27 20:51:28        7
##  8: 0.001        8       0.27             0.00 2022-02-27 20:51:28        8
##  9: 0.001        5       0.28             0.00 2022-02-27 20:51:28        9
## 10: 0.100        5       0.21             0.02 2022-02-27 20:51:28       10
## 11: 0.075       10       0.21             0.00 2022-02-27 20:51:28       11
## 12: 0.050       10       0.21             0.01 2022-02-27 20:51:28       12
## 13: 0.075        5       0.21             0.00 2022-02-27 20:51:28       13
## 14: 0.050        8       0.21             0.01 2022-02-27 20:51:29       14
## 15: 0.001       10       0.26             0.00 2022-02-27 20:51:29       15
## 16: 0.050        3       0.21             0.00 2022-02-27 20:51:29       16
## 17: 0.050        1       0.21             0.02 2022-02-27 20:51:29       17
## 18: 0.100       10       0.21             0.00 2022-02-27 20:51:29       18
## 19: 0.075        1       0.21             0.01 2022-02-27 20:51:29       19
## 20: 0.026        1       0.21             0.00 2022-02-27 20:51:29       20
##     warnings errors      resample_result
##  1:        0      0 <ResampleResult[22]>
##  2:        0      0 <ResampleResult[22]>
##  3:        0      0 <ResampleResult[22]>
##  4:        0      0 <ResampleResult[22]>
##  5:        0      0 <ResampleResult[22]>
##  6:        0      0 <ResampleResult[22]>
##  7:        0      0 <ResampleResult[22]>
##  8:        0      0 <ResampleResult[22]>
##  9:        0      0 <ResampleResult[22]>
## 10:        0      0 <ResampleResult[22]>
## 11:        0      0 <ResampleResult[22]>
## 12:        0      0 <ResampleResult[22]>
## 13:        0      0 <ResampleResult[22]>
## 14:        0      0 <ResampleResult[22]>
## 15:        0      0 <ResampleResult[22]>
## 16:        0      0 <ResampleResult[22]>
## 17:        0      0 <ResampleResult[22]>
## 18:        0      0 <ResampleResult[22]>
## 19:        0      0 <ResampleResult[22]>
## 20:        0      0 <ResampleResult[22]>接下来就可以把训练好的超参数应用于模型,重新应用于数据:learner$param_set$values <- instance$result_learner_param_vals
learner$train(task)
1
2
这个训练好的模型就可以用于预测了,使用learner$predict()即可!以上步骤写起来有些复杂,与tidymodels相比不够简洁好理解,我刚开始学习的时候经常记不住,后来版本更新后终于有了简便写法:instance <- tune(task = task,learner = learner,resampling = hout,measure = measure,search_space = search_space,method = "grid_search",resolution = 5,term_evals = 25
)
## INFO  [20:51:29.402] [bbotk] Starting to optimize 2 parameter(s) with '<TunerGridSearch>' and '<TerminatorEvals> [n_evals=25, k=0]' 
## INFO  [20:51:29.403] [bbotk] Evaluating 1 configuration(s) 
## INFO  [20:51:29.411] [mlr3] Running benchmark with 1 resampling iterations 
## 省略。。。
## INFO  [20:51:30.535] [bbotk]  0.02575       10          <list[3]> <list[2]>  0.2347826instance$result_learner_param_vals
## $xval
## [1] 0
## 
## $cp
## [1] 0.02575
## 
## $minsplit
## [1] 10
instance$result_y
## classif.ce 
##  0.2347826
learner$param_set$values <- instance$result_learner_param_vals
learner$train(task)mlr3也支持同时设定多个性能指标:measures <- msrs(c("classif.ce","time_train")) # 设定多个评价指标evals20 <- trm("evals", n_evals = 20)instance <- TuningInstanceMultiCrit$new(task = task,learner = learner,resampling = hout,measures = measures,search_space = search_space,terminator = evals20
)tuner$optimize(instance)
## INFO  [20:51:30.595] [bbotk] Starting to optimize 2 parameter(s) with '<TunerGridSearch>' and '<TerminatorEvals> [n_evals=20, k=0]' 
## INFO  [20:51:30.597] [bbotk] Evaluating 1 configuration(s) 
## 省略输出。。。查看结果:instance$result_learner_param_vals
## [[1]]
## [[1]]$xval
## [1] 0
## 
## [[1]]$cp
## [1] 0.0505
## 
## [[1]]$minsplit
## [1] 1
## 
## 
## [[2]]
## [[2]]$xval
## [1] 0
## 
## [[2]]$cp
## [1] 0.07525
## 
## [[2]]$minsplit
## [1] 1
## 
## 
## [[3]]
## [[3]]$xval
## [1] 0
## 
## [[3]]$cp
## [1] 0.07525
## 
## [[3]]$minsplit
## [1] 10
## 
## 
## [[4]]
## [[4]]$xval
## [1] 0
## 
## [[4]]$cp
## [1] 0.1
## 
## [[4]]$minsplit
## [1] 8
## 
## 
## [[5]]
## [[5]]$xval
## [1] 0
## 
## [[5]]$cp
## [1] 0.02575
## 
## [[5]]$minsplit
## [1] 3
## 
## 
## [[6]]
## [[6]]$xval
## [1] 0
## 
## [[6]]$cp
## [1] 0.07525
## 
## [[6]]$minsplit
## [1] 8
## 
## 
## [[7]]
## [[7]]$xval
## [1] 0
## 
## [[7]]$cp
## [1] 0.1
## 
## [[7]]$minsplit
## [1] 3
## 
## 
## [[8]]
## [[8]]$xval
## [1] 0
## 
## [[8]]$cp
## [1] 0.1
## 
## [[8]]$minsplit
## [1] 5
## 
## 
## [[9]]
## [[9]]$xval
## [1] 0
## 
## [[9]]$cp
## [1] 0.02575
## 
## [[9]]$minsplit
## [1] 5
## 
## 
## [[10]]
## [[10]]$xval
## [1] 0
## 
## [[10]]$cp
## [1] 0.07525
## 
## [[10]]$minsplit
## [1] 5
## 
## 
## [[11]]
## [[11]]$xval
## [1] 0
## 
## [[11]]$cp
## [1] 0.0505
## 
## [[11]]$minsplit
## [1] 8
## 
## 
## [[12]]
## [[12]]$xval
## [1] 0
## 
## [[12]]$cp
## [1] 0.0505
## 
## [[12]]$minsplit
## [1] 3
## 
## 
## [[13]]
## [[13]]$xval
## [1] 0
## 
## [[13]]$cp
## [1] 0.07525
## 
## [[13]]$minsplit
## [1] 3
## 
## 
## [[14]]
## [[14]]$xval
## [1] 0
## 
## [[14]]$cp
## [1] 0.0505
## 
## [[14]]$minsplit
## [1] 5
## 
## 
## [[15]]
## [[15]]$xval
## [1] 0
## 
## [[15]]$cp
## [1] 0.02575
## 
## [[15]]$minsplit
## [1] 1
instance$rusult_y
## NULL以上就是第一种方法,接下来介绍第二种方法。方法二:通过autotuner训练模型
这种方式方法把调整参数、将调整好的参数应用于模型放到一起了,但是也需要提前设定好各种需要的参数。task <- tsk("pima") # 创建任务leanrer <- lrn("classif.rpart") # 选择学习器search_space <- ps(cp = p_dbl(0.001, 0.1),minsplit = p_int(1,10)
) # 设定搜索范围terminator <- trm("evals", n_evals = 10) # 设定停止标志tuner <- tnr("random_search") # 选择搜索方法resampling <- rsmp("holdout") # 选择重抽样方法measure <- msr("classif.acc") # 选择评价指标# 训练
at <- AutoTuner$new(learner = learner,resampling = resampling,search_space = search_space,measure = measure,tuner = tuner,terminator = terminator
)自动选择最优参数并作用于数据:at$train(task)
## INFO  [20:51:31.873] [bbotk] Starting to optimize 2 parameter(s) with '<OptimizerRandomSearch>' and '<TerminatorEvals> [n_evals=10, k=0]' 
## INFO  [20:51:31.882] [bbotk] Evaluating 1 configuration(s) 
##省略巨多输出
## INFO  [20:51:32.332] [bbotk]  0.02278977        3          <list[3]> <list[2]>   0.7695312
at$predict(task)
## <PredictionClassif> for 768 observations:
##     row_ids truth response
##           1   pos      pos
##           2   neg      neg
##           3   pos      neg
## ---                       
##         766   neg      neg
##         767   pos      neg
##         768   neg      neg这个方法也有个简便写法:auto_learner <- auto_tuner(learner = learner,resampling = resampling,measure = measure,search_space = search_space,method = "random_search",term_evals = 10
)auto_learner$train(task)
## INFO  [20:51:32.407] [bbotk] Starting to optimize 2 parameter(s) with '<OptimizerRandomSearch>' and '<TerminatorEvals> [n_evals=10, k=0]' 
## INFO  [20:51:32.414] [bbotk] Evaluating 1 configuration(s) 
## INFO  [20:51:32.421] [mlr3] Running benchmark with 1 resampling iterations 
## INFO  [20:51:32.425] [mlr3] Applying learner 'classif.rpart' on task 'pima' (iter 1/1) 
##省略巨多输出
auto_learner$predict(task)
## <PredictionClassif> for 768 observations:
##     row_ids truth response
##           1   pos      pos
##           2   neg      neg
##           3   pos      neg
## ---                       
##         766   neg      neg
##         767   pos      neg
##         768   neg      neg超参数设定的方法
每次单独设置超参数的范围等可能会显得比较笨重无聊,mlr3也提供另外一种可以在选择学习器时进行设定超参数的方法。# 在选择学习器时设置超参数范围
learner <- lrn("classif.svm")
learner$param_set$values$kernel <- "polynomial"
learner$param_set$values$degree <- to_tune(lower = 1, upper = 3)print(learner$param_set$search_space())
## <ParamSet>
##        id    class lower upper nlevels        default value
## 1: degree ParamInt     1     3       3 <NoDefault[3]>但其实这样也有问题,这个方法要求你对算法很熟悉,能够记住所有超参数记忆它们在mlr3中的拼写!但很显然这有点困难,所有我还是推荐第一种,每次单独设置,记不住还可以查看一下具体的超参数。参数依赖
某些超参数只有在某些条件下才有效,比如支持向量机(SVM),它的degree参数只有在kernel是polynomial时才有效,这种情况也可以在mlr3中设置好。library(data.table)
search_space = ps(cost = p_dbl(-1, 1, trafo = function(x) 10^x), # 可进行数据变换kernel = p_fct(c("polynomial", "radial")),degree = p_int(1, 3, depends = kernel == "polynomial") # 设置参数依赖
)
rbindlist(generate_design_grid(search_space, 3)$transpose(), fill = TRUE)
##     cost     kernel degree
##  1:  0.1 polynomial      1
##  2:  0.1 polynomial      2
##  3:  0.1 polynomial      3
##  4:  0.1     radial     NA
##  5:  1.0 polynomial      1
##  6:  1.0 polynomial      2
##  7:  1.0 polynomial      3
##  8:  1.0     radial     NA
##  9: 10.0 polynomial      1
## 10: 10.0 polynomial      2
## 11: 10.0 polynomial      3
## 12: 10.0     radial     NA

超参数设置

超参数设置是通过paradox包完成的。

reference-based objects

paradoxParamHelpers的重写版,完全基于R6对象。

library("paradox")ps = ParamSet$new()
ps2 = ps
ps3 = ps$clone(deep = TRUE)
print(ps) # ps2和ps3是一样的
## <ParamSet>
## Empty.


 

ps$add(ParamLgl$new("a"))
print(ps)
## <ParamSet>
##    id    class lower upper nlevels        default value
## 1:  a ParamLgl    NA    NA       2 <NoDefault[3]>

设定参数范围(parameter space)
paradox包里面的超参数主要有以下类型:

ParamInt: 整数
ParamDbl: 浮点数(小数)
ParamFct: 因子
ParamLgl: 逻辑值,TRUE / FALSE
ParamUty: 能取代任意值的参数
设定超参数范围的完整写法(前面几篇用到的是简写):

library("paradox")
parA = ParamLgl$new(id = "A")
parB = ParamInt$new(id = "B", lower = 0, upper = 10, tags = c("tag1", "tag2"))
parC = ParamDbl$new(id = "C", lower = 0, upper = 4, special_vals = list(NULL))
parD = ParamFct$new(id = "D", levels = c("x", "y", "z"), default = "y")
parE = ParamUty$new(id = "E", custom_check = function(x) checkmate::checkFunction(x))

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

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

相关文章

Weakly Supervised Audio-Visual Violence Detection 论文阅读

Weakly Supervised Audio-Visual Violence Detection 论文阅读 摘要III. METHODOLOGYA. Multimodal FusionB. Relation Modeling ModuleC. Training and Inference IV. EXPERIMENTSV. CONCLUSION阅读总结 文章信息&#xff1a; 发表于&#xff1a;IEEE TRANSACTIONS ON MULTIME…

【Redis 神秘大陆】006 灾备方案

六、Redis 灾备方案 6.1 存储方案 6.1.1 基础对比 RDB持久化AOF持久化原理周期性fork子进程生成持久化文件每次写入记录命令日志文件类型二进制dump快照文件文本appendonly日志文件触发条件默认超过300s间隔且有1s内超过1kb数据变更永久性每秒fsync一次文件位置配置文件中指…

政安晨:【深度学习神经网络基础】(十)—— 反向传播网络中计算输出节点增量与计算剩余节点增量

目录 简述 二次误差函数 交叉熵误差函数 计算剩余节点增量 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: 政安晨的机器学习笔记 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xf…

刷穿力扣006-剑指offer一数组——02寻找目标值-二维数组

刷穿力扣006-剑指offer<一>数组——02寻找目标值-二维数组 基本面试题都是我带大家刷的力扣热题100和剑指offer的75道题&#xff0c;建议刷两遍&#xff01;&#xff08;ps:想找工作实习的同学&#xff0c;文末有面试八股和简历模板&#xff09; 题目&#xff1a; 语言…

计算机网络 TCP/IP体系 物理层

一. TCP/IP体系 物理层 1.1 物理层的基本概念 物理层作为TCP/IP网络模型的最低层&#xff0c;负责直接与传输介质交互&#xff0c;实现比特流的传输。 要完成物理层的主要任务&#xff0c;需要确定以下特性&#xff1a; 机械特性&#xff1a;物理层的机械特性主要涉及网络…

华为春招内幕:2024年最全Spring Dependency Injection面试题大全,深入掌握DI技术!99%的应聘者都推荐收藏!

在2024年&#xff0c;随着软件开发领域对高效和灵活的编程实践的需求日益增长&#xff0c;依赖注入&#xff08;DI&#xff09;作为一种关键的设计模式&#xff0c;在现代软件开发中扮演着至关重要的角色。华为&#xff0c;作为全球领先的技术创新公司&#xff0c;对其软件工程…

【Altium Designer 20 笔记】PCB层

Top Overlay & Bottom Overlay (顶部丝印层和底部丝印层)&#xff1a; 用于标记元件、连接和其他重要信息。丝印层是 PCB 表面的一层&#xff0c;上面印上文字、图标或标记。 Top Solder & Bottom Solder (顶部阻焊层和底部阻焊层)&#xff1a; 阻焊层、开窗层、绿油层…

Jackson 2.x 系列【25】Spring Boot 集成之起步依赖、自动配置

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Jackson 版本 2.17.0 本系列Spring Boot 版本 3.2.4 源码地址&#xff1a;https://gitee.com/pearl-organization/study-jaskson-demo 文章目录 1. 前言2. 起步依赖3. 自动配置3.1 JacksonPrope…

K8S认证工程师(CKA)考试速通经验分享(含答案)

昨天参加了Linux Foundation推出的Certified Kubernetes Administrator(CKA)考试&#xff0c;今天收到邮件通知通过啦&#xff5e;分数是93/100分 证书这个样子 ➡️随着应用现代化成为IT/互联网行业大趋势&#xff0c;企业的系统架构逐渐向微服务、容器化转型&#xff0c;好处…

并行计算基础以及相关C语言API介绍

并行计算概念 并行计算是一种利用多个计算资源&#xff08;如多个处理器、计算单元或计算机集群&#xff09;同时执行多个计算任务的方法&#xff0c;旨在提高计算机系统的处理能力和效率。它通过将原始计算任务分解为多个子任务&#xff0c;让多个处理单元同时执行这些子任务…

spring03:bean的自动装配

spring03&#xff1a;bean的自动装配 文章目录 spring03&#xff1a;bean的自动装配前言&#xff1a;一、 在xml中显示的配置&#xff1a;分析&#xff1a; People类&#xff1a;Cat类&#xff1a;Dog类&#xff1a;1. 在xml中显示的配置&#xff1a; 二、 隐式的自动装配bean【…

量子密钥分发系统设计与实现(一):系统基本架构讨论

经过一段时间讨论&#xff0c;我们了解到量子密钥分发设备是当前量子保密通信系统的基础。从本文开始&#xff0c;我将开启量子密钥分发系统设计与实现系列&#xff0c;详细讨论量子密钥分发设备如何从0到1的搭建。 1.QKD系统总体讨论 QKD系统的核心功能就是为通信双方提供理论…

聊聊最近两星期的学习吧!

今天是4月14号。 自从我3月份回到学校之后&#xff0c;我每天都有记录自己的学习时长。今天晚上&#xff0c;我在复盘我自己学习时长的时候&#xff0c;我发现&#xff0c;在整个四月份&#xff0c;我平均每天的有效学习时长只有6h&#xff0c;而且到今天为止&#xff0c;整个四…

写作对于技术人来说是最好的投资

上周日参加了腾讯云开发者社区和墨问西东组织的技术创作特训营活动&#xff0c;今天复盘一下。 虽说是技术创作特训营&#xff0c;现场到场的超过半数也都是技术人&#xff0c;但是分享的内容并不局限于技术人。 这次分享包括四个部分的内容&#xff0c;四个部分内容是一个体…

Excel使用 CONCATENATE 函数或“”符号拼接多列数据

如果你想在Excel中拼接多列数据&#xff0c;你可以使用Excel的函数来实现。其中一个常用的函数是CONCATENATE函数或者更简洁的&符号。以下是如何使用这些方法拼接多列数据的示例&#xff1a; 假设有以下的数据&#xff1a; ABCJohnDoe25JaneSmith30BobBrown35 1. **使用…

mvn spring-boot:run运行报错

[ERROR] No plugin found for prefix ‘spring-boot’ in the current project and in the plugin groups [org.apache.maven.plugins, org.codehaus.mojo] available from the repositories [local (/Users/itkey/.m2/repository), public (https://maven.aliyun.com/reposito…

Python基于循环神经网络的情感分类系统设计与实现,附源码

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…

spring02:DI(依赖注入)

spring02&#xff1a;DI&#xff08;依赖注入&#xff09; 文章目录 spring02&#xff1a;DI&#xff08;依赖注入&#xff09;前言&#xff1a;一、构造器注入&#xff08;constructor&#xff09;二、set注入&#xff1a;分析&#xff1a; 1. Student类&#xff1a;2. Addres…

编程入门(二)【计算机基础三】

读者大大们好呀&#xff01;&#xff01;!☀️☀️☀️ &#x1f525; 欢迎来到我的博客 &#x1f440;期待大大的关注哦❗️❗️❗️ &#x1f680;欢迎收看我的主页文章➡️寻至善的主页 文章目录 前言五、常用软件的相关介绍六、操作系统的相关介绍七、Window11系统的基本操…

关于fail-fast机制和集合中删除元素报错这件事

我们由简到繁来叙述这件事 集合中删除元素报错 这个是很很基础但每一个程序员开发之路上都会遇到的报错&#xff0c;即ConcurrentModificationException 现象&#xff1a;在加强for循环中&#xff0c;使用集合本身的方法去删除了某个元素&#xff0c;比如 for (String obj:…