<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Nab-iak&apos;s Blog</title><description>春水阁泡澡</description><link>https://nab-iak.github.io/</link><language>en</language><item><title>[PIN] RNA-seq Analysis Service from University of Tsukuba</title><link>https://nab-iak.github.io/posts/p2/p2/</link><guid isPermaLink="true">https://nab-iak.github.io/posts/p2/p2/</guid><description>The CHEAPEST RNA-seq service for you &lt;3</description><pubDate>Mon, 18 Apr 3025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Cover Pic by &lt;a href=&quot;https://www.pixiv.net/artworks/120767239&quot;&gt;@Rafa&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;This RNA-seq analysis services as a part of the Open Facility Program, University of Tsukuba.&lt;/li&gt;
&lt;li&gt;If you wish to proceed with the request below, please contact to us. The person in charge will respond with the shipping address and other instructions.&lt;/li&gt;
&lt;li&gt;Note: Samples will not be returned. Thank you for your understanding.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;lt;/br&amp;gt;
&amp;lt;center&amp;gt;&amp;lt;h4&amp;gt;Shipping Address&amp;lt;/h4&amp;gt;&amp;lt;/center&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sport Medicine Laboratory
Room 060, Medical Sciences Building,
University of Tsukubaa
1-1-1 Tennodai, Tsukuba, Ibaraki 305-8577, Japan&lt;/li&gt;
&lt;li&gt;Email: rnaseq.sugasawalab.tsukuba ※ gmail.com&lt;br /&gt;
(please replace ※ with @)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;&amp;lt;center&amp;gt;Plan 1: from Extraction and Purification to Data Analysis&amp;lt;/center&amp;gt;&lt;/h2&gt;
&lt;p&gt;&amp;lt;center&amp;gt;&amp;lt;h4&amp;gt;- 44,300 yen/sample -&amp;lt;/h4&amp;gt;&amp;lt;/center&amp;gt;
&amp;lt;center&amp;gt;&amp;lt;h4&amp;gt;- or 311.13 dollar/sample (2025.4.17) -&amp;lt;/h4&amp;gt;&amp;lt;/center&amp;gt;&lt;/p&gt;
&lt;h3&gt;Sample&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Please submit either tissue or a homogenized solution (e.g., processed with TRIZOL, QIAZOL, or ISOGEN)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;&amp;lt;center&amp;gt;Plan 2: from Purified RNA to Data Analysis&amp;lt;/center&amp;gt;&lt;/h2&gt;
&lt;p&gt;&amp;lt;center&amp;gt;&amp;lt;h4&amp;gt;- 37,150 yen/sample -&amp;lt;/h4&amp;gt;&amp;lt;/center&amp;gt;
&amp;lt;center&amp;gt;&amp;lt;h4&amp;gt;- or 260.91 dollar/sample (2025.4.17) -&amp;lt;/h4&amp;gt;&amp;lt;/center&amp;gt;&lt;/p&gt;
&lt;h3&gt;Sample&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The submitted total RNA solution must meet the following criteria:
&lt;ul&gt;
&lt;li&gt;A260/230 ratio ≥ 1.6&lt;/li&gt;
&lt;li&gt;A260/280 ratio ≥ 1.8&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;A total of 1.5–3 μg of RNA at a concentration of 50–100 ng/μL is required for each sample.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Note&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Please submit at least 3–4 μg of total RNA if possible.
If the amount is less than 3 μg, library preparation may not be feasible.&lt;/li&gt;
&lt;li&gt;If your sample does not meet the above requirements, please contact us.
We may be able to accommodate samples with low concentration or poor quality.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;&amp;lt;center&amp;gt;Plan 3: from Quality-checked RNA to Data Analysis&amp;lt;/center&amp;gt;&lt;/h2&gt;
&lt;p&gt;&amp;lt;center&amp;gt;&amp;lt;h4&amp;gt;- 25,020 yen/sample -&amp;lt;/h4&amp;gt;&amp;lt;/center&amp;gt;
&amp;lt;center&amp;gt;&amp;lt;h4&amp;gt;- or 175.72 dollar/sample (2025.4.17) -&amp;lt;/h4&amp;gt;&amp;lt;/center&amp;gt;&lt;/p&gt;
&lt;h3&gt;Sample&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The submitted total RNA solution after purification must meet the following criteria:
&lt;ul&gt;
&lt;li&gt;A260/230 ratio ≥ 1.6&lt;/li&gt;
&lt;li&gt;A260/280 ratio ≥ 1.8&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Confirm that RNA degradation is absent or minimal in all samples using either standard gel electrophoresis
(agarose gel for DNA in TAE buffer) or a Bioanalyzer.
&lt;ul&gt;
&lt;li&gt;For gel electrophoresis, a 28S/18S ratio of 1.6–1.8 with no smearing is ideal.&lt;/li&gt;
&lt;li&gt;For Bioanalyzer, RIN ≥ 7 is recommended.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Adjust RNA concentration to 100 ng/μL and ensure a total yield of 3-4 ng/μL of RNA remains.&lt;/li&gt;
&lt;li&gt;A total yield of at least 30 μL is required for each sample.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Note&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Even if the total yield of RNA is lower than specified, request is still possible,
but please note that it increases the risk of library preparation failure.
Feel free to contact us for support, including guidance for gel electrophoresis.&lt;/li&gt;
&lt;li&gt;If you require frequent support for data analysis, we may propose proceeding as a collaborative research project with the Department of Sports Medicine Analytics. Final decisions will be made based on your preferences.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;&amp;lt;center&amp;gt;Plan 4: from Quality-checked RNA to FASTQ Delivery&amp;lt;/center&amp;gt;&lt;/h2&gt;
&lt;p&gt;&amp;lt;center&amp;gt;&amp;lt;h4&amp;gt;- 20,940 yen/sample -&amp;lt;/h4&amp;gt;&amp;lt;/center&amp;gt;
&amp;lt;center&amp;gt;&amp;lt;h4&amp;gt;- or 147.07 dollar/sample (2025.4.17) -&amp;lt;/h4&amp;gt;&amp;lt;/center&amp;gt;&lt;/p&gt;
&lt;h3&gt;Sample&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The submitted total RNA solution after purification must meet the following criteria:
&lt;ul&gt;
&lt;li&gt;A260/230 ratio ≥ 1.6&lt;/li&gt;
&lt;li&gt;A260/280 ratio ≥ 1.8&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Confirm that RNA degradation is absent or minimal in all samples using either standard gel electrophoresis
(agarose gel for DNA in TAE buffer) or a Bioanalyzer.
&lt;ul&gt;
&lt;li&gt;For gel electrophoresis, a 28S/18S ratio of 1.6–1.8 with no smearing is ideal.&lt;/li&gt;
&lt;li&gt;For Bioanalyzer, RIN ≥ 7 is recommended.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Adjust RNA concentration to 100 ng/μL and ensure a total yield of 3-4 ng/μL of RNA remains.&lt;/li&gt;
&lt;li&gt;A total yield of at least 30 μL is required for each sample.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Note&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Even if the total yield of RNA is lower than specified, request is still possible,
but please note that it increases the risk of library preparation failure.
Feel free to contact us for support, including guidance for gel electrophoresis.&lt;/li&gt;
&lt;li&gt;If you require frequent support for data analysis, we may propose proceeding as a collaborative research project with the Department of Sports Medicine Analytics. Final decisions will be made based on your preferences.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;&amp;lt;center&amp;gt;Bioinformatics Analysis Support&amp;lt;/center&amp;gt;&lt;/h2&gt;
&lt;p&gt;&amp;lt;center&amp;gt;&amp;lt;h4&amp;gt;- 4,010 yen/sample -&amp;lt;/h4&amp;gt;&amp;lt;/center&amp;gt;
&amp;lt;center&amp;gt;&amp;lt;h4&amp;gt;- or 28.16 dollar/sample (2025.4.17) -&amp;lt;/h4&amp;gt;&amp;lt;/center&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Our department provides bioinformatics analysis support using data obtained from next-generation sequencing. Based on a hearing with the requester, we conduct tailored analyses and prepare figures and tables accordingly.&lt;/li&gt;
&lt;li&gt;Please note that we may be unable to perform analyses that exceed the technical capacity of our department. For users of our RNA-seq service, please use this request form if you wish to request re-analysis more than one month after data delivery.&lt;/li&gt;
&lt;li&gt;Supported analyses:
RNA-seq, ChIP-seq, and genomic DNA-seq (regularly updated).&lt;/li&gt;
&lt;li&gt;Accepted data formats:
FASTQ, expression quantification data (TPM, RPKM, read count data, etc.).&lt;/li&gt;
&lt;li&gt;Supported species:
Mammals such as human, mouse, and rat, as well as bacteria.&lt;/li&gt;
&lt;li&gt;Tools/software used:
CLC Genomics Workbench, R, Python, GeneMANIA, Metascape, DAVID, GSEA,
and others (continually updated).&lt;/li&gt;
&lt;li&gt;Available visualizations:
Expression quantification, hierarchical clustering, heatmaps, pathways, Gene Ontology (GO),
scatter plots, volcano plots, and mutation identification.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>倾向得分匹配（PSM）</title><link>https://nab-iak.github.io/posts/p25/p25/</link><guid isPermaLink="true">https://nab-iak.github.io/posts/p25/p25/</guid><description>计量经济学中的常用方法</description><pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Cover Pic by &lt;a href=&quot;https://www.pixiv.net/artworks/134520959&quot;&gt;@BISQQQUE&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h2&gt;参考&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://necostat.hatenablog.jp/entry/2022/04/04/190303&quot;&gt;傾向スコア解析(1)：ロジスティック回帰モデルで傾向スコア（propensity score）を推定する [R]&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://necostat.hatenablog.jp/entry/2022/04/05/065854&quot;&gt;傾向スコア解析(2)：傾向スコアを使った逆確率重み付け法（IPW）で交絡を調整する [R]&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://necostat.hatenablog.jp/entry/2022/04/06/001353&quot;&gt;傾向スコア解析(3)：傾向スコアマッチング（PSM）を使って交絡を調整する [R]&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;em&gt;(IDE中途从vscode换成了positron了，输出没有了html格式)&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;使用倾向得分调整混淆变量的方法&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;匹配&lt;/li&gt;
&lt;li&gt;分层&lt;/li&gt;
&lt;li&gt;以倾向得分为变量的回归模型&lt;/li&gt;
&lt;li&gt;逆概率加权法&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;示例数据&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;加载R包和数据&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;library(tidyverse) # Basic tidy R style
library(tableone) # Group comparision
library(PSAgraphics) # Dataset
library(MatchIt) # PSM

data(&quot;lindner&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;变量调整：增加&lt;code&gt;death&lt;/code&gt;，表示是否死亡&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;dt &amp;lt;- lindner %&amp;gt;% 
	mutate(death = if_else(lifepres==0,1,0))
head(dt)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&quot;dataframe&quot;&amp;gt;
&amp;lt;caption&amp;gt;A data.frame: 6 x 11&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;lifepres&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;cardbill&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;abcix&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;stent&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;height&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;female&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;diabetic&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;acutemi&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;ejecfrac&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;ves1proc&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;death&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;1&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt; 0.0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;14301&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;163&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;56&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;2&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;11.6&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 3563&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;168&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;56&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;3&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;11.6&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 4694&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;188&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;50&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;4&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;11.6&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 7366&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;175&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;50&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;5&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;11.6&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 8247&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;168&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;55&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;6&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;11.6&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 8319&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;178&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;50&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;death&lt;/code&gt;：经皮冠状动脉介入治疗（PCI）后6个月的预后（0=生存, 1=死亡）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;abcix&lt;/code&gt;：有无使用abciximab（0=PCI, 1=PCI+abciximab）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;stent&lt;/code&gt;：有无留置冠动脉支架（0=无, 1=有）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;height&lt;/code&gt;：身長（cm）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;female&lt;/code&gt;：性別（0=男性, 1=女性）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;diabetic&lt;/code&gt;：有无糖尿病（0=无, 1=有）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;acutemi&lt;/code&gt;：7天以内有无急性心肌梗塞（0=无, 1=有）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;ejecfrac&lt;/code&gt;：左心室收缩率（%）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;ves1proc&lt;/code&gt;：病变血管数量&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;查看组间的差异&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;table_crude &amp;lt;- CreateTableOne(
	vars = c(
		&quot;stent&quot;, &quot;height&quot;, &quot;female&quot;, 
        &quot;diabetic&quot;, &quot;acutemi&quot;, &quot;ejecfrac&quot;, 
        &quot;ves1proc&quot;,&quot;death&quot;
	),
	   factorVars = c(
		   &quot;stent&quot;, &quot;female&quot;, &quot;diabetic&quot;, 
		   &quot;acutemi&quot;,&quot;death&quot;
	   ),
	   strata = &quot;abcix&quot;,
	   data = dt,
	   test = FALSE,
	   smd = TRUE)
print(table_crude, smd = TRUE)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;Stratified by abcix
                       0              1              SMD   
  n                       298            698               
  stent = 1 (%)           174 (58.4)     492 (70.5)   0.255
  height (mean (SD))   171.45 (10.59) 171.44 (10.69) &amp;lt;0.001
  female = 1 (%)          115 (38.6)     231 (33.1)   0.115
  diabetic = 1 (%)         80 (26.8)     143 (20.5)   0.150
  acutemi = 1 (%)          18 ( 6.0)     125 (17.9)   0.372
  ejecfrac (mean (SD))  52.29 (10.30)  50.40 (10.42)  0.182
  ves1proc (mean (SD))   1.20 (0.48)    1.46 (0.71)   0.427
  death = 1 (%)            15 ( 5.0)      11 ( 1.6)   0.194
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;使用逻辑回归估计倾向得分&lt;/h2&gt;
&lt;h3&gt;逻辑回归估计&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;过程很简单，就是先建立逻辑回归模型，&lt;br /&gt;
再用模型重新预测元数据集得到样本的预测结果及预测概率&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;ps_model &amp;lt;- glm(
	abcix ~ stent + height + female + 
		diabetic + acutemi + ejecfrac + ves1proc, 
	data = dt, 
	family = binomial(link=&quot;logit&quot;)
)

dt &amp;lt;- dt %&amp;gt;%
	mutate(
		ps_logit = predict(ps_model, type = &quot;link&quot;),
		ps = predict(ps_model, type = &quot;response&quot;)
)

head(dt)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&quot;dataframe&quot;&amp;gt;
&amp;lt;caption&amp;gt;A data.frame: 6 x 13&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;lifepres&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;cardbill&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;abcix&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;stent&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;height&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;female&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;diabetic&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;acutemi&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;ejecfrac&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;ves1proc&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;death&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;ps_logit&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;ps&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;1&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt; 0.0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;14301&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;163&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;56&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-0.37258319&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4079170&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;2&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;11.6&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 3563&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;168&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;56&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 0.31645572&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.5784602&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;3&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;11.6&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 4694&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;188&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;50&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 0.09786545&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.5244469&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;4&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;11.6&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 7366&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;175&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;50&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-0.10918387&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4727311&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;5&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;11.6&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 8247&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;168&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;55&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-0.02781550&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4930466&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;6&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;11.6&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 8319&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;178&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;50&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 0.25152728&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.5625524&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;ps&lt;/code&gt;为倾向得分&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;ps_logit&lt;/code&gt;为倾向得分的logit变换值&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;通过对两组的可视化也可以看出，接受治疗的组的倾向得分更高&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;ggplot(aes(x = ps, fill = factor(abcix)), data=dt) +
	geom_density(alpha=.25) +
	theme_bw()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./image_1.png&quot; alt=&quot;image_1&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;ROC曲线&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;做ROC曲线看拟合程度&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;library(pROC)
roc_ps &amp;lt;- roc(abcix ~ ps_logit, data = dt, ci = TRUE)
ggroc(
	roc_ps,
	size = 1,
	legacy.axes = TRUE
) +
	geom_abline(color=&quot;dark grey&quot;, size=0.5) +
	theme_bw()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./image_2.png&quot; alt=&quot;image_2&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;查看ROC-AUC&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;roc_ps
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;Call:
roc.formula(formula = abcix ~ ps_logit, data = dt, ci = TRUE)

Data: ps_logit in 298 controls (abcix 0) &amp;lt; 698 cases (abcix 1).
Area under the curve: 0.6807
95% CI: 0.6457-0.7156 (DeLong)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;AUC
&lt;ul&gt;
&lt;li&gt;AUC过低表明预测能力不足&lt;/li&gt;
&lt;li&gt;AUC过高则显示其中一组更容易预测，&lt;br /&gt;
会导致再另一组中难以匹配到对应个体&lt;/li&gt;
&lt;li&gt;0.6–0.8的范围内比较合适&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Hosmer-Lemeshow检验&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;检验模型拟合程度的方法&lt;/li&gt;
&lt;li&gt;$H_0$：预测值与观测值是一致的&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;library(ResourceSelection)
hoslem.test(
	dt$abcix,
	fitted(ps_model),
	g=10
)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;
	Hosmer and Lemeshow goodness of fit (GOF) test

data:  dt$abcix, fitted(ps_model)
X-squared = 8.7059, df = 8, p-value = 0.3677
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;本事例中 p = 0.3677 &amp;gt; 0.05，&lt;br /&gt;
可以认为模型拟合得没有问题&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;使用倾向得分的逆概率加权法（IPW）&lt;/h2&gt;
&lt;h3&gt;权重的计算&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Average Treatment Effect (ATE)&lt;br /&gt;
$$w_i = \frac{Z_i}{p_{1i}} + \frac{1-Z_i}{1-p_{1i}}$$&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Average Treatment Effect on the Treated (ATT)&lt;br /&gt;
$$w_i = Z_i + (1-Z_i)\frac{p_{1i}}{1-p_{1i}}$$&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;使用ATE计算权重&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;dt &amp;lt;- dt %&amp;gt;%
  mutate(wt = if_else(abcix==1,1/ps,1/(1-ps)))
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;极端权重值的对应方法&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;方法&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;重新考虑是否使用倾向得分模型&lt;/li&gt;
&lt;li&gt;使用倾向得分进行其他的分析&lt;/li&gt;
&lt;li&gt;权重截断（weight truncation）&lt;/li&gt;
&lt;li&gt;稳定权重（stabilized weight）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;权重截断&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;这里将0.99以上的权重值改为0.99&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;dt &amp;lt;- dt %&amp;gt;%
	mutate(
		wt_trun = if_else(
			wt &amp;gt; quantile(wt, prob = 0.99),
			quantile(wt, prob = 0.99),
			wt
		)
	)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;稳定权重
&lt;ul&gt;
&lt;li&gt;在ATE的基础上分别乘以概率的均值&lt;br /&gt;
$$w_i = c_1 \frac{Z_i}{p_{1i}} + c_0 \frac{1-Z_i}{1-p_{1i}}$$&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;dt &amp;lt;- dt %&amp;gt;%
  mutate(c1 = mean(ps), 
         c0 = mean(1-ps),
         wt_stab = if_else(abcix==1,wt*c1,wt*c0))
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;对3种加权方式的比较&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;res &amp;lt;- dt %&amp;gt;% 
	pivot_longer(
		cols=c(wt,wt_trun,wt_stab),
		names_to = &quot;wt_type&quot;, 
		values_to = &quot;weight&quot;) %&amp;gt;%
	group_by(wt_type) %&amp;gt;%
	do(
		plots = 
			ggplot(data=., aes(x=weight)) +
				geom_density(aes(colour=factor(abcix))) +
				scale_x_continuous(limits = c(0,10)) + 
				ggtitle(.$wt_type) + 
				theme_bw()
	)
res[[2]]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./image_3.png&quot; alt=&quot;image_3&quot; /&gt;
&lt;img src=&quot;./image_4.png&quot; alt=&quot;image_4&quot; /&gt;
&lt;img src=&quot;./image_5.png&quot; alt=&quot;image_5&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;&lt;code&gt;WeightIt&lt;/code&gt;包的一步到位&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;weightit()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;library(WeightIt)
wt_out &amp;lt;- weightit(
	abcix ~ stent + height + female + diabetic + acutemi + ejecfrac + ves1proc,
	data = dt, 
	estimand = &quot;ATE&quot;, 
	method = &quot;ps&quot;,
	stabilize = FALSE
)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;结果出存在&lt;code&gt;wt_out$weights&lt;/code&gt;中&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;summary()&lt;/code&gt;可以查看汇总信息&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;权重范围&lt;/li&gt;
&lt;li&gt;按分组给出5个极端权重值&lt;/li&gt;
&lt;li&gt;权重统计值
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Coef of Var&lt;/code&gt;：变异系数，&lt;br /&gt;
衡量权重的相对离散程度；&lt;br /&gt;
值越大，说明权重差异越大&lt;/li&gt;
&lt;li&gt;&lt;code&gt;MAD&lt;/code&gt;：平均绝对离差，&lt;br /&gt;
衡量权重偏离其均值的平均距离&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Entropy&lt;/code&gt;：熵，&lt;br /&gt;
衡量权重分布的均匀性；&lt;br /&gt;
熵值越小，说明权重分布越不均匀&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;有效样本量（ESS）
&lt;ul&gt;
&lt;li&gt;$$ESS = \frac{(\sum w_i)^2}{\sum w_i^2}$$&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;summary(wt_out)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[4mSummary of weights[24m

- [3mWeight ranges[23m:

           Min                                   Max
treated 1.0204 |-|                            3.2033
control 1.3027  |--------------------------| 23.9979

- [3mUnits with the 5 most extreme weights by group[23m:
                                                
              34      80      93      72      22
 treated  2.4968  2.5399  2.6684   2.673  3.2033
             988     995     978     993     979
 control 14.8467 15.1977 15.6449 18.0062 23.9979

- [3mWeight statistics[23m:

        Coef of Var   MAD Entropy # Zeros
treated       0.200 0.154   0.019       0
control       0.703 0.368   0.153       0

- [3mEffective Sample Sizes[23m:

           Control Treated
Unweighted  298.    698.  
Weighted    199.68  671.09
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;cobalt&lt;/code&gt;包检查权重平衡&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;由于上面的&lt;code&gt;summary()&lt;/code&gt;结果只关注权重本身，&lt;br /&gt;
还需要使用 &lt;code&gt;cobalt&lt;/code&gt; 包来检查加权后协变量是否真的达到了平衡
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&quot;m&quot;&lt;/code&gt;：標準化平均差；&lt;br /&gt;
对于连续变量，这是两组的均值之差；&lt;br /&gt;
对于二元变量，这是两组的比例之差&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&quot;V&quot;&lt;/code&gt;：分散比；&lt;br /&gt;
计算处理组和控制组协变量的方差之比，只对连续变量有意义&lt;/li&gt;
&lt;li&gt;&lt;code&gt;binary = &quot;std&quot;&lt;/code&gt;: 这个参数指定了如何处理二元变量（Binary variables）；&lt;br /&gt;
&lt;code&gt;&quot;std&quot;&lt;/code&gt; 表示计算标准化的均值差异（ SMD）；&lt;br /&gt;
这是目前最推荐和最常用的做法&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;library(cobalt)
bal.tab(
	wt_out, 
	stats = c(&quot;m&quot;,&quot;v&quot;), 
	binary = &quot;std&quot;
)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[4mBalance Measures[24m
               Type Diff.Adj V.Ratio.Adj
prop.score Distance  -0.0192      0.9373
stent        Binary   0.0062           .
height      Contin.  -0.0120      0.8409
female       Binary   0.0217           .
diabetic     Binary  -0.0517           .
acutemi      Binary  -0.0032           .
ejecfrac    Contin.  -0.0005      0.9475
ves1proc    Contin.  -0.0736      0.9061

[4mEffective sample sizes[24m
           Control Treated
Unadjusted  298.    698.  
Adjusted    199.68  671.09
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;MatchIt&lt;/code&gt;包检查权重平衡&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;MatchIt&lt;/code&gt;包多用于PSM，&lt;br /&gt;
也可以通过设置&lt;code&gt;method = NULL&lt;/code&gt;及&lt;code&gt;s.weights&lt;/code&gt;来检查权重平衡&lt;/li&gt;
&lt;li&gt;&lt;code&gt;summary()&lt;/code&gt;之后可以获得评估结果
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Means Treated&lt;/code&gt;与&lt;code&gt;Means Control&lt;/code&gt;：&lt;br /&gt;
加权后，处理组和控制组中各个协变量的均值&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Std. Mean Diff.&lt;/code&gt;：SMD&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Var. Ratio&lt;/code&gt;：方差比&lt;/li&gt;
&lt;li&gt;&lt;code&gt;eCDF Mean&lt;/code&gt; / &lt;code&gt;eCDF Max&lt;/code&gt;：&lt;br /&gt;
经验累积分布函数（Empirical Cumulative Distribution Function）&lt;br /&gt;
的均值差异和最大差异
&lt;ul&gt;
&lt;li&gt;越接近0越好&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;Matched&lt;/code&gt; / &lt;code&gt;Unmatched&lt;/code&gt; / &lt;code&gt;Discarded&lt;/code&gt;&lt;/strong&gt;:&lt;br /&gt;
因为没有执行任何匹配操作，&lt;br /&gt;
所以所有数据都被认为是匹配的，没有未匹配或丢弃的数据&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;library(MatchIt)

wt_tab &amp;lt;- matchit(
	abcix ~ stent + height + female + diabetic + acutemi + ejecfrac + ves1proc,
        data = dt, 
        method = NULL, 
        s.weights = wt_out$weights
)

summary(wt_tab)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;
Call:
matchit(formula = abcix ~ stent + height + female + diabetic + 
    acutemi + ejecfrac + ves1proc, data = dt, method = NULL, 
    s.weights = wt_out$weights)

Summary of Balance for All Data:
         Means Treated Means Control Std. Mean Diff. Var. Ratio eCDF Mean
distance        0.4981        0.4964          0.0865     0.9000    0.0187
stent           0.6702        0.6673          0.0063          .    0.0029
height        171.4044      171.5317         -0.0120     0.8409    0.0087
female          0.3438        0.3334          0.0219          .    0.0104
diabetic        0.2228        0.2447         -0.0526          .    0.0219
acutemi         0.1433        0.1443         -0.0029          .    0.0010
ejecfrac       50.9431       50.9481         -0.0005     0.9475    0.0133
ves1proc        1.3840        1.4284         -0.0670     0.9061    0.0078
         eCDF Max
distance   0.0492
stent      0.0029
height     0.0376
female     0.0104
diabetic   0.0219
acutemi    0.0010
ejecfrac   0.0422
ves1proc   0.0280

Sample Sizes:
              Control Treated
All (ESS)      199.68  671.09
All            298.    698.  
Matched (ESS)  199.68  671.09
Matched        298.    698.  
Unmatched        0.      0.  
Discarded        0.      0.  
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;估计治疗效果&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;使用&lt;code&gt;survey&lt;/code&gt;包中的&lt;code&gt;svyglm()&lt;/code&gt;函数来执行带权重的稳健标准误差估计广义线性回归&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;library(survey)

dsgn_wt &amp;lt;- svydesign(~1, weights = wt_out$weights, data = dt)

fit &amp;lt;- svyglm(
	death ~ abcix, 
	design = dsgn_wt,
	# 使用quasibinomial避免关于非整数成功次数的警告
	family = quasibinomial(link = &quot;logit&quot;)
)
              
summary(fit)              
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;Call:
svyglm(formula = death ~ abcix, design = dsgn_wt, family = quasibinomial(link = &quot;logit&quot;))

Survey design:
svydesign(~1, weights = wt_out$weights, data = dt)

Coefficients:
            Estimate Std. Error t value Pr(&amp;gt;|t|)    
(Intercept)  -2.4250     0.3918  -6.190  8.8e-10 ***
abcix        -1.7471     0.5031  -3.472 0.000538 ***
---
Signif. codes:  0 &apos;***&apos; 0.001 &apos;**&apos; 0.01 &apos;*&apos; 0.05 &apos;.&apos; 0.1 &apos; &apos; 1

(Dispersion parameter for quasibinomial family taken to be 1.001005)

Number of Fisher Scoring iterations: 7
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;&lt;code&gt;MatchIt&lt;/code&gt;包进行倾向得分匹配&lt;/h2&gt;
&lt;h3&gt;确定协变量的平衡性&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容和&lt;a href=&quot;#%60MatchIt%60%E5%8C%85%E6%A3%80%E6%9F%A5%E6%9D%83%E9%87%8D%E5%B9%B3%E8%A1%A1&quot;&gt;之前&lt;/a&gt;的&lt;code&gt;MatchIt&lt;/code&gt;包检查权重平衡相似
&lt;ul&gt;
&lt;li&gt;只是没有指定&lt;code&gt;s.weights&lt;/code&gt;参数&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;library(MatchIt)

unmatched &amp;lt;- matchit(
	abcix ~ stent + height + female + diabetic + acutemi + ejecfrac + ves1proc,
	data = dt, 
	method = NULL
)

summary(unmatched)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;Call:
matchit(formula = abcix ~ stent + height + female + diabetic + 
    acutemi + ejecfrac + ves1proc, data = dt, method = NULL)

Summary of Balance for All Data:
         Means Treated Means Control Std. Mean Diff. Var. Ratio eCDF Mean
distance        0.7265        0.6406          0.6609     1.1161    0.1714
stent           0.7049        0.5839          0.2652          .    0.1210
height        171.4427      171.4463         -0.0003     1.0201    0.0079
female          0.3309        0.3859         -0.1168          .    0.0550
diabetic        0.2049        0.2685         -0.1575          .    0.0636
acutemi         0.1791        0.0604          0.3095          .    0.1187
ejecfrac       50.4026       52.2886         -0.1810     1.0238    0.0356
ves1proc        1.4628        1.2047          0.3654     2.1614    0.0433
         eCDF Max
distance   0.2760
stent      0.1210
height     0.0250
female     0.0550
diabetic   0.0636
acutemi    0.1187
ejecfrac   0.1138
ves1proc   0.1884

Sample Sizes:
          Control Treated
All           298     698
Matched       298     698
Unmatched       0       0
Discarded       0       0
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;构建倾向得分匹配过的队列&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;matchit()&lt;/code&gt;函数
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;method&lt;/code&gt;：匹配方法
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&quot;nearest&quot;&lt;/code&gt;：最近邻匹配&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;distance&lt;/code&gt;：观测间得分距离
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&quot;mahalanobis&quot;&lt;/code&gt;：马哈拉诺比斯距离 / 马氏距离&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;estimand&lt;/code&gt;：估计方法
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&quot;ATT&quot;&lt;/code&gt;：对于那些接受了abcix治疗的患者，这个治疗到底有多大效果&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;replace&lt;/code&gt;：是否允许重复匹配&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ratio&lt;/code&gt;：匹配比例，&lt;code&gt;1&lt;/code&gt;为一对一匹配&lt;/li&gt;
&lt;li&gt;&lt;code&gt;caliper&lt;/code&gt;：&lt;br /&gt;
匹配观测间距离的SD阈值；&lt;br /&gt;
小于改阈值的观测将被匹配；&lt;br /&gt;
例如设置为0.2的情况时，距离小于0.2个SD的观测被匹配&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;matched_1 &amp;lt;- matchit(
	abcix ~ stent + height + female + diabetic + acutemi + ejecfrac + ves1proc,
	data = dt,
	method = &quot;nearest&quot;,
	distance = &quot;glm&quot;,
	link = &quot;logit&quot;,
	estimand = &quot;ATT&quot;,
	replace = FALSE,
	ratio = 1,
	seed = 42
)

summary(matched_1)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;Warning message:
&quot;Fewer control units than treated units; not all treated units will get
a match.&quot;


Call:
matchit(formula = abcix ~ stent + height + female + diabetic + 
    acutemi + ejecfrac + ves1proc, data = dt, method = &quot;nearest&quot;, 
    distance = &quot;glm&quot;, link = &quot;logit&quot;, estimand = &quot;ATT&quot;, replace = FALSE, 
    ratio = 1, seed = 42)

Summary of Balance for All Data:
         Means Treated Means Control Std. Mean Diff. Var. Ratio eCDF Mean
distance        0.7265        0.6406          0.6609     1.1161    0.1714
stent           0.7049        0.5839          0.2652          .    0.1210
height        171.4427      171.4463         -0.0003     1.0201    0.0079
female          0.3309        0.3859         -0.1168          .    0.0550
diabetic        0.2049        0.2685         -0.1575          .    0.0636
acutemi         0.1791        0.0604          0.3095          .    0.1187
ejecfrac       50.4026       52.2886         -0.1810     1.0238    0.0356
ves1proc        1.4628        1.2047          0.3654     2.1614    0.0433
         eCDF Max
distance   0.2760
stent      0.1210
height     0.0250
female     0.0550
diabetic   0.0636
acutemi    0.1187
ejecfrac   0.1138
ves1proc   0.1884

Summary of Balance for Matched Data:
         Means Treated Means Control Std. Mean Diff. Var. Ratio eCDF Mean
distance        0.8517        0.6406          1.6242     0.2455    0.4407
stent           0.7852        0.5839          0.4414          .    0.2013
height        171.4295      171.4463         -0.0016     1.1500    0.0109
female          0.2919        0.3859         -0.1997          .    0.0940
diabetic        0.1644        0.2685         -0.2577          .    0.1040
acutemi         0.4128        0.0604          0.9190          .    0.3523
ejecfrac       47.7953       52.2886         -0.4313     1.2340    0.0800
ves1proc        1.9228        1.2047          1.0170     2.7619    0.1197
         eCDF Max Std. Pair Dist.
distance   0.8289          1.6242
stent      0.2013          0.9123
height     0.0403          1.0803
female     0.0940          0.8986
diabetic   0.1040          0.7400
acutemi    0.3523          1.0065
ejecfrac   0.2315          1.0980
ves1proc   0.5134          1.1405

Sample Sizes:
          Control Treated
All           298     698
Matched       298     298
Unmatched       0     400
Discarded       0       0
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;查看匹配后的协变量平衡性&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;在上面&lt;code&gt;summary()&lt;/code&gt;后的结果中
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Summary of Balance for All Data：&lt;/strong&gt;&lt;br /&gt;
匹配前的数据平衡性&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Summary of Balance for Matched Data：&lt;/strong&gt;&lt;br /&gt;
匹配后的数据平衡性&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Percent Balance Improvement：&lt;/strong&gt;&lt;br /&gt;
匹配前后数据平衡性的各指标改善百分比&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sample Sizes：&lt;/strong&gt;&lt;br /&gt;
匹配的队列中选择的观测数&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;可视化匹配结果&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;散点图&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;plot(matched_1, type = &quot;jitter&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./image_6.png&quot; alt=&quot;image_6&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;密度分布图&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;plot(matched_1, type = &quot;density&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./image_7.png&quot; alt=&quot;image_7&quot; /&gt;
&lt;img src=&quot;./image_8.png&quot; alt=&quot;image_8&quot; /&gt;
&lt;img src=&quot;./image_9.png&quot; alt=&quot;image_9&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;QQ图（仅对连续变量）&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;plot(
	matched_1, 
	type = &quot;qq&quot;, 
	which.xs = c(&quot;height&quot;, &quot;ejecfrac&quot;, &quot;ves1proc&quot;)
)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./image_10.png&quot; alt=&quot;image_10&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;eCDF图（仅对连续变量）&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;plot(
	matched_1, 
	type = &quot;ecdf&quot;, 
	which.xs = c(&quot;height&quot;, &quot;ejecfrac&quot;, &quot;ves1proc&quot;)
)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./image_11.png&quot; alt=&quot;image_11&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用&lt;code&gt;cobalt&lt;/code&gt;包可以对SMD进行可视化&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;library(cobalt)
love.plot(matched_1, threshold = 0.15, abs = TRUE, stars = &quot;raw&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./image_12.png&quot; alt=&quot;image_12&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;估计治疗效果&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;match.data()&lt;/code&gt;能够将匹配后的各种参数合并到原数据集中
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;distance&lt;/code&gt;：与倾向得分&lt;code&gt;ps&lt;/code&gt;相同，用于匹配&lt;/li&gt;
&lt;li&gt;&lt;code&gt;weights&lt;/code&gt;: 匹配权重（这里全为1，表示1:1匹配）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;subclass&lt;/code&gt;：匹配后的配对编号&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;m.out_1 &amp;lt;- match.data(matched_1)
head(m.out_1)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;lifepres cardbill abcix stent height female diabetic acutemi ejecfrac ves1proc death ps_logit        ps       wt
367      0.0    14990     1     1    157      1        1       0       45        2     1 1.215812 0.7713257 1.296469
369      0.0    96741     1     1    171      0        0       0       29        1     1 1.242675 0.7760293 1.288611
370     11.6     7616     1     1    168      1        0       0       51        2     0 1.364860 0.7965484 1.255416
371     11.6     7664     1     0    173      0        0       1       55        1     0 1.453961 0.8106073 1.233643
374     11.6     8321     1     0    180      0        0       1       60        1     0 1.272454 0.7811625 1.280143
375     11.6     8389     1     0    170      1        0       1       55        1     0 1.141000 0.7578631 1.319499
     wt_trun        c1        c0   wt_stab  distance weights subclass
367 1.296469 0.7008032 0.2991968 0.9085698 0.7713257       1        1
369 1.288611 0.7008032 0.2991968 0.9030628 0.7760293       1        2
370 1.255416 0.7008032 0.2991968 0.8797999 0.7965484       1        3
371 1.233643 0.7008032 0.2991968 0.8645409 0.8106073       1        4
374 1.280143 0.7008032 0.2991968 0.8971286 0.7811625       1        5
375 1.319499 0.7008032 0.2991968 0.9247094 0.7578631       1        6
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;使用上面&lt;code&gt;match.data()&lt;/code&gt;过后的&lt;code&gt;m.out_1&lt;/code&gt;直接进行&lt;code&gt;glm()&lt;/code&gt;,&lt;br /&gt;
就能过获得估计后的治疗效果&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;fit &amp;lt;- glm(death ~ abcix, data = m.out_1,
           family = binomial(link = &quot;logit&quot;),
           # 添加权重即可
           weights = weights)
summary(fit)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;Call:
glm(formula = death ~ abcix, family = binomial(link = &quot;logit&quot;), 
    data = m.out_1, weights = weights)

Coefficients:
            Estimate Std. Error z value Pr(&amp;gt;|z|)    
(Intercept)  -2.9374     0.2650 -11.086   &amp;lt;2e-16 ***
abcix        -0.7900     0.4653  -1.698   0.0895 .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 188.34  on 595  degrees of freedom
Residual deviance: 185.25  on 594  degrees of freedom
AIC: 189.25

Number of Fisher Scoring iterations: 6
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;为了进行更好的估计，推荐使用稳健方差估计来修正结果&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;library(lmtest)
library(sandwich)

coeftest(fit, vcov. = vcovCL, cluster = ~subclass)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;z test of coefficients:

            Estimate Std. Error  z value Pr(&amp;gt;|z|)    
(Intercept) -2.93740    0.26540 -11.0679  &amp;lt; 2e-16 ***
abcix       -0.79002    0.45153  -1.7497  0.08018 .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;使用logit变换的倾向得分&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;如果使用倾向得分的logit变换值，&lt;br /&gt;
需要在&lt;code&gt;distance&lt;/code&gt;指定&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 先逻辑回归
ps_model &amp;lt;- glm(
	abcix ~ stent + height + female + diabetic + acutemi + ejecfrac + ves1proc, 
	data = dt, 
	family = binomial(link=&quot;logit&quot;)
)

# 获得预测的link与response值，
# link值就是logit变换值
dt &amp;lt;- dt %&amp;gt;%
	mutate(
		ps_logit = predict(ps_model, type = &quot;link&quot;),
		ps = predict(ps_model, type = &quot;response&quot;)
	)

# 其他都一样，仅修改distance
matched_2 &amp;lt;- matchit(
	abcix ~ stent + height + female + diabetic + acutemi + ejecfrac + ves1proc,
	data = dt,
	method = &quot;nearest&quot;,
	# 指定为ps_logit而不是glm
	distance = dt$ps_logit,
	caliper = 0.2,
	std.caliper = TRUE,
	ratio = 1,
	replace = F,
	seed = 42
	)

summary(matched_2)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;Call:
matchit(formula = abcix ~ stent + height + female + diabetic + 
    acutemi + ejecfrac + ves1proc, data = dt, method = &quot;nearest&quot;, 
    distance = dt$ps_logit, replace = F, caliper = 0.2, std.caliper = TRUE, 
    ratio = 1, seed = 42)

Summary of Balance for All Data:
         Means Treated Means Control Std. Mean Diff. Var. Ratio eCDF Mean
distance        1.1148        0.6333          0.6048     1.6720    0.1714
stent           0.7049        0.5839          0.2652          .    0.1210
height        171.4427      171.4463         -0.0003     1.0201    0.0079
female          0.3309        0.3859         -0.1168          .    0.0550
diabetic        0.2049        0.2685         -0.1575          .    0.0636
acutemi         0.1791        0.0604          0.3095          .    0.1187
ejecfrac       50.4026       52.2886         -0.1810     1.0238    0.0356
ves1proc        1.4628        1.2047          0.3654     2.1614    0.0433
         eCDF Max
distance   0.2760
stent      0.1210
height     0.0250
female     0.0550
diabetic   0.0636
acutemi    0.1187
ejecfrac   0.1138
ves1proc   0.1884

Summary of Balance for Matched Data:
         Means Treated Means Control Std. Mean Diff. Var. Ratio eCDF Mean
distance        0.7978        0.6554          0.1788     1.0395    0.0616
stent           0.6438        0.5959          0.1051          .    0.0479
height        170.7671      171.5925         -0.0772     0.9794    0.0154
female          0.3562        0.3733         -0.0364          .    0.0171
diabetic        0.1918        0.2603         -0.1697          .    0.0685
acutemi         0.0719        0.0616          0.0268          .    0.0103
ejecfrac       51.5240       52.1301         -0.0582     0.9932    0.0222
ves1proc        1.2740        1.2123          0.0873     1.2880    0.0137
         eCDF Max Std. Pair Dist.
distance   0.1747          0.1798
stent      0.0479          0.6157
height     0.0616          1.0218
female     0.0171          0.7933
diabetic   0.0685          0.5940
acutemi    0.0103          0.2233
ejecfrac   0.0822          0.8556
ves1proc   0.0651          0.3589

Sample Sizes:
          Control Treated
All           298     698
Matched       292     292
Unmatched       6     406
Discarded       0       0
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>快速变量编码转换函数</title><link>https://nab-iak.github.io/posts/p24/p24/</link><guid isPermaLink="true">https://nab-iak.github.io/posts/p24/p24/</guid><description>原始数据+转换规则矩阵即可轻松搞定编码转换</description><pubDate>Mon, 11 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Cover Pic by &lt;a href=&quot;https://www.pixiv.net/artworks/133295244&quot;&gt;@MOJE末杰&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h2&gt;简介&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;对于一些问卷调查的结果，大概率原始的编码给的都不是你想要的样子
&lt;ul&gt;
&lt;li&gt;比如有无的1/0编码可能被弄成1/2&lt;/li&gt;
&lt;li&gt;有序变量的顺序也可能与实际分析的顺序相反&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;本函数通过传递一个转换规则矩阵，可以实现一键变量编码转换&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;code&gt;autoTx&lt;/code&gt;：一键转换变量编码&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;函数功能：一键转换变量编码&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;函数参数：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;x&lt;/code&gt;：待转换的数据集&lt;/li&gt;
&lt;li&gt;&lt;code&gt;t&lt;/code&gt;：转换规则矩阵&lt;/li&gt;
&lt;li&gt;&lt;code&gt;var&lt;/code&gt;：&lt;code&gt;x&lt;/code&gt;中需要转换的变量的列名&lt;/li&gt;
&lt;li&gt;&lt;code&gt;valOld&lt;/code&gt;：变量的旧编码&lt;/li&gt;
&lt;li&gt;&lt;code&gt;valNew&lt;/code&gt;：变量转换后的新编码&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;函数返回值：转换后的数据集&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;原始函数&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;autoTx &amp;lt;- function(x, t, var, valOld, valNew) {
  require(dplyr)
  require(tidyr)
  require(tibble)
  require(rlang)

  var_sym &amp;lt;- sym(var)
  valOld_sym &amp;lt;- sym(valOld)
  valNew_sym &amp;lt;- sym(valNew)

  tt &amp;lt;- t %&amp;gt;% fill(!!var_sym, .direction = &apos;down&apos;)

  for (v in unique(tt[[var]])) {
    recode_map &amp;lt;- tt %&amp;gt;%
      filter(!!var_sym == v) %&amp;gt;%
      select(!!valOld_sym, !!valNew_sym) %&amp;gt;%
      deframe()

    if (length(recode_map) == 0) {
      warning(glue::glue(&quot;No mapping found for variable &apos;{v}&apos;, skipping.&quot;))
      next
    }

    if (!(v %in% names(x))) {
      warning(glue::glue(&quot;Variable &apos;{v}&apos; not in x, skipping.&quot;))
      next
    }

    x[[v]] &amp;lt;- recode(x[[v]], !!!recode_map)
  }

  return(x)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;示例&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;x&lt;/code&gt;是待转换的数据&lt;/li&gt;
&lt;li&gt;&lt;code&gt;trans&lt;/code&gt;是转换规则矩阵&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;x &amp;lt;- data.frame(
    a = c(1, 2, 1, 2, 1, 3, 0),
    b = c(10, 20, 5, 10, 100, 20, 10)
)

trans &amp;lt;- data.frame(
    vars = c(&quot;a&quot;, NA, &quot;b&quot;, NA, NA),
    val_old = c(1, 2, 5, 10 ,20),
    val_new = c(1, 0, 1 ,2, 3)
)

x; trans
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&quot;dataframe&quot;&amp;gt;
&amp;lt;caption&amp;gt;A data.frame: 7 x 2&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;a&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;b&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 10&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 20&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;  5&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 10&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;100&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 20&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 10&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;table class=&quot;dataframe&quot;&amp;gt;
&amp;lt;caption&amp;gt;A data.frame: 5 x 3&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;vars&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;val_old&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;val_new&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;a &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;b &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 5&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;10&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;20&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;autoTx(
    x, 
    trans, 
    var = &quot;vars&quot;, 
    valOld = &quot;val_old&quot;, 
    valNew = &quot;val_new&quot;
)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&quot;dataframe&quot;&amp;gt;
&amp;lt;caption&amp;gt;A data.frame: 7 x 2&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;a&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;b&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;  2&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;  3&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;  1&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;  2&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;100&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;  3&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;  2&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在规则转换矩阵里的变量以及旧编码会被转换，&lt;br /&gt;
不存在的会直接保留原样&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>公共卫生PhD技能清单</title><link>https://nab-iak.github.io/posts/p23/p23/</link><guid isPermaLink="true">https://nab-iak.github.io/posts/p23/p23/</guid><description>全会的已经是学生还是超人</description><pubDate>Mon, 04 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Cover Pic by &lt;a href=&quot;https://www.pixiv.net/artworks/132253674&quot;&gt;@Rafa&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;英文原文：&lt;a href=&quot;https://academic.oup.com/aje/advance-article/doi/10.1093/aje/kwaf073/8109203?__cf_chl_tk=2iZU7fcsvK_kepVJ01GyXQ6QfUR6D7pV03Hbgq6xhMQ-1754282054-1.0.1.1-TXgz.h.dgWNd60y6tKZDyqjylkrXssVRNGDqeP.O_zw&quot;&gt;Defining methodologic and other core competencies for PhD-level training in epidemiology&lt;/a&gt;&lt;br /&gt;
中文翻译：&lt;a href=&quot;https://zhuanlan.zhihu.com/p/1897766718887158806&quot;&gt;流行病学与卫生统计学专业硕士/博士生训练应具备的方法学知识和能力&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;描述人群健康状况，包括比较不同人群的健康状况&lt;/h2&gt;
&lt;h3&gt;1.1 提出优质问题&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;区分描述性、预测性和病因学研究问题；&lt;/li&gt;
&lt;li&gt;能够定义研究问题 / 阐明估计目标；对于因果问题，相关框架可能包括：
&lt;ul&gt;
&lt;li&gt;PICOT（人群、干预措施、对照、结局、时间）&lt;/li&gt;
&lt;li&gt;FINER 标准（可行、有趣、新颖、符合伦理、相关）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;基本因果概念：
&lt;ul&gt;
&lt;li&gt;传统 / 历史方法 （例如布拉德福德・希尔准则）&lt;/li&gt;
&lt;li&gt;现代方法（如充分病因和组分病因、反事实理论）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1.2 人、地点、时间&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;描述性流行病学
&lt;ul&gt;
&lt;li&gt;数据汇总和描述性统计&lt;/li&gt;
&lt;li&gt;相关性&lt;/li&gt;
&lt;li&gt;图表类型（直方图、箱线图、条形图、散点图）&lt;/li&gt;
&lt;li&gt;分布度量&lt;/li&gt;
&lt;li&gt;均值、中位数&lt;/li&gt;
&lt;li&gt;方差、标准差&lt;/li&gt;
&lt;li&gt;Z 分数&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;人口调查&lt;/li&gt;
&lt;li&gt;年龄、时期、队列效应&lt;/li&gt;
&lt;li&gt;寿命表方法&lt;/li&gt;
&lt;li&gt;目标人群&lt;/li&gt;
&lt;li&gt;人群类型
&lt;ul&gt;
&lt;li&gt;封闭和开放人群&lt;/li&gt;
&lt;li&gt;稳态&lt;/li&gt;
&lt;li&gt;源人群&lt;/li&gt;
&lt;li&gt;研究人群&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;抽样方法
&lt;ul&gt;
&lt;li&gt;简单随机抽样&lt;/li&gt;
&lt;li&gt;系统抽样&lt;/li&gt;
&lt;li&gt;整群 / 多阶段抽样&lt;/li&gt;
&lt;li&gt;非概率抽样&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;普遍性、代表性、可推广性&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1.3 疾病监测&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;疾病传播动力学&lt;/li&gt;
&lt;li&gt;地方性流行、流行病、大流行&lt;/li&gt;
&lt;li&gt;暴发调查（现场流行病学）&lt;/li&gt;
&lt;li&gt;发病率、续发率&lt;/li&gt;
&lt;li&gt;社区保护（群体免疫）&lt;/li&gt;
&lt;li&gt;疾病监测项目&lt;/li&gt;
&lt;li&gt;主动监测&lt;/li&gt;
&lt;li&gt;被动监测&lt;/li&gt;
&lt;li&gt;症状监测&lt;/li&gt;
&lt;li&gt;哨点健康事件&lt;/li&gt;
&lt;li&gt;国家和国际疾病监测项目&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1.4 数据收集和数据来源&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;原始数据与二手数据&lt;/li&gt;
&lt;li&gt;大数据来源&lt;/li&gt;
&lt;li&gt;电子健康记录&lt;/li&gt;
&lt;li&gt;行政数据&lt;/li&gt;
&lt;li&gt;记录链接&lt;/li&gt;
&lt;li&gt;健康索赔数据库&lt;/li&gt;
&lt;li&gt;人口调查数据&lt;/li&gt;
&lt;li&gt;不同类型暴露、结局、协变量的测量&lt;/li&gt;
&lt;li&gt;疾病分类系统（如国际疾病分类第十版）&lt;/li&gt;
&lt;li&gt;测量人群健康的挑战&lt;/li&gt;
&lt;li&gt;问卷设计&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1.5 发生的测量指标&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;发病率&lt;/li&gt;
&lt;li&gt;发病密度&lt;/li&gt;
&lt;li&gt;人年计算&lt;/li&gt;
&lt;li&gt;累积发病率&lt;/li&gt;
&lt;li&gt;病死率&lt;/li&gt;
&lt;li&gt;疾病特异性死亡率&lt;/li&gt;
&lt;li&gt;比例死亡率比（Proportionate mortality ratio）&lt;/li&gt;
&lt;li&gt;时点患病率，时期患病率&lt;/li&gt;
&lt;li&gt;发病率与患病率的关系&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1.6 关联和影响的测量指标（包括计算与解释）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;相对测量指标&lt;/li&gt;
&lt;li&gt;Risk ratio&lt;/li&gt;
&lt;li&gt;Rate ratio&lt;/li&gt;
&lt;li&gt;Odds ratio&lt;/li&gt;
&lt;li&gt;不可折叠性&lt;/li&gt;
&lt;li&gt;绝对测量指标&lt;/li&gt;
&lt;li&gt;Risk difference&lt;/li&gt;
&lt;li&gt;Rate difference&lt;/li&gt;
&lt;li&gt;Number needed to treat or harm&lt;/li&gt;
&lt;li&gt;归因风险，归因分数&lt;/li&gt;
&lt;li&gt;人群归因风险（Population attributable risk，PAR%）&lt;/li&gt;
&lt;li&gt;指标间的概念差异&lt;/li&gt;
&lt;li&gt;标准化&lt;/li&gt;
&lt;li&gt;直接标准化&lt;/li&gt;
&lt;li&gt;间接标准化&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1.7 生物统计学&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;概率分布&lt;/li&gt;
&lt;li&gt;正态分布&lt;/li&gt;
&lt;li&gt;二项分布&lt;/li&gt;
&lt;li&gt;泊松分布&lt;/li&gt;
&lt;li&gt;离散和连续随机变量&lt;/li&gt;
&lt;li&gt;随机变量的期望与方差&lt;/li&gt;
&lt;li&gt;随机变异&lt;/li&gt;
&lt;li&gt;目标参数（estimand）和估计量（estimator）&lt;/li&gt;
&lt;li&gt;一致/相合估计量&lt;/li&gt;
&lt;li&gt;超总体（super-populations）&lt;/li&gt;
&lt;li&gt;维度灾难&lt;/li&gt;
&lt;li&gt;标准误&lt;/li&gt;
&lt;li&gt;假设检验&lt;/li&gt;
&lt;li&gt;P值的理解和解释&lt;/li&gt;
&lt;li&gt;参数检验/非参数检验&lt;/li&gt;
&lt;li&gt;频率学派/贝叶斯视角&lt;/li&gt;
&lt;li&gt;置信区间&lt;/li&gt;
&lt;li&gt;检验效能和样本量&lt;/li&gt;
&lt;li&gt;精确度&lt;/li&gt;
&lt;li&gt;信度的测量&lt;/li&gt;
&lt;li&gt;评分者间信度、评分者内信度&lt;/li&gt;
&lt;li&gt;内部一致性&lt;/li&gt;
&lt;li&gt;重测信度&lt;/li&gt;
&lt;li&gt;一致性的测量（统计、图形、表格方法）&lt;/li&gt;
&lt;li&gt;效度的测量&lt;/li&gt;
&lt;li&gt;内容效度&lt;/li&gt;
&lt;li&gt;效标效度&lt;/li&gt;
&lt;li&gt;结构效度&lt;/li&gt;
&lt;li&gt;ROC曲线&lt;/li&gt;
&lt;li&gt;灵敏度、特异度、阳性预测值、阴性预测值&lt;/li&gt;
&lt;li&gt;似然比&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1.8 研究设计&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;实验性研究/观察性研究&lt;/li&gt;
&lt;li&gt;随机对照试验&lt;/li&gt;
&lt;li&gt;临床均势（equipoise）&lt;/li&gt;
&lt;li&gt;安慰剂对照&lt;/li&gt;
&lt;li&gt;阳性对照&lt;/li&gt;
&lt;li&gt;优效性，等效性，非劣效性试验&lt;/li&gt;
&lt;li&gt;可行性，伦理&lt;/li&gt;
&lt;li&gt;随机化类型&lt;/li&gt;
&lt;li&gt;分层&lt;/li&gt;
&lt;li&gt;区组&lt;/li&gt;
&lt;li&gt;群（cluster）&lt;/li&gt;
&lt;li&gt;分配隐藏&lt;/li&gt;
&lt;li&gt;盲法类型&lt;/li&gt;
&lt;li&gt;依从性&lt;/li&gt;
&lt;li&gt;效力 vs. 效果&lt;/li&gt;
&lt;li&gt;意向性分析，符合方案分析，实际接受治疗的分析&lt;/li&gt;
&lt;li&gt;期中分析与停止规则，数据安全监查委员会（DSMB）&lt;/li&gt;
&lt;li&gt;整群随机对照试验&lt;/li&gt;
&lt;li&gt;社区干预试验&lt;/li&gt;
&lt;li&gt;非劣效试验&lt;/li&gt;
&lt;li&gt;横断面研究&lt;/li&gt;
&lt;li&gt;队列研究（前瞻性、回顾性、双向）&lt;/li&gt;
&lt;li&gt;病例-对照研究（累积，病例队列，发病密度抽样）&lt;/li&gt;
&lt;li&gt;病例-队列研究&lt;/li&gt;
&lt;li&gt;病例-交叉研究&lt;/li&gt;
&lt;li&gt;单纯病例研究&lt;/li&gt;
&lt;li&gt;生态学研究&lt;/li&gt;
&lt;li&gt;病例报告-病例系列&lt;/li&gt;
&lt;li&gt;准实验研究&lt;/li&gt;
&lt;li&gt;断点回归设计&lt;/li&gt;
&lt;li&gt;双重差分&lt;/li&gt;
&lt;li&gt;干预时间序列&lt;/li&gt;
&lt;li&gt;合成控制设计&lt;/li&gt;
&lt;li&gt;对于各个研究设计&lt;/li&gt;
&lt;li&gt;理解其适用场景的的合理依据&lt;/li&gt;
&lt;li&gt;优势与局限性&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1.9 偏倚概述&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;概念性介绍&lt;/li&gt;
&lt;li&gt;选择偏倚&lt;/li&gt;
&lt;li&gt;混杂偏倚&lt;/li&gt;
&lt;li&gt;测量偏倚（信息偏倚）&lt;/li&gt;
&lt;li&gt;各类偏倚的预防&lt;/li&gt;
&lt;li&gt;缺失数据（完全随机缺失，随机缺失，非随机缺失）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1.10 评价效应异质性&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;同质性与异质性概念&lt;/li&gt;
&lt;li&gt;相加尺度/相乘尺度&lt;/li&gt;
&lt;li&gt;交互的连续性&lt;/li&gt;
&lt;li&gt;定量和定性分析&lt;/li&gt;
&lt;li&gt;效应修饰&lt;/li&gt;
&lt;li&gt;分层&lt;/li&gt;
&lt;li&gt;评价&lt;/li&gt;
&lt;li&gt;交互&lt;/li&gt;
&lt;li&gt;生物学交互vs.统计学交互&lt;/li&gt;
&lt;li&gt;联合效应框架&lt;/li&gt;
&lt;li&gt;协同作用与拮抗作用&lt;/li&gt;
&lt;li&gt;交互作用相对超额风险&lt;/li&gt;
&lt;li&gt;与效应修饰的区别&lt;/li&gt;
&lt;li&gt;公共卫生相关性&lt;/li&gt;
&lt;li&gt;单调性&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1.11 诊断，预后和筛查研究&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;临床和亚临床疾病&lt;/li&gt;
&lt;li&gt;慢性疾病与传染性疾病&lt;/li&gt;
&lt;li&gt;潜隐期和潜伏期&lt;/li&gt;
&lt;li&gt;疾病自然史&lt;/li&gt;
&lt;li&gt;诊断与预后&lt;/li&gt;
&lt;li&gt;检验准确性&lt;/li&gt;
&lt;li&gt;灵敏度、特异度、阳性预测值、阴性预测值&lt;/li&gt;
&lt;li&gt;筛查研究&lt;/li&gt;
&lt;li&gt;人群疾病筛查&lt;/li&gt;
&lt;li&gt;筛查伦理学&lt;/li&gt;
&lt;li&gt;成本效益比&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;分析流行病学&lt;/h2&gt;
&lt;h3&gt;2.1 因果推断框架&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;因果效应类型&lt;/li&gt;
&lt;li&gt;个体因果效应&lt;/li&gt;
&lt;li&gt;平均因果效应&lt;/li&gt;
&lt;li&gt;因果估计目标&lt;/li&gt;
&lt;li&gt;因果vs.相关&lt;/li&gt;
&lt;li&gt;因果响应类型&lt;/li&gt;
&lt;li&gt;反事实理论和记号&lt;/li&gt;
&lt;li&gt;可识别假定&lt;/li&gt;
&lt;li&gt;可交换性&lt;/li&gt;
&lt;li&gt;因果一致性&amp;amp;无干扰&amp;amp;SUTVA&lt;/li&gt;
&lt;li&gt;正定性&lt;/li&gt;
&lt;li&gt;无测量误差&lt;/li&gt;
&lt;li&gt;因果模型误设&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.2 因果图&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;因果有向无环图（DAGs）&lt;/li&gt;
&lt;li&gt;DAG术语（如弧、节点、祖先、后代、父、子、对撞子）&lt;/li&gt;
&lt;li&gt;D-分离规则&lt;/li&gt;
&lt;li&gt;忠实性&lt;/li&gt;
&lt;li&gt;偏倚的结构方法&lt;/li&gt;
&lt;li&gt;单世界干预图（SWIGs）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.3 目标试验框架&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;问一个因果问题&lt;/li&gt;
&lt;li&gt;模拟目标试验&lt;/li&gt;
&lt;li&gt;撰写目标试验方案（计划书）&lt;/li&gt;
&lt;li&gt;纳排标准&lt;/li&gt;
&lt;li&gt;干预（治疗策略）&lt;/li&gt;
&lt;li&gt;结局&lt;/li&gt;
&lt;li&gt;随访的开始和结束&lt;/li&gt;
&lt;li&gt;因果比较（估计目标）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.4 混杂偏倚&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;混杂的结构&lt;/li&gt;
&lt;li&gt;后门路径和前门路径&lt;/li&gt;
&lt;li&gt;使用因果有向无环图进行定义&lt;/li&gt;
&lt;li&gt;条件独立性&lt;/li&gt;
&lt;li&gt;混杂选择的原理&lt;/li&gt;
&lt;li&gt;通过研究设计进行控制&lt;/li&gt;
&lt;li&gt;随机化&lt;/li&gt;
&lt;li&gt;限制&lt;/li&gt;
&lt;li&gt;匹配&lt;/li&gt;
&lt;li&gt;通过分析方法控制&lt;/li&gt;
&lt;li&gt;分层（包括回归调整）&lt;/li&gt;
&lt;li&gt;标准化&lt;/li&gt;
&lt;li&gt;针对未观测混杂因素的敏感性分析，如E-value&lt;/li&gt;
&lt;li&gt;残余混杂&lt;/li&gt;
&lt;li&gt;未观测混杂&lt;/li&gt;
&lt;li&gt;过度调整（如，调整了一个中介变量）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.5 选择偏倚&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;概念聚焦（从更大人群中抽样）&lt;/li&gt;
&lt;li&gt;无偏倚的选择&lt;/li&gt;
&lt;li&gt;偏倚的大小和方向&lt;/li&gt;
&lt;li&gt;混杂和选择偏倚的区别&lt;/li&gt;
&lt;li&gt;选择偏倚的结构&lt;/li&gt;
&lt;li&gt;使用因果DAGs进行定义&lt;/li&gt;
&lt;li&gt;有/没有碰撞节点变量的选择偏倚&lt;/li&gt;
&lt;li&gt;零假设与非零假设下的选择偏倚&lt;/li&gt;
&lt;li&gt;纳入样本的选择（例如，幸存者偏倚、不恰当的对照选择）&lt;/li&gt;
&lt;li&gt;从样本中排除的选择（例如，失访）&lt;/li&gt;
&lt;li&gt;外推性和可迁移性&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.6 测量偏倚&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;测量误差 vs 错误分类&lt;/li&gt;
&lt;li&gt;使用因果DAGs进行定义&lt;/li&gt;
&lt;li&gt;基于测量误差结构的偏倚强度和方向（差异错分/非差异错分，相关/独立）&lt;/li&gt;
&lt;li&gt;暴露、结局、混杂、对撞节点变量的测量错误&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.7 数据分析基础&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;统计软件知识（SAS，R，Stata，etc）&lt;/li&gt;
&lt;li&gt;数据结构（宽格式、长格式）&lt;/li&gt;
&lt;li&gt;总结与描述数据（数据列表、Table 1）&lt;/li&gt;
&lt;li&gt;编码&lt;/li&gt;
&lt;li&gt;分类变量&lt;/li&gt;
&lt;li&gt;虚拟变量&lt;/li&gt;
&lt;li&gt;不相交类别编码&lt;/li&gt;
&lt;li&gt;嵌套编码&lt;/li&gt;
&lt;li&gt;连续型变量&lt;/li&gt;
&lt;li&gt;重新缩放&lt;/li&gt;
&lt;li&gt;中心化&lt;/li&gt;
&lt;li&gt;变换&lt;/li&gt;
&lt;li&gt;ANOVA&lt;/li&gt;
&lt;li&gt;最大似然&lt;/li&gt;
&lt;li&gt;最小二乘&lt;/li&gt;
&lt;li&gt;2.8 回归模型&lt;/li&gt;
&lt;li&gt;回归分析导论&lt;/li&gt;
&lt;li&gt;什么是统计模型？&lt;/li&gt;
&lt;li&gt;函数形式&lt;/li&gt;
&lt;li&gt;包括概率在内的预测值&lt;/li&gt;
&lt;li&gt;饱和模型/非饱和模型&lt;/li&gt;
&lt;li&gt;粗/未校正模型，校正模型&lt;/li&gt;
&lt;li&gt;广义线性和其他回归模型基础&lt;/li&gt;
&lt;li&gt;线性回归&lt;/li&gt;
&lt;li&gt;分位数回归&lt;/li&gt;
&lt;li&gt;Logistic回归&lt;/li&gt;
&lt;li&gt;Poisson回归&lt;/li&gt;
&lt;li&gt;Binomial回归&lt;/li&gt;
&lt;li&gt;解释回归模型输出，包括未校正和校正模型的结果&lt;/li&gt;
&lt;li&gt;回归模型的后估计&lt;/li&gt;
&lt;li&gt;预测概率&lt;/li&gt;
&lt;li&gt;边际效应&lt;/li&gt;
&lt;li&gt;多项式回归模型&lt;/li&gt;
&lt;li&gt;有序回归&lt;/li&gt;
&lt;li&gt;多项回归&lt;/li&gt;
&lt;li&gt;回归系数的合理解释，P值，置信区间&lt;/li&gt;
&lt;li&gt;剂量反应和趋势分析&lt;/li&gt;
&lt;li&gt;单调性&lt;/li&gt;
&lt;li&gt;机器学习的概念介绍，以及它和参数模型的异同之处&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.9 模型构建和拟合优度&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;模型构建的不同方法&lt;/li&gt;
&lt;li&gt;先验法/基于因果DAG的方法&lt;/li&gt;
&lt;li&gt;逐步回归，以及为何应该避免使用该法&lt;/li&gt;
&lt;li&gt;不同方法的优势和局限&lt;/li&gt;
&lt;li&gt;自变量建模的灵活方法/平滑方法&lt;/li&gt;
&lt;li&gt;样条&lt;/li&gt;
&lt;li&gt;分式多项式&lt;/li&gt;
&lt;li&gt;模型拟合优度&lt;/li&gt;
&lt;li&gt;似然比检验&lt;/li&gt;
&lt;li&gt;信息标准（如AIC、BIC等）&lt;/li&gt;
&lt;li&gt;偏倚——方差的权衡&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;复杂流行病学分析方法&lt;/h2&gt;
&lt;h3&gt;3.1 纵向和多水平数据分析&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;变化的分析&lt;/li&gt;
&lt;li&gt;时间固定和时间依赖的暴露因素和协变量&lt;/li&gt;
&lt;li&gt;集群/相关数据&lt;/li&gt;
&lt;li&gt;重复测量&lt;/li&gt;
&lt;li&gt;多水平&lt;/li&gt;
&lt;li&gt;边际模型&lt;/li&gt;
&lt;li&gt;广义估计方程&lt;/li&gt;
&lt;li&gt;协方差结构&lt;/li&gt;
&lt;li&gt;混合效应/层次模型&lt;/li&gt;
&lt;li&gt;随机效应和固定效应&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3.2 生存分析&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;定义起点&lt;/li&gt;
&lt;li&gt;时间尺度&lt;/li&gt;
&lt;li&gt;离散（如人-时数据集）/连续时间数据结构&lt;/li&gt;
&lt;li&gt;删失和截断&lt;/li&gt;
&lt;li&gt;区间删失，左删失，右删失&lt;/li&gt;
&lt;li&gt;生存曲线和其他描述指标（风险/累积风险/累积发生率函数）&lt;/li&gt;
&lt;li&gt;非参数，半参数，参数生存模型&lt;/li&gt;
&lt;li&gt;Log-rank检验&lt;/li&gt;
&lt;li&gt;Cox比例风险回归&lt;/li&gt;
&lt;li&gt;离散时间风险模型（如，pooled Logistic回归）&lt;/li&gt;
&lt;li&gt;加速失效时间模型&lt;/li&gt;
&lt;li&gt;Poisson回归&lt;/li&gt;
&lt;li&gt;风险比的风险&lt;/li&gt;
&lt;li&gt;竞争风险&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3.3 时依性暴露&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;暴露评估方法&lt;/li&gt;
&lt;li&gt;暴露负担&lt;/li&gt;
&lt;li&gt;累积暴露&lt;/li&gt;
&lt;li&gt;治疗策略&lt;/li&gt;
&lt;li&gt;总是治疗/从不治疗&lt;/li&gt;
&lt;li&gt;确定性治疗策略和随机治疗策略&lt;/li&gt;
&lt;li&gt;动态治疗策略&lt;/li&gt;
&lt;li&gt;序贯可交换性&lt;/li&gt;
&lt;li&gt;时依性混杂，包括受先前暴露影响的时依性混杂/治疗混杂反馈&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3.4 调整混杂因素的高级方法&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;边缘结构模型&lt;/li&gt;
&lt;li&gt;G方法&lt;/li&gt;
&lt;li&gt;g-估计/参数g-公式&lt;/li&gt;
&lt;li&gt;逆概率加权&lt;/li&gt;
&lt;li&gt;标准化 vs 未标准化权重&lt;/li&gt;
&lt;li&gt;截断方法&lt;/li&gt;
&lt;li&gt;加权诊断（图方法，数值方法）&lt;/li&gt;
&lt;li&gt;G-估计&lt;/li&gt;
&lt;li&gt;倾向性评分&lt;/li&gt;
&lt;li&gt;PS分层&lt;/li&gt;
&lt;li&gt;PS匹配&lt;/li&gt;
&lt;li&gt;工具变量（包括孟德尔随机化）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3.5 定量偏倚分析方法&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;验证研究（内部验证/外部验证）&lt;/li&gt;
&lt;li&gt;偏倚参数&lt;/li&gt;
&lt;li&gt;确定性偏倚分析&lt;/li&gt;
&lt;li&gt;概率偏倚分析&lt;/li&gt;
&lt;li&gt;多重偏倚分析&lt;/li&gt;
&lt;li&gt;未观测混杂、信息偏倚和选择偏倚的偏倚分析&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3.6 变量选择和预测，特别是在高维数据背景下&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;变量选择技术&lt;/li&gt;
&lt;li&gt;压缩&lt;/li&gt;
&lt;li&gt;子集&lt;/li&gt;
&lt;li&gt;LASSO&lt;/li&gt;
&lt;li&gt;岭回归&lt;/li&gt;
&lt;li&gt;维度缩减技术&lt;/li&gt;
&lt;li&gt;交叉验证&lt;/li&gt;
&lt;li&gt;过拟合&lt;/li&gt;
&lt;li&gt;机器学习技术&lt;/li&gt;
&lt;li&gt;双稳健机器学习估计量&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3.7 中介分析&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;中介分析的传统方法&lt;/li&gt;
&lt;li&gt;差值方法&lt;/li&gt;
&lt;li&gt;乘积方法&lt;/li&gt;
&lt;li&gt;因果中介分析&lt;/li&gt;
&lt;li&gt;混杂假设&lt;/li&gt;
&lt;li&gt;直接和间接效应&lt;/li&gt;
&lt;li&gt;受控效应和自然效应&lt;/li&gt;
&lt;li&gt;暴露——中介——交互&lt;/li&gt;
&lt;li&gt;中介变量的类型&lt;/li&gt;
&lt;li&gt;二分类&lt;/li&gt;
&lt;li&gt;连续&lt;/li&gt;
&lt;li&gt;多重中介&lt;/li&gt;
&lt;li&gt;中介解释的百分比&lt;/li&gt;
&lt;li&gt;消除比例&lt;/li&gt;
&lt;li&gt;效应分解&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;流行病学研究的解释与应用，流行病学实践&lt;/h2&gt;
&lt;h3&gt;4.1 研究的实际实施&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;公共卫生数据来源&lt;/li&gt;
&lt;li&gt;数据管理&lt;/li&gt;
&lt;li&gt;清理数据集&lt;/li&gt;
&lt;li&gt;合并，追加数据集&lt;/li&gt;
&lt;li&gt;创建变量&lt;/li&gt;
&lt;li&gt;工作流和文档记录的最佳实践&lt;/li&gt;
&lt;li&gt;跨数据集协调&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4.2 研究伦理&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;历史视角与研究伦理的必要性&lt;/li&gt;
&lt;li&gt;国际伦理准则和监管框架&lt;/li&gt;
&lt;li&gt;机构审查委员会提交（材料）&lt;/li&gt;
&lt;li&gt;知情同意&lt;/li&gt;
&lt;li&gt;特殊人群（儿童、囚犯、无法提供同意的成年人）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4.3 开展与政策相关的研究&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;循证医学框架&lt;/li&gt;
&lt;li&gt;证据级别&lt;/li&gt;
&lt;li&gt;比较效果研究&lt;/li&gt;
&lt;li&gt;政策评估&lt;/li&gt;
&lt;li&gt;与政策相关的结果&lt;/li&gt;
&lt;li&gt;符合条件（暴露）的人群&lt;/li&gt;
&lt;li&gt;预期和非预期后果&lt;/li&gt;
&lt;li&gt;CDC公共卫生评估框架&lt;/li&gt;
&lt;li&gt;政策相关的因果推断方法&lt;/li&gt;
&lt;li&gt;卫生技术评估&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4.4 批判性评价与同行评审&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;如何对草稿进行批判性评价&lt;/li&gt;
&lt;li&gt;同行评审的目的和原则&lt;/li&gt;
&lt;li&gt;一篇写得好的批判性评价和同行评审的组成部分&lt;/li&gt;
&lt;li&gt;如何撰写同行评审意见&lt;/li&gt;
&lt;li&gt;Equator网络，研究报告指南&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4.5 证据综合&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;进行文献检索&lt;/li&gt;
&lt;li&gt;检索策略&lt;/li&gt;
&lt;li&gt;数据库&lt;/li&gt;
&lt;li&gt;文献管理软件&lt;/li&gt;
&lt;li&gt;识别趋势、模式和不一致性&lt;/li&gt;
&lt;li&gt;识别知识空白&lt;/li&gt;
&lt;li&gt;综述的类型&lt;/li&gt;
&lt;li&gt;叙述性综述&lt;/li&gt;
&lt;li&gt;定性与定量综合&lt;/li&gt;
&lt;li&gt;系统评价&lt;/li&gt;
&lt;li&gt;meta分析&lt;/li&gt;
&lt;li&gt;个体患者数据meta分析&lt;/li&gt;
&lt;li&gt;网络meta分析&lt;/li&gt;
&lt;li&gt;发表偏倚&lt;/li&gt;
&lt;li&gt;数据综合&lt;/li&gt;
&lt;li&gt;图形方法&lt;/li&gt;
&lt;li&gt;异质性评价&lt;/li&gt;
&lt;li&gt;拉贝图&lt;/li&gt;
&lt;li&gt;合并&lt;/li&gt;
&lt;li&gt;固定和随机效应&lt;/li&gt;
&lt;li&gt;Dersimonian和Laird模型&lt;/li&gt;
&lt;li&gt;亚组分析&lt;/li&gt;
&lt;li&gt;Meta回归&lt;/li&gt;
&lt;li&gt;解释结果&lt;/li&gt;
&lt;li&gt;PRISMA指南&lt;/li&gt;
&lt;li&gt;GRADE指南&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4.6 基金申请书撰写：研究目的&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;开发研究目的&lt;/li&gt;
&lt;li&gt;假设&lt;/li&gt;
&lt;li&gt;基本原理&lt;/li&gt;
&lt;li&gt;背景&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4.7 基金申请书撰写：研究方法&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;研究人群&lt;/li&gt;
&lt;li&gt;招募&lt;/li&gt;
&lt;li&gt;数据来源&lt;/li&gt;
&lt;li&gt;预试验数据&lt;/li&gt;
&lt;li&gt;数据来源&lt;/li&gt;
&lt;li&gt;模拟研究&lt;/li&gt;
&lt;li&gt;测量&lt;/li&gt;
&lt;li&gt;分析计划&lt;/li&gt;
&lt;li&gt;样本量计算&lt;/li&gt;
&lt;li&gt;时间安排&lt;/li&gt;
&lt;li&gt;严谨性和可重复性&lt;/li&gt;
&lt;li&gt;性别作为生物学变量&lt;/li&gt;
&lt;li&gt;潜在问题和替代策略&lt;/li&gt;
&lt;li&gt;预算编制&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4.7 基金申请书撰写：描述潜在影响&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;创新性&lt;/li&gt;
&lt;li&gt;意义和价值&lt;/li&gt;
&lt;li&gt;知识转化计划&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4.8 科学交流&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;撰写草稿（引言、方法、结果、结论）&lt;/li&gt;
&lt;li&gt;给利益相关方的报告（如社区合作伙伴、资助方）&lt;/li&gt;
&lt;li&gt;会议摘要&lt;/li&gt;
&lt;li&gt;口头报告&lt;/li&gt;
&lt;li&gt;海报展示&lt;/li&gt;
&lt;li&gt;数据可视化&lt;/li&gt;
&lt;li&gt;其他科学传播形式（如社交媒体、播客等）&lt;/li&gt;
&lt;li&gt;面向非专业受众的传播&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>MacOS使用7zip</title><link>https://nab-iak.github.io/posts/p22/p22/</link><guid isPermaLink="true">https://nab-iak.github.io/posts/p22/p22/</guid><description>7zip还是比较通用的哈</description><pubDate>Mon, 28 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Cover Pic by &lt;a href=&quot;https://www.pixiv.net/artworks/131608773&quot;&gt;@Pero&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h2&gt;下载&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;直接官网下载，然后解压到喜欢的路径即可&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;https://www.7-zip.org/download.html
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;tar -xvf 7z2500-mac.tar.xz
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;写入环境变量&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;vim&lt;/code&gt;编辑环境变量配置文件（我用的&lt;code&gt;.bash_profile&lt;/code&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;vim ~/.bash_profile
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;按&lt;code&gt;I&lt;/code&gt;键进入编辑模式，&lt;br /&gt;
把下面复制进去就行（注意替换&lt;code&gt;YOURPATH&lt;/code&gt;为文件夹路径），&lt;br /&gt;
然后&lt;code&gt;esc&lt;/code&gt;关闭编辑模式，&lt;br /&gt;
直接输入&lt;code&gt;:wq&lt;/code&gt;回车保存&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;export PATH=$PATH:YOURPATH/7z2500-mac/:$
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;使用前&lt;code&gt;source&lt;/code&gt;环境变量配置文件&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;source ~/.bash_profile
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;使用&lt;/h2&gt;
&lt;h3&gt;压缩文件&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 单个文件
7zz a archive.7z a.txt

# 多个文件
7zz a archive.7z a.txt b.txt c.txt

# 递归压缩
7zz a -r archive.7z a.txt b.txt c.txt FolderA/ FolderB/
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;加密压缩&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 密码123

# 单个文件
7zz a -p123 archive.7z a.txt

# 多个文件
7zz a -p123 archive.7z a.txt b.txt c.txt

# 递归压缩
7zz a -p123 -r archive.7z a.txt b.txt c.txt FolderA/ FolderB/
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;ZIP压缩&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 单个文件
7zz a -tZip archive.7z a.txt

# 多个文件
7zz a -tZip archive.7z a.txt b.txt c.txt

# 递归压缩
7zz a -tZip -r archive.7z a.txt b.txt c.txt FolderA/ FolderB/
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;解压文件&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 正常解压
7z x archive.7z
7z x archive.zip

# 解压到指定目录
7z x -o/xxx archive.7z
7z x -o/xxx archive.zip

# 有密码的情况
# 正常解压，之后对话框输入密码123
7z x archive.7z 
# 直接解压
7z x -p123 archive.7z 
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>使用missRanger插补</title><link>https://nab-iak.github.io/posts/p21/p21/</link><guid isPermaLink="true">https://nab-iak.github.io/posts/p21/p21/</guid><description>基于随机森林的missRanger插补方法</description><pubDate>Fri, 25 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Cover Pic by &lt;a href=&quot;https://www.pixiv.net/artworks/132988033&quot;&gt;@千机&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h2&gt;简介&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;missRanger&lt;/code&gt;是一种基于随机森林的&lt;strong&gt;多元插补算法&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;该算法会不断迭代，直到森林的平均袋外（OOB）误差不再改善&lt;/li&gt;
&lt;li&gt;缺失值将由最佳迭代的袋外预测值填充
&lt;ul&gt;
&lt;li&gt;速度很快&lt;/li&gt;
&lt;li&gt;允许进行样本外应用&lt;/li&gt;
&lt;li&gt;使用语法很直观：
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;missRanger(data, . ~ 1)&lt;/code&gt;对所有变量进行单变量插补&lt;/li&gt;
&lt;li&gt;&lt;code&gt;missRanger(data, Species ~ Sepal.Width)&lt;/code&gt;&lt;br /&gt;
使用&lt;code&gt;Sepal.Width&lt;/code&gt;来插补&lt;code&gt;Species&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;适用于多种数据类型&lt;/li&gt;
&lt;li&gt;将随机森林插补与预测均值匹配相结合
&lt;ul&gt;
&lt;li&gt;避免了在0 - 1编码变量中出现像0.3334这样的新值，&lt;br /&gt;
并有助于提高插补的方差&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;用法&lt;/h2&gt;
&lt;h3&gt;数据准备&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;library(missRanger)
set.seed(42)

# 随机对iris数据集产生10%的NA值
iris_NA &amp;lt;- generateNA(iris, p = 0.1)

# 查看带有NA的iris数据集
head(iris_NA)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&quot;dataframe&quot;&amp;gt;
&amp;lt;caption&amp;gt;A data.frame: 6 x 5&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;Sepal.Length&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;Sepal.Width&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;Petal.Length&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;Petal.Width&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;Species&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;fct&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;1&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;5.1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.5&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;setosa&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;2&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;4.9&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;setosa&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;3&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;4.7&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;setosa&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;4&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;4.6&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;setosa&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;5&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;5.0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;setosa&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;6&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;5.4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.9&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;setosa&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;h3&gt;预测均值匹配&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;set.seed(42)
imp &amp;lt;- missRanger(iris_NA, num.trees = 100)
head(imp)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;Missing value imputation by random forests


Variables to impute:  Sepal.Length, Sepal.Width, Petal.Length, Petal.Width, Species
Variables used to impute: Sepal.Length, Sepal.Width, Petal.Length, Petal.Width, Species

iter 1 
  |======================================================================| 100%
iter 2 
  |======================================================================| 100%
iter 3 
  |======================================================================| 100%
iter 4 
  |======================================================================| 100%
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&quot;dataframe&quot;&amp;gt;
&amp;lt;caption&amp;gt;A data.frame: 6 x 5&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;Sepal.Length&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;Sepal.Width&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;Petal.Length&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;Petal.Width&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;Species&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;fct&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;1&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;5.1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.500000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.400000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;setosa&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;2&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;4.9&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.400000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.1623667&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;setosa&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;3&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;4.7&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.222188&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.543517&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;setosa&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;4&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;4.6&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.100000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.336512&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;setosa&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;5&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;5.0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.229943&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.400000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2169167&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;setosa&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;6&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;5.4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.900000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.485592&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;setosa&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;h3&gt;预测均值匹配&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;为了避免插补值过于精确（原本才小数点后1位数），&lt;br /&gt;
可以在袋外预测中添加预测均值匹配（predictive mean matching，PMM）
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;pmm.k&lt;/code&gt;：&lt;br /&gt;
在插补过程中，会为每个缺失值找到 5 个与预测均值最接近的样本，&lt;br /&gt;
然后从这 5 个样本中随机选一个值来填补缺失，&lt;br /&gt;
这样可以避免直接使用模型预测的精确值，&lt;br /&gt;
让插补结果更贴近实际数据分布，同时增加插补的方差&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;set.seed(42)
imp &amp;lt;- missRanger(
 iris_NA, 
 pmm.k = 5, # 在预测均值匹配步骤中，用于抽样的候选非缺失值数量
 num.trees = 100, 
 verbose = 0 # 控制输出的详细程度，值为0，1，2
)
head(imp)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&quot;dataframe&quot;&amp;gt;
&amp;lt;caption&amp;gt;A data.frame: 6 x 5&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;Sepal.Length&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;Sepal.Width&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;Petal.Length&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;Petal.Width&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;Species&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;fct&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;1&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;5.1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.5&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;setosa&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;2&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;4.9&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;setosa&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;3&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;4.7&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.5&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;setosa&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;4&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;4.6&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;setosa&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;5&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;5.0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2.8&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.5&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;setosa&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;6&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;5.4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.9&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.5&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;setosa&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;h3&gt;随机森林的控制&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;可以对随机森林的算法自行控制&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;set.seed(42)
imp &amp;lt;- missRanger(
 iris_NA, 
 pmm.k = 5, # 在预测均值匹配步骤中，用于抽样的候选非缺失值数量
 num.trees = 200, # 树改成200
 mtry = 1, # 每次仅分割一个特征
 verbose = 0 # 控制输出的详细程度，值为0，1，2
)
head(imp)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&quot;dataframe&quot;&amp;gt;
&amp;lt;caption&amp;gt;A data.frame: 6 x 5&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;Sepal.Length&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;Sepal.Width&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;Petal.Length&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;Petal.Width&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;Species&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;fct&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;1&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;5.1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.5&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;setosa&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;2&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;4.9&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;setosa&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;3&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;4.7&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.6&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;setosa&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;4&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;4.6&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;setosa&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;5&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;5.0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;setosa&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;6&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;5.4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.9&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.5&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;setosa&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;h3&gt;扩展输出&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;将&lt;code&gt;data_only = FALSE&lt;/code&gt;（或&lt;code&gt;keep_forests = TRUE&lt;/code&gt;）设置为返回一个“missRanger”对象&lt;/li&gt;
&lt;li&gt;使用&lt;code&gt;keep_forests = TRUE&lt;/code&gt;，这允许进行样本外应用&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;set.seed(42)
imp &amp;lt;- missRanger(
 iris_NA, 
 pmm.k = 5, 
 num.trees = 100, 
 verbose = 0,
 keep_forests = TRUE
)

imp
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;missRanger object. Extract imputed data via $data
- best iteration: 4 
- best average OOB imputation error: 0.1456677 
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;summary(imp)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;missRanger object. Extract imputed data via $data
- best iteration: 4 
- best average OOB imputation error: 0.1456677 

Sequence of OOB prediction errors:

     Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
[1,]    1.0000000   1.1300328   0.25109911  0.13967576 0.06666667
[2,]    0.2045336   0.4627131   0.02291660  0.05595659 0.05925926
[3,]    0.1990785   0.4006927   0.02354877  0.05329063 0.06666667
[4,]    0.1717736   0.4393524   0.02212563  0.05064235 0.04444444
[5,]    0.1780753   0.4114935   0.02547026  0.06026729 0.05925926

Mean performance per iteration:
[1] 0.5174949 0.1610758 0.1486555 0.1456677 0.1469131

First rows of imputed data:

  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.5         0.2  setosa
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;predict(imp, head(iris_NA))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&quot;dataframe&quot;&amp;gt;
&amp;lt;caption&amp;gt;A data.frame: 6 x 5&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;Sepal.Length&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;Sepal.Width&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;Petal.Length&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;Petal.Width&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;Species&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;fct&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;1&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;5.1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.5&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;setosa&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;2&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;4.9&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;setosa&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;3&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;4.7&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;setosa&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;4&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;4.6&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;setosa&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;5&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;5.0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;4.2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;setosa&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;6&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;5.4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.9&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;setosa&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;h3&gt;公式&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;默认情况下，&lt;code&gt;missRanger()&lt;/code&gt; 使用所有列来插补所有存在缺失值的列&lt;/li&gt;
&lt;li&gt;可以通过传递一个公式来修改：&lt;br /&gt;
公式左侧指定要进行插补的变量，右侧列出用于插补的变量&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 用所有变量对所有变量进行插补
set.seed(42)
m1 &amp;lt;- missRanger(
 iris_NA, 
 formula = . ~ ., 
 pmm.k = 5, 
 num.trees = 100, 
 verbose = 0
)

# 用除了Species以外的变量对所有变量插补
set.seed(42)
m2 &amp;lt;- missRanger(
 iris_NA, 
 . ~ . - Species, 
 pmm.k = 5, 
 num.trees = 100, 
 verbose = 0
)

# 仅用Species对Sepal.Length插补
set.seed(42)
m3 &amp;lt;- missRanger(
 iris_NA, 
 Sepal.Length ~ Species, 
 pmm.k = 5, 
 num.trees = 100,
 verbose = 0
)

head(m1)
head(m2)
head(m3)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&quot;dataframe&quot;&amp;gt;
&amp;lt;caption&amp;gt;A data.frame: 6 x 5&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;Sepal.Length&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;Sepal.Width&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;Petal.Length&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;Petal.Width&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;Species&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;fct&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;1&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;5.1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.5&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;setosa&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;2&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;4.9&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;setosa&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;3&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;4.7&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.5&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;setosa&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;4&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;4.6&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;setosa&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;5&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;5.0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2.8&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.5&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;setosa&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;6&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;5.4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.9&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.5&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;setosa&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;table class=&quot;dataframe&quot;&amp;gt;
&amp;lt;caption&amp;gt;A data.frame: 6 x 5&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;Sepal.Length&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;Sepal.Width&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;Petal.Length&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;Petal.Width&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;Species&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;fct&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;1&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;5.1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.5&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;setosa&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;2&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;4.9&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;setosa&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;3&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;4.7&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.6&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;setosa&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;4&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;4.6&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;setosa&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;5&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;5.0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;setosa&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;6&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;5.4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.9&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.5&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;setosa&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;table class=&quot;dataframe&quot;&amp;gt;
&amp;lt;caption&amp;gt;A data.frame: 6 x 5&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;Sepal.Length&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;Sepal.Width&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;Petal.Length&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;Petal.Width&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;Species&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;fct&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;1&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;5.1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.5&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;setosa&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;2&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;4.9&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;setosa&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;3&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;4.7&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;setosa&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;4&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;4.6&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;setosa&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;5&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;5.0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;setosa&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;6&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;5.4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.9&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;setosa&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;h3&gt;加速插补时间&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;missRanger()&lt;/code&gt; 会针对每个变量和每次迭代拟合一个随机森林
&lt;ul&gt;
&lt;li&gt;因此，插补可能需要较长时间&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;减少时间的方法：
&lt;ul&gt;
&lt;li&gt;使用更少的树，例如，&lt;code&gt;num.trees = 100&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;使用较小的树深度，例如，&lt;code&gt;max.depth = 6&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;使用较大的叶节点，例如，&lt;code&gt;min.node.size = 100&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;使用较小的自助抽样样本，例如，&lt;code&gt;sample.fraction = 0.2&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;使用更少的迭代次数，例如，&lt;code&gt;max.iter = 3&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;前三项还有助于大幅减小模型的规模，&lt;br /&gt;
这在设置 &lt;code&gt;keep_forests = TRUE&lt;/code&gt; 的样本外应用中可能会很重要&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;使用&lt;code&gt;case.weights&lt;/code&gt;减少缺失值较多的行的影响&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;使用 &lt;code&gt;case.weights&lt;/code&gt; 参数，&lt;br /&gt;
可以将案例权重传递给插补模型
&lt;ul&gt;
&lt;li&gt;这可以减少缺失值较多的行的影响：&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;m &amp;lt;- missRanger(
 iris_NA,
 num.trees = 100,
 pmm.k = 5,
 case.weights = rowSums(!is.na(iris_NA))
)
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>【mlr3】1.基础用法</title><link>https://nab-iak.github.io/posts/p10/p10/</link><guid isPermaLink="true">https://nab-iak.github.io/posts/p10/p10/</guid><description>mlr3基础用法</description><pubDate>Tue, 22 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Cover Pic by &lt;a href=&quot;https://www.pixiv.net/artworks/126561187&quot;&gt;@抠肉肚脐&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://mlr3book.mlr-org.com/&quot;&gt;Applied Machine Learning Using mlr3 in R&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://mlr3book.mlr-org.com/&quot;&gt;Applied Machine Learning Using mlr3 in R&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;&lt;code&gt;mlr3&lt;/code&gt;框架生态&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;./image_1.png&quot; alt=&quot;image_1&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;机器学习流程&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;./image_2.png&quot; alt=&quot;image_2&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;将数据集拆分为训练集与测试集&lt;/li&gt;
&lt;li&gt;选择学习器，用训练集构建模型&lt;/li&gt;
&lt;li&gt;使用构建的模型对测试集进行预测&lt;/li&gt;
&lt;li&gt;基于预测的结果对模型用不同的评估器进行评估&lt;/li&gt;
&lt;li&gt;基于评估结果评价模型的性能&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;预设字典&lt;/h2&gt;
&lt;h3&gt;预设的Task列表&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;mlr_tasks
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;DictionaryTask&amp;gt; with 11 stored values
Keys: breast_cancer, california_housing, german_credit, iris, mtcars,
  penguins, pima, sonar, spam, wine, zoo
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;预设学习器列表&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;mlr_learners
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;DictionaryLearner&amp;gt; with 27 stored values
Keys: classif.cv_glmnet, classif.debug, classif.featureless,
  classif.glmnet, classif.kknn, classif.lda, classif.log_reg,
  classif.multinom, classif.naive_bayes, classif.nnet, classif.qda,
  classif.ranger, classif.rpart, classif.svm, classif.xgboost,
  regr.cv_glmnet, regr.debug, regr.featureless, regr.glmnet, regr.kknn,
  regr.km, regr.lm, regr.nnet, regr.ranger, regr.rpart, regr.svm,
  regr.xgboost
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;预设的评估器列表&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 1
mlr_measures
# 2
msr()
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;DictionaryMeasure&amp;gt; with 62 stored values
Keys: aic, bic, classif.acc, classif.auc, classif.bacc, classif.bbrier,
  classif.ce, classif.costs, classif.dor, classif.fbeta, classif.fdr,
  classif.fn, classif.fnr, classif.fomr, classif.fp, classif.fpr,
  classif.logloss, classif.mauc_au1p, classif.mauc_au1u,
  classif.mauc_aunp, classif.mauc_aunu, classif.mauc_mu,
  classif.mbrier, classif.mcc, classif.npv, classif.ppv, classif.prauc,
  classif.precision, classif.recall, classif.sensitivity,
  classif.specificity, classif.tn, classif.tnr, classif.tp,
  classif.tpr, debug_classif, internal_valid_score, oob_error,
  regr.bias, regr.ktau, regr.mae, regr.mape, regr.maxae, regr.medae,
  regr.medse, regr.mse, regr.msle, regr.pbias, regr.pinball, regr.rmse,
  regr.rmsle, regr.rsq, regr.sae, regr.smape, regr.srho, regr.sse,
  selected_features, sim.jaccard, sim.phi, time_both, time_predict,
  time_train
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;msr() %&amp;gt;% as.data.table()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 62 x 7&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;key&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;label&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;task_type&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;packages&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;predict_type&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;properties&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;task_properties&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;aic                &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Akaike Information Criterion              &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA      &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;na_score              , requires_learner      , requires_model        , requires_no_prediction&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;bic                &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Bayesian Information Criterion            &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA      &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;na_score              , requires_learner      , requires_model        , requires_no_prediction&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.acc        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Classification Accuracy                   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3        , mlr3measures&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;weights&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.auc        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Area Under the ROC Curve                  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3        , mlr3measures&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;prob    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;twoclass&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.bacc       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Balanced Accuracy                         &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3        , mlr3measures&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;weights&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.bbrier     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Binary Brier Score                        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3        , mlr3measures&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;prob    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;weights&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;twoclass&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.ce         &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Classification Error                      &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3        , mlr3measures&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;weights&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.costs      &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Cost-sensitive Classification             &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;weights&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.dor        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Diagnostic Odds Ratio                     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3        , mlr3measures&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;twoclass&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.fbeta      &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;F-beta score                              &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3        , mlr3measures&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;twoclass&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.fdr        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;False Discovery Rate                      &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3        , mlr3measures&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;twoclass&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.fn         &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;False Negatives                           &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3        , mlr3measures&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;twoclass&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.fnr        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;False Negative Rate                       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3        , mlr3measures&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;twoclass&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.fomr       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;False Omission Rate                       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3        , mlr3measures&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;twoclass&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.fp         &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;False Positives                           &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3        , mlr3measures&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;twoclass&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.fpr        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;False Positive Rate                       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3        , mlr3measures&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;twoclass&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.logloss    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Log Loss                                  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3        , mlr3measures&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;prob    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;weights&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.mauc_au1p  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Weighted average 1 vs. 1 multiclass AUC   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3        , mlr3measures&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;prob    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.mauc_au1u  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Average 1 vs. 1 multiclass AUC            &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3        , mlr3measures&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;prob    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.mauc_aunp  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Weighted average 1 vs. rest multiclass AUC&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3        , mlr3measures&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;prob    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.mauc_aunu  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Average 1 vs. rest multiclass AUC         &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3        , mlr3measures&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;prob    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.mauc_mu    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Multiclass mu AUC                         &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3        , mlr3measures&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;prob    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.mbrier     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Multiclass Brier Score                    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3        , mlr3measures&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;prob    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.mcc        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Matthews Correlation Coefficient          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3        , mlr3measures&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.npv        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Negative Predictive Value                 &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3        , mlr3measures&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;twoclass&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.ppv        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Positive Predictive Value                 &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3        , mlr3measures&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;twoclass&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.prauc      &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Precision-Recall Curve                    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3        , mlr3measures&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;prob    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;twoclass&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.precision  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Precision                                 &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3        , mlr3measures&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;twoclass&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.recall     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Recall                                    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3        , mlr3measures&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;twoclass&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.sensitivity&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Sensitivity                               &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3        , mlr3measures&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;twoclass&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.tnr         &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;True Negative Rate                                 &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3        , mlr3measures&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;twoclass&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.tp          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;True Positives                                     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3        , mlr3measures&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;twoclass&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.tpr         &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;True Positive Rate                                 &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3        , mlr3measures&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;twoclass&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;debug_classif       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Debug Classification Measure                       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;na_score&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;internal_valid_score&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Internal Validation Score                          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;na_score              , requires_learner      , requires_no_prediction&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;oob_error           &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Out-of-bag Error                                   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;na_score              , requires_learner      , requires_no_prediction&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;regr.bias           &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Bias                                               &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;regr   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3        , mlr3measures&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;weights&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;regr.ktau           &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Kendall&apos;s tau                                      &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;regr   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3        , mlr3measures&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;regr.mae            &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Mean Absolute Error                                &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;regr   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3        , mlr3measures&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;weights&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;regr.mape           &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Mean Absolute Percent Error                        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;regr   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3        , mlr3measures&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;weights&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;regr.maxae          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Max Absolute Error                                 &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;regr   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3        , mlr3measures&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;regr.medae          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Median Absolute Error                              &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;regr   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3        , mlr3measures&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;regr.medse          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Median Squared Error                               &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;regr   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3        , mlr3measures&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;regr.mse            &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Mean Squared Error                                 &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;regr   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3        , mlr3measures&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;weights&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;regr.msle           &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Mean Squared Log Error                             &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;regr   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3        , mlr3measures&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;weights&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;regr.pbias          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Percent Bias                                       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;regr   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3        , mlr3measures&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;weights&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;regr.pinball        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA                                                 &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;regr   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;quantiles&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;regr.rmse           &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Root Mean Squared Error                            &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;regr   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3        , mlr3measures&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;weights&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;regr.rmsle          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Root Mean Squared Log Error                        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;regr   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3        , mlr3measures&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;weights&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;regr.rsq            &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA                                                 &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;regr   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;weights&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;regr.sae            &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Sum of Absolute Errors                             &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;regr   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3        , mlr3measures&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;regr.smape          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Symmetric Mean Absolute Percent Error              &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;regr   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3        , mlr3measures&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;regr.srho           &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Spearman&apos;s rho                                     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;regr   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3        , mlr3measures&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;regr.sse            &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Sum of Squared Errors                              &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;regr   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3        , mlr3measures&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;selected_features   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Absolute or Relative Frequency of Selected Features&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;requires_task         , requires_learner      , requires_model        , requires_no_prediction&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;sim.jaccard         &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Jaccard Similarity Index                           &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3        , mlr3measures&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;requires_model        , requires_no_prediction&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;sim.phi             &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Phi Coefficient Similarity                         &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3        , mlr3measures&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;requires_model        , requires_no_prediction&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;time_both           &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Elapsed Time                                       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;requires_learner      , requires_no_prediction&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;time_predict        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Elapsed Time                                       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;requires_learner      , requires_no_prediction&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;time_train          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Elapsed Time                                       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;requires_learner      , requires_no_prediction&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;h3&gt;调取详情&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;mlr_tasks$get(&apos;california_housing&apos;)
mlr_learners$get(&apos;classif.xgboost&apos;)
mlr_measures$get(&apos;regr.mse&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[36m--[39m [1m[34m&amp;lt;TaskRegr&amp;gt;[39m (20640x10): California House Value[22m [36m-------------------------------[39m
* Target: median_house_value
* Properties: -
* Features (9):
  * dbl (8): households, housing_median_age, latitude, longitude,
  median_income, population, total_bedrooms, total_rooms
  * fct (1): ocean_proximity



[36m--[39m [1m[34m&amp;lt;LearnerClassifXgboost&amp;gt;[39m (classif.xgboost): Extreme Gradient Boosting[22m [36m--------[39m
* Model: -
* Parameters: nrounds=1000, nthread=1, verbose=0
* Validate: [34m&amp;lt;NULL&amp;gt;[39m
* Packages: [34mmlr3[39m, [34mmlr3learners[39m, and [34mxgboost[39m
* Predict Types: [response] and prob
* Feature Types: logical, integer, and numeric
* Encapsulation: none (fallback: -)
* Properties: hotstart_forward, importance, internal_tuning, missings,
multiclass, offset, twoclass, validation, and weights
* Other settings: use_weights = &apos;use&apos;



[36m--[39m [1m[34m&amp;lt;MeasureRegrSimple&amp;gt;[39m (regr.mse): Mean Squared Error[22m [36m--------------------------[39m
* Packages: [34mmlr3[39m and [34mmlr3measures[39m
* Range: [0, Inf]
* Minimize: [34mTRUE[39m
* Average: macro
* Parameters: list()
* Properties: weights
* Predict type: response
* Predict sets: test
* Aggregator: mean()
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;简单的回归的流程&lt;/h2&gt;
&lt;h3&gt;任务化&lt;/h3&gt;
&lt;h4&gt;创建任务&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;as_task_*()&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;target：outcome&lt;/li&gt;
&lt;li&gt;id：任务名称&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;这里就用&lt;code&gt;as_task_regr()&lt;/code&gt;代替下&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;dt.tskR &amp;lt;- as_task_regr(dt, target = &apos;outcome&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;对outcome与特征值的图形化概括
&lt;ul&gt;
&lt;li&gt;特征值过多不建议，又慢又看不清&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;library(mlr3viz)
autoplot(dt.tskR, type = &apos;pairs&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;数据检索及数据处理&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;可以通过&lt;code&gt;$&lt;/code&gt;探索任务里的各种信息&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;对于导入的原始数据而言&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;dt.tskR$nrow&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dt.tskR$ncol&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dt.tskR$feature_names&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dt.tskR$target_names&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dt.tskR$row_ids&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dt.tskR$col_info&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;......&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;有些是函数&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;dt.tskR$clone()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dt.tskR$data()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dt.tskR$cbind()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dt.tskR$rbind()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dt.tskR$filter()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dt.tskR$select()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dt.tskR$head()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;......&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;这两个虽然结果一样，&lt;br /&gt;
但是第一个是先调取整个data再筛选，&lt;br /&gt;
第二个则是直接充task里调取第二行&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;housing.tskR$data()[2]
housing.tskR$data(rows = housing.tskR$row_ids[2])
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;函数的用法和平时的类似，只是集成到了Task里面而已&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;数据处理的实例&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;注意，&lt;code&gt;dt.tskR$func()&lt;/code&gt;是对&lt;code&gt;dt.tsk&lt;/code&gt;的就地修改，&lt;br /&gt;
&lt;strong&gt;不需要保存到新的变量里&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 克隆一个一模一样的任务
dt.tskR2 &amp;lt;- dt.tskR$clone()
# 选择第1–2行
dt.tskR2$filter(1:2)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;# 添加列
dt.tskR$cbind( 
  data.frame(x = c(150, 160))
)
# 添加行
dt.tskR_small$rbind( 
  data.frame(x1 = 23, x2 = 5, x3 = 170)
)
dt.tskR_small$data()
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;学习器&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://mlr-org.com/learners.html&quot;&gt;mlr-org: Learners&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;学习器的类型是&lt;code&gt;Learner&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;包的分类&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;mlr3&lt;/strong&gt;：仅包含一些基础的学习器&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;mlr3learners&lt;/strong&gt;：比&lt;code&gt;mlr3&lt;/code&gt;包更丰富且常用的学习器&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;mlr3proba&lt;/strong&gt;：生存学习器&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;mlr3cluster&lt;/strong&gt;：聚类学习器&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;mlr3extralearners&lt;/strong&gt;：一些不稳定或者CRAN上不可用的学习器&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;mlr3torch&lt;/strong&gt;：神经网络相关学习器&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;查看学习器&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;lrn()&lt;/code&gt;可以调取对应学习器的信息，并且包含下列数据
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;$feature_types&lt;/code&gt;：学习器可以处理的特征类型&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$packages&lt;/code&gt;：使用该学习器需要安装的软件包&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$properties&lt;/code&gt;：学习器的属性；例如，&lt;strong&gt;&apos;missings&apos;&lt;/strong&gt; 属性表示模型可以处理缺失数据，而 &lt;strong&gt;&apos;importance&apos;&lt;/strong&gt; 表示它可以计算每个特征的相对重要性&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$predict_types&lt;/code&gt;：模型能够做出的预测类型&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$param_set&lt;/code&gt;：可用超参数集&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;lrn(&apos;regr.rpart&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[36m--[39m [1m[34m&amp;lt;LearnerRegrRpart&amp;gt;[39m (regr.rpart): Regression Tree[22m [36m----------------------------[39m
* Model: -
* Parameters: xval=0
* Packages: [34mmlr3[39m and [34mrpart[39m
* Predict Types: [response]
* Feature Types: logical, integer, numeric, factor, and ordered
* Encapsulation: none (fallback: -)
* Properties: importance, missings, selected_features, and weights
* Other settings: use_weights = &apos;use&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;传递多个学习器&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;lrn()&lt;/code&gt;的复数形&lt;code&gt;lrns()&lt;/code&gt;可以调取多个学习器&lt;/li&gt;
&lt;li&gt;其他的类似的还有&lt;code&gt;tsks()&lt;/code&gt;和后续出现的&lt;code&gt;msrs()&lt;/code&gt;，&lt;code&gt;rsmps()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;dt.lrnR.rpart_lm &amp;lt;- lrns(c(&apos;regr.rpart&apos;, &apos;regr.lm&apos;))
dt.lrnR.rpart_lm
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;分割训练集和测试集&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;partition()&lt;/code&gt;中&lt;code&gt;ratio&lt;/code&gt;为训练集占整个数据集比例&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;dt.tskR.splits &amp;lt;- partition(dt.tsk, ratio = 0.7)
dt.tskR.splits
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;训练模型&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Learner&lt;/code&gt;作用于&lt;code&gt;Task&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;dt.lrnR.rpart &amp;lt;- lrn(&apos;regr.rpart&apos;)
dt.lrnR.rpart$train(dt.tsk)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;拟合的模型储存在&lt;code&gt;Learner$model&lt;/code&gt;中&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;dt.lrnR.rpart$model
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;通过指定参数&lt;code&gt;row_ids&lt;/code&gt;分配训练集&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;dt.lrnR.rpart$train(dt.tskR, row_ids = dt.tskR.splits$train)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;也可以指定预测类型
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;regr.rpart&lt;/code&gt;不能选择response以外的类型&lt;/li&gt;
&lt;li&gt;这里选择用 &lt;code&gt;regr.lm&lt;/code&gt;来预测标准误差&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;dt.lrnR.lm &amp;lt;- lrn(&apos;regr.lm&apos;, predict_type = &apos;se&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;可以随便看看区别
&lt;ul&gt;
&lt;li&gt;在指定了&lt;strong&gt;se&lt;/strong&gt;后output里&lt;code&gt;Predict Types&lt;/code&gt;的框框给到了&lt;code&gt;[se]&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;lrn(&apos;regr.lm&apos;)
lrn(&apos;regr.lm&apos;, predict_type = &apos;se&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;
[36m--[39m [1m[34m&amp;lt;LearnerRegrLM&amp;gt;[39m (regr.lm): Linear Model[22m [36m-------------------------------------[39m
* Model: -
* Parameters: use_pred_offset=TRUE
* Packages: [34mmlr3[39m, [34mmlr3learners[39m, and [34mstats[39m
* Predict Types: [response] and se
* Feature Types: logical, integer, numeric, character, and factor
* Encapsulation: none (fallback: -)
* Properties: offset and weights
* Other settings: use_weights = &apos;use&apos;


[36m--[39m [1m[34m&amp;lt;LearnerRegrLM&amp;gt;[39m (regr.lm): Linear Model[22m [36m-------------------------------------[39m
* Model: -
* Parameters: use_pred_offset=TRUE
* Packages: [34mmlr3[39m, [34mmlr3learners[39m, and [34mstats[39m
* Predict Types: response and [se]
* Feature Types: logical, integer, numeric, character, and factor
* Encapsulation: none (fallback: -)
* Properties: offset and weights
* Other settings: use_weights = &apos;use&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;预测数据&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;由于&lt;code&gt;Learner$predict()&lt;/code&gt;会返回一个新的对象，所以需要另外保存&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;dt.lrnR.rpart.pred &amp;lt;- dt.lrnR.rpart$predict(dt.tskR, row_ids = dt.tskR.splits$test)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;可以简单看看这些对象的类别&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;dt.tskR %&amp;gt;% class()
dt.lrnR.rpart %&amp;gt;% class()
dt.lrnR.rpart.pred %&amp;gt;% class()
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&apos;TaskRegr&apos;&apos;TaskSupervised&apos;&apos;Task&apos;&apos;R6&apos;
&apos;LearnerRegrRpart&apos;&apos;LearnerRegr&apos;&apos;Learner&apos;&apos;R6&apos;
&apos;PredictionRegr&apos;&apos;Prediction&apos;&apos;R6&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;dt.lrnR.rpart.pred&lt;/code&gt;：返回一个预测结果的文本输出&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dt.lrnR.rpart.pred$truth&lt;/code&gt;：返回真实值向量&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dt.lrnR.rpart.pred$responese&lt;/code&gt;：返回预测响应值向量&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;对真实值-预测值进行绘图&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;autoplot(dt.lrnR.rpart.pred)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;超参数&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;训练模型前需要&lt;strong&gt;预先指定的参数&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;获取超参数&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;# 1
dt.lrnR.rpart$param_set
# 2
lrn(&apos;regr.rpart&apos;)$param_set
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;ParamSet(10)&amp;gt;
                id    class lower upper nlevels        default  value
            &amp;lt;char&amp;gt;   &amp;lt;char&amp;gt; &amp;lt;num&amp;gt; &amp;lt;num&amp;gt;   &amp;lt;num&amp;gt;         &amp;lt;list&amp;gt; &amp;lt;list&amp;gt;
 1:             cp ParamDbl     0     1     Inf           0.01 [NULL]
 2:     keep_model ParamLgl    NA    NA       2          FALSE [NULL]
 3:     maxcompete ParamInt     0   Inf     Inf              4 [NULL]
 4:       maxdepth ParamInt     1    30      30             30 [NULL]
 5:   maxsurrogate ParamInt     0   Inf     Inf              5 [NULL]
 6:      minbucket ParamInt     1   Inf     Inf &amp;lt;NoDefault[0]&amp;gt; [NULL]
 7:       minsplit ParamInt     1   Inf     Inf             20 [NULL]
 8: surrogatestyle ParamInt     0     1       2              0 [NULL]
 9:   usesurrogate ParamInt     0     2       3              2 [NULL]
10:           xval ParamInt     0   Inf     Inf             10      0
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;其中&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;id&lt;/strong&gt;：超参数名&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;class&lt;/strong&gt;：类别&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;lower&lt;/strong&gt;：最小可设定值&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;upper&lt;/strong&gt;：最大可设定值&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;nlevels&lt;/strong&gt;：可设定值的种类数目&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;default&lt;/strong&gt;：原函数的默认取值&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;value&lt;/strong&gt;：当前取值，&lt;code&gt;[NULL]&lt;/code&gt;时使用&lt;code&gt;default&lt;/code&gt;的值&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;当&lt;code&gt;cp&lt;/code&gt;设置为&lt;code&gt;0.5&lt;/code&gt;后，可以看到output中&lt;code&gt;cp&lt;/code&gt;的value变成了&lt;code&gt;0.5&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;lrn(&apos;regr.rpart&apos;, cp = 0.5)$param_set
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;ParamSet(10)&amp;gt;
                id    class lower upper nlevels        default  value
            &amp;lt;char&amp;gt;   &amp;lt;char&amp;gt; &amp;lt;num&amp;gt; &amp;lt;num&amp;gt;   &amp;lt;num&amp;gt;         &amp;lt;list&amp;gt; &amp;lt;list&amp;gt;
 1:             cp ParamDbl     0     1     Inf           0.01    0.5
 2:     keep_model ParamLgl    NA    NA       2          FALSE [NULL]
 3:     maxcompete ParamInt     0   Inf     Inf              4 [NULL]
 4:       maxdepth ParamInt     1    30      30             30 [NULL]
 5:   maxsurrogate ParamInt     0   Inf     Inf              5 [NULL]
 6:      minbucket ParamInt     1   Inf     Inf &amp;lt;NoDefault[0]&amp;gt; [NULL]
 7:       minsplit ParamInt     1   Inf     Inf             20 [NULL]
 8: surrogatestyle ParamInt     0     1       2              0 [NULL]
 9:   usesurrogate ParamInt     0     2       3              2 [NULL]
10:           xval ParamInt     0   Inf     Inf             10      0
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;查看当前模型的超参数设定情况&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;dt.lrnR.rpart$param_set$values
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;对查看当前模型的超参数设定就地修改&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;dt.lrnR.rpart$param_set$set_values(cp = 0.02，minsplit = 10)
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;超参数依赖关系&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;支持向量机中的超参数更加复杂&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;lrn(&apos;regr.svm&apos;)$param_set
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;ParamSet(14)&amp;gt;
Key: &amp;lt;id&amp;gt;
           id    class lower upper nlevels        default parents  value
       &amp;lt;char&amp;gt;   &amp;lt;char&amp;gt; &amp;lt;num&amp;gt; &amp;lt;num&amp;gt;   &amp;lt;num&amp;gt;         &amp;lt;list&amp;gt;  &amp;lt;list&amp;gt; &amp;lt;list&amp;gt;
 1: cachesize ParamDbl  -Inf   Inf     Inf             40  [NULL] [NULL]
 2:     coef0 ParamDbl  -Inf   Inf     Inf              0  kernel [NULL]
 3:      cost ParamDbl     0   Inf     Inf              1    type [NULL]
 4:     cross ParamInt     0   Inf     Inf              0  [NULL] [NULL]
 5:    degree ParamInt     1   Inf     Inf              3  kernel [NULL]
 6:   epsilon ParamDbl     0   Inf     Inf            0.1    type [NULL]
 7:    fitted ParamLgl    NA    NA       2           TRUE  [NULL] [NULL]
 8:     gamma ParamDbl     0   Inf     Inf &amp;lt;NoDefault[0]&amp;gt;  kernel [NULL]
 9:    kernel ParamFct    NA    NA       4         radial  [NULL] [NULL]
10:        nu ParamDbl  -Inf   Inf     Inf            0.5    type [NULL]
11:     scale ParamUty    NA    NA     Inf           TRUE  [NULL] [NULL]
12: shrinking ParamLgl    NA    NA       2           TRUE  [NULL] [NULL]
13: tolerance ParamDbl     0   Inf     Inf          0.001  [NULL] [NULL]
14:      type ParamFct    NA    NA       2 eps-regression  [NULL] [NULL]
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;可以从&lt;code&gt;Learner$param_set$deps&lt;/code&gt;中获得超参数之间的依赖关系总结&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;lrn(&apos;regr.svm&apos;)$param_set$deps
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 6 x 3&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;id&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;on&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;cond&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;coef0  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;kernel&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;polynomial    , sigmoid       , %s %%in%% {%s}&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;cost   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;type  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;eps-regression, nu-regression , %s %%in%% {%s}&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;degree &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;kernel&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;polynomial, %s == %s  &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;epsilon&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;type  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;eps-regression, %s == %s      &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;gamma  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;kernel&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;polynomial    , radial        , sigmoid       , %s %%in%% {%s}&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;nu     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;type  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;nu-regression, %s == %s     &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;查看一下设置的条件&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;for (i in 1:6){
 print(lrn(&apos;regr.svm&apos;)$param_set$deps[[i, &apos;cond&apos;]])
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;CondAnyOf: x %in% {polynomial, sigmoid}
CondAnyOf: x %in% {eps-regression, nu-regression}
CondEqual: x == polynomial
CondEqual: x == eps-regression
CondAnyOf: x %in% {polynomial, radial, sigmoid}
CondEqual: x == nu-regression
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;输出中&lt;code&gt;x&lt;/code&gt;是&lt;code&gt;on&lt;/code&gt;的指代，&lt;br /&gt;
当被依赖的超参数&lt;code&gt;on&lt;/code&gt;的设置满足某条件时，&lt;br /&gt;
&lt;code&gt;id&lt;/code&gt;中的超参数才能被设置&lt;/li&gt;
&lt;li&gt;如果&lt;code&gt;on&lt;/code&gt;超参数不满足条件，设置&lt;code&gt;id&lt;/code&gt;超参数会报错&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;基准学习器&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;regr.featureless&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;它总是将新值预测为训练数据中目标的均值&lt;/li&gt;
&lt;li&gt;如果 &lt;code&gt;robust&lt;/code&gt; 超参数设置为 &lt;code&gt;TRUE&lt;/code&gt;，则为中位数&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;用于
&lt;ul&gt;
&lt;li&gt;模型比较&lt;/li&gt;
&lt;li&gt;回退学习器&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;lrn(&apos;regr.featureless&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;模型评估&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;msr()&lt;/code&gt;用于单个评估器的评估&lt;/li&gt;
&lt;li&gt;&lt;code&gt;msrs()&lt;/code&gt;可以输入使用多个评估器名称的向量&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 1
msrR.mse_mae &amp;lt;- msrs(c(&apos;regr.mse&apos;, &apos;regr.mae&apos;))
housing.lrnR.rpart.pred$score(msrR.mse_mae)
# 2
housing.lrnR.rpart.pred$score(msrs(c(&apos;regr.mse&apos;, &apos;regr.mae&apos;)))
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;mlr3&lt;/code&gt;还有一些其他非质量评价的评估指标&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;msr(&apos;time_train&apos;)&lt;/code&gt;：训练模型所花费的时间&lt;/li&gt;
&lt;li&gt;&lt;code&gt;msr(&apos;time_predict&apos;)&lt;/code&gt;：模型进行预测所需的时间&lt;/li&gt;
&lt;li&gt;&lt;code&gt;msr(&apos;time_both&apos;)&lt;/code&gt;：训练模型然后进行预测所花费的总时间&lt;/li&gt;
&lt;li&gt;&lt;code&gt;msr(&apos;selected_features&apos;)&lt;/code&gt;：&lt;br /&gt;
模型选择的特征数量，仅当模型具有&lt;code&gt;selected_features&lt;/code&gt;属性时才可使用&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Measure$properties&lt;/code&gt;提供了评估器的属性&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;msr(&apos;regr.mse&apos;)$properties
msr(&apos;time_train&apos;)$properties
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&apos;weights&apos;
&apos;requires_learner&apos;&apos;requires_no_prediction&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;评估器的超参数
&lt;ul&gt;
&lt;li&gt;可以注意到&lt;code&gt;time_train&lt;/code&gt;的&lt;code&gt;Parameters&lt;/code&gt;是&lt;code&gt;list()&lt;/code&gt;，&lt;br /&gt;
这代表是空的&lt;/li&gt;
&lt;li&gt;&lt;code&gt;selected_features&lt;/code&gt;的&lt;code&gt;Parameters&lt;/code&gt;有&lt;code&gt;normalize=FALSE&lt;/code&gt;，&lt;br /&gt;
说明可以提前设置&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;msr(&apos;time_train&apos;)
msr(&apos;selected_features&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[36m--[39m [1m[34m&amp;lt;MeasureElapsedTime&amp;gt;[39m (time_train): Elapsed Time[22m [36m-----------------------------[39m
* Packages: [34mmlr3[39m
* Range: [0, Inf]
* Minimize: [34mTRUE[39m
* Average: macro
* Parameters: list()
* Properties: requires_learner and requires_no_prediction
* Predict type: NA
* Predict sets:
* Aggregator: mean()


[36m--[39m [1m[34m&amp;lt;MeasureSelectedFeatures&amp;gt;[39m (selected_features): Absolute or Relative Frequency[22m
* Packages: [34mmlr3[39m
* Range: [0, Inf]
* Minimize: [34mTRUE[39m
* Average: macro
* Parameters: normalize=FALSE
* Properties: requires_task, requires_learner, requires_model, and
requires_no_prediction
* Predict type: NA
* Predict sets:
* Aggregator: mean()
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;访问评估器的超参数也是用&lt;code&gt;$param_set&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;msr.sf &amp;lt;- msr(&apos;selected_features&apos;)
msr.sf$param_set
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;ParamSet(1)&amp;gt;
          id    class lower upper nlevels        default  value
      &amp;lt;char&amp;gt;   &amp;lt;char&amp;gt; &amp;lt;num&amp;gt; &amp;lt;num&amp;gt;   &amp;lt;num&amp;gt;         &amp;lt;list&amp;gt; &amp;lt;list&amp;gt;
1: normalize ParamLgl    NA    NA       2 &amp;lt;NoDefault[0]&amp;gt;  FALSE
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;修改&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 1
msr.sf$param_set$set_values(normalize = TRUE)
# 2
msr.sf$param_set$normalize &amp;lt;- TRUE
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;简单的分类的流程&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;与回归的流程相同，&lt;br /&gt;
只是基础对象分别继承自 &lt;code&gt;TaskClassif&lt;/code&gt;、&lt;code&gt;LearnerClassif&lt;/code&gt; 和 &lt;code&gt;MeasureClassif&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;分类有&lt;strong&gt;二元分类&lt;/strong&gt;和&lt;strong&gt;多元分类&lt;/strong&gt;两种&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;任务化&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;这里就直接调取预设的任务进行练习&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;mlr_tasks %&amp;gt;% as.data.table()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 11 x 14&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;key&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;label&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;task_type&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;nrow&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;ncol&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;properties&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;lgl&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;int&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;dbl&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;chr&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;fct&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;ord&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;pxc&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;dte&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;breast_cancer     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Wisconsin Breast Cancer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;  683&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;10&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;twoclass&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;9&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;california_housing&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;California House Value &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;regr   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;20640&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;10&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 8&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;german_credit     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;German Credit          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;21&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;twoclass&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;14&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;iris              &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Iris Flowers           &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;  150&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 5&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;multiclass&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;mtcars            &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Motor Trends           &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;regr   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;   32&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;11&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;10&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;penguins          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Palmer Penguins        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;  344&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 8&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;multiclass&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;pima              &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Pima Indian Diabetes   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;  768&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 9&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;twoclass&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 8&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;sonar             &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Sonar: Mines vs. Rocks &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;  208&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;61&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;twoclass&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;60&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;spam              &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;HP Spam Detection      &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 4601&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;58&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;twoclass&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;57&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;wine              &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Wine Regions           &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;  178&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;14&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;multiclass&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;11&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;zoo               &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Zoo Animals            &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;  101&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;17&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;multiclass&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;15&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;分别用&lt;code&gt;german_credit&lt;/code&gt;和&lt;code&gt;penguins&lt;/code&gt;作为二元分类和多元分类的例子&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;gc.tskC &amp;lt;- tsk(&apos;german_credit&apos;)
peng.tskC &amp;lt;- tsk(&apos;penguins&apos;)

gc.tskC
peng.tskC
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[36m--[39m [1m[34m&amp;lt;TaskClassif&amp;gt;[39m (1000x21): German Credit[22m [36m--------------------------------------[39m
* Target: credit_risk
* Target classes: good (positive class, 70%), bad (30%)
* Properties: twoclass
* Features (20):
  * fct (14): credit_history, employment_duration, foreign_worker, housing,
  job, other_debtors, other_installment_plans, people_liable,
  personal_status_sex, property, purpose, savings, status, telephone
  * int (3): age, amount, duration
  * ord (3): installment_rate, number_credits, present_residence


[36m--[39m [1m[34m&amp;lt;TaskClassif&amp;gt;[39m (344x8): Palmer Penguins[22m [36m--------------------------------------[39m
* Target: species
* Target classes: Adelie (44%), Gentoo (36%), Chinstrap (20%)
* Properties: multiclass
* Features (7):
  * int (3): body_mass, flipper_length, year
  * dbl (2): bill_depth, bill_length
  * fct (2): island, sex
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;二元分类&lt;/h3&gt;
&lt;h4&gt;Outcome的分类&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;gc.tskC$class_names
gc.tskC$properties
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&apos;good&apos;&apos;bad&apos;
&apos;twoclass&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;定义正类&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;gc.tskC$positive &amp;lt;- &apos;good&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;如果不设置，默认第一个级别是正类&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;对真实值-预测值进行绘图&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;autoplot(gc.tskC, type = &apos;duo&apos;) +
  theme(strip.text.y = element_text(angle = -45, size = 8))
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;预测结果&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;predict_type&lt;/code&gt;可以选择预测响应类别&lt;code&gt;&apos;response&apos;&lt;/code&gt;或者概率&lt;code&gt;&apos;prob&apos;&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;选择概率也会给出&lt;code&gt;response&lt;/code&gt;的结果&lt;/li&gt;
&lt;li&gt;所以对于分类问题，用概率会更好&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;lrn(&apos;classif.rpart&apos;) # &apos;response&apos;是默认
lrn(&apos;classif.rpart&apos;, predict_type = &apos;prob&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;# gc.tskC.splits &amp;lt;- partition(gc.tskC,ratio = 0.7) # 事先设定好

gc.lrnC.rpart &amp;lt;- lrn(&apos;classif.rpart&apos;, predict_type = &apos;response&apos;)
gc.lrnC.rpart$train(gc.tskC, gc.tskC.splits$train)
gc.lrnC.rpart.pred &amp;lt;- gc.lrnC.rpart$predict(gc.tskC, gc.tskC.splits$test)
gc.lrnC.rpart.pred
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[36m--[39m [1m[34m&amp;lt;PredictionClassif&amp;gt;[39m for [34m300[39m observations:[22m [36m-----------------------------------[39m
 row_ids truth response
       6  good     good
       8  good      bad
      10   bad      bad
     ---   ---      ---
     992  good     good
     995  good     good
    1000  good      bad
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;# gc.tskC.splits &amp;lt;- partition(gc.tskC,ratio = 0.7) # 事先设定好

gc.lrnC.rpart &amp;lt;- lrn(&apos;classif.rpart&apos;, predict_type = &apos;prob&apos;)
gc.lrnC.rpart$train(gc.tskC, gc.tskC.splits$train)
gc.lrnC.rpart.pred &amp;lt;- gc.lrnC.rpart$predict(gc.tskC, gc.tskC.splits$test)
gc.lrnC.rpart.pred
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[36m--[39m [1m[34m&amp;lt;PredictionClassif&amp;gt;[39m for [34m300[39m observations:[22m [36m-----------------------------------[39m
 row_ids truth response  prob.good  prob.bad
       6  good     good 0.85667752 0.1433225
       8  good      bad 0.21739130 0.7826087
      10   bad      bad 0.29411765 0.7058824
     ---   ---      ---        ---       ---
     992  good     good 0.85667752 0.1433225
     995  good     good 0.85667752 0.1433225
    1000  good      bad 0.07692308 0.9230769
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;模型评估&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;不同种类的评估器对于&lt;code&gt;response&lt;/code&gt;和&lt;code&gt;prob&lt;/code&gt;的适用性是不同的，&lt;br /&gt;
需要找到合适的评估器&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;寻找支持分类并用于评估概率的评估器&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;as.data.table(msr())[
    task_type == &apos;classif&apos; &amp;amp; predict_type == &apos;prob&apos;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 7 x 7&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;key&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;label&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;task_type&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;packages&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;predict_type&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;properties&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;task_properties&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.logloss  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Log Loss                                  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3        , mlr3measures&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;prob&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;weights&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.mauc_au1p&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Weighted average 1 vs. 1 multiclass AUC   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3        , mlr3measures&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;prob&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.mauc_au1u&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Average 1 vs. 1 multiclass AUC            &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3        , mlr3measures&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;prob&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.mauc_aunp&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Weighted average 1 vs. rest multiclass AUC&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3        , mlr3measures&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;prob&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.mauc_aunu&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Average 1 vs. rest multiclass AUC         &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3        , mlr3measures&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;prob&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.mauc_mu  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Multiclass mu AUC                         &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3        , mlr3measures&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;prob&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.mbrier   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Multiclass Brier Score                    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3        , mlr3measures&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;prob&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;这里使用了3种评估器
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;classif.mbrier&lt;/code&gt;：用预测概率与真实值之间的平方差评估&lt;code&gt;prob&lt;/code&gt;的预测结果&lt;/li&gt;
&lt;li&gt;&lt;code&gt;classif.logloss&lt;/code&gt;：用真实类别的预测概率的负对数评估&lt;code&gt;prob&lt;/code&gt;的预测结果&lt;/li&gt;
&lt;li&gt;&lt;code&gt;classif.acc&lt;/code&gt;：评估&lt;code&gt;response&lt;/code&gt;的预测分类结果&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;gc.lrnC.rpart.pred$score(msrs(c(&apos;classif.mbrier&apos;, &apos;classif.logloss&apos;, &apos;classif.acc&apos;)))
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;混淆矩阵&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Prediction$confution&lt;/code&gt;查看混淆矩阵&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;gc.lrnC.rpart.pred$confusion
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;        truth
response good bad
    good  177  45
    bad    41  37
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;通过&lt;code&gt;autoplot(Prediction)&lt;/code&gt;可视化混淆矩阵&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;autoplot(gc.lrnC.rpart.pred)
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;阈值设定&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Prediction$set_threshold()&lt;/code&gt;设定阈值
&lt;ul&gt;
&lt;li&gt;阈值是&lt;strong&gt;判断为正类&lt;/strong&gt;的阈值，因此需要正确设置正类&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;gc.lrnC.rpart.pred$set_threshold(YourThreshold)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;多元分类&lt;/h3&gt;
&lt;h4&gt;Outcome的分类&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;peng.tskC$class_names
peng.tskC$properties
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&apos;Adelie&apos;&apos;Chinstrap&apos;&apos;Gentoo&apos;
&apos;multiclass&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;没有定义正类&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;定义了反而会报错的&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;peng.tskC$positive &amp;lt;- &apos;Adelie&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;Error in (function (rhs) : Setting the positive class is only feasible for binary classification
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;对真实值-预测值进行绘图&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;autoplot(peng.tskC, type = &apos;duo&apos;) +
  theme(strip.text.y = element_text(angle = -45, size = 8))
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;预测结果&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;# peng.tskC.splits &amp;lt;- partition(peng.tskC,ratio = 0.7) # 事先设定好

peng.lrnC.rpart &amp;lt;- lrn(&apos;classif.rpart&apos;, predict_type = &apos;response&apos;)
peng.lrnC.rpart$train(peng.tskC, peng.tskC.splits$train)
peng.lrnC.rpart.pred &amp;lt;- peng.lrnC.rpart$predict(peng.tskC, peng.lrnC.splits$test)
peng.lrnC.rpart.pred
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[36m--[39m [1m[34m&amp;lt;PredictionClassif&amp;gt;[39m for [34m103[39m observations:[22m [36m-----------------------------------[39m
 row_ids     truth  response
      11    Adelie    Adelie
      13    Adelie    Adelie
      14    Adelie    Adelie
     ---       ---       ---
     326 Chinstrap Chinstrap
     331 Chinstrap    Adelie
     338 Chinstrap Chinstrap
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;# peng.tskC.splits &amp;lt;- partition(peng.tskC,ratio = 0.7) # 事先设定好

peng.lrnC.rpart &amp;lt;- lrn(&apos;classif.rpart&apos;, predict_type = &apos;prob&apos;)
peng.lrnC.rpart$train(peng.tskC, peng.tskC.splits$train)
peng.lrnC.rpart.pred &amp;lt;- peng.lrnC.rpart$predict(peng.tskC, peng.lrnC.splits$test)
peng.lrnC.rpart.pred
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[36m--[39m [1m[34m&amp;lt;PredictionClassif&amp;gt;[39m for [34m103[39m observations:[22m [36m-----------------------------------[39m
 row_ids     truth  response prob.Adelie prob.Chinstrap prob.Gentoo
      11    Adelie    Adelie   0.9537037     0.01851852  0.02777778
      13    Adelie    Adelie   0.9537037     0.01851852  0.02777778
      14    Adelie    Adelie   0.9537037     0.01851852  0.02777778
     ---       ---       ---         ---            ---         ---
     326 Chinstrap Chinstrap   0.0000000     1.00000000  0.00000000
     331 Chinstrap    Adelie   0.9537037     0.01851852  0.02777778
     338 Chinstrap Chinstrap   0.0000000     1.00000000  0.00000000
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;模型评估&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;寻找支持多元分类并用于评估概率的评估器&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;as.data.table(msr())[
    task_type == &apos;classif&apos; &amp;amp; predict_type == &apos;prob&apos; &amp;amp;
    !sapply(task_properties, function(x) return(&apos;twoclass&apos; %in% x))]
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;peng.lrnC.rpart.pred$score(msrs(c(&apos;classif.mbrier&apos;, &apos;classif.logloss&apos;, &apos;classif.acc&apos;)))
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;混淆矩阵&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Prediction$confution&lt;/code&gt;查看混淆矩阵&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;gc.lrnC.rpart.pred$confusion
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;        truth
response good bad
    good  177  45
    bad    41  37
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;通过&lt;code&gt;autoplot(Prediction)&lt;/code&gt;可视化混淆矩阵&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;autoplot(gc.lrnC.rpart.pred)
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;阈值设定&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Prediction$set_threshold()&lt;/code&gt;设定阈值&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;与二元分类不同的是，多元分类需要&lt;strong&gt;给每一个分类&lt;/strong&gt;单独设置一个阈值&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在多分类问题中阈值化的工作原理&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;首先为 &lt;code&gt;n&lt;/code&gt; 个类别中的每个类别分配一个阈值，&lt;br /&gt;
将每个类别的预测概率除以这些阈值，&lt;br /&gt;
以返回 &lt;code&gt;n&lt;/code&gt; 个比率，然后选择比率最高的类别&lt;br /&gt;
（这里的阈值其实就是权重了，阈值越小，权重越高）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;通过传递一个命名向量进行更改&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 随便设置
peng.lrnC.rpart.pred$set_threshold(c(
 &apos;Adelie&apos; = 0.8,
 &apos;Chinstrap&apos; = 0.5,
 &apos;Gentoo&apos; = 0.2
))
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;逆加权设定阈值
&lt;ul&gt;
&lt;li&gt;将新阈值设置为训练集中每个类别的比例&lt;/li&gt;
&lt;li&gt;在选择比率最高的标签之前，用预测概率除以这些类别比例&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 逆加权法设置
peng.lrnC.rpart.pred$set_threshold(
 peng.tskC$truth(peng.tskC.splits$train) %&amp;gt;% 
  table() %&amp;gt;% 
  proportions()
)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;定义数据role&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Task$col_roles&lt;/code&gt;能显示所有的role&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;peng.tskC$col_roles
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;$feature
&apos;bill_depth&apos;&apos;bill_length&apos;&apos;flipper_length&apos;&apos;island&apos;&apos;sex&apos;&apos;year&apos;&apos;body_mass&apos;
$target
&apos;species&apos;
$name
$order
$stratum
$group
$offset
$weights_learner
$weights_measure
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;通过&lt;code&gt;Task$set_col_roles(&apos;col&apos;, roles = &apos;role&apos;)&lt;/code&gt;来重新定义&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;set_col_roles(&apos;body_mass&apos;, roles = &apos;feature&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;留出法与评估&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;留出法就是&lt;code&gt;partition()&lt;/code&gt;的简单划分方法&lt;/li&gt;
&lt;li&gt;评估&lt;code&gt;Prediction$score&lt;/code&gt;是用来估计最终模型的&lt;strong&gt;泛化能力&lt;/strong&gt;
&lt;img src=&quot;./image_3.png&quot; alt=&quot;image_3&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;重采样&lt;/h2&gt;
&lt;h3&gt;简介&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;./image_4.png&quot; alt=&quot;image_4&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;k折交叉验证（k-fold cross-validation, CV）&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;将数据集拆分为k折，其中k-1折用于模型训练，剩下1折用于测试数据&lt;/li&gt;
&lt;li&gt;过程重复进行，直到每一折都被作为测试集使用一次&lt;/li&gt;
&lt;li&gt;将k个模型的性估计值汇总，通常取平均值&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;留一法交叉验证（leave-one-out cross-validation, LOO-CV）&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;CV的变体，用于测试集的数据不是一折而是&lt;strong&gt;一个样本&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;子采样（subsampling）&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;按一定比例&lt;strong&gt;无放回&lt;/strong&gt;地抽取数据用作训练集，剩余的样本作为测试集&lt;/li&gt;
&lt;li&gt;与CV不同的是，每次抽取都是随机的，意味着有的样本会被重复抽取&lt;/li&gt;
&lt;li&gt;平均而言，在自助采样过程中，&lt;br /&gt;
$1-e^{-1} \simeq 63.2%$ 的数据点将包含在训练集中，&lt;br /&gt;
这些数据点被称为 “袋内” 样本（另外36.8% 被称为 “袋外” 样本）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自助采样（bootstrapping）&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;类似于子采样，但是抽取样本是&lt;strong&gt;有放回的&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;自助法已经不太常用，&lt;br /&gt;
因为训练数据中的重复观测在某些机器学习设置中会导致问题，&lt;br /&gt;
特别是与模型选择方法和嵌套重采样结合时&lt;br /&gt;
（因为在嵌套方案中，重复观测可能会同时出现在训练集和测试集中）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./image_6.png&quot; alt=&quot;image_6&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://mlr3book.mlr-org.com/chapters/chapter3/evaluation_and_benchmarking.html&quot;&gt;三重交叉验证示意图&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;构建重采样策略&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;查看所有重采样策略&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;mlr_resamplings %&amp;gt;% as.data.table()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 9 x 4&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;key&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;label&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;params&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;iters&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;bootstrap  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Bootstrap                    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;ratio  , repeats&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 30&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;custom     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Custom Splits                &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; NA&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;custom_cv  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Custom Split Cross-Validation&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; NA&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;cv         &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Cross-Validation             &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;folds&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 10&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;holdout    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Holdout                      &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;ratio&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;  1&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;insample   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Insample Resampling          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;  1&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;loo        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Leave-One-Out                &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; NA&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;repeated_cv&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Repeated Cross-Validation    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;folds  , repeats&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;100&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;subsampling&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Subsampling                  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;ratio  , repeats&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 30&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;创建&lt;code&gt;Resampling&lt;/code&gt;对象&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;rsmp(&apos;cv&apos;, folds = 5)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[36m--[39m [1m[34m&amp;lt;ResamplingCV&amp;gt;[39m : Cross-Validation[22m [36m-------------------------------------------[39m
* Iterations: [34m5[39m
* Instantiated: [34mFALSE[39m
* Parameters: folds=5
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Resampling&lt;/code&gt;对象也有参数可以设定
&lt;ul&gt;
&lt;li&gt;可以用&lt;code&gt;Resampling$param_set&lt;/code&gt;查看&lt;/li&gt;
&lt;li&gt;也能用&lt;code&gt;rsmp.cv$param_set$set_values()&lt;/code&gt;重新设定参数&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;rsmp.cv &amp;lt;- rsmp(&apos;cv&apos;)
rsmp.cv$param_set
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;ParamSet(1)&amp;gt;
       id    class lower upper nlevels        default  value
   &amp;lt;char&amp;gt;   &amp;lt;char&amp;gt; &amp;lt;int&amp;gt; &amp;lt;num&amp;gt;   &amp;lt;num&amp;gt;         &amp;lt;list&amp;gt; &amp;lt;list&amp;gt;
1:  folds ParamInt     2   Inf     Inf &amp;lt;NoDefault[0]&amp;gt;     10
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;rsmp.cv$param_set$set_values(folds = 5)
rsmp.cv$param_set
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;ParamSet(1)&amp;gt;
       id    class lower upper nlevels        default  value
   &amp;lt;char&amp;gt;   &amp;lt;char&amp;gt; &amp;lt;int&amp;gt; &amp;lt;num&amp;gt;   &amp;lt;num&amp;gt;         &amp;lt;list&amp;gt; &amp;lt;list&amp;gt;
1:  folds ParamInt     2   Inf     Inf &amp;lt;NoDefault[0]&amp;gt;      5
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Resampling$instantiate(Task)&lt;/code&gt;可以手动构建重采样策略，&lt;br /&gt;
生成所有的训练集-测试集拆分&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;rsmp.cv &amp;lt;- rsmp(&apos;cv&apos;, folds = 5)
rsmp.cv$instantiate(peng.tskC)

# 第一个训练集中前五个样本
rsmp.cv$train_set(1)[1:5]
# 第三个测试集中前五个样本
rsmp.cv$test_set(3)[1:5]
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;执行重采样&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;使用&lt;code&gt;resample()&lt;/code&gt;执行重采样，参数依次为&lt;code&gt;Task&lt;/code&gt;，&lt;code&gt;Learner&lt;/code&gt;，&lt;code&gt;Resampling&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;注意，这里的&lt;code&gt;Learner&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;peng.lrnC.rpart.rr &amp;lt;- resample(peng.tskC, peng.lrnC.rpart, rsmp.cv)
peng.lrnC.rpart.rr
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;
[36m--[39m [1m[34m&amp;lt;ResampleResult&amp;gt;[39m with [34m5[39m resampling iterations[22m [36m-------------------------------[39m
  task_id    learner_id resampling_id iteration     prediction_test warnings
 penguins classif.rpart            cv         1 &amp;lt;PredictionClassif&amp;gt;        0
 penguins classif.rpart            cv         2 &amp;lt;PredictionClassif&amp;gt;        0
 penguins classif.rpart            cv         3 &amp;lt;PredictionClassif&amp;gt;        0
 penguins classif.rpart            cv         4 &amp;lt;PredictionClassif&amp;gt;        0
 penguins classif.rpart            cv         5 &amp;lt;PredictionClassif&amp;gt;        0
 errors
      0
      0
      0
      0
      0
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;默认是不储存所有训练出来的模型的，&lt;br /&gt;
如果要储存，则需要指定参数&lt;code&gt;store_models = TRUE&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;peng.lrnC.rpart.rr &amp;lt;- resample(peng.tskC, peng.lrnC.rpart, rsmp.cv, store_models = TRUE)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;查看精准度评估结果&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 分开的结果
peng.lrnC.rpart.rr$score(msr(&apos;classif.acc&apos;))
# 整合结果
peng.lrnC.rpart.rr$aggregate(msr(&apos;classif.acc&apos;))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A rr_score: 5 x 9&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;task&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;task_id&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;learner&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;learner_id&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;resampling&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;resampling_id&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;iteration&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;prediction_test&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;classif.acc&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x10a09dc58&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;penguins&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x10c5640f0&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.rpart&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x118978278&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x11964f5b8&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.9130435&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x10a09dc58&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;penguins&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x139a15978&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.rpart&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x118978278&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x119767f20&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.9130435&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x10a09dc58&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;penguins&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x1395c69e0&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.rpart&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x118978278&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x1099dbc90&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.9710145&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x10a09dc58&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;penguins&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x1391f6740&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.rpart&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x118978278&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x11a3bea58&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.9710145&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x10a09dc58&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;penguins&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x1380535f0&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.rpart&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x118978278&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x10d1c6e00&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.9411765&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;classif.acc: 0.941858482523444
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;默认的整合方式是使用平均值，这里也可以指定其他方式
&lt;ul&gt;
&lt;li&gt;这里用的是微平均（micro average）
&lt;ul&gt;
&lt;li&gt;把重采样迭代中的预测结果合并到一个 &lt;code&gt;Prediction&lt;/code&gt; 对象中，&lt;br /&gt;
然后直接在此对象上计算指标&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;默认的聚合方法类型可以通过查询&lt;code&gt;Measure&lt;/code&gt;对象的&lt;code&gt;$average&lt;/code&gt;字段来找到&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;peng.lrnC.rpart.rr$aggregate(msr(&apos;classif.acc&apos;, average = &apos;micro&apos;))
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;classif.acc: 0.941860465116279
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;msr(&apos;classif.ce&apos;)$average
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&apos;macro&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;宏平均和微平均的详细&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# macro
mean(mean(c(3, 5, 9)), mean(c(1, 5)))

# micro
mean(c(3, 5, 9, 1, 5))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./image_7.png&quot; alt=&quot;image_7&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;$score()&lt;/code&gt; 与 &lt;code&gt;$aggregate()&lt;/code&gt; 之间差异的示例：前者在每次重采样迭代中将预测结果聚合为单个分数，而后者则在所有重采样迭代中聚合分数&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;可以用&lt;code&gt;autoplot.ResampleResult()&lt;/code&gt;生成重采样的结果&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;autoplot(peng.lrnC.rpart.rr, type = &apos;boxplot&apos;)
autoplot(peng.lrnC.rpart.rr, type = &apos;histogram&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;重采样结果对象&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ResampleResult$$prediction()&lt;/code&gt;打印单个模型的预测结果，&lt;br /&gt;
这个结果是整合了全部模型预测的结果
&lt;ul&gt;
&lt;li&gt;组合后的预测对象可用于手动计算微平均性能估计值&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ResampleResult$$predictions()&lt;/code&gt;分别打印所有模型的预测结果&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;peng.lrnC.rpart.rr$prediction()
peng.lrnC.rpart.rr$predictions()
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[36m--[39m [1m[34m&amp;lt;PredictionClassif&amp;gt;[39m for [34m344[39m observations:[22m [36m-----------------------------------[39m
 row_ids     truth  response prob.Adelie prob.Chinstrap prob.Gentoo
       7    Adelie    Adelie  0.98290598     0.01709402  0.00000000
       9    Adelie    Adelie  0.98290598     0.01709402  0.00000000
      16    Adelie    Adelie  0.98290598     0.01709402  0.00000000
     ---       ---       ---         ---            ---         ---
     320 Chinstrap Chinstrap  0.05454545     0.92727273  0.01818182
     338 Chinstrap Chinstrap  0.05454545     0.92727273  0.01818182
     344 Chinstrap Chinstrap  0.05454545     0.92727273  0.01818182
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[[1]]

[36m--[39m [1m[34m&amp;lt;PredictionClassif&amp;gt;[39m for [34m69[39m observations:[22m [36m------------------------------------[39m
 row_ids     truth  response prob.Adelie prob.Chinstrap prob.Gentoo
       7    Adelie    Adelie  0.98290598     0.01709402  0.00000000
       9    Adelie    Adelie  0.98290598     0.01709402  0.00000000
      16    Adelie    Adelie  0.98290598     0.01709402  0.00000000
     ---       ---       ---         ---            ---         ---
     315 Chinstrap Chinstrap  0.05882353     0.92156863  0.01960784
     317 Chinstrap Chinstrap  0.28571429     0.57142857  0.14285714
     335 Chinstrap Chinstrap  0.05882353     0.92156863  0.01960784

[[2]]

[36m--[39m [1m[34m&amp;lt;PredictionClassif&amp;gt;[39m for [34m69[39m observations:[22m [36m------------------------------------[39m
 row_ids     truth  response prob.Adelie prob.Chinstrap prob.Gentoo
       4    Adelie    Adelie  0.97580645     0.02419355    0.000000
      12    Adelie    Adelie  0.97580645     0.02419355    0.000000
      25    Adelie    Adelie  0.97580645     0.02419355    0.000000
     ---       ---       ---         ---            ---         ---
     334 Chinstrap Chinstrap  0.08000000     0.92000000    0.000000
     340 Chinstrap    Gentoo  0.00990099     0.02970297    0.960396
     343 Chinstrap    Gentoo  0.00990099     0.02970297    0.960396

[[3]]

[36m--[39m [1m[34m&amp;lt;PredictionClassif&amp;gt;[39m for [34m69[39m observations:[22m [36m------------------------------------[39m
 row_ids     truth  response prob.Adelie prob.Chinstrap prob.Gentoo
       5    Adelie    Adelie   0.9669421     0.03305785  0.00000000
      10    Adelie    Adelie   0.9669421     0.03305785  0.00000000
      14    Adelie    Adelie   0.9669421     0.03305785  0.00000000
     ---       ---       ---         ---            ---         ---
     322 Chinstrap Chinstrap   0.0754717     0.90566038  0.01886792
     337 Chinstrap Chinstrap   0.2500000     0.50000000  0.25000000
     339 Chinstrap Chinstrap   0.0754717     0.90566038  0.01886792

[[4]]

[36m--[39m [1m[34m&amp;lt;PredictionClassif&amp;gt;[39m for [34m69[39m observations:[22m [36m------------------------------------[39m
 row_ids     truth  response prob.Adelie prob.Chinstrap prob.Gentoo
       8    Adelie    Adelie  0.96124031     0.03875969   0.0000000
      21    Adelie    Adelie  0.96124031     0.03875969   0.0000000
      22    Adelie    Adelie  0.96124031     0.03875969   0.0000000
     ---       ---       ---         ---            ---         ---
     336 Chinstrap Chinstrap  0.06382979     0.91489362   0.0212766
     341 Chinstrap    Adelie  0.96124031     0.03875969   0.0000000
     342 Chinstrap Chinstrap  0.06382979     0.91489362   0.0212766

[[5]]

[36m--[39m [1m[34m&amp;lt;PredictionClassif&amp;gt;[39m for [34m68[39m observations:[22m [36m------------------------------------[39m
 row_ids     truth  response prob.Adelie prob.Chinstrap prob.Gentoo
       1    Adelie    Adelie  0.96363636     0.03636364  0.00000000
       2    Adelie    Adelie  0.96363636     0.03636364  0.00000000
       3    Adelie    Adelie  0.96363636     0.03636364  0.00000000
     ---       ---       ---         ---            ---         ---
     320 Chinstrap Chinstrap  0.05454545     0.92727273  0.01818182
     338 Chinstrap Chinstrap  0.05454545     0.92727273  0.01818182
     344 Chinstrap Chinstrap  0.05454545     0.92727273  0.01818182
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;如果在重采样时指定了 &lt;code&gt;store_models = TRUE&lt;/code&gt;，&lt;br /&gt;
也可以同理调出学习器&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ResampleResult$learner&lt;/code&gt;并不是聚合后的学习器，&lt;br /&gt;
而是&lt;strong&gt;最终选择出来的模型&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;peng.lrnC.rpart.rr$learner
peng.lrnC.rpart.rr$learners
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[36m--[39m [1m[34m&amp;lt;LearnerClassifRpart&amp;gt;[39m (classif.rpart): Classification Tree[22m [36m------------------[39m
* Model: -
* Parameters: xval=0
* Packages: [34mmlr3[39m and [34mrpart[39m
* Predict Types: response and [prob]
* Feature Types: logical, integer, numeric, factor, and ordered
* Encapsulation: none (fallback: -)
* Properties: importance, missings, multiclass, selected_features, twoclass,
and weights
* Other settings: use_weights = &apos;use&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[[1]]

[36m--[39m [1m[34m&amp;lt;LearnerClassifRpart&amp;gt;[39m (classif.rpart): Classification Tree[22m [36m------------------[39m
* Model: rpart
* Parameters: xval=0
* Packages: [34mmlr3[39m and [34mrpart[39m
* Predict Types: response and [prob]
* Feature Types: logical, integer, numeric, factor, and ordered
* Encapsulation: none (fallback: -)
* Properties: importance, missings, multiclass, selected_features, twoclass,
and weights
* Other settings: use_weights = &apos;use&apos;

[[2]]

[36m--[39m [1m[34m&amp;lt;LearnerClassifRpart&amp;gt;[39m (classif.rpart): Classification Tree[22m [36m------------------[39m
* Model: rpart
* Parameters: xval=0
* Packages: [34mmlr3[39m and [34mrpart[39m
* Predict Types: response and [prob]
* Feature Types: logical, integer, numeric, factor, and ordered
* Encapsulation: none (fallback: -)
* Properties: importance, missings, multiclass, selected_features, twoclass,
and weights
* Other settings: use_weights = &apos;use&apos;

[[3]]

[36m--[39m [1m[34m&amp;lt;LearnerClassifRpart&amp;gt;[39m (classif.rpart): Classification Tree[22m [36m------------------[39m
* Model: rpart
* Parameters: xval=0
* Packages: [34mmlr3[39m and [34mrpart[39m
* Predict Types: response and [prob]
* Feature Types: logical, integer, numeric, factor, and ordered
* Encapsulation: none (fallback: -)
* Properties: importance, missings, multiclass, selected_features, twoclass,
and weights
* Other settings: use_weights = &apos;use&apos;

[[4]]

[36m--[39m [1m[34m&amp;lt;LearnerClassifRpart&amp;gt;[39m (classif.rpart): Classification Tree[22m [36m------------------[39m
* Model: rpart
* Parameters: xval=0
* Packages: [34mmlr3[39m and [34mrpart[39m
* Predict Types: response and [prob]
* Feature Types: logical, integer, numeric, factor, and ordered
* Encapsulation: none (fallback: -)
* Properties: importance, missings, multiclass, selected_features, twoclass,
and weights
* Other settings: use_weights = &apos;use&apos;

[[5]]

[36m--[39m [1m[34m&amp;lt;LearnerClassifRpart&amp;gt;[39m (classif.rpart): Classification Tree[22m [36m------------------[39m
* Model: rpart
* Parameters: xval=0
* Packages: [34mmlr3[39m and [34mrpart[39m
* Predict Types: response and [prob]
* Feature Types: logical, integer, numeric, factor, and ordered
* Encapsulation: none (fallback: -)
* Properties: importance, missings, multiclass, selected_features, twoclass,
and weights
* Other settings: use_weights = &apos;use&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;可以用&lt;code&gt;lapply()&lt;/code&gt;查看每个模型中变量重要度&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 查看全部
lapply(
 peng.lrnC.rpart.rr$learners[2:3], 
 function(x) return(x$model$variable.importance)
)

# 选择子集
lapply(
 peng.lrnC.rpart.rr$learners[2:3], 
 function(x) return(x$model$variable.importance)
)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;自定义重采样&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;rsmp(&apos;custom&apos;)&lt;/code&gt;用于构建&lt;strong&gt;留出重采样&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;留出重采样需要手动构建样本ID&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;peng.rs.ho &amp;lt;- rsmp(&apos;custom&apos;)
peng.rs.ho.trainSets &amp;lt;- c(1:5, 153:158, 277:280)
peng.rs.ho$instantiate(
 peng.tskC,
 train = list(peng.rs.ho.trainSets, peng.rs.ho.trainSets + 5),
 test = list(peng.rs.ho.trainSets + 15, peng.rs.ho.trainSets + 25)
)
resample(peng.tskC, peng.lrnC.rpart, peng.rr.ho)$prediction()
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[36m--[39m [1m[34m&amp;lt;PredictionClassif&amp;gt;[39m for [34m30[39m observations:[22m [36m------------------------------------[39m
 row_ids     truth response prob.Adelie prob.Chinstrap prob.Gentoo
      16    Adelie   Gentoo   0.3333333      0.2666667         0.4
      17    Adelie   Gentoo   0.3333333      0.2666667         0.4
      18    Adelie   Gentoo   0.3333333      0.2666667         0.4
     ---       ---      ---         ---            ---         ---
     303 Chinstrap   Gentoo   0.3333333      0.2666667         0.4
     304 Chinstrap   Gentoo   0.3333333      0.2666667         0.4
     305 Chinstrap   Gentoo   0.3333333      0.2666667         0.4
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;rsmp(&apos;custom_cv&apos;)&lt;/code&gt;用于构建&lt;strong&gt;CV重采样&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 仅选用4个样本，分别是第1，100，200，300行
peng.tskC_small &amp;lt;- peng.tskC$filter(c(1, 100, 200, 300))
peng.rs.ccv &amp;lt;- rsmp(&apos;custom_cv&apos;)
# 第1，3行为训练集，2，4行为测试集
peng.rs.ccv.folds &amp;lt;- as.factor(c(1, 2, 1, 2))
peng.rs.ccv$instantiate(tskC_small, f = peng.rs.ccv.folds)
resample(peng.tskC_small, peng.lrnC.rpart, peng.rs.ccv)$predictions()
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;Error in frame$yval2[where, 1L + nclass + 1L:nclass, drop = FALSE]: subscript out of bounds
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;由于上面莫名其妙地报错，所以用了个新的&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# `$filter`是就地修改，如果改了的话运行：
# peng.tskC &amp;lt;- tsk(&apos;penguins&apos;)
peng.tskC2 &amp;lt;- peng.tskC$clone()
peng.rs.ccv &amp;lt;- rsmp(&apos;custom_cv&apos;)
peng.rs.ccv.folds &amp;lt;- as.factor(c(rep(1,244),rep(2,100)))
peng.rs.ccv$instantiate(peng.tskC2, f = peng.rs.ccv.folds)
resample(peng.tskC2, peng.lrnC.rpart, peng.rs.ccv)$predictions()
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[[1]]

[36m--[39m [1m[34m&amp;lt;PredictionClassif&amp;gt;[39m for [34m244[39m observations:[22m [36m-----------------------------------[39m
 row_ids  truth  response prob.Adelie prob.Chinstrap prob.Gentoo
       1 Adelie Chinstrap           0              1           0
       2 Adelie Chinstrap           0              1           0
       3 Adelie Chinstrap           0              1           0
     ---    ---       ---         ---            ---         ---
     242 Gentoo    Gentoo           0              0           1
     243 Gentoo    Gentoo           0              0           1
     244 Gentoo    Gentoo           0              0           1

[[2]]

[36m--[39m [1m[34m&amp;lt;PredictionClassif&amp;gt;[39m for [34m100[39m observations:[22m [36m-----------------------------------[39m
 row_ids     truth response prob.Adelie prob.Chinstrap prob.Gentoo
     245    Gentoo   Gentoo   0.0212766              0   0.9787234
     246    Gentoo   Gentoo   0.0212766              0   0.9787234
     247    Gentoo   Gentoo   0.0212766              0   0.9787234
     ---       ---      ---         ---            ---         ---
     342 Chinstrap   Adelie   1.0000000              0   0.0000000
     343 Chinstrap   Gentoo   0.0212766              0   0.9787234
     344 Chinstrap   Adelie   1.0000000              0   0.0000000
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;重采样中的分组与分层&lt;/h3&gt;
&lt;h4&gt;分组重采样&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;在一些特定的情形下，分组是至关重要的：
&lt;ul&gt;
&lt;li&gt;纵向研究中，对同一个个体进行多个时间点测量，&lt;br /&gt;
如果不分组，可能会高估模型的泛化，&lt;br /&gt;
因为同一个个体的观测值可能同时出现在训练集和测试集中&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;peng.tskC &amp;lt;-  tsk(&apos;penguins&apos;)
peng.tskC$set_col_roles(&apos;year&apos;, &apos;group&apos;)

peng.rs.loo &amp;lt;- rsmp(&apos;loo&apos;)
peng.rs.loo$instantiate(peng.tskC)

table(peng.tskC$data(rows = peng.rs.loo$train_set(1), cols = &apos;year&apos;))
table(peng.tskC$data(rows = peng.rs.loo$test_set(1), cols = &apos;year&apos;))
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;year
2007 2008 
 110  114 

year
2009 
 120 
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;用CV试了下&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;peng.tskC &amp;lt;-  tsk(&apos;penguins&apos;)
peng.tskC$set_col_roles(&apos;year&apos;, &apos;group&apos;)

peng.rs.cv &amp;lt;- rsmp(&apos;cv&apos;)
peng.rs.cv$instantiate(peng.tskC)

table(peng.tskC$data(rows = peng.rs.cv$train_set(1), cols = &apos;year&apos;))
table(peng.tskC$data(rows = peng.rs.cv$test_set(1), cols = &apos;year&apos;))
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;year
2008 2009 
 114  120 

year
2007 
 110 
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;上面可以看得出，&lt;br /&gt;
2008，2009年的数据分配到了&lt;strong&gt;训练集&lt;/strong&gt;，&lt;br /&gt;
而2007的数据分配到了&lt;strong&gt;测试集&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;所以&lt;code&gt;factor&lt;/code&gt;的第一级会分配到测试集中&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;分层重采样&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;分层能够确保在训练集与测试集中样本的&lt;strong&gt;特征分布是相同&lt;/strong&gt;的，&lt;br /&gt;
以保证泛化能力较小的偏差&lt;/li&gt;
&lt;li&gt;当不平衡情况严重时，少数类&lt;strong&gt;可能根本不会出现&lt;/strong&gt;在训练集中
&lt;ul&gt;
&lt;li&gt;因此，这些重采样迭代中的中间模型将永远不会预测缺失的类，&lt;br /&gt;
从而导致对任何没有分层的重采样策略的性能估计产生误导&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;依然用&lt;code&gt;Task$set_col_roles()&lt;/code&gt;指定&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;peng.tskC &amp;lt;-  tsk(&apos;penguins&apos;)
peng.tskC$set_col_roles(&apos;species&apos;, c(&apos;target&apos;, &apos;stratum&apos;))

peng.rs.cv &amp;lt;- rsmp(&apos;cv&apos;, folds = 10)
peng.rs.cv$instantiate(peng.tskC)

fold1 = prop.table(table(peng.tskC$data(rows = peng.rs.cv$test_set(1),
  cols = &apos;species&apos;)))
fold2 = prop.table(table(peng.tskC$data(rows = peng.rs.cv$test_set(2),
  cols = &apos;species&apos;)))

rbind(&apos;Fold 1&apos; = fold1, &apos;Fold 2&apos; = fold2)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A matrix: 2 x 3 of type dbl&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;Adelie&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;Chinstrap&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;Gentoo&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;Fold 1&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;0.4444444&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.1944444&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.3611111&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;Fold 2&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;0.4444444&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.1944444&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.3611111&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;基准测试&lt;/h2&gt;
&lt;h3&gt;&lt;code&gt;benchmark()&lt;/code&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;benchmark()&lt;/code&gt;可以执行在每个&lt;code&gt;Task&lt;/code&gt;和&lt;code&gt;Learner&lt;/code&gt;上的重采样&lt;code&gt;resample()&lt;/code&gt;，&lt;br /&gt;
然后手机它们的结果&lt;/li&gt;
&lt;li&gt;首先调用&lt;code&gt;benchmark_grid()&lt;/code&gt;函数构建一个&lt;br /&gt;
不同&lt;code&gt;Task&lt;/code&gt;，&lt;code&gt;Learner&lt;/code&gt;，和&lt;code&gt;Resampling&lt;/code&gt;的策略组合&lt;/li&gt;
&lt;li&gt;（懒得改变量名了，就用教程给的）&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 这里`tasks`是一个`list`
# 使用本地文件可以先`as_task_*()`构建好任务，再用`list()`列表化
tasks &amp;lt;- tsks(c(&apos;german_credit&apos;, &apos;sonar&apos;)) 
learners &amp;lt;- lrns(c(&apos;classif.rpart&apos;, &apos;classif.ranger&apos;,
  &apos;classif.featureless&apos;), predict_type = &apos;prob&apos;)
rsmp_cv5 &amp;lt;- rsmp(&apos;cv&apos;, folds = 5)

design &amp;lt;- benchmark_grid(tasks, learners, rsmp_cv5)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;本来用&lt;code&gt;head()&lt;/code&gt;可以看的，但是在VS code的 jupyter 里好像用不了，&lt;br /&gt;
所以换了种&lt;code&gt;print()&lt;/code&gt;的方式&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;design %&amp;gt;% head()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A benchmark_grid: 6 x 3&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;task&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;learner&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;resampling&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x14a4fe818&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x13ad80320&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x10b13e698&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x14a4fe818&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x139489040&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x10b13e698&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x14a4fe818&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x10df71690&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x10b13e698&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x14c562668&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x13ad80320&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x10fe429c0&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x14c562668&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x139489040&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x10fe429c0&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x14c562668&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x10df71690&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x10fe429c0&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;print(design, cols =ncol(design))
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;            task             learner resampling
          &amp;lt;char&amp;gt;              &amp;lt;char&amp;gt;     &amp;lt;char&amp;gt;
1: german_credit       classif.rpart         cv
2: german_credit      classif.ranger         cv
3: german_credit classif.featureless         cv
4:         sonar       classif.rpart         cv
5:         sonar      classif.ranger         cv
6:         sonar classif.featureless         cv
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;这里可以看到&lt;code&gt;design&lt;/code&gt;就是一个&lt;code&gt;data.table&lt;/code&gt;，&lt;br /&gt;
生成的原理也类似于&lt;code&gt;expand_grid()&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;内容也可以手动进行修改&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;默认情况下，&lt;code&gt;benchmark_grid()&lt;/code&gt; 会在任务上实例化重采样，&lt;br /&gt;
这意味着会生成具体的训练 - 测试分割&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;由于此过程是随机的，因此有必要在调用 &lt;code&gt;benchmark_grid()&lt;/code&gt; 之前&lt;br /&gt;
&lt;strong&gt;设置随机种子&lt;/strong&gt;，以确保数据分割的可重复性&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在&lt;code&gt;benchmark_grid()&lt;/code&gt;创建基准测试设计后，&lt;br /&gt;
将设计表格传递给&lt;code&gt;benchmark()&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;bmr &amp;lt;- benchmark(design)
bmr
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[36m--[39m [1m[34m&amp;lt;BenchmarkResult&amp;gt;[39m of [34m30[39m rows with [34m6[39m resampling run[22m [36m--------------------------[39m
 nr       task_id          learner_id resampling_id iters warnings errors
  1 german_credit       classif.rpart            cv     5        0      0
  2 german_credit      classif.ranger            cv     5        0      0
  3 german_credit classif.featureless            cv     5        0      0
  4         sonar       classif.rpart            cv     5        0      0
  5         sonar      classif.ranger            cv     5        0      0
  6         sonar classif.featureless            cv     5        0      0
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;可以用&lt;code&gt;BenchmarkResult$score()&lt;/code&gt;查看每个学习器/任务/重采样组合的每一折的结果，&lt;br /&gt;
用&lt;code&gt;BenchmarkResult$aggregate()&lt;/code&gt;查看每个学习器/任务/重采样组合的每一折的结果&lt;/li&gt;
&lt;li&gt;注意，这里的&lt;code&gt;x.[rowVector,.(var1,var2,...)]&lt;/code&gt;用法是&lt;code&gt;data.table&lt;/code&gt;的独有用法&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;bmr$score()[c(1, 7, 13), .(iteration, task_id, learner_id, classif.ce)]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A bmr_score: 3 x 4&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;iteration&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;task_id&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;learner_id&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;classif.ce&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;german_credit&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.rpart      &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.29&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;german_credit&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.ranger     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.25&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;german_credit&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.featureless&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.31&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;bmr$aggregate()[, .(task_id, learner_id, classif.ce)]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A bmr_aggregate: 6 x 3&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;task_id&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;learner_id&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;classif.ce&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;german_credit&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.rpart      &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2720000&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;german_credit&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.ranger     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2420000&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;german_credit&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.featureless&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.3000000&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;sonar        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.rpart      &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2792102&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;sonar        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.ranger     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.1782811&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;sonar        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.featureless&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4670151&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;这里也可以改成其他的评估器&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;bmr$aggregate(msr(&apos;classif.acc&apos;))[, .(task_id, learner_id, classif.acc)]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A bmr_aggregate: 6 x 3&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;task_id&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;learner_id&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;classif.acc&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;german_credit&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.rpart      &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.7280000&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;german_credit&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.ranger     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.7580000&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;german_credit&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.featureless&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.7000000&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;sonar        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.rpart      &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.7207898&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;sonar        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.ranger     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.8217189&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;sonar        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.featureless&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.5329849&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;h3&gt;&lt;code&gt;BenchmarkResult&lt;/code&gt;对象&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;BenchmarkResult&lt;/code&gt;对象其实就是多个&lt;code&gt;ResampleResult&lt;/code&gt;对象的集合&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;bmrdt &amp;lt;- as.data.table(bmr)
bmrdt[1:2, .(task, learner, resampling, iteration)]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 2 x 4&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;task&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;learner&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;resampling&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;iteration&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x164aae688&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x14c201600&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x13ff88320&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x164aae688&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x14a63e1b8&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x13ff88320&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;存储的 &lt;code&gt;ResampleResult&lt;/code&gt; 可以通过 &lt;code&gt;ResampleResult$resample_result(i)&lt;/code&gt; 方法提取
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;i&lt;/code&gt;是执行的重采样实验的索引&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;rr1 &amp;lt;- bmr$resample_result(1)
rr2 &amp;lt;- bmr$resample_result(2)

rr1
rr2
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[36m--[39m [1m[34m&amp;lt;ResampleResult&amp;gt;[39m with [34m5[39m resampling iterations[22m [36m-------------------------------[39m
       task_id    learner_id resampling_id iteration     prediction_test
 german_credit classif.rpart            cv         1 &amp;lt;PredictionClassif&amp;gt;
 german_credit classif.rpart            cv         2 &amp;lt;PredictionClassif&amp;gt;
 german_credit classif.rpart            cv         3 &amp;lt;PredictionClassif&amp;gt;
 german_credit classif.rpart            cv         4 &amp;lt;PredictionClassif&amp;gt;
 german_credit classif.rpart            cv         5 &amp;lt;PredictionClassif&amp;gt;
 warnings errors
        0      0
        0      0
        0      0
        0      0
        0      0


[36m--[39m [1m[34m&amp;lt;ResampleResult&amp;gt;[39m with [34m5[39m resampling iterations[22m [36m-------------------------------[39m
       task_id     learner_id resampling_id iteration     prediction_test
 german_credit classif.ranger            cv         1 &amp;lt;PredictionClassif&amp;gt;
 german_credit classif.ranger            cv         2 &amp;lt;PredictionClassif&amp;gt;
 german_credit classif.ranger            cv         3 &amp;lt;PredictionClassif&amp;gt;
 german_credit classif.ranger            cv         4 &amp;lt;PredictionClassif&amp;gt;
 german_credit classif.ranger            cv         5 &amp;lt;PredictionClassif&amp;gt;
 warnings errors
        0      0
        0      0
        0      0
        0      0
        0      0
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ResampleResult$resample_results()&lt;/code&gt;也可以打印所有的重采样&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;bmr$resample_results
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 6 x 3&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;uhash&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;nr&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;resample_result&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;e3e12f28-dbeb-491f-9053-bf542a1a6eb7&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x13ae1b7c0&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;01b8d3a8-9d06-4520-b3d9-a43dfe6eb620&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x13ae79ba0&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;f859c5f2-80ba-4b18-8074-9fa3007c8e16&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x13ab7e918&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;c844f002-4add-428c-9bc0-6f1cd7439ffb&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x148f66558&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;bba8375a-f30e-4b44-8caa-c7b572d5b151&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x148ff9b30&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;78cfe007-fbfd-4f2d-bcd2-3fba990295b5&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;6&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x13a9f3368&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;as_benchmark_result()&lt;/code&gt; 可用于将对象从 &lt;code&gt;ResampleResult&lt;/code&gt; 转换为 &lt;code&gt;BenchmarkResult&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;c()&lt;/code&gt; 方法可用于合并多个 &lt;code&gt;BenchmarkResult&lt;/code&gt; 对象
&lt;ul&gt;
&lt;li&gt;这在多台机器上进行实验时可能会很有用&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;bmr1 &amp;lt;- as_benchmark_result(rr1)
bmr2 &amp;lt;- as_benchmark_result(rr2)

c(bmr1, bmr2)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[36m--[39m [1m[34m&amp;lt;BenchmarkResult&amp;gt;[39m of [34m10[39m rows with [34m2[39m resampling run[22m [36m--------------------------[39m
 nr       task_id     learner_id resampling_id iters warnings errors
  1 german_credit  classif.rpart            cv     5        0      0
  2 german_credit classif.ranger            cv     5        0      0
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;可视化&lt;code&gt;BenchmarkResult&lt;/code&gt;的评估结果&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;autoplot(bmr, measure = msr(&apos;classif.acc&apos;))
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;二元分类器的评估&lt;/h2&gt;
&lt;h3&gt;混淆矩阵（Confusion Matrix）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;基于混淆矩阵，可以计算以下指标
&lt;ul&gt;
&lt;li&gt;True Positive Rate (TPR), Sensitivity or Recall&lt;/li&gt;
&lt;li&gt;True Negative Rate (TNR) or Specificity&lt;/li&gt;
&lt;li&gt;False Positive Rate (FPR), or 1- Specificity&lt;/li&gt;
&lt;li&gt;Positive Predictive Value (PPV) or Precision&lt;/li&gt;
&lt;li&gt;Negative Predictive Value (NPV)&lt;/li&gt;
&lt;li&gt;Accuracy (ACC)&lt;/li&gt;
&lt;li&gt;F1-score
$$2 \times \frac{Precision \times Recall}{Precision + Recall}$$&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./image_8.png&quot; alt=&quot;image_8&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;mlr3measures::confusion_matrix()&lt;/code&gt;可以生成混淆矩阵&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 准备一下数据
gc.tskC &amp;lt;- tsk(&apos;german_credit&apos;)
gc.tskC.splits &amp;lt;- partition(gc.tskC)
gc.lrnC.ranger &amp;lt;- lrn(&apos;classif.ranger&apos;, predict_type = &apos;prob&apos;)
gc.lrnC.ranger$train(gc.tskC, row_ids = gc.tskC.splits$train)
gc.lrnC.ranger.pred &amp;lt;- gc.lrnC.ranger$predict(gc.tskC, row_ids = gc.tskC.splits$test)

# 混淆矩阵
gc.cm.ranger &amp;lt;- mlr3measures::confusion_matrix(
    truth = gc.lrnC.ranger.pred$truth,
    response = gc.lrnC.ranger.pred$response, 
    positive = gc.tskC$positive
)
gc.cm.ranger
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;        truth
response good bad
    good  207  60
    bad    26  37
acc :  0.7394; ce  :  0.2606; dor :  4.9096; f1  :  0.8280 
fdr :  0.2247; fnr :  0.1116; fomr:  0.4127; fpr :  0.6186 
mcc :  0.3128; npv :  0.5873; ppv :  0.7753; tnr :  0.3814 
tpr :  0.8884 
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;受试者工作特征曲线（ROC curve）分析&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;对于二元分类问题最常用的评估器&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;由不同阈值进行分类截断时的FPR与TPR构成的一条曲线&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ROC曲线可以由&lt;code&gt;autoplot(Prediction)&lt;/code&gt;生成&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;注意&lt;/strong&gt;：&lt;code&gt;Learner &amp;lt;- lrn(&apos;classif.*&apos;, predict_type = &apos;prob&apos;)&lt;/code&gt;&lt;br /&gt;
必须指定预测的类型为&lt;code&gt;&apos;prob&apos;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;autoplot(gc.lrnC.ranger.pred, type = &apos;roc&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;使用&lt;code&gt;msr(&apos;classif.auc&apos;)&lt;/code&gt;调用评估器AUC分析&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;gc.lrnC.ranger.pred$score(msr(&apos;classif.auc&apos;))
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;classif.auc: 0.772628921745402
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;精确率 - 召回率曲线（PRC）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;PRC能够可视化阳性预测值/精确率与真阳性率/召回率的关系&lt;/li&gt;
&lt;li&gt;PRC忽略了真阴性的数量，这在不平衡总体中很有用，&lt;br /&gt;
因为阳性类别总是少见的，因此具有高真阳性率的分类器可能仍然提供的信息不多&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;autoplot(gc.lrnC.ranger.pred, type = &apos;prc&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;使用&lt;code&gt;msr(&apos;classif.prauc&apos;)&lt;/code&gt;调用评估器PRC AUC分析&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;gc.lrnC.ranger.pred$score(msr(&apos;classif.prauc&apos;))
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;classif.prauc: 0.891557073290125
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;其他的可视化&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;可视化其他性能指标随阈值变化的关系
&lt;ul&gt;
&lt;li&gt;这里是误报率（FPR）和准确率为例&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;autoplot(gc.lrnC.ranger.pred, type = &apos;threshold&apos;, measure = msr(&apos;classif.fpr&apos;))
autoplot(gc.lrnC.ranger.pred, type = &apos;threshold&apos;, measure = msr(&apos;classif.acc&apos;))
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;上述的可视化方法同样适用于&lt;code&gt;ResampleResult&lt;/code&gt;对象&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>【mlr3】2.调优</title><link>https://nab-iak.github.io/posts/p11/p11/</link><guid isPermaLink="true">https://nab-iak.github.io/posts/p11/p11/</guid><description>mlr3调优</description><pubDate>Mon, 21 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Cover Pic by &lt;a href=&quot;https://www.pixiv.net/artworks/132528204&quot;&gt;@晕欧欧&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://mlr3book.mlr-org.com/&quot;&gt;Applied Machine Learning Using mlr3 in R&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;基本调优方法&lt;/h2&gt;
&lt;h3&gt;调优的整体流程&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;./image_1.png&quot; alt=&quot;image_1&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;模型调优（Model Tuning）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;搜索空间（search space）/调优空间（tuning space）&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;可供调整的超参数集合&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;不可调超参数&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;少数模型的训练函数提供了和训练模型不相干的超参数&lt;/li&gt;
&lt;li&gt;例如&lt;code&gt;lrn(&apos;classif.ranger&apos;)&lt;/code&gt; 中的 &lt;code&gt;verbose&lt;/code&gt; 控制训练期间向用户显示多少信息&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;对于数值型的超参数，需要指定调整的范围&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;使用&lt;code&gt;to_tune()&lt;/code&gt;来构建调整范围的下限与上限&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;learner &amp;lt;- lrn(&apos;classif.svm&apos;,
  type  = &apos;C-classification&apos;,
  kernel = &apos;radial&apos;,
  cost  = to_tune(1e-1, 1e5),
  gamma = to_tune(1e-1, 1)
)
learner
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;如果对用&lt;code&gt;to_tune()&lt;/code&gt;标记了超参数的学习器调用&lt;code&gt;Learner$train()&lt;/code&gt;的话会抛出错误&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;终止器（Terminator）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;s&gt;终结者&lt;/s&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mlr_terminators&lt;/code&gt;存储了所有终止器的种类，&lt;br /&gt;
使用 &lt;code&gt;trm()&lt;/code&gt; 创建终止器&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Terminator &amp;lt;br&amp;gt;终止器&lt;/th&gt;
&lt;th&gt;Function call and default parameters &amp;lt;br&amp;gt;函数调用和默认参数&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Clock Time &amp;lt;br&amp;gt;时钟时间&lt;/td&gt;
&lt;td&gt;&lt;code&gt;trm(&apos;clock_time&apos;)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Combo &amp;lt;br&amp;gt;组合&lt;/td&gt;
&lt;td&gt;&lt;code&gt;trm(&apos;combo&apos;, any = TRUE)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;None &amp;lt;br&amp;gt;无&lt;/td&gt;
&lt;td&gt;&lt;code&gt;trm(&apos;none&apos;)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Number of Evaluations &amp;lt;br&amp;gt;评估次数&lt;/td&gt;
&lt;td&gt;&lt;code&gt;trm(&apos;evals&apos;, n_evals = 100, k = 0)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Performance Level &amp;lt;br&amp;gt;性能水平&lt;/td&gt;
&lt;td&gt;&lt;code&gt;trm(&apos;perf_reached&apos;, level = 0.1)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Run Time &amp;lt;br&amp;gt;运行时间&lt;/td&gt;
&lt;td&gt;&lt;code&gt;trm(&apos;run_time&apos;, secs = 30)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stagnation &amp;lt;br&amp;gt;停滞&lt;/td&gt;
&lt;td&gt;&lt;code&gt;trm(&apos;stagnation&apos;, iters = 10, threshold = 0)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre&gt;&lt;code&gt;mlr_terminators %&amp;gt;% as.data.table()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 9 x 4&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;key&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;label&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;properties&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;unit&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;clock_time            &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Clock Time            &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;single-crit, multi-crit &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;seconds    &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;combo                 &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Combination           &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;single-crit, multi-crit &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;percent    &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;evals                 &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Number of Evaluation  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;single-crit, multi-crit &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;evaluations&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;none                  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;None                  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;single-crit, multi-crit &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;percent    &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;perf_reached          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Performance Level     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;single-crit&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;percent    &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;run_time              &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Run Time              &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;single-crit, multi-crit &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;seconds    &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;stagnation            &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Stagnation            &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;single-crit&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;percent    &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;stagnation_batch      &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Stagnation Batch      &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;single-crit&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;percent    &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;stagnation_hypervolume&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Stagnation Hypervolume&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;multi-crit&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;percent    &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;最常用的终止条件是在特定时间（&lt;code&gt;trm(&apos;run_time&apos;&lt;/code&gt;），&lt;br /&gt;
或给定评估次数（&lt;code&gt;trm(&apos;evals&apos;)&lt;/code&gt;）后停止调优
&lt;ul&gt;
&lt;li&gt;选择运行时间通常基于实际考虑和直觉
&lt;ul&gt;
&lt;li&gt;在计算集群上，使用时间限制可能很重要，&lt;br /&gt;
因为可能需要为计算任务指定最长运行时间&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;trm(&apos;perf_reached&apos;)&lt;/code&gt;在达到指定性能水平时停止调优
&lt;ul&gt;
&lt;li&gt;如果某个性能水平被认为足以满足模型的实际应用，这会很有帮助&lt;/li&gt;
&lt;li&gt;但是，如果设置得过于乐观，调优可能永远不会终止&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;trm(&apos;stagnation&apos;)&lt;/code&gt;在设定数量的&lt;code&gt;iterations&lt;/code&gt;中没有取得大于&lt;code&gt;threshold&lt;/code&gt;的进展时停止
&lt;ul&gt;
&lt;li&gt;对于复杂的搜索空间，阈值可能很难选择&lt;/li&gt;
&lt;li&gt;因为尽管仍有（可能很大的）改进空间，但优化可能会过早停止&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;trm(&apos;none&apos;)&lt;/code&gt;用于自行控制终止的调谐器，因此此终止条件不起作用&lt;/li&gt;
&lt;li&gt;这些终止条件中的任何一个都可以通过使用&lt;code&gt;trm(&apos;combo&apos;)&lt;/code&gt;自由组合，&lt;br /&gt;
可用于指定超参数优化在任何终止条件触发时完成（&lt;code&gt;any = TRUE&lt;/code&gt;），&lt;br /&gt;
或者在所有终止条件触发时完成（&lt;code&gt;any = FALSE&lt;/code&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;使用&lt;code&gt;ti()&lt;/code&gt;进行实例调优（Tuning Instance）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;这里用&lt;code&gt;ti()&lt;/code&gt;创建了一个单目标调优的&lt;code&gt;TuningInstanceBatchSingleCrit&lt;/code&gt;对象&lt;/li&gt;
&lt;li&gt;所谓的实例，就是将&lt;code&gt;Task&lt;/code&gt;，&lt;code&gt;Learner&lt;/code&gt;，&lt;code&gt;Resampling&lt;/code&gt;，&lt;code&gt;Measure&lt;/code&gt;，和&lt;code&gt;Terminator&lt;/code&gt;这些要素打包在一起，提供给&lt;code&gt;Tuner&lt;/code&gt;进行调优&lt;/li&gt;
&lt;li&gt;调优的结果也会储存在&lt;code&gt;Instance&lt;/code&gt;里面&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 调取预设任务`&apos;sonar&apos;`
tsk_sonar &amp;lt;-  tsk(&apos;sonar&apos;)
# 构建学习器
learner &amp;lt;-  lrn(&apos;classif.svm&apos;,
 # 指定调优的超参数`cose`和`gamma`
 cost  = to_tune(1e-1, 1e5),
 gamma = to_tune(1e-1, 1),
 # 设置其他的超参数
 kernel = &apos;radial&apos;,
 type = &apos;C-classification&apos;
)
# 进行实例调优
instance &amp;lt;-  ti(
 task = tsk_sonar,
 learner = learner,
 resampling = rsmp(&apos;cv&apos;, folds = 3),
 # 这里只有一个`Measure`，所以是单目标调优
 # 如果这里是`msrs(c(&apos;msr1&apos;,&apos;msr2&apos;))`，那么就是多目标调优
 measures = msr(&apos;classif.ce&apos;),
 # 遍历整个网格，不过早停止，因此不设定终止器
 terminator = trm(&apos;none&apos;)
)
# 查看实例
instance
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;TuningInstanceBatchSingleCrit&amp;gt;
* State:  Not optimized
* Objective: &amp;lt;ObjectiveTuningBatch:classif.svm_on_sonar&amp;gt;
* Search Space:
       id    class lower upper nlevels
   &amp;lt;char&amp;gt;   &amp;lt;char&amp;gt; &amp;lt;num&amp;gt; &amp;lt;num&amp;gt;   &amp;lt;num&amp;gt;
1:   cost ParamDbl   0.1 1e+05     Inf
2:  gamma ParamDbl   0.1 1e+00     Inf
* Terminator: &amp;lt;TerminatorNone&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;其实这里&lt;code&gt;&amp;lt;TuningInstanceBatchSingleCrit&amp;gt;&lt;/code&gt;已经看得出是单目标调优对象了&lt;/li&gt;
&lt;li&gt;可以随便看看&lt;code&gt;instance&lt;/code&gt;的类&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;instance %&amp;gt;% class()
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&apos;TuningInstanceBatchSingleCrit&apos;&apos;OptimInstanceBatchSingleCrit&apos;&apos;OptimInstanceBatch&apos;&apos;OptimInstance&apos;&apos;R6&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;调优器（Tuner）&lt;/h3&gt;
&lt;h4&gt;调优器种类&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;下表给出了可用的&lt;code&gt;Tuner&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tuner &amp;lt;br&amp;gt;调谐器&lt;/th&gt;
&lt;th&gt;Function call &amp;lt;br&amp;gt;函数调用&lt;/th&gt;
&lt;th&gt;Package &amp;lt;br&amp;gt;包&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Random Search &amp;lt;br&amp;gt;随机搜索&lt;/td&gt;
&lt;td&gt;&lt;code&gt;tnr(&apos;random_search&apos;)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;mlr3tuning&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Grid Search &amp;lt;br&amp;gt;网格搜索&lt;/td&gt;
&lt;td&gt;&lt;code&gt;tnr(&apos;grid_search&apos;)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;mlr3tuning&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bayesian Optimization &amp;lt;br&amp;gt;贝叶斯优化&lt;/td&gt;
&lt;td&gt;&lt;code&gt;tnr(&apos;mbo&apos;)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;mlr3mbo&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CMA-ES &amp;lt;br&amp;gt;协方差矩阵自适应进化策略&lt;/td&gt;
&lt;td&gt;&lt;code&gt;tnr(&apos;cmaes&apos;)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;adagio&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Iterated Racing &amp;lt;br&amp;gt;迭代竞赛&lt;/td&gt;
&lt;td&gt;&lt;code&gt;tnr(&apos;irace&apos;)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;irace&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hyperband &amp;lt;br&amp;gt;超参数优化算法&lt;/td&gt;
&lt;td&gt;&lt;code&gt;tnr(&apos;hyperband&apos;)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;mlr3hyperband&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Generalized Simulated Annealing &amp;lt;br&amp;gt;广义模拟退火算法&lt;/td&gt;
&lt;td&gt;&lt;code&gt;tnr(&apos;gensa&apos;)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GenSA&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nonlinear Optimization &amp;lt;br&amp;gt;非线性优化&lt;/td&gt;
&lt;td&gt;&lt;code&gt;tnr(&apos;nloptr&apos;)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;nloptr&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;使用&lt;code&gt;tnr()&lt;/code&gt;来调用调优器&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;tnr(&apos;grid_search&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;TunerBatchGridSearch&amp;gt;: Grid Search
* Parameters: batch_size=1, resolution=10
* Parameter classes: ParamLgl, ParamInt, ParamDbl, ParamFct
* Properties: dependencies, single-crit, multi-crit
* Packages: mlr3tuning, bbotk
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;调优策略&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;搜索策略（Search strategies）&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;网格搜索和随机搜索是最基本的算法，在初始实验中通常首先被选用&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;网格搜索&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;思路是详尽地评估给定超参数值的每一种可能组合&lt;/li&gt;
&lt;li&gt;分类超参数通常会在其所有可能取值上进行评估&lt;/li&gt;
&lt;li&gt;数值型和整型超参数值会根据给定的分辨率&lt;br /&gt;
（即每个超参数要尝试的不同值的数量），&lt;br /&gt;
在其边界约束（上限和下限）内等距分布&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;随机搜索&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;从预先指定的分布（通常是均匀分布）中为每个超参数独立地随机选择值&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;这两种方法都不具备适应性，&lt;br /&gt;
也就是说每次提出的配置都忽略了先前配置的性能&lt;/li&gt;
&lt;li&gt;由于其简单性，&lt;br /&gt;
网格搜索和随机搜索都可以处理混合搜索空间
（即超参数可以是数值型、整型或分类型）以及分层搜索空间&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;自适应算法（Adaptive Algorithms）&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;自适应算法从&lt;strong&gt;先前评估&lt;/strong&gt;的配置中学习，以快速找到良好的配置&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;贝叶斯优化（Bayesian Optimization）&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;使用&lt;strong&gt;代理模型&lt;/strong&gt;来近似待优化的未知函数
&lt;ul&gt;
&lt;li&gt;在超参数优化中，这将是从超参数配置到估计的泛化性能的映射&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;如果选择了合适的代理模型，例如随机森林，&lt;br /&gt;
贝叶斯优化可以相当灵活，甚至可以处理混合和分层搜索空间&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;协方差矩阵自适应进化策略&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;（Covariance Matrix Adaptation Evolution Strategy）&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;在候选点上维持一个概率分布，该分布由一个均值向量和协方差矩阵表示&lt;br /&gt;
通过从这个分布中采样生成一组新的候选点，每个候选点被选中的概率与其性能成正比&lt;/li&gt;
&lt;li&gt;协方差矩阵会随着时间进行调整，以反映性能态势&lt;/li&gt;
&lt;li&gt;通过&lt;code&gt;miesmuschel&lt;/code&gt;包，在mlr3中还可使用更多进化策略&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;迭代竞赛算法（Iterated Racing）&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;迭代舍弃那些经统计检验显示性能不佳的配置&lt;/li&gt;
&lt;li&gt;首先从参数化密度中随机采样的初始配置群体中进行 “竞赛”，&lt;br /&gt;
然后利用竞赛中幸存的配置来随机更新后续竞赛的密度，&lt;br /&gt;
以便聚焦于搜索空间中有前景的区域，&lt;br /&gt;
依此类推&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;超带算法（Hyperband）/ 多保真度超参数优化（Multi-fidelity HPO）&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;一种自适应方法，&lt;br /&gt;
利用计算成本较低的低保真度评估的预测能力&lt;br /&gt;
（即质量较差的预测例如那些由训练轮数较少的神经网络产生的预测）&lt;br /&gt;
来提高整体优化效率&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;策略选择&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;搜索策略&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;如果搜索空间&lt;strong&gt;较小&lt;/strong&gt;或结构&lt;strong&gt;不复杂&lt;/strong&gt;，&lt;br /&gt;
网格搜索或许能够在合理时间内详尽评估整个搜索空间&lt;/li&gt;
&lt;li&gt;由于高纬度的搜索空间导致的的&lt;strong&gt;维度灾难&lt;/strong&gt;以及对数值&lt;strong&gt;搜索空间的覆盖不足&lt;/strong&gt;，&lt;br /&gt;
通常&lt;strong&gt;不推荐使用网格搜索&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;此时，&lt;strong&gt;随机搜索&lt;/strong&gt;往往是更好的选择，&lt;br /&gt;
因为可以考虑更多独特值&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;更优的算法&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;适用于高维度或结构更复杂的搜索空间&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;进化策略和贝叶斯优化&lt;/strong&gt;间的选择
&lt;ul&gt;
&lt;li&gt;根据函数评估的成本进行选择&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;进化策略（evolutionary strategies）&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;超参数配置能够快速评估时&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;贝叶斯优化（Bayesian optimization）&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;模型评估耗时且优化预算有限时&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;通常推荐在超参数优化中使用&lt;strong&gt;贝叶斯优化&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;虽然贝叶斯优化的优化成本相对较大&lt;br /&gt;
（例如，在每次迭代中，都要训练代理模型并优化采集函数），&lt;br /&gt;
但在诸如机器学习模型重采样等函数评估成本相对较高的情况下，&lt;br /&gt;
这种影响较小&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;在超参数优化问题涉及有意义的&lt;strong&gt;保真度参数&lt;/strong&gt;（例如，轮数、树的数量、提升轮数）&lt;br /&gt;
且需要&lt;strong&gt;高效使用优化预算&lt;/strong&gt;的情况下，&lt;br /&gt;
像Hyperband这样的多保真度超参数优化算法可能值得考虑&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;调优器处理的类型&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Learner$param_classes&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;提供可以处理哪些类别的超参数&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Learner$param_classes&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;提供可以处理哪些特性&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;tnr(&apos;grid_search&apos;)$param_classes
tnr(&apos;grid_search&apos;)$properties
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&apos;ParamLgl&apos;&apos;ParamInt&apos;&apos;ParamDbl&apos;&apos;ParamFct&apos;
&apos;dependencies&apos;&apos;single-crit&apos;&apos;multi-crit&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;（重新回顾一下如何去看超参数类型）
&lt;ul&gt;
&lt;li&gt;这里的&lt;code&gt;class&lt;/code&gt;就是了&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;lrn(&apos;classif.svm&apos;)$param_set
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;ParamSet(16)&amp;gt;
Key: &amp;lt;id&amp;gt;
                 id    class lower upper nlevels          default parents
             &amp;lt;char&amp;gt;   &amp;lt;char&amp;gt; &amp;lt;num&amp;gt; &amp;lt;num&amp;gt;   &amp;lt;num&amp;gt;           &amp;lt;list&amp;gt;  &amp;lt;list&amp;gt;
 1:       cachesize ParamDbl  -Inf   Inf     Inf               40  [NULL]
 2:   class.weights ParamUty    NA    NA     Inf           [NULL]  [NULL]
 3:           coef0 ParamDbl  -Inf   Inf     Inf                0  kernel
 4:            cost ParamDbl     0   Inf     Inf                1    type
 5:           cross ParamInt     0   Inf     Inf                0  [NULL]
 6: decision.values ParamLgl    NA    NA       2            FALSE  [NULL]
 7:          degree ParamInt     1   Inf     Inf                3  kernel
 8:         epsilon ParamDbl     0   Inf     Inf              0.1  [NULL]
 9:          fitted ParamLgl    NA    NA       2             TRUE  [NULL]
10:           gamma ParamDbl     0   Inf     Inf   &amp;lt;NoDefault[0]&amp;gt;  kernel
11:          kernel ParamFct    NA    NA       4           radial  [NULL]
12:              nu ParamDbl  -Inf   Inf     Inf              0.5    type
13:           scale ParamUty    NA    NA     Inf             TRUE  [NULL]
14:       shrinking ParamLgl    NA    NA       2             TRUE  [NULL]
15:       tolerance ParamDbl     0   Inf     Inf            0.001  [NULL]
16:            type ParamFct    NA    NA       2 C-classification  [NULL]
     value
    &amp;lt;list&amp;gt;
 1: [NULL]
 2: [NULL]
 3: [NULL]
 4: [NULL]
 5: [NULL]
 6: [NULL]
 7: [NULL]
 8: [NULL]
 9: [NULL]
10: [NULL]
11: [NULL]
12: [NULL]
13: [NULL]
14: [NULL]
15: [NULL]
16: [NULL]
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;lrn(&apos;classif.svm&apos;)$param_set$deps
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 5 x 3&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;id&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;on&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;cond&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;coef0 &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;kernel&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;polynomial    , sigmoid       , %s %%in%% {%s}&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;cost  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;type  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;C-classification, %s == %s        &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;degree&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;kernel&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;polynomial, %s == %s  &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;gamma &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;kernel&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;polynomial    , radial        , sigmoid       , %s %%in%% {%s}&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;nu    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;type  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;nu-classification, %s == %s         &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;h4&gt;触发调优过程&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;这个是之前构建好的实例&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;tsk_sonar &amp;lt;-  tsk(&apos;sonar&apos;)
# 构建学习器
learner &amp;lt;-  lrn(&apos;classif.svm&apos;,
 # 指定调优的超参数`cose`和`gamma`
 cost  = to_tune(1e-1, 1e5),
 gamma = to_tune(1e-1, 1),
 # 设置其他的超参数
 kernel = &apos;radial&apos;,
 type = &apos;C-classification&apos;
)
# 进行实例调优
instance &amp;lt;-  ti(
 task = tsk_sonar,
 learner = learner,
 resampling = rsmp(&apos;cv&apos;, folds = 3),
 measures = msr(&apos;classif.ce&apos;),
 terminator = trm(&apos;none&apos;)
)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;创建调优器
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;resolution&lt;/code&gt;：控制网格搜索中每个超参数的候选值数量，决定搜索的细致程度&lt;/li&gt;
&lt;li&gt;&lt;code&gt;batch_size&lt;/code&gt;：控制评估超参数组合时的分批规模，平衡计算资源与效率&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;tuner &amp;lt;- tnr(&apos;grid_search&apos;, resolution = 5, batch_size = 10)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;接下来使用&lt;code&gt;Tuner$optimize(TuningInstanceBatchSingleCrit)&lt;/code&gt;进行调优
&lt;ul&gt;
&lt;li&gt;结果返回了最佳的调优参数，并且储存在了&lt;br /&gt;
&lt;code&gt;TuningInstanceBatchSingleCrit$result&lt;/code&gt;中&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;tuner$optimize(instance)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 1 x 5&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;cost&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;gamma&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;learner_param_vals&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;x_domain&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;classif.ce&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;25000.08&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;radial          , C-classification, 25000.075       , 0.1             &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;25000.08, 0.10&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.27902&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;instance$result
instance$result$learner_param_vals
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 1 x 5&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;cost&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;gamma&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;learner_param_vals&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;x_domain&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;classif.ce&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;25000.08&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;radial          , C-classification, 25000.075       , 0.1             &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;25000.08, 0.10&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.27902&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$kernel
&apos;radial&apos;
$type
&apos;C-classification&apos;
$cost
25000.075
$gamma
0.1
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;对数变换&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;对于许多具有较大上界的非负超参数，&lt;br /&gt;
在对数尺度上进行调优可能比在线性尺度上更有效&lt;/li&gt;
&lt;li&gt;对数变化之后可以让备选参数的范围更集中&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;cost &amp;lt;- runif(1000, log(1e-5), log(1e5))
exp_cost &amp;lt;- exp(cost)

# library(patchwork)
data.frame(x=cost) %&amp;gt;% ggplot(aes(x=x)) + geom_histogram() + theme_bw() &amp;amp; data.frame(x=exp_cost) %&amp;gt;% ggplot(aes(x=x)) + geom_histogram() + theme_bw()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./image_2.png&quot; alt=&quot;image_2&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;左边是&lt;code&gt;Tuner&lt;/code&gt;中采样的结果频数&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;右边&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在调优时，只用将&lt;code&gt;logscale = TRUE&lt;/code&gt; 传递给 &lt;code&gt;to_tune()&lt;/code&gt; 即可&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 调取任务
tsk_sonar &amp;lt;-  tsk(&apos;sonar&apos;)
# 构建学习器
learner &amp;lt;-  lrn(&apos;classif.svm&apos;,
 # 指定调优的超参数`cose`和`gamma`
 # 选择将对数变换的结果传递给`Learner`
 cost  = to_tune(1e-1, 1e5, logscale = TRUE),
 gamma = to_tune(1e-1, 1e5, logscale = TRUE),
 # 设置其他的超参数
 kernel = &apos;radial&apos;,
 type = &apos;C-classification&apos;
)
# 进行实例调优
instance &amp;lt;-  ti(
 task = tsk_sonar,
 learner = learner,
 resampling = rsmp(&apos;cv&apos;, folds = 3),
 measures = msr(&apos;classif.ce&apos;),
 terminator = trm(&apos;none&apos;)
)
# 构建调优器
tuner &amp;lt;- tnr(&apos;grid_search&apos;, resolution = 5, batch_size = 10)
# 调优实例
tuner$optimize(instance)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 1 x 5&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;cost&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;gamma&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;learner_param_vals&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;x_domain&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;classif.ce&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;1.151293&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-2.302585&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;radial          , C-classification, 3.16227766016838, 0.1             &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.162278, 0.100000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2408558&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;cost&lt;/code&gt;和&lt;code&gt;gamma&lt;/code&gt;是对数变换前的最优值，&lt;br /&gt;
而&lt;code&gt;learner_param_vals&lt;/code&gt;和&lt;code&gt;x_domain&lt;/code&gt;包含的是是对数变换后的&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;instance$result_learner_param_vals
instance$result$learner_param_vals
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;$kernel
&apos;radial&apos;
$type
&apos;C-classification&apos;
$cost
3.16227766016838
$gamma
0.1
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;instance$result_x_domain
instance$result$x_domain
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;$cost
3.16227766016838
$gamma
0.1
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;可以简单验算一下结果
&lt;ul&gt;
&lt;li&gt;结果和上方的结果完全一致&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;instance$result$cost
exp(instance$result$cost)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;1.15129254649702
3.16227766016838
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;分析和使用结果&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;评估完的结果储存在&lt;code&gt;Instance$archive&lt;/code&gt;里面&lt;/li&gt;
&lt;li&gt;一共有25组，这是因为设定的&lt;code&gt;Tuner&lt;/code&gt;的&lt;code&gt;resulution&lt;/code&gt;是5，&lt;br /&gt;
所以可以得到$5^{2}= 25$&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;instance$archive
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 25 x 10&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;cost&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;gamma&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;classif.ce&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;runtime_learners&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;timestamp&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;warnings&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;errors&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;x_domain&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;batch_nr&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;resample_result&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dttm&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;-2.302585&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4665286&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.039&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 14:29:56&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1e-01, 1e+05&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x1734a6650&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; 1.151293&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-2.302585&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2408558&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.046&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 14:29:56&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.162278, 0.100000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x173467a08&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; 1.151293&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1.151293&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4665286&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.030&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 14:29:56&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.162278, 3.162278&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x173430338&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; 1.151293&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 8.059048&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4665286&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.026&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 14:29:56&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.162278, 3162.277660&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x1733e7c38&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; 1.151293&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4665286&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.030&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 14:29:56&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.162278e+00, 1.000000e+05&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x1733b1f48&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; 4.605170&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-2.302585&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2408558&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.100&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 14:29:56&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;100.0, 0.1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x173087ad0&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; 8.059048&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-2.302585&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2408558&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.030&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 14:29:56&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3162.278, 0.100&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x17361d128&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; 8.059048&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4665286&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.027&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 14:29:56&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3162.278, 100000.000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x173397c08&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4665286&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.030&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 14:29:56&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1e+05, 1e+05&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x173350e78&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;-2.302585&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-2.302585&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4665286&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.029&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 14:29:56&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.1, 0.1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x173313660&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;-2.302585&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 8.059048&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4665286&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.026&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 14:29:56&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.100, 3162.278&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x1732e5170&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; 1.151293&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 4.605170&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4665286&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.025&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 14:29:56&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.162278, 100.000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x1732b32b0&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; 4.605170&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1.151293&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4665286&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.038&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 14:29:56&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;100.000000, 3.162278&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x1732860c8&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; 8.059048&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1.151293&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4665286&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.030&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 14:29:56&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3162.277660, 3.162278&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x171620ab0&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; 8.059048&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 8.059048&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4665286&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.031&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 14:29:56&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3162.278, 3162.278&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x1715e60b0&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1.151293&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4665286&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.035&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 14:29:56&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e+05, 3.162278e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x173054958&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 8.059048&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4665286&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.029&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 14:29:56&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;100000.000, 3162.278&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x173214b00&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;-2.302585&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1.151293&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4665286&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.031&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 14:29:57&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.100000, 3.162278&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x1731baa20&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;-2.302585&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 4.605170&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4665286&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.027&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 14:29:57&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.1, 100.0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x173160e10&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; 4.605170&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 4.605170&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4665286&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.026&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 14:29:57&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;100, 100&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x1730f8d98&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; 4.605170&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 8.059048&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4665286&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.040&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 14:29:57&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;100.000, 3162.278&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x173064ba0&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; 4.605170&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4665286&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.064&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 14:29:57&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1e+02, 1e+05&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x13a1f7410&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; 8.059048&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 4.605170&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4665286&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.033&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 14:29:57&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3162.278, 100.000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x176b02dd8&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-2.302585&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2408558&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.035&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 14:29:57&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1e+05, 1e-01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x176c46388&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 4.605170&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4665286&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.039&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 14:29:57&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1e+05, 1e+02&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x176bf3e68&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;可以根据不同的性能指标对内部&lt;code&gt;ResampleResult&lt;/code&gt;进行评分
&lt;ul&gt;
&lt;li&gt;zhe l这里是考察漏报率、误报率以及分类错误&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;as.data.table(
 instance$archive,
 measures = msrs(c(&apos;classif.fpr&apos;, &apos;classif.fnr&apos;))
)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 25 x 12&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;cost&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;gamma&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;classif.ce&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;classif.fpr&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;classif.fnr&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;runtime_learners&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;timestamp&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;warnings&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;errors&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;x_domain&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;batch_nr&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;resample_result&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dttm&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;-2.302585&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4665286&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.0000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.00000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.039&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 14:29:56&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1e-01, 1e+05&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x17b2d4438&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; 1.151293&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-2.302585&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2408558&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4606607&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.03397436&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.046&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 14:29:56&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.162278, 0.100000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x17b2bce48&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; 1.151293&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1.151293&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4665286&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.0000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.00000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.030&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 14:29:56&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.162278, 3.162278&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x17b2a6070&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; 1.151293&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 8.059048&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4665286&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.0000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.00000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.026&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 14:29:56&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.162278, 3162.277660&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x17b288a58&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; 1.151293&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4665286&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.0000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.00000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.030&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 14:29:56&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.162278e+00, 1.000000e+05&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x17b2719e0&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; 4.605170&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-2.302585&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2408558&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4606607&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.03397436&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.100&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 14:29:56&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;100.0, 0.1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x17b254208&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; 8.059048&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-2.302585&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2408558&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4606607&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.03397436&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.030&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 14:29:56&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3162.278, 0.100&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x17b23cb00&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; 8.059048&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4665286&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.0000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.00000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.027&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 14:29:56&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3162.278, 100000.000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x17b19f510&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4665286&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.0000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.00000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.030&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 14:29:56&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1e+05, 1e+05&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x17b17e0e0&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;-2.302585&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-2.302585&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4665286&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.0000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.00000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.029&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 14:29:56&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.1, 0.1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x17b1639e0&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;-2.302585&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 8.059048&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4665286&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.0000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.00000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.026&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 14:29:56&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.100, 3162.278&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x17b140828&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; 1.151293&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 4.605170&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4665286&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.0000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.00000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.025&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 14:29:56&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.162278, 100.000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x17b1184e0&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; 4.605170&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1.151293&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4665286&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.0000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.00000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.038&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 14:29:56&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;100.000000, 3.162278&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x17b0ffee8&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; 8.059048&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1.151293&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4665286&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.0000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.00000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.030&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 14:29:56&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3162.277660, 3.162278&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x17b0e54d8&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; 8.059048&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 8.059048&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4665286&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.0000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.00000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.031&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 14:29:56&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3162.278, 3162.278&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x17b0c9120&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1.151293&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4665286&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.0000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.00000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.035&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 14:29:56&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e+05, 3.162278e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x17b0ae860&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 8.059048&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4665286&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.0000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.00000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.029&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 14:29:56&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;100000.000, 3162.278&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x17b0978c8&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;-2.302585&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1.151293&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4665286&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.0000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.00000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.031&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 14:29:57&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.100000, 3.162278&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x17b07ce80&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;-2.302585&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 4.605170&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4665286&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.0000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.00000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.027&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 14:29:57&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.1, 100.0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x17b062f60&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; 4.605170&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 4.605170&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4665286&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.0000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.00000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.026&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 14:29:57&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;100, 100&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x17b049820&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; 4.605170&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 8.059048&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4665286&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.0000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.00000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.040&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 14:29:57&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;100.000, 3162.278&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x17b02c320&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; 4.605170&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4665286&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.0000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.00000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.064&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 14:29:57&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1e+02, 1e+05&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x17b015b30&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; 8.059048&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 4.605170&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4665286&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.0000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.00000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.033&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 14:29:57&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3162.278, 100.000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x1797f0da0&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-2.302585&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2408558&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4606607&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.03397436&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.035&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 14:29:57&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1e+05, 1e-01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x1797d1698&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 4.605170&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4665286&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.0000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.00000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.039&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 14:29:57&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1e+05, 1e+02&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x1797b2a90&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;只挑前五个的一部分&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;as.data.table(
 instance$archive,
 measures = msrs(c(&apos;classif.fpr&apos;, &apos;classif.fnr&apos;))
)[1:5 ,.(cost, gamma, classif.ce, classif.fpr, classif.fnr)]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 5 x 5&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;cost&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;gamma&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;classif.ce&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;classif.fpr&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;classif.fnr&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;-2.302585&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4665286&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.0000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.00000000&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; 1.151293&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-2.302585&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2408558&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4606607&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.03397436&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; 1.151293&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1.151293&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4665286&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.0000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.00000000&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; 1.151293&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 8.059048&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4665286&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.0000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.00000000&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; 1.151293&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4665286&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.0000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.00000000&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Instance$archive$benchmark_result&lt;/code&gt;中储存了所有的&lt;code&gt;BenchmarkResult&lt;/code&gt;对象&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;{instance$archive$benchmark_result %&amp;gt;% as.data.table()}[1:5]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 5 x 9&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;uhash&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;task&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;learner&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;resampling&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;iteration&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;prediction&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;task_id&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;learner_id&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;resampling_id&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;e31b69c6-41d4-4d7f-81c2-ed3b4bd3b75f&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x17cd32908&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x3064c38c0&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x17269e738&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x3202d2ac0&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;e31b69c6-41d4-4d7f-81c2-ed3b4bd3b75f&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x17cd32908&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x306425260&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x17269e738&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x32023dcf0&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;e31b69c6-41d4-4d7f-81c2-ed3b4bd3b75f&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x17cd32908&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x30a0e4660&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x17269e738&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x32019c9d0&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;5413c20f-f67c-4741-bc1e-6535ac83e266&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x17cd32908&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x300847120&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x17269e738&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x320379c40&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;5413c20f-f67c-4741-bc1e-6535ac83e266&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x17cd32908&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x31f42b8c0&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x17269e738&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x17ede9278&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;可以将&lt;code&gt;type = &apos;surface&apos;&lt;/code&gt;传递给&lt;code&gt;autoplot.TuningInstanceBatchSingleCrit&lt;/code&gt;来可视化实例调优的结果
&lt;ul&gt;
&lt;li&gt;蓝色的区域表示&lt;code&gt;classif.ce&lt;/code&gt;评估器的较小结果，表明模型更优&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;autoplot(instance, type = &apos;surface&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./image_3.png&quot; alt=&quot;image_3&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;训练优化模型&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;当确定好超参数后，将&lt;code&gt;Instance&lt;/code&gt;中的超参数传递给新建学习器中&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;lrn_svm_tuned &amp;lt;- lrn(&apos;classif.svm&apos;)
lrn_svm_tuned$param_set$values &amp;lt;- instance$result_learner_param_vals
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;之后进行最基础的训练流程即可&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;lrn_svm_tuned$train(tsk_sonar)$model
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;Call:
svm.default(x = data, y = task$truth(), type = &apos;C-classification&apos;, 
    kernel = &apos;radial&apos;, gamma = 0.1, cost = 3.16227766016838, probability = (self$predict_type == 
        &apos;prob&apos;))


Parameters:
   SVM-Type:  C-classification 
 SVM-Kernel:  radial 
       cost:  3.162278 

Number of Support Vectors:  205
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;更便捷的调优方法&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;基本调优方法中用的是&lt;code&gt;ti()&lt;/code&gt;创建调优实例，&lt;br /&gt;
之后用&lt;code&gt;Tuner$optimize()&lt;/code&gt;进行调优&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;code&gt;tune()&lt;/code&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;tune()&lt;/code&gt;可以在创建实例后直接进行调优，&lt;br /&gt;
省略手动先创建调优实例，后&lt;/li&gt;
&lt;li&gt;下面的例子可以进行简单的对比&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 调取任务
tsk_sonar &amp;lt;-  tsk(&apos;sonar&apos;)

# ---------------之前的方法
# 构建学习器
learner &amp;lt;-  lrn(&apos;classif.svm&apos;,
 # 指定调优的超参数`cose`和`gamma`
 # 选择将对数变换的结果传递给`Learner`
 cost  = to_tune(1e-1, 1e5, logscale = TRUE),
 gamma = to_tune(1e-1, 1e5, logscale = TRUE),
 # 设置其他的超参数
 kernel = &apos;radial&apos;,
 type = &apos;C-classification&apos;
)
# 进行实例调优
instance &amp;lt;-  ti(
 task = tsk_sonar,
 learner = learner,
 resampling = rsmp(&apos;cv&apos;, folds = 3),
 measures = msr(&apos;classif.ce&apos;),
 terminator = trm(&apos;none&apos;)
)
# 构建调优器
tuner &amp;lt;- tnr(&apos;grid_search&apos;, resolution = 5, batch_size = 10)
# 调优实例
tuner$optimize(instance)

# ---------------`tune()`的方法
# 构建学习器
lrn_svm &amp;lt;- lrn(&apos;classif.svm&apos;,
  cost  = to_tune(1e-5, 1e5, logscale = TRUE),
  gamma = to_tune(1e-5, 1e5, logscale = TRUE),
  kernel = &apos;radial&apos;,
  type = &apos;C-classification&apos;
)
# [构建调优器]
# 需要先构建调优器，之后传递到`tune()`中
tnr_grid_search &amp;lt;- tnr(&apos;grid_search&apos;, resolution = 5, batch_size = 5)
# 进行实例调优
instance &amp;lt;- tune(
 # [这里多了`tuner`参数]
 # 所以先构建的调优器，后传递到`tune()`中
 # 也可以直接输入`tnr(&apos;grid_search&apos;, resolution = 5, batch_size = 5)`
 tuner = tnr_grid_search,
 task = tsk_sonar,
 learner = lrn_svm,
 resampling = rsmp(&apos;cv&apos;, folds = 3),
 measures = msr(&apos;classif.ce&apos;)
)
instance$result
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;auto_tune()&lt;/code&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;auto_tune()&lt;/code&gt; 创建一个&lt;code&gt;AutoTuner&lt;/code&gt;类的对象&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AutoTuner&lt;/code&gt;继承自Learner类，并封装了调优所需的所有信息，&lt;br /&gt;
这意味着&lt;code&gt;AutoTuner&lt;/code&gt;就是一个&lt;code&gt;Learner&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;在底层，&lt;code&gt;AutoTuner&lt;/code&gt;本质上是在调用&lt;code&gt;Learner$train()&lt;/code&gt;时传递给模型的数据上运行&lt;code&gt;tune()&lt;/code&gt;，然后将&lt;code&gt;Learner$param_set&lt;/code&gt;参数设置为最优配置&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 调取任务
tsk_sonar &amp;lt;-  tsk(&apos;sonar&apos;)

# ---------------之前的方法
# 构建学习器
learner &amp;lt;-  lrn(&apos;classif.svm&apos;,
 # 指定调优的超参数`cose`和`gamma`
 # 选择将对数变换的结果传递给`Learner`
 cost  = to_tune(1e-1, 1e5, logscale = TRUE),
 gamma = to_tune(1e-1, 1e5, logscale = TRUE),
 # 设置其他的超参数
 kernel = &apos;radial&apos;,
 type = &apos;C-classification&apos;
)
# 进行实例调优
instance &amp;lt;-  ti(
 task = tsk_sonar,
 learner = learner,
 resampling = rsmp(&apos;cv&apos;, folds = 3),
 measures = msr(&apos;classif.ce&apos;),
 terminator = trm(&apos;none&apos;)
)
# 构建调优器
tuner &amp;lt;- tnr(&apos;grid_search&apos;, resolution = 5, batch_size = 10)
# 调优实例
tuner$optimize(instance)

# ---------------`auto_tune()`的方法
# 构建学习器
lrn_svm &amp;lt;- lrn(&apos;classif.svm&apos;,
 cost  = to_tune(1e-5, 1e5, logscale = TRUE),
 gamma = to_tune(1e-5, 1e5, logscale = TRUE),
 kernel = &apos;radial&apos;,
 type = &apos;C-classification&apos;
)
# [构建调优器]
# 需要先构建调优器，之后传递到`auto_tune()`中
tnr_grid_search &amp;lt;- tnr(&apos;grid_search&apos;, resolution = 5, batch_size = 5)
# 创建`AutoTuner`
at &amp;lt;- auto_tuner(
 tuner = tnr_grid_search,
 learner = lrn_svm,
 resampling = rsmp(&apos;cv&apos;, folds = 3),
 measure = msr(&apos;classif.ce&apos;)
)
# 分割`Task`的数据
split &amp;lt;- partition(tsk_sonar) 
# 训练模型，在此过程中自动调优选择出最佳的超参数
at$train(tsk_sonar, row_ids = split$train) 
# 预测模型，获得评估结果
pred &amp;lt;- at$predict(tsk_sonar, row_ids = split$test)
pred$score()
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;classif.ce: 0.159420289855072
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;AutoTuner&lt;/code&gt;中还包含一个调优实例&lt;code&gt;Intance&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;用法和前述一样&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;at$tuning_instance$result %&amp;gt;% as.data.table()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 1 x 5&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;cost&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;gamma&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;learner_param_vals&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;x_domain&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;classif.ce&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;11.51293&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-5.756463&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;radial             , C-classification   , 1e+05              , 0.00316227766016838&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e+05, 3.162278e-03&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2008942&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image_4.png&quot; alt=&quot;image_4&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Illustration of an Auto-Tuner.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;嵌套重采样（Nested Resampling）&lt;/h2&gt;
&lt;h3&gt;简介&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;超参数优化在不进行额外的重采样时会产生训练误差导致的乐观偏差&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./image_5.png&quot; alt=&quot;image_5&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;嵌套重采样示意图大块代表用于模型评估的外部重采样的三折交叉验证，小块代表用于调优的内部重采样的四折交叉验证浅蓝色块为训练集，深蓝色块为测试集&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;看着挺挺复杂的，在本例中：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;其实就是先对整个数据集进行3折交叉验证的切分，&lt;br /&gt;
这个里面2/3的用于训练集，1/3的用于验证集&lt;br /&gt;
（本质是测试集，不过一般测试集是纯用于测试的那种），
这个部分叫&lt;strong&gt;外部重采样（outer resampling）&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;对2/3训练集中再进行4折交叉验证的切分，&lt;br /&gt;
这个部分叫&lt;strong&gt;内部重采样（inner resampling）&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;内部重采样训练出来的N个模型用外部的验证集进行评估，&lt;br /&gt;
选出最佳超参数，&lt;br /&gt;
这个部分叫&lt;strong&gt;超参数优化（HPO）&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;N取决于超参数个数以及网格搜索分辨率，&lt;br /&gt;
2个超参数，网格搜索分辨率为2就是$2^2=4$，&lt;br /&gt;
2个超参数，网格搜索分辨率为3就是$3^2=9$，&lt;br /&gt;
这个结果再乘以内部重采样的k值&lt;/li&gt;
&lt;li&gt;本例中假设内部重采样是4折，2个参数，2个网格，&lt;br /&gt;
那么共产生 $4\times2^2=16$ 个模型&lt;/li&gt;
&lt;li&gt;这些模型不直接用于1/3数据的验证集，&lt;br /&gt;
而是用内部重采样的小验证集进行性能评估，&lt;br /&gt;
最终选出16个模型里在自己小验证集上表现最好的模型的超参数&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;用选择的超参数在&lt;strong&gt;整个&lt;/strong&gt;2/3数据的的训练集进行模型训练，&lt;br /&gt;
再在1/3数据的测试集上进行模型评估&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;上述一轮的内外重采样结束后，再重复两轮&lt;/li&gt;
&lt;li&gt;三次结束后，获得最终3个模型，&lt;br /&gt;
最这三个模型进行综合评估并选择最佳参数建模，&lt;br /&gt;
并最终用测试集评估最终性能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;：嵌套重采样的计算成本很高&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;正如上所述，超参数的个数和网格数分辨率决定了训练模型的迭代次数；&lt;br /&gt;
如果2超参数外3折内4折为5的分辨率，那么总共需要迭代 $3\times4\times5^{2}= 300$次&lt;/li&gt;
&lt;li&gt;如果计算资源支持，可以通过并行化提高速度&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;使用&lt;code&gt;auto_tuner()&lt;/code&gt;进行嵌套重采样&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;只需将 &lt;code&gt;AutoTuner&lt;/code&gt; 传递给 &lt;code&gt;resample()&lt;/code&gt;或 &lt;code&gt;benchmark()&lt;/code&gt; 即可&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 调取任务
tsk_sonar &amp;lt;-  tsk(&apos;sonar&apos;)
# 构建学习器
lrn_svm &amp;lt;- lrn(&apos;classif.svm&apos;,
 cost  = to_tune(1e-5, 1e5, logscale = TRUE),
 gamma = to_tune(1e-5, 1e5, logscale = TRUE),
 kernel = &apos;radial&apos;,
 type = &apos;C-classification&apos;
)
# 构建调优器
tnr_grid_search &amp;lt;- tnr(&apos;grid_search&apos;, resolution = 5, batch_size = 5)
# 构建`AutoTuner`
at &amp;lt;- auto_tuner(
 tuner = tnr_grid_search,
 learner = lrn_svm,
 # 构建内部`Resampling`
 resampling = rsmp(&apos;cv&apos;, folds = 4),
 measure = msr(&apos;classif.ce&apos;)
)
# 构建外部`Resampling`
rsmp_cv3 &amp;lt;- rsmp(&apos;cv&apos;, folds = 3)
# 将`AutoTuner`传递给`resample()`
# 这里的`store_models=TRUE`仅能储存外部重采样的3个模型
rr &amp;lt;- resample(tsk_sonar, at, rsmp_cv3, store_models = TRUE)
# 打印
rr
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[36m--[39m [1m[34m&amp;lt;ResampleResult&amp;gt;[39m with [34m3[39m resampling iterations[22m [36m-------------------------------[39m
 task_id        learner_id resampling_id iteration     prediction_test warnings
   sonar classif.svm.tuned            cv         1 &amp;lt;PredictionClassif&amp;gt;        0
   sonar classif.svm.tuned            cv         2 &amp;lt;PredictionClassif&amp;gt;        0
   sonar classif.svm.tuned            cv         3 &amp;lt;PredictionClassif&amp;gt;        0
 errors
      0
      0
      0
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;查看最终模型的&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;rr$aggregate()
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;classif.ce: 0.163285024154589
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;extract_inner_tuning_results(ResampleResult)&lt;/code&gt; 返回外部重采样的全部结果&lt;/li&gt;
&lt;li&gt;&lt;code&gt;extract_inner_tuning_archives(ResampleResult)&lt;/code&gt; 返回内外部重采样的全部结果&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;extract_inner_tuning_results(rr)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 3 x 9&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;iteration&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;cost&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;gamma&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;classif.ce&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;learner_param_vals&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;x_domain&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;task_id&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;learner_id&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;resampling_id&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5.756463&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; -5.756463&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.1882353&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;radial             , C-classification   , 316.227766016838   , 0.00316227766016838&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.162278e+02, 3.162278e-03&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm.tuned&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5.756463&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2376050&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;radial          , C-classification, 316.227766016838, 1e-05           &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;316.22777, 0.00001&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm.tuned&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5.756463&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; -5.756463&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2006303&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;radial             , C-classification   , 316.227766016838   , 0.00316227766016838&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.162278e+02, 3.162278e-03&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm.tuned&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;extract_inner_tuning_archives(rr)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 75 x 15&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;iteration&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;cost&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;gamma&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;classif.ce&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;x_domain_cost&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;x_domain_gamma&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;runtime_learners&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;timestamp&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;warnings&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;errors&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;batch_nr&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;resample_result&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;task_id&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;learner_id&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;resampling_id&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dttm&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span style=white-space:pre-wrap&amp;gt;  5.756463&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4632353&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e-05&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.162278e+02&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.088&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 23:57:50&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x16ec87bc8&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm.tuned&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span style=white-space:pre-wrap&amp;gt;  0.000000&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; -5.756463&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2689076&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.162278e-03&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.042&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 23:57:50&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x16ec63f78&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm.tuned&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span style=white-space:pre-wrap&amp;gt;  0.000000&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span style=white-space:pre-wrap&amp;gt;  0.000000&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4632353&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.074&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 23:57:50&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x16ec47d10&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm.tuned&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span style=white-space:pre-wrap&amp;gt;  5.756463&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.3126050&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.162278e+02&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e-05&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.033&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 23:57:50&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x16ec1b1c8&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm.tuned&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span style=white-space:pre-wrap&amp;gt;  5.756463&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span style=white-space:pre-wrap&amp;gt;  0.000000&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4632353&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.162278e+02&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.035&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 23:57:50&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x16ebf3920&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm.tuned&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; -5.756463&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; -5.756463&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4632353&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.162278e-03&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.162278e-03&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.026&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 23:57:50&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x16ebda1e0&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm.tuned&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; -5.756463&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span style=white-space:pre-wrap&amp;gt;  0.000000&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4632353&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.162278e-03&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.029&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 23:57:50&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x16eba3970&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm.tuned&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; -5.756463&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span style=white-space:pre-wrap&amp;gt;  5.756463&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4632353&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.162278e-03&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.162278e+02&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.037&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 23:57:50&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x16eb76288&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm.tuned&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span style=white-space:pre-wrap&amp;gt;  0.000000&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4632353&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e+05&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.028&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 23:57:50&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x16eb1ca18&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm.tuned&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span style=white-space:pre-wrap&amp;gt;  5.756463&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4632353&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e+05&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.162278e+02&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.034&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 23:57:50&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x16eaf0358&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm.tuned&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; -5.756463&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4632353&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e-05&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.162278e-03&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.035&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 23:57:51&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x16eac7780&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm.tuned&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span style=white-space:pre-wrap&amp;gt;  0.000000&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4632353&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e-05&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.029&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 23:57:51&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x16e7cc3a0&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm.tuned&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4632353&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e-05&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e+05&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.055&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 23:57:51&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x134617800&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm.tuned&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span style=white-space:pre-wrap&amp;gt;  0.000000&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span style=white-space:pre-wrap&amp;gt;  5.756463&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4632353&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.162278e+02&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.044&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 23:57:51&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x164f9f808&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm.tuned&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span style=white-space:pre-wrap&amp;gt;  0.000000&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4632353&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e+05&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.039&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 23:57:51&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x164f80080&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm.tuned&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; -5.756463&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4632353&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.162278e-03&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e+05&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.029&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 23:57:52&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x164f5c5f8&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm.tuned&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span style=white-space:pre-wrap&amp;gt;  5.756463&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; -5.756463&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.1882353&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.162278e+02&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.162278e-03&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.025&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 23:57:52&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x164f362f0&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm.tuned&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span style=white-space:pre-wrap&amp;gt;  5.756463&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4632353&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.162278e+02&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e+05&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.050&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 23:57:52&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x164f0c570&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm.tuned&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; -5.756463&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.1882353&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e+05&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.162278e-03&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.024&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 23:57:52&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x164eec7c8&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm.tuned&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4632353&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e+05&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e+05&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.792&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 23:57:52&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x164ec0b48&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm.tuned&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4632353&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e-05&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e-05&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.030&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 23:57:52&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x164e8ab88&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm.tuned&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; -5.756463&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4632353&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.162278e-03&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e-05&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.029&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 23:57:52&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x164e5e2d0&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm.tuned&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span style=white-space:pre-wrap&amp;gt;  0.000000&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4632353&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e-05&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.043&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 23:57:52&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x164e34400&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm.tuned&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span style=white-space:pre-wrap&amp;gt;  5.756463&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span style=white-space:pre-wrap&amp;gt;  5.756463&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4632353&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.162278e+02&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.162278e+02&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.074&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 23:57:52&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x164e02020&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm.tuned&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2542017&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e+05&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e-05&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.026&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 23:57:52&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x164de4160&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm.tuned&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; -5.756463&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4672269&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.162278e-03&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e-05&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.030&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 23:57:53&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x16e41f860&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm.tuned&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span style=white-space:pre-wrap&amp;gt;  0.000000&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span style=white-space:pre-wrap&amp;gt;  5.756463&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4672269&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.162278e+02&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.050&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 23:57:53&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x16e3e9f40&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm.tuned&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span style=white-space:pre-wrap&amp;gt;  5.756463&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span style=white-space:pre-wrap&amp;gt;  5.756463&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4672269&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.162278e+02&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.162278e+02&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.035&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 23:57:53&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x16e3c77f8&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm.tuned&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span style=white-space:pre-wrap&amp;gt;  5.756463&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4672269&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e+05&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.162278e+02&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.032&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 23:57:53&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x1345eef68&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm.tuned&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4672269&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e+05&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e+05&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.029&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 23:57:53&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x1345c8a18&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm.tuned&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span style=white-space:pre-wrap&amp;gt;  5.756463&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4672269&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e-05&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.162278e+02&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.027&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 23:57:54&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x164ca6460&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm.tuned&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; -5.756463&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; -5.756463&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4672269&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.162278e-03&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.162278e-03&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.029&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 23:57:54&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x164c86108&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm.tuned&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; -5.756463&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span style=white-space:pre-wrap&amp;gt;  5.756463&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4672269&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.162278e-03&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.162278e+02&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.023&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 23:57:54&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x13452b258&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm.tuned&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span style=white-space:pre-wrap&amp;gt;  0.000000&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span style=white-space:pre-wrap&amp;gt;  0.000000&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4672269&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.026&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 23:57:54&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x1345010e8&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm.tuned&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span style=white-space:pre-wrap&amp;gt;  0.000000&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4672269&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e+05&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.028&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 23:57:54&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x1344dd2a8&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm.tuned&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span style=white-space:pre-wrap&amp;gt;  0.000000&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4680672&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e-05&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.033&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 23:57:55&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x16e8c96d8&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm.tuned&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; -5.756463&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span style=white-space:pre-wrap&amp;gt;  0.000000&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4680672&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.162278e-03&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.042&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 23:57:55&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x16e8a5b28&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm.tuned&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span style=white-space:pre-wrap&amp;gt;  0.000000&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; -5.756463&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2518908&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.162278e-03&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.025&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 23:57:55&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x16e87db78&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm.tuned&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span style=white-space:pre-wrap&amp;gt;  5.756463&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span style=white-space:pre-wrap&amp;gt;  0.000000&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4680672&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.162278e+02&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.026&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 23:57:55&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x164b0ec00&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm.tuned&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2371849&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e+05&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e-05&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.051&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 23:57:55&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x164aede90&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm.tuned&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; -5.756463&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4680672&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e-05&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.162278e-03&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.027&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 23:57:55&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x164aadb78&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm.tuned&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4680672&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e-05&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e+05&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.026&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 23:57:55&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x164a8cee8&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm.tuned&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; -5.756463&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span style=white-space:pre-wrap&amp;gt;  5.756463&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4680672&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.162278e-03&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.162278e+02&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.024&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 23:57:55&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x164a46ef8&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm.tuned&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span style=white-space:pre-wrap&amp;gt;  5.756463&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; -5.756463&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2006303&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.162278e+02&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.162278e-03&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.024&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 23:57:55&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x164a275b0&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm.tuned&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span style=white-space:pre-wrap&amp;gt;  5.756463&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span style=white-space:pre-wrap&amp;gt;  5.756463&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4680672&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.162278e+02&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.162278e+02&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.025&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 23:57:55&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x164a0a2e0&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm.tuned&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; -5.756463&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4823529&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.162278e-03&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e-05&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.025&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 23:57:56&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x1649ea238&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm.tuned&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; -5.756463&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; -5.756463&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4680672&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.162278e-03&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.162278e-03&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.030&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 23:57:56&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x1649d0c80&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm.tuned&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; -5.756463&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4680672&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.162278e-03&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e+05&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.052&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 23:57:56&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x1649b6c10&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm.tuned&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span style=white-space:pre-wrap&amp;gt;  0.000000&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4823529&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e-05&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.029&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 23:57:56&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x16e865190&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm.tuned&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span style=white-space:pre-wrap&amp;gt;  0.000000&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4680672&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e+05&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.028&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 23:57:56&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x16e84baf8&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm.tuned&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4823529&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e-05&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e-05&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.037&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 23:57:56&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x16e82a278&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm.tuned&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span style=white-space:pre-wrap&amp;gt;  5.756463&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4680672&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e-05&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.162278e+02&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.025&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 23:57:56&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x133ff9c88&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm.tuned&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span style=white-space:pre-wrap&amp;gt;  5.756463&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2802521&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.162278e+02&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e-05&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.025&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 23:57:56&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x133fde710&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm.tuned&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span style=white-space:pre-wrap&amp;gt;  5.756463&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4680672&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.162278e+02&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e+05&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.026&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 23:57:56&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x133fc2fd0&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm.tuned&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span style=white-space:pre-wrap&amp;gt;  5.756463&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4680672&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e+05&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.162278e+02&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.027&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 23:57:56&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x133f06cb0&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm.tuned&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span style=white-space:pre-wrap&amp;gt;  0.000000&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span style=white-space:pre-wrap&amp;gt;  0.000000&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4680672&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.025&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 23:57:56&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x133eca480&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm.tuned&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span style=white-space:pre-wrap&amp;gt;  0.000000&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span style=white-space:pre-wrap&amp;gt;  5.756463&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4680672&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.162278e+02&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.024&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 23:57:56&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x133e9dd28&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm.tuned&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; -5.756463&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2006303&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e+05&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.162278e-03&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.033&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 23:57:56&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x133e7f238&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm.tuned&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span style=white-space:pre-wrap&amp;gt;  0.000000&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4680672&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e+05&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.029&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 23:57:56&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x16e33a6d8&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm.tuned&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 11.512925&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4680672&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e+05&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e+05&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.027&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-17 23:57:56&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x16e319e18&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm.tuned&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;h3&gt;评估性能的正确（与错误）方式&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;这里进行一个对比，看看为什么要用嵌套重采样而不是简单的无嵌套重采样&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# ---------------准备数据
# 设置随机数种子
set.seed(5)
# 构建学习器
lrn_xgboost &amp;lt;- lrn(
 # 选择xgboost算法作为学习器
 &apos;classif.xgboost&apos;,
 # 设置超参数的选择范围
 eta = to_tune(1e-4, 1, logscale = TRUE),
 max_depth = to_tune(1, 20),
 colsample_bytree  = to_tune(1e-1, 1),
 colsample_bylevel = to_tune(1e-1, 1),
 lambda = to_tune(1e-3, 1e3, logscale = TRUE),
 alpha = to_tune(1e-3, 1e3, logscale = TRUE),
 subsample = to_tune(1e-1, 1)
)
# 构建任务生成器，命名为&apos;moons&apos;
tsk_moons &amp;lt;- tgen(&apos;moons&apos;)
# 随机生成100个训练样本和1000000个测试样本
tsk_moons_train &amp;lt;- tsk_moons$generate(100)
tsk_moons_test &amp;lt;- tsk_moons$generate(1000000)
# 构建评估器
msr_ce &amp;lt;- msr(&apos;classif.ce&apos;)
# 调优器用随机搜索法
tnr_random &amp;lt;- tnr(&apos;random_search&apos;)
# 使用留出法重采样
rsmp_holdout &amp;lt;- rsmp(&apos;holdout&apos;)
# 设置终止器，使用次数限制法，随机搜索700次终止
trm_evals700 &amp;lt;- trm(&apos;evals&apos;, n_evals = 700)

# -------无嵌套重采样
# 使用`tune()`进行实例调优
instance &amp;lt;- tune(
 tuner = tnr_random,
 task = tsk_moons_train,
 learner = lrn_xgboost,
 resampling = rsmp_holdout,
 measures = msr_ce,
 terminator = trm_evals700
)
# 记录最优参数在调优集上的性能
insample &amp;lt;- instance$result_y

# -------嵌套重采样
# 使用`auto_tuner()`创建一个调优学习器`AutoTuner`
at &amp;lt;- auto_tuner(
 tuner = tnr_random,
 learner = lrn_xgboost,
 # 这里的留出法用于内部重采样
 resampling = rsmp_holdout,
 measure = msr_ce,
 terminator = trm_evals700
)
# 创建一个5折CV，用于后续的外部重采样
rsmp_cv5 &amp;lt;- rsmp(&apos;cv&apos;, folds = 5)
# 将`Task`，`AutoTuner`和外部重采样器`Resampling`传递给`resample()`
# `ResampleResult$aggregate()`给出整合结果
rr &amp;lt;- resample(tsk_moons_train, at, rsmp_cv5)
outsample &amp;lt;- rr$aggregate()

# ------用无嵌套重采样的超参数建模
# 创建xgboost的学习器
lrn_xgboost_tuned &amp;lt;- lrn(&apos;classif.xgboost&apos;)
# 将无嵌套重采样的实例调优得到的最佳超参数传递给xgboost学习器
lrn_xgboost_tuned$param_set$set_values(
 # `instance`是无嵌套重采样的调优实例
 .values = instance$result_learner_param_vals
)
# 训练模型 -&amp;gt; 测试模型 -&amp;gt; 评估
generalization &amp;lt;- lrn_xgboost_tuned$train(
 tsk_moons_train
)$
 predict(tsk_moons_test)$
 score()

# 汇总一下结果
round(
 c(
  # 用无嵌套重采样选择的最佳超参数构建的模型在测试集上的评估结果
  true_generalization = as.numeric(generalization),
  # 无嵌套重采样选择的最佳超参数构建的模型在内部训练的评估结果
  # 这里的内部是仅在训练集上生成的调优模型得到的结果
  without_nested_resampling = as.numeric(insample),
  # 嵌套重采样选择的最佳超参数构建的模型在内部训练的评估结果
  with_nested_resampling = as.numeric(outsample)
 ), 
 2
)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;true_generalization 0.1 
without_nested_resampling 0.06 
with_nested_resampling 0.14
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;从上面得到什么结果？&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;无嵌套重采样的内部评估得到的交叉熵很低，与实际在测试集的评估结果差异很大&lt;/li&gt;
&lt;li&gt;这可能表明对特定的内部留出划分存在&lt;strong&gt;元过拟合（meta-overfitting）&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;相比之下嵌套重采样得到的外部估计效果更稳健&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;更高级的搜索空间&lt;/h2&gt;
&lt;h3&gt;标量参数调优（Scalar Parameter Tuning）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;当在学习器中使用&lt;code&gt;to_tune()&lt;/code&gt;时，会隐式地为调优搜索空间创建一个&lt;code&gt;ParamSet&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;learner &amp;lt;- lrn(&apos;classif.svm&apos;,
  cost  = to_tune(1e-1, 1e5),
  kernel = to_tune(c(&apos;radial&apos;, &apos;linear&apos;)),
  shrinking = to_tune(),
  type = &apos;C-classification&apos;
)

learner$param_set$search_space()
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;ParamSet(3)&amp;gt;
          id    class lower upper nlevels        default  value
      &amp;lt;char&amp;gt;   &amp;lt;char&amp;gt; &amp;lt;num&amp;gt; &amp;lt;num&amp;gt;   &amp;lt;num&amp;gt;         &amp;lt;list&amp;gt; &amp;lt;list&amp;gt;
1:      cost ParamDbl   0.1 1e+05     Inf &amp;lt;NoDefault[0]&amp;gt; [NULL]
2:    kernel ParamFct    NA    NA       2 &amp;lt;NoDefault[0]&amp;gt; [NULL]
3: shrinking ParamLgl    NA    NA       2           TRUE [NULL]
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;可以看到
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;kernel&lt;/code&gt;是因子，只需要传入想要调整的水平相对应的向量&lt;/li&gt;
&lt;li&gt;&lt;code&gt;shrinking&lt;/code&gt;超参数是一个逻辑值，它只有两种可能的值，&lt;br /&gt;
所以不需要向&lt;code&gt;to_tune()&lt;/code&gt;传递任何内容，&lt;br /&gt;
它会自动从&lt;code&gt;learner$param_set&lt;/code&gt;中识别出这是一个逻辑值，&lt;br /&gt;
并将这个细节传递给&lt;code&gt;learner$param_set$search_space()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;对于因子参数，如果想在所有可能的值上进行调整，&lt;br /&gt;
也可以在不传递任何参数的情况下使用&lt;code&gt;to_tune()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;如果想在一小部分可能的值上离散化数值参数，&lt;br /&gt;
可以使用to_tune()将数值参数视为因子
&lt;ul&gt;
&lt;li&gt;例如，想找到随机森林中最优的树的数量，&lt;br /&gt;
我们可能只考虑三种情况：100棵、200棵或400棵树&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;lrn(&apos;classif.ranger&apos;, num.trees = to_tune(c(100, 200, 400)))
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;将&lt;strong&gt;整数变做因子&lt;/strong&gt;会导致超参数&lt;strong&gt;无序&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;因此，利用顺序信息的算法在忽略顺序时性能会变差&lt;/li&gt;
&lt;li&gt;对于这些算法，&lt;br /&gt;
使用自定义变换定义一个 &lt;code&gt;ParamDbl&lt;/code&gt; 或 &lt;code&gt;ParamInt&lt;/code&gt;更有意义
（后续内容）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;定义搜索空间&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;下列&lt;code&gt;p_*()&lt;/code&gt;创建&lt;code&gt;Param&lt;/code&gt;对象&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Constructor 构造函数&lt;/th&gt;
&lt;th&gt;Description 描述&lt;/th&gt;
&lt;th&gt;Underlying Class 基础类&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;p_dbl()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Real valued parameter (“double”)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ParamDbl&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;p_int()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Integer parameter&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ParamInt&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;p_fct()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Discrete valued parameter (“factor”)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ParamFct&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;p_lgl()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Logical / Boolean parameter&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ParamLgl&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;p_uty()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Untyped parameter&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ParamUty&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;使用&lt;code&gt;ps()&lt;/code&gt;手动创造搜索空间，对象为&lt;code&gt;ParamSet&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;search_space &amp;lt;- ps(
 cost  = p_dbl(lower = 1e-1, upper = 1e5),
 kernel = p_fct(c(&apos;radial&apos;, &apos;linear&apos;)),
 shrinking = p_lgl()
)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;将搜索空间传递给&lt;code&gt;ti()&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;官方文档写错了，他给的例子是&lt;code&gt;ti()&lt;/code&gt;
&lt;code&gt;auto_tuner()&lt;/code&gt;应该传递了&lt;code&gt;Tuner&lt;/code&gt;但是例子里没有&lt;code&gt;Tuner&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;tsk_sonar &amp;lt;- tsk(&apos;sonar&apos;)
rsmp_cv3 &amp;lt;- rsmp(&apos;cv&apos;, folds = 3)
msr_ce &amp;lt;- msr(&apos;classif.ce&apos;)

ists &amp;lt;- ti(
    tsk_sonar, 
    lrn(&apos;classif.svm&apos;, type = &apos;C-classification&apos;), 
    rsmp_cv3,
    msr_ce, 
    trm(&apos;none&apos;), 
    # 将搜索空间传递到参数`search_space`
    search_space = search_space
)

ists
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[36m--[39m [1m[34m&amp;lt;TuningInstanceBatchSingleCrit&amp;gt;[39m[22m [36m---------------------------------------------[39m
* State: Not optimized
* Objective: [34m&amp;lt;ObjectiveTuningBatch&amp;gt;[39m
* Search Space:
          id    class lower upper nlevels
      &amp;lt;char&amp;gt;   &amp;lt;char&amp;gt; &amp;lt;num&amp;gt; &amp;lt;num&amp;gt;   &amp;lt;num&amp;gt;
1:      cost ParamDbl   0.1 1e+05     Inf
2:    kernel ParamFct    NA    NA       2
3: shrinking ParamLgl    NA    NA       2
* Terminator: [34m&amp;lt;TerminatorNone&amp;gt;[39m
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;有界搜索空间&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;手动创建搜索空间时，对搜索空间中的所有超参数是否有边界保持谨慎&lt;/li&gt;
&lt;li&gt;如果没有给&lt;code&gt;p_dbl()&lt;/code&gt; 或 &lt;code&gt;p_int()&lt;/code&gt; 传递下限和上限，&lt;br /&gt;
几乎所有调谐器在调优过程中都会抛出错误&lt;/li&gt;
&lt;li&gt;如果不确定，您可以在构造的 &lt;code&gt;ParamSet&lt;/code&gt; （&lt;code&gt;ps()&lt;/code&gt;创建的对象）上&lt;br /&gt;
使用&lt;code&gt;ParamSet$is_bounded&lt;/code&gt;查看是否设置了下限和上限&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;ps(cost = p_dbl(lower = 0.1, upper = 1))$is_bounded
ps(cost = p_dbl(lower = 0.1, upper = Inf))$is_bounded
search_space
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;cost: TRUE

cost: FALSE

cost TRUE 
kernel TRUE 
shrinking TRUE
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;向量上的变换与调优&lt;/h3&gt;
&lt;h4&gt;使用&lt;code&gt;p_*()&lt;/code&gt;的自定义变换&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;之前讨论过对数变换的用法&lt;/li&gt;
&lt;li&gt;简单回顾一下之前用给&lt;code&gt;lrn()&lt;/code&gt;传递用&lt;code&gt;to_tune()&lt;/code&gt;创建的学习器的搜索空间&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;svm &amp;lt;- lrn(
 &apos;classif.svm&apos;,
 cost = to_tune(1e-5,1e5, logscale = TRUE)
)
svm$param_set
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;ParamSet(1)&amp;gt;
       id    class     lower    upper nlevels        default  value
   &amp;lt;char&amp;gt;   &amp;lt;char&amp;gt;     &amp;lt;num&amp;gt;    &amp;lt;num&amp;gt;   &amp;lt;num&amp;gt;         &amp;lt;list&amp;gt; &amp;lt;list&amp;gt;
1:   cost ParamDbl -11.51293 11.51293     Inf &amp;lt;NoDefault[0]&amp;gt; [NULL]
Trafo is set.
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;可以看到这里的&lt;code&gt;lower&lt;/code&gt;和&lt;code&gt;upper&lt;/code&gt;并非&lt;code&gt;1e-5&lt;/code&gt;和&lt;code&gt;1e5&lt;/code&gt;而是&lt;code&gt;-11.5&lt;/code&gt;和&lt;code&gt;11.5&lt;/code&gt; 　
所以输入到学习器的范围其实是&lt;code&gt;log(1e-5)&lt;/code&gt;和&lt;code&gt;log(1e5)&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;手动创建对数变换&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;trafo&lt;/code&gt;中传递的是对采样结果的操作函数&lt;/li&gt;
&lt;li&gt;这里的输出结果和&lt;code&gt;svm$param_set&lt;/code&gt;一致&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;ss &amp;lt;- ps(
 cost = p_dbl(
  # 注意：这里是log(1e-5)和log(1e5)
  log(1e-5), log(1e5),
  # 对结果做指数变换
  trafo = function(x) ruturn(exp(x))
 )
) 
ss
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;ParamSet(1)&amp;gt;
       id    class     lower    upper nlevels        default  value
   &amp;lt;char&amp;gt;   &amp;lt;char&amp;gt;     &amp;lt;num&amp;gt;    &amp;lt;num&amp;gt;   &amp;lt;num&amp;gt;         &amp;lt;list&amp;gt; &amp;lt;list&amp;gt;
1:   cost ParamDbl -11.51293 11.51293     Inf &amp;lt;NoDefault[0]&amp;gt; [NULL]
Trafo is set.
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;虽然&lt;code&gt;ParamSet&lt;/code&gt;给出了&lt;code&gt;Trafo is set.&lt;/code&gt;的信息，&lt;br /&gt;
也可以通过&lt;code&gt;ParamSet$trafo()&lt;/code&gt;手动输入信息来查看是否有转换&lt;/li&gt;
&lt;li&gt;看看&lt;code&gt;ParamSet$trafo()&lt;/code&gt;的转换
&lt;ul&gt;
&lt;li&gt;结果也是完全一致&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;svm$param_set$search_space()$trafo(list(cost = 1))
ss$trafo(list(cost = 1))
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;$cost = 2.71828182845905
$cost = 2.71828182845905
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;从上面的例子可以看出，&lt;code&gt;to_tune(1e-5,1e5, logscale = TRUE)&lt;/code&gt;的原理是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;将下限与上限做对数变换&lt;/li&gt;
&lt;li&gt;在对数变换后的上下限形成的区间做均匀取样&lt;/li&gt;
&lt;li&gt;将均匀取样的结果进行指数变换，传递给&lt;code&gt;Learner&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;to_tune()&lt;/code&gt;除了接受&lt;code&gt;to_tune(1e-5, 1e5, logscale = TRUE)&lt;/code&gt;这样的格式外，&lt;br /&gt;
也接受&lt;code&gt;Param&lt;/code&gt;对象&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在下面例子中，取样在区间$[0,3]$均匀取样，将取样的结果$+2$传递到&lt;code&gt;Learner&lt;/code&gt;中&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;lrn(
 &apos;classif.svm&apos;,
 cost = to_tune(
  p_dbl(
   0, 3, 
   trafo = function(x) return(x + 2)
  )
 )
)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;对于多个复杂变换，需要将函数传递到&lt;code&gt;.extra_trafo&lt;/code&gt;中
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;.extra_trafo&lt;/code&gt;接受一个带有参数&lt;code&gt;x&lt;/code&gt;和&lt;code&gt;param_set&lt;/code&gt;的函数&lt;/li&gt;
&lt;li&gt;在调优过程中，&lt;br /&gt;
&lt;code&gt;x&lt;/code&gt;是一个包含正在测试的配置的列表，&lt;br /&gt;
&lt;code&gt;param_set&lt;/code&gt;是整个参数集&lt;/li&gt;
&lt;li&gt;测试了一下，在这个例子里省略&lt;code&gt;param_set&lt;/code&gt;也是可以的，&lt;br /&gt;
但是不确定其他用法中能不能省，我觉得还是别省了&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;search_space &amp;lt;- ps(
 # `cost`在区间[-1,1]均匀取样，取样结果做指数转换
 cost = p_dbl(-1, 1, trafo = function(x) return(exp(x))),
 # `kernel`有&apos;polynomial&apos;和&apos;radial&apos;两种选择
 kernel = p_fct(c(&apos;polynomial&apos;, &apos;radial&apos;)),
 # 传递一个函数：当kernel == &apos;polynomial&apos;时，
 # `cost`抽样后指数转换的最终结果+2；否则就保持最终结果
 .extra_trafo = function(x, param_set) {
     if (x$kernel == &apos;polynomial&apos;) {
       x$cost = x$cost + 2
  }
  return(x)
 }
)

search_space$trafo(list(cost = 1, kernel = &apos;polynomial&apos;))
search_space$trafo(list(cost = 1, kernel = &apos;radial&apos;))
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;$cost
4.71828182845904
$kernel
&apos;polynomial&apos;


$cost
2.71828182845905
$kernel
&apos;radial&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;向量变换&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;任何函数都可以传递给&lt;code&gt;trafo&lt;/code&gt;和&lt;code&gt;.extra_trafo&lt;/code&gt;，&lt;br /&gt;
这使得可以调整&lt;code&gt;ParamUty&lt;/code&gt;类参数，&lt;br /&gt;
这些参数可以是向量、函数或任何非原子类&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;下例中，支持向量机（SVM）的&lt;code&gt;class.weights&lt;/code&gt;参数接受一个类权重的命名向量，&lt;br /&gt;
每个目标类都有一个条目&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;为了调整这个参数，可以调整一个标量，然后将其转换为一个向量&lt;/li&gt;
&lt;li&gt;下面的代码将采样一个介于&lt;code&gt;0.1&lt;/code&gt;和&lt;code&gt;0.9&lt;/code&gt;之间的值&lt;code&gt;x&lt;/code&gt;，&lt;br /&gt;
然后将结果转换为(&lt;code&gt;x&lt;/code&gt;, &lt;code&gt;1 - x&lt;/code&gt;)，然后传递给&lt;code&gt;Learner&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;先看看&lt;code&gt;class.weights&lt;/code&gt;长什么样&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;它的类型是&lt;code&gt;ParamUty&lt;/code&gt;，所以可以传递任何东西给它&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;{
    lrn(&apos;classif.svm&apos;)$param_set %&amp;gt;% 
        as.data.table()
} %&amp;gt;% 
    filter(id == &apos;class.weights&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 1 x 11&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;id&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;class&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;lower&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;upper&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;levels&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;nlevels&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;is_bounded&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;special_vals&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;default&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;storage_type&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;tags&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;lgl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;class.weights&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;ParamUty&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NULL&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Inf&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;FALSE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NULL&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NULL&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;list&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;train&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;对于&lt;code&gt;ParamUty&lt;/code&gt;而言，要慎重确定它&lt;strong&gt;原本接受什么形式的输入&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;class.weights&lt;/code&gt;接受一个命名向量，&lt;br /&gt;
其中包含分类的level以及希望分配的权重（0–1之间）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;search_space &amp;lt;- ps(
 class.weights = p_dbl(
  lower = 0.1, upper = 0.9,
  # 这里的M和R是`tsk_sonar`里的分类
  # M是Mines，R是Rocks
  trafo = function(x) return(c(M = x, R = 1 - x))
 )
)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;有时候需要调节多个不存在学习器&lt;code&gt;param_set&lt;/code&gt;里的&lt;strong&gt;伪参数&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;这些伪参数会被用于调整向量参数&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;下例中以&lt;code&gt;lrn(&apos;surv.coxtime&apos;)&lt;/code&gt;为例
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;num_nodes&lt;/code&gt;需要给每个层传递节点，&lt;br /&gt;
如果有5个层，每个层生成4个节点，那么就要输入向量：&lt;br /&gt;
&lt;code&gt;num_nodes = c(4, 4, 4, 4, 4)&lt;/code&gt;，
当然也可以这样传递：`num_nodes = rep(4, 5)&lt;/li&gt;
&lt;li&gt;所以&lt;code&gt;num_nodes&lt;/code&gt;实际依赖两个参数：
&lt;ul&gt;
&lt;li&gt;层数&lt;/li&gt;
&lt;li&gt;每层节点数&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;因此可以自定义层数和每层节点数的两个伪参数，&lt;br /&gt;
通过组合这两个伪函数来生成目标超参数&lt;code&gt;num_nodes&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;num_nodes&lt;/code&gt;并不会在&lt;code&gt;ParamSet&lt;/code&gt;的打印结果中出现，&lt;br /&gt;
因为我们并没有在&lt;code&gt;ps()&lt;/code&gt;中直接定义它&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;search_space &amp;lt;- ps(
 num_layers = p_int(lower = 1, upper = 20),
 num_nodes_per_layer = p_int(4, 64),
 .extra_trafo = function(x, param_set) {
  x$num_nodes = rep(x$num_nodes_per_layer, x$num_layers)
  x$num_layers = NULL
  x$num_nodes_per_layer = NULL
  return(x)
  }
)

search_space
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;ParamSet(2)&amp;gt;
                    id    class lower upper nlevels        default  value
                &amp;lt;char&amp;gt;   &amp;lt;char&amp;gt; &amp;lt;num&amp;gt; &amp;lt;num&amp;gt;   &amp;lt;num&amp;gt;         &amp;lt;list&amp;gt; &amp;lt;list&amp;gt;
1:          num_layers ParamInt     1    20      20 &amp;lt;NoDefault[0]&amp;gt; [NULL]
2: num_nodes_per_layer ParamInt     4    64      61 &amp;lt;NoDefault[0]&amp;gt; [NULL]
Trafo is set.
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;但是可以通过&lt;code&gt;ParamSet$trafo()&lt;/code&gt;来验证
&lt;ul&gt;
&lt;li&gt;结果也是很清晰了，&lt;br /&gt;
在实际的运算中要传递给&lt;code&gt;Learner&lt;/code&gt;的是生成的&lt;code&gt;num_nodes&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;search_space$trafo(list(num_layers = 4, num_nodes_per_layer = 12))
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;$num_nodes =
12 12 12 12
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;可以通过&lt;code&gt;Learner$param_set$set_values()&lt;/code&gt;传递上述自定义的搜索空间&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;learner &amp;lt;- lrn(&apos;surv.coxtime&apos;)
learner$param_set$search_space()

learner$param_set$set_values(num_nodes = to_tune(search_space))
learner$param_set$search_space()
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;ParamSet(0)&amp;gt;
Empty.


&amp;lt;ParamSet(2)&amp;gt;
                    id    class lower upper nlevels        default  value
                &amp;lt;char&amp;gt;   &amp;lt;char&amp;gt; &amp;lt;num&amp;gt; &amp;lt;num&amp;gt;   &amp;lt;num&amp;gt;         &amp;lt;list&amp;gt; &amp;lt;list&amp;gt;
1:          num_layers ParamInt     1    20      20 &amp;lt;NoDefault[0]&amp;gt; [NULL]
2: num_nodes_per_layer ParamInt     4    64      61 &amp;lt;NoDefault[0]&amp;gt; [NULL]
Trafo is set.
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;超参数依赖关系&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;例如，SVM中的&lt;code&gt;degree&lt;/code&gt;参数仅在&lt;code&gt;kernel&lt;/code&gt;为&lt;code&gt;&apos;polynomial&apos;&lt;/code&gt;时才有效&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在&lt;code&gt;ps()&lt;/code&gt;函数中，使用&lt;code&gt;depends&lt;/code&gt;参数来指定这种依赖关系，&lt;br /&gt;
该参数接受一个命名参数，&lt;br /&gt;
形式为&lt;code&gt;&amp;lt;param&amp;gt; == value&lt;/code&gt; 或 &lt;code&gt;&amp;lt;param&amp;gt; %in% &amp;lt;vector&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;下面例子中，对3个超参数进行调优&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;先简单看看&lt;code&gt;lrn(&apos;classif.svm&apos;)&lt;/code&gt;中的依赖关系&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;degree&lt;/code&gt;和&lt;code&gt;gamma&lt;/code&gt;都依赖于&lt;code&gt;kernel&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;learner &amp;lt;- lrn(&apos;classif.svm&apos;)
learner$param_set$deps
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 5 x 3&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;id&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;on&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;cond&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;coef0 &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;kernel&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;polynomial    , sigmoid       , %s %%in%% {%s}&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;cost  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;type  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;C-classification, %s == %s        &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;degree&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;kernel&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;polynomial, %s == %s  &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;gamma &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;kernel&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;polynomial    , radial        , sigmoid       , %s %%in%% {%s}&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;nu    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;type  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;nu-classification, %s == %s         &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用&lt;code&gt;depends&lt;/code&gt;参数来指定这种依赖关系
&lt;ul&gt;
&lt;li&gt;该参数接受一个命名参数，形式为&lt;code&gt;&amp;lt;param&amp;gt; == value&lt;/code&gt; 或 &lt;code&gt;&amp;lt;param&amp;gt; %in% &amp;lt;vector&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;ps(
 kernel = p_fct(c(&apos;polynomial&apos;, &apos;radial&apos;)),
 degree = p_int(1, 3, depends = (kernel == &apos;polynomial&apos;)),
 gamma = p_dbl(
  1e-5, 1e5,
  depends = (kernel %in% c(&apos;polynomial&apos;, &apos;radial&apos;))
 )
)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;ParamSet(3)&amp;gt;
Key: &amp;lt;id&amp;gt;
       id    class lower upper nlevels        default parents  value
   &amp;lt;char&amp;gt;   &amp;lt;char&amp;gt; &amp;lt;num&amp;gt; &amp;lt;num&amp;gt;   &amp;lt;num&amp;gt;         &amp;lt;list&amp;gt;  &amp;lt;list&amp;gt; &amp;lt;list&amp;gt;
1: degree ParamInt 1e+00 3e+00       3 &amp;lt;NoDefault[0]&amp;gt;  kernel [NULL]
2:  gamma ParamDbl 1e-05 1e+05     Inf &amp;lt;NoDefault[0]&amp;gt;  kernel [NULL]
3: kernel ParamFct    NA    NA       2 &amp;lt;NoDefault[0]&amp;gt;  [NULL] [NULL]
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;也可以直接传递到&lt;code&gt;to_tune()&lt;/code&gt;函数&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;lrn(
 &apos;classif.svm&apos;,
 kernel = to_tune(c(&apos;polynomial&apos;, &apos;radial&apos;)),
 degree = to_tune(
  p_int(
   1, 3, 
   depends = (kernel == &apos;polynomial&apos;)
  )
 ),
 gamma = to_tune(
  p_dbl(
   1e-5, 1e5,
   depends = (kernel %in% c(&apos;polynomial&apos;, &apos;radial&apos;))
  )
 )
)$param_set$search_space()
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;ParamSet(3)&amp;gt;
Key: &amp;lt;id&amp;gt;
       id    class lower upper nlevels        default       parents  value
   &amp;lt;char&amp;gt;   &amp;lt;char&amp;gt; &amp;lt;num&amp;gt; &amp;lt;num&amp;gt;   &amp;lt;num&amp;gt;         &amp;lt;list&amp;gt;        &amp;lt;list&amp;gt; &amp;lt;list&amp;gt;
1: degree ParamInt 1e+00 3e+00       3 &amp;lt;NoDefault[0]&amp;gt; kernel,kernel [NULL]
2:  gamma ParamDbl 1e-05 1e+05     Inf &amp;lt;NoDefault[0]&amp;gt; kernel,kernel [NULL]
3: kernel ParamFct    NA    NA       2 &amp;lt;NoDefault[0]&amp;gt;        [NULL] [NULL]
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;使用 &lt;code&gt;mlr3tuningspaces&lt;/code&gt; 推荐的搜索空间&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;选定的搜索空间可能需要大量的背景知识或专业技能&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mlr3tuningspaces&lt;/code&gt; 包为许多流行的机器学习算法提供已发布搜索空间的实现，&lt;br /&gt;
让超参数优化更容易上手&lt;/li&gt;
&lt;li&gt;搜索空间存储在字典 &lt;code&gt;mlr_tuning_spaces&lt;/code&gt; 中&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# library(mlr3tuningspaces)
mlr_tuning_spaces
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 30 x 4&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;key&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;label&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;learner&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;n_values&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.glmnet.default &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Classification GLM with Default      &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.glmnet &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 2&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.glmnet.rbv1    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Classification GLM with RandomBot    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.glmnet &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 2&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.glmnet.rbv2    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Classification GLM with RandomBot    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.glmnet &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 2&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.ranger.default &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Classification Ranger with Default   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.ranger &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 4&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.ranger.rbv1    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Classification Ranger with RandomBot &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.ranger &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 6&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.ranger.rbv2    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Classification Ranger with RandomBot &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.ranger &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 8&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.rpart.default  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Classification Rpart with Default    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.rpart  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 3&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.rpart.rbv1     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Classification Rpart with RandomBot  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.rpart  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 4&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.rpart.rbv2     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Classification Rpart with RandomBot  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.rpart  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 4&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.svm.default    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Classification SVM with Default      &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 4&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.svm.rbv1       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Classification SVM with RandomBot    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 4&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.svm.rbv2       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Classification SVM with RandomBot    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.svm    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 5&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.xgboost.default&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Classification XGBoost with Default  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.xgboost&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 8&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.xgboost.rbv1   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Classification XGBoost with RandomBot&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.xgboost&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;10&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.xgboost.rbv2   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Classification XGBoost with RandomBot&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.xgboost&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;13&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;regr.glmnet.default    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Regression GLM with Default          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;regr.glmnet    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 2&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;regr.glmnet.rbv1       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Regression GLM with RandomBot        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;regr.glmnet    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 2&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;regr.glmnet.rbv2       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Regression GLM with RandomBot        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;regr.glmnet    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 2&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;regr.ranger.default    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Regression Ranger with Default       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;regr.ranger    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 4&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;regr.ranger.rbv1       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Regression Ranger with RandomBot     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;regr.ranger    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 6&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;regr.ranger.rbv2       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Regression Ranger with RandomBot     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;regr.ranger    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 7&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;regr.rpart.default     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Regression Rpart with Default        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;regr.rpart     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 3&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;regr.rpart.rbv1        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Regression Rpart with RandomBot      &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;regr.rpart     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 4&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;regr.rpart.rbv2        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Regression Rpart with RandomBot      &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;regr.rpart     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 4&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;regr.svm.default       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Regression SVM with Default          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;regr.svm       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 4&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;regr.svm.rbv1          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Regression SVM with RandomBot        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;regr.svm       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 4&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;regr.svm.rbv2          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Regression SVM with RandomBot        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;regr.svm       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 5&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;regr.xgboost.default   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Regression XGBoost with Default      &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;regr.xgboost   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 8&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;regr.xgboost.rbv1      &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Regression XGBoost with RandomBot    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;regr.xgboost   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;10&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;regr.xgboost.rbv2      &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Regression XGBoost with RandomBot    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;regr.xgboost   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;13&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;lts()&lt;/code&gt;（learner tuning space）可以快速调取推荐的搜索空间&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;lts_rpart &amp;lt;- lts(&apos;classif.rpart.default&apos;)
lts_rpart
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[36m--[39m [1m[34m&amp;lt;TuningSpace&amp;gt;[39m (classif.rpart.default): Classification Rpart with Default[22m [36m----[39m
          id lower upper levels logscale
      &amp;lt;char&amp;gt; &amp;lt;num&amp;gt; &amp;lt;num&amp;gt; &amp;lt;list&amp;gt;   &amp;lt;lgcl&amp;gt;
1:  minsplit 2e+00 128.0 [NULL]     TRUE
2: minbucket 1e+00  64.0 [NULL]     TRUE
3:        cp 1e-04   0.1 [NULL]     TRUE
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;之后可以传递给&lt;code&gt;ti()&lt;/code&gt;或&lt;code&gt;auto_tuner()&lt;/code&gt;中的&lt;code&gt;search_space&lt;/code&gt;参数，&lt;br /&gt;
也可以直接调取&lt;code&gt;TuningSpace$values&lt;/code&gt;（&lt;code&gt;TuneToken&lt;/code&gt;类）传递到&lt;code&gt;Learner$param_set&lt;/code&gt;中&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# `ti()`
instance &amp;lt;- ti(
 task = tsk_sonar,
 learner = lrn(&apos;classif.rpart&apos;),
 resampling = rsmp(&apos;cv&apos;, folds = 3),
 measures = msr(&apos;classif.ce&apos;),
 terminator = trm(&apos;evals&apos;, n_evals = 20),
 # 在这里
 search_space = lts_rpart
)

# `auto_tuner()`
at &amp;lt;- auto_tuner(
 learner = lrn(&apos;classif.rpart&apos;),
 resampling = rsmp(&apos;cv&apos;, folds = 3),
 measures = msr(&apos;classif.ce&apos;),
 terminator = trm(&apos;evals&apos;, n_evals = 20),
 # # 在这里
 search_space = lts_rpart
)

# 直接传递给`Learner`
learner &amp;lt;- lrn(&apos;classif.rpart&apos;)
learner$param_set$set_values(.values = lts_rpart$values)
learner$param_set
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;也可以直接将&lt;code&gt;Learner&lt;/code&gt;传递给&lt;code&gt;lts()&lt;/code&gt;来调用默认的搜索空间，&lt;br /&gt;
以及在&lt;code&gt;lts()&lt;/code&gt;调用默认搜索空间的时候自定义更改超参数调优内容&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;lts(lrn(&apos;classif.rpart&apos;))
lts(&apos;classif.rpart.rbv2&apos;, maxdepth = to_tune(1, 20))
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;错误处理与内存管理&lt;/h2&gt;
&lt;h3&gt;封装与回退学习器&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;即使在简单的机器学习问题中，也有很大的出错可能性
&lt;ul&gt;
&lt;li&gt;例如，当学习器无法收敛、内存耗尽，&lt;br /&gt;
或者由于底层数据的问题而出现错误并终止运行&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;作为一个常见问题：如果测试数据中存在训练数据中没有的因子水平，&lt;br /&gt;
学习器可能会失败，在这种情况下建模会失败，&lt;br /&gt;
因为没有针对这些新的因子水平训练权重/系数：&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 调取`Task`
tsk_pen &amp;lt;- tsk(&apos;penguins&apos;)
# 去除有缺损值的行
tsk_pen$filter(tsk_pen$row_ids[complete.cases(tsk_pen$data())])
# 创建一个custom方法的重采样器(ResamplingCustom类)：
# custom需要手动提供的索引将数据拆分为训练集和测试集
rsmp_custom &amp;lt;- rsmp(&apos;custom&apos;)
# 为了举例子，这里选择手动分配训练集和测试集：
# 不包含“Torgersen”和仅包含“Torgersen”的行的数据集
rsmp_custom$instantiate(
 task = tsk_pen,
 # 选择所有`island`不为&apos;Torgersen&apos;的行的数据集作为训练集
 train_sets = list(
  tsk_pen$
   row_ids[
    tsk_pen$
     data()$
     island != &apos;Torgersen&apos;
   ]
 ),
 # 选择所有`island`为&apos;Torgersen&apos;的行的数据集作为测试集
 test_sets = list(
  tsk_pen$
   row_ids[
    tsk_pen$
     data()$
     island == &apos;Torgersen&apos;
   ]
 )
)
# 这样分配完后，测试集中的`island`是没有&apos;Torgersen&apos;的（缺乏因子）
# 这种结果会导致后面的`tune()`失败

# 创建交叉熵评估器
msr_ce &amp;lt;- msr(&apos;classif.ce&apos;)
# 创建随机搜索调优器
tnr_random &amp;lt;- tnr(&apos;random_search&apos;)
# 创建lda学习器
learner &amp;lt;- lrn(
 &apos;classif.lda&apos;, 
 method = &apos;t&apos;, 
 nu = to_tune(3, 10)
)

# ----------由于训练集没有测试集的因子“Torgersen”
# ----------下面报错
# 进行实例调优
tune(
 tuner = tnr_random, 
 task = tsk_pen, 
 learner = learner, 
 resampling = rsmp_custom, 
 measure = msr_ce, 
 term_evals = 10)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;Error in lda.default(x, grouping, ...): variable 6 appears to be constant within groups
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;封装（encapsulation）允许在不干扰调优过程的情况下隔离和处理错误&lt;/li&gt;
&lt;li&gt;可以使用 &lt;code&gt;$encapsulate()&lt;/code&gt; 方法让学习器封装错误
&lt;ul&gt;
&lt;li&gt;传递的&lt;code&gt;method = &apos;evaluate&apos;&lt;/code&gt;是告诉学习器在训练和预测阶段都设置封装&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;learner$encapsulate(
 method = &apos;evaluate&apos;, 
 fallback = lrn(&apos;classif.featureless&apos;)
)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;在HPO过程中，学习器不收敛是比较常见的问题，&lt;br /&gt;
这导致进程无限期运行
&lt;ul&gt;
&lt;li&gt;可以通过在学习器中设置 &lt;code&gt;timeout&lt;/code&gt;字段来避免这种情况发生&lt;/li&gt;
&lt;li&gt;如果学习器运行了指定的时长（以秒为单位），&lt;br /&gt;
该字段会向学习器发出停止信号&lt;/li&gt;
&lt;li&gt;可以分别针对训练和预测进行设置&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;learner$timeout = c(train = 30, predict = 30)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;如果出现错误，或者达到模型超时阈值，&lt;br /&gt;
那么学习者不会中断，而是在发现错误时不进行预测
&lt;ul&gt;
&lt;li&gt;对于出现错误的重采样迭代，结果将显示为&lt;code&gt;NA&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;上述情况时，超参数优化将会失败
&lt;ul&gt;
&lt;li&gt;因为无法汇总不同重采样迭代的结果&lt;/li&gt;
&lt;li&gt;通过使用备择学习器，可以解决这个问题
&lt;ul&gt;
&lt;li&gt;常见的方法是使用无特征基线&lt;br /&gt;
&lt;code&gt;lrn(&apos;regr.featureless&apos;)&lt;/code&gt; 或&lt;br /&gt;
 &lt;code&gt;lrn(&apos;classif.featureless&apos;)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;lrn(&apos;classif.featureless&apos;)&lt;/code&gt;总是预测多数类（占比最高的分类）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;instance &amp;lt;- tune(
 tuner = tnr_random, 
 task = tsk_pen, 
 learner = learner, 
 resampling = rsmp_custom, 
 measure = msr_ce,
 term_evals = 10
)

as.data.table(instance$archive)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 10 x 9&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;nu&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;classif.ce&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;runtime_learners&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;timestamp&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;warnings&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;errors&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;x_domain&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;batch_nr&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;resample_result&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dttm&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;8&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-20 18:42:40&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;8&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x16642a5a8&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;9&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-20 18:42:40&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;9&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x165f622c8&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;5&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-20 18:42:40&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x165f7da40&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;5&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-20 18:42:40&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x165f9bbc8&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;6&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-20 18:42:40&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;6&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 5&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x165fbb758&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;9&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-20 18:42:40&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;9&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 6&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x165fd78a8&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;5&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-20 18:42:40&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 7&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x165fedbc8&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-20 18:42:40&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 8&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x16644c068&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;8&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-20 18:42:40&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;8&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 9&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x16646a458&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;6&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-20 18:42:41&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;6&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;10&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x166ac1458&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;用&lt;code&gt;Instance$archive$resample_result()&lt;/code&gt;调取重采样中发生的错误&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;instance$archive$resample_result(1)$errors
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 1 x 2&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;iteration&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;msg&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;variable 6 appears to be constant within groups&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;调优则是可以进行的，并且得到最终选择出来的超参数&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;instance$result
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 1 x 4&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;nu&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;learner_param_vals&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;x_domain&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;classif.ce&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;8&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;t, 8&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;8&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;h3&gt;内存管理&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ti()&lt;/code&gt;和&lt;code&gt;auto_tuner()&lt;/code&gt;中的&lt;code&gt;store_models&lt;/code&gt;参数&lt;br /&gt;
可以选择是否储存训练中生成的模型&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ti()&lt;/code&gt; 和 &lt;code&gt;auto_tuner()&lt;/code&gt;中的&lt;code&gt;store_benchmark_result&lt;/code&gt;参数&lt;br /&gt;
可以选择是否储存重采样结果
&lt;ul&gt;
&lt;li&gt;但如果没有重采样结果，&lt;br /&gt;
就无法再用其他指标对配置进行评分&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;当使用大量外部重采样迭代运行嵌套重采样时，&lt;br /&gt;
如果在 &lt;code&gt;auto_tuner()&lt;/code&gt; 函数中设置 &lt;code&gt;store_tuning_instance = FALSE&lt;/code&gt;，&lt;br /&gt;
则可以节省额外的内存
&lt;ul&gt;
&lt;li&gt;但是，&lt;br /&gt;
&lt;code&gt;extract_inner_tuning_results()&lt;/code&gt; 和&lt;br /&gt;
&lt;code&gt;extract_inner_tuning_archives()&lt;/code&gt; 函数将不再起作用&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;选项&lt;code&gt;store_models = TRUE&lt;/code&gt;会将&lt;br /&gt;
&lt;code&gt;store_benchmark_result&lt;/code&gt;和&lt;br /&gt;
&lt;code&gt;store_tuning_instance&lt;/code&gt;设置为&lt;code&gt;TRUE&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;因为模型存储在基准测试结果中，&lt;br /&gt;
而基准测试结果又是实例的一部分&lt;/li&gt;
&lt;li&gt;这也意味着&lt;code&gt;store_benchmark_result = TRUE&lt;/code&gt;会将&lt;br /&gt;
&lt;code&gt;store_tuning_instance&lt;/code&gt;设置为&lt;code&gt;TRUE&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;在 &lt;code&gt;resample()&lt;/code&gt; 或 &lt;code&gt;benchmark()&lt;/code&gt; 中设置 &lt;code&gt;store_models = FALSE&lt;/code&gt;，&lt;br /&gt;
以在运行嵌套重采样时禁用自动调谐器的存储
仍然可以通过&lt;code&gt;ResampleResult$aggregate()&lt;/code&gt; 查看整合评估的结果，&lt;br /&gt;
但会丢失有关内部重采样的信息&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;多目标调优&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;更多时候，比起模型在单一评估指标上优秀，&lt;br /&gt;
在多个评估指标上都有较好的评估结果是我们想看到的&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;从定义上讲，对多个评估指标进行优化意味着这些指标之间会相互竞争&lt;br /&gt;
（否则我们只需优化其中一个指标）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;因此一般来说，不存在一种能优化所有指标的单一评估器&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;帕累托最优（Pareto optimality）&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;假设要最小化分类误差$CE$和复杂度$CP$，&lt;br /&gt;
配置A和配置B的分类误差分别为$CE_A$和$CE_B$，复杂度分别为$CP_A$和$CP_B$&lt;/li&gt;
&lt;li&gt;若满足以下条件，则A帕累托支配B：
&lt;ul&gt;
&lt;li&gt;1）CEA≤CEB且CPA&amp;lt;CPB；或者&lt;br /&gt;
2）CEA&amp;lt;CEB且CPA≤CPB&lt;/li&gt;
&lt;li&gt;所有不被其他任何配置帕累托支配的配置称为&lt;br /&gt;
&lt;strong&gt;帕累托有效配置（Pareto-efficient）&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;所有这些配置的集合就是&lt;strong&gt;帕累托集（Pareto set）&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;与帕累托集相对应的指标值称为&lt;strong&gt;帕累托前沿（Pareto front）&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;多目标超参数优化的目标是找到一组非支配解，&lt;br /&gt;
使其对应的指标值&lt;strong&gt;逼近帕累托前沿&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;下例中，对 &lt;code&gt;tsk(&apos;sonar&apos;)&lt;/code&gt; 数据集上调整决策树来演示多目标超参数优化&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;其中分类误差作为模型性能的度量&lt;/li&gt;
&lt;li&gt;所选特征的数量作为模型复杂度的度量&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;learner &amp;lt;- lrn(
 &apos;classif.rpart&apos;, 
 cp = to_tune(1e-04, 1e-1),
 minsplit = to_tune(2, 64), 
 maxdepth = to_tune(1, 30)
)

measures &amp;lt;- msrs(c(&apos;classif.ce&apos;, &apos;selected_features&apos;))
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;用&lt;code&gt;ti()&lt;/code&gt;调优
&lt;ul&gt;
&lt;li&gt;由于是多评估指标调优，所以创建的不是&lt;br /&gt;
&lt;code&gt;TuningInstanceBatchSingleCrit&lt;/code&gt;，而是&lt;br /&gt;
&lt;code&gt;TuningInstanceBatchMultiCrit&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 创建调优实例
instance &amp;lt;- ti(
 task = tsk(&apos;sonar&apos;),
 learner = learner,
 resampling = rsmp(&apos;cv&apos;, folds = 3),
 # 注意不是`measure`而是`measures`复数
 measures = measures,
 terminator = trm(&apos;evals&apos;, n_evals = 30),
 # 
 store_models = TRUE
)

# 创建调优器
tuner &amp;lt;- tnr(&apos;random_search&apos;)
# 调优
tuner$optimize(instance)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 16 x 7&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;cp&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;maxdepth&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;minsplit&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;learner_param_vals&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;x_domain&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;classif.ce&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;selected_features&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.05426979&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;28&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.00000000, 0.05426979, 2.00000000, 28.00000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.05426979, 2.00000000, 28.00000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2739821&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.666667&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.08910768&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;24&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;44&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.00000000, 0.08910768, 24.00000000, 44.00000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.08910768, 24.00000000, 44.00000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2835749&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.08880381&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 9&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.00000000, 0.08880381, 4.00000000, 9.00000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.08880381, 4.00000000, 9.00000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2835749&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.07884068&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;36&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.00000000, 0.07884068, 4.00000000, 36.00000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.07884068, 4.00000000, 36.00000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2787440&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.333333&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.07125967&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 8&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;16&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.00000000, 0.07125967, 8.00000000, 16.00000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.07125967, 8.00000000, 16.00000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2692892&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.000000&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.09373661&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;15&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;32&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.00000000, 0.09373661, 15.00000000, 32.00000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.09373661, 15.00000000, 32.00000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2835749&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.09580900&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;47&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.000000, 0.095809, 3.000000, 47.000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.095809, 3.000000, 47.000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2835749&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.09714774&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 6&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;57&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.00000000, 0.09714774, 6.00000000, 57.00000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.09714774, 6.00000000, 57.00000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2835749&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.09435243&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;26&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;33&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.00000000, 0.09435243, 26.00000000, 33.00000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.09435243, 26.00000000, 33.00000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2835749&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.01511812&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;20&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.00000000, 0.01511812, 1.00000000, 20.00000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.01511812, 1.00000000, 20.00000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2835749&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.06956784&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;18&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 9&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.00000000, 0.06956784, 18.00000000, 9.00000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.06956784, 18.00000000, 9.00000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2692892&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.000000&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.05564576&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;51&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.00000000, 0.05564576, 3.00000000, 51.00000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.05564576, 3.00000000, 51.00000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2739821&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.666667&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.08578581&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;64&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.00000000, 0.08578581, 1.00000000, 64.00000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.08578581, 1.00000000, 64.00000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2835749&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.07160058&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;24&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;12&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.00000000, 0.07160058, 24.00000000, 12.00000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.07160058, 24.00000000, 12.00000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2692892&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.000000&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.06709319&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;14&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;15&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.00000000, 0.06709319, 14.00000000, 15.00000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.06709319, 14.00000000, 15.00000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2644582&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.333333&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.06516315&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 8&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;59&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.00000000, 0.06516315, 8.00000000, 59.00000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.06516315, 8.00000000, 59.00000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2835749&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 16 x 12&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;cp&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;maxdepth&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;minsplit&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;classif.ce&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;selected_features&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;warnings&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;errors&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;runtime_learners&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;uhash&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;x_domain&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;timestamp&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;batch_nr&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dttm&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.05426979&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;28&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2739821&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.666667&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.021&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;6be71e58-e259-4c8b-878b-e29817f2a6d8&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.05426979, 2.00000000, 28.00000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-20 19:51:32&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 2&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.08910768&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;24&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;44&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2835749&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.025&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;9e2e9e87-1080-47a8-b919-76d94a86dda6&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.08910768, 24.00000000, 44.00000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-20 19:51:32&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 3&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.08880381&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 9&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2835749&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.020&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;a97a1800-f583-43fa-9598-98e94f489fc3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.08880381, 4.00000000, 9.00000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-20 19:51:33&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 4&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.07884068&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;36&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2787440&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.333333&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.024&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;d068028d-b167-4a10-868c-0ad4dc41645e&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.07884068, 4.00000000, 36.00000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-20 19:51:33&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 5&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.07125967&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 8&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;16&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2692892&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.026&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;36f4c7a7-1d1f-4bc8-93ca-f3a4554e1ac0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.07125967, 8.00000000, 16.00000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-20 19:51:33&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 6&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.09373661&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;15&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;32&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2835749&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.019&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;556f9677-9b7f-4141-83a9-b60005fa7b13&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.09373661, 15.00000000, 32.00000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-20 19:51:33&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 8&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.09580900&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;47&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2835749&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.019&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;86f908bf-3e82-4520-af3a-44f79b6dc187&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.095809, 3.000000, 47.000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-20 19:51:33&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 9&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.09714774&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 6&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;57&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2835749&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.019&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;9e15d7b5-70ed-4ad5-a25c-1a977bbe7c02&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.09714774, 6.00000000, 57.00000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-20 19:51:33&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;11&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.09435243&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;26&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;33&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2835749&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.019&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;b6c82dee-e800-4ac2-92f4-3fed0ad3d7d7&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.09435243, 26.00000000, 33.00000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-20 19:51:33&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;13&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.01511812&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;20&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2835749&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.020&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;9624b63b-5a6e-4e33-b3d6-3c7d3f019c11&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.01511812, 1.00000000, 20.00000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-20 19:51:34&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;15&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.06956784&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;18&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 9&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2692892&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.022&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;42137ac1-5ae4-4b5e-b115-a6595affbb7c&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.06956784, 18.00000000, 9.00000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-20 19:51:34&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;20&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.05564576&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;51&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2739821&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.666667&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.018&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;9474b0f3-4b88-45dd-a47f-d74b270d4b42&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.05564576, 3.00000000, 51.00000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-20 19:51:34&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;24&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.08578581&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;64&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2835749&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.017&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;d43220b1-93b9-44c7-84b4-7d3b59874a5e&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.08578581, 1.00000000, 64.00000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-20 19:51:34&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;25&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.07160058&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;24&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;12&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2692892&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.019&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5bc304de-e3c7-4b7f-8e6a-34d8656effaf&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.07160058, 24.00000000, 12.00000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-20 19:51:35&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;27&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.06709319&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;14&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;15&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2644582&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.333333&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.018&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2f5dee32-6999-40cf-8587-0d3160c01c87&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.06709319, 14.00000000, 15.00000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-20 19:51:35&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;29&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.06516315&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 8&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;59&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2835749&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.017&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;6227972f-90ad-4963-8fed-102fb71e697f&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.06516315, 8.00000000, 59.00000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-20 19:51:35&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;30&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用&lt;code&gt;Instance$archive$best()&lt;/code&gt;调用所有的可用配置
&lt;ul&gt;
&lt;li&gt;从帕累托前沿中确定部署哪种配置取决于个人偏好
&lt;ul&gt;
&lt;li&gt;根据定义，不存在最优配置&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;例如，如果宁愿以较高错误率为代价来换取较低的复杂度，&lt;br /&gt;
那么可以选择 &lt;code&gt;selected_features = 1&lt;/code&gt; 的配置&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;instance$archive$best()[
 , 
 .(
  cp, minsplit, 
  maxdepth, 
  classif.ce,
  selected_features
 )
]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 16 x 5&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;cp&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;minsplit&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;maxdepth&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;classif.ce&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;selected_features&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.05426979&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;28&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2739821&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.666667&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.08910768&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;44&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;24&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2835749&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.08880381&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 9&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2835749&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.07884068&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;36&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2787440&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.333333&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.07125967&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;16&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 8&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2692892&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.000000&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.09373661&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;32&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;15&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2835749&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.09580900&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;47&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2835749&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.09714774&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;57&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 6&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2835749&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.09435243&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;33&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;26&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2835749&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.01511812&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;20&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2835749&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.06956784&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 9&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;18&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2692892&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.000000&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.05564576&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;51&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2739821&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.666667&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.08578581&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;64&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2835749&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.07160058&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;12&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;24&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2692892&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.000000&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.06709319&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;15&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;14&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2644582&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.333333&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.06516315&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;59&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 8&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2835749&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用&lt;code&gt;Instance$result_learner_param_vals传递给&lt;/code&gt;Learner`
&lt;ul&gt;
&lt;li&gt;例如这里选择第二项配置&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;learner &amp;lt;- lrn(&apos;classif.rpart&apos;)
learner$param_set$values &amp;lt;- instance$result_learner_param_vals[[2]]
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;因为多目标调优需要人为手动配置，&lt;br /&gt;
所以不能使用&lt;code&gt;auto_tuner()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;超带算法（Hyperband）进行多保真度（Fidelity）调优&lt;/h2&gt;
&lt;h3&gt;简介&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;保真度：&lt;/strong&gt;&lt;br /&gt;
核心指模型或算法在处理数据、进行预测或迁移时对原始信息的保留程度&lt;/li&gt;
&lt;li&gt;对于超大的数据集和搜索空间，&lt;br /&gt;
调优的计算成本会非常高&lt;/li&gt;
&lt;li&gt;类似于&lt;strong&gt;Hyperband&lt;/strong&gt;的方法目的在于：&lt;br /&gt;
用&lt;strong&gt;低保真度&lt;/strong&gt;模型的性能可以代替&lt;strong&gt;全保真度&lt;/strong&gt;模型的性能
&lt;ul&gt;
&lt;li&gt;对于预期进行1000轮梯度提升算法实验时，&lt;br /&gt;
1000轮的训练就是全保真，&lt;br /&gt;
轮数越低保真度就越低&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;一些算法具有天然的保真度参数
&lt;ul&gt;
&lt;li&gt;神经网络：number of epochs&lt;/li&gt;
&lt;li&gt;随机森林：number of trees&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;超带算法与连续减半算法（Successive Halving）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;超带算法&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;对低保真度下随机采样的配置进行评估后，&lt;br /&gt;
超带算法会迭代地将更多资源分配给有前景的配置，&lt;br /&gt;
并尽早终止性能不佳的配置&lt;/li&gt;
&lt;li&gt;基于Jamieson和Talwalkar提出的连续减半算法
&lt;ul&gt;
&lt;li&gt;简介
&lt;ul&gt;
&lt;li&gt;初始化时需要一些起始配置数量$m_0$，&lt;br /&gt;
每个阶段丢弃配置的比例$η$，&lt;br /&gt;
以及单次评估的最小预算（budget，= 保真度）$r_0$和&lt;br /&gt;
最大预算$r_{max}$&lt;/li&gt;
&lt;li&gt;该算法首先对$m_0$个随机配置进行采样，并为它们分配最小预算$r_0$&lt;/li&gt;
&lt;li&gt;对这些配置进行评估，然后丢弃表现最差的$\frac{η-1}{η}$的配置&lt;/li&gt;
&lt;li&gt;剩余的配置进入下一阶段（bracket），并在更大的预算下进行评估；&lt;br /&gt;
这个过程持续进行，直到一个或多个配置在最大预算$r_{max}$下进行评估，&lt;br /&gt;
然后选择表现最佳的配置&lt;/li&gt;
&lt;li&gt;计算阶段总数，以便每个阶段消耗大致相同的总预算&lt;/li&gt;
&lt;li&gt;这种方法的一个很大缺点是，&lt;br /&gt;
不清楚是从大量配置（较大的$r_0$）和较小预算开始，&lt;br /&gt;
还是从较少配置（较小的$r_0$）但较大预算开始更好&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;超带算法中对其的优化
&lt;ul&gt;
&lt;li&gt;通过在不同的起始配置数量下运行连续减半法，&lt;br /&gt;
每个起始配置数量对应不同的预算水平 $r_0$，&lt;br /&gt;
解决上述问题&lt;/li&gt;
&lt;li&gt;使用相同的 $η$ 和 $r_{max}$ 参数进行初始化（但不是 $m_0$）&lt;/li&gt;
&lt;li&gt;每个bracket从不同的预算 $r_0$ 开始，&lt;br /&gt;
较小的值意味着可以评估更多的配置，&lt;br /&gt;
因此最具探索性的括号（即bracket最多的那个）被分配全局最小预算 $r_{min}$&lt;/li&gt;
&lt;li&gt;在每个括号中，起始预算以 $η$ 倍的因子增加，&lt;br /&gt;
直到最后一个括号基本上使用完整预算 $r_{max}$ 进行随机搜索&lt;/li&gt;
&lt;li&gt;括号的总数 $s_{max} + 1$ 计算为 $s_{max}=log_η{\frac{r_max}{r_min}}$&lt;/li&gt;
&lt;li&gt;每个括号的起始配置数量 $m_0$ 经过计算，&lt;br /&gt;
使得每个括号使用的预算大致相同&lt;/li&gt;
&lt;li&gt;每个括号中的最优超参数配置是最后阶段性能最佳的配置&lt;/li&gt;
&lt;li&gt;调优结束时的最优超参数配置是所有括号中性能最佳的配置&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;下表例子为：当$η=2$，$r_{min}=1$， $r_{max}=8$时，&lt;br /&gt;
每个bracket $s$ ，阶段 $i$ 的超带调度，&lt;br /&gt;
包含配置数量 $m_i$ 和资源量 $r_i$&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;s=3&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;s=2&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;s=1&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;s=0&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;i&lt;/td&gt;
&lt;td&gt;mi&lt;/td&gt;
&lt;td&gt;ri&lt;/td&gt;
&lt;td&gt;mi&lt;/td&gt;
&lt;td&gt;ri&lt;/td&gt;
&lt;td&gt;mi&lt;/td&gt;
&lt;td&gt;ri&lt;/td&gt;
&lt;td&gt;mi&lt;/td&gt;
&lt;td&gt;ri&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;下表是商标中具体的超参数配置
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;HPCs∗&lt;/code&gt; 是bracket $s$ 中的最优超参数配置&lt;/li&gt;
&lt;li&gt;&lt;code&gt;HPC∗&lt;/code&gt; 是所有bracket中的最优超参数配置&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;s=3&lt;/th&gt;
&lt;th&gt;s=2&lt;/th&gt;
&lt;th&gt;s=1&lt;/th&gt;
&lt;th&gt;s=0&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;i=0&lt;/td&gt;
&lt;td&gt;{1,2,3,4,5,6,7,8}&lt;/td&gt;
&lt;td&gt;{9,10,11,12,13,14}&lt;/td&gt;
&lt;td&gt;{15,16,17,18}&lt;/td&gt;
&lt;td&gt;{19,20,21,22}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;i=1&lt;/td&gt;
&lt;td&gt;{1,2,7,8}&lt;/td&gt;
&lt;td&gt;{9,14,15}&lt;/td&gt;
&lt;td&gt;{20,21}&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;i=2&lt;/td&gt;
&lt;td&gt;{1,8}&lt;/td&gt;
&lt;td&gt;{15}&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;i=3&lt;/td&gt;
&lt;td&gt;{1}&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HPCs∗&lt;/td&gt;
&lt;td&gt;{1}&lt;/td&gt;
&lt;td&gt;{15}&lt;/td&gt;
&lt;td&gt;{21}&lt;/td&gt;
&lt;td&gt;{22}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HPC∗&lt;/td&gt;
&lt;td&gt;{15}&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;&lt;code&gt;mlr3hyperband&lt;/code&gt;包&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;调用的方法为
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;tnr(&apos;successive_halving&apos;)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tnr(&apos;hyperband&apos;)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;下面的例子为使用超带算法&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 超带算法需要单独加载&apos;mlr3hyperband&apos;包
# library(mlr3hyperband)

# 构建学习器，这里是xgboost算法
learner &amp;lt;- lrn(&apos;classif.xgboost&apos;)
# 设置超级参数的调整范围
# 这里是先创建学习器，再设定参数
# 直接在`lrn()`中传递设置也行
learner$param_set$set_values(
 nrounds = to_tune(p_int(16, 128, tags = &apos;budget&apos;)),
 eta = to_tune(1e-4, 1, logscale = TRUE),
 max_depth = to_tune(1, 20),
 colsample_bytree = to_tune(1e-1, 1),
 colsample_bylevel = to_tune(1e-1, 1),
 lambda = to_tune(1e-3, 1e3, logscale = TRUE),
 alpha = to_tune(1e-3, 1e3, logscale = TRUE),
 subsample = to_tune(1e-1, 1)
)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;构建超带算法调优器
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;eta&lt;/code&gt;，$\eta$&lt;/li&gt;
&lt;li&gt;&lt;code&gt;reprtitions&lt;/code&gt;，brackets评估的次数
&lt;ul&gt;
&lt;li&gt;如果希望终止器基于运行时间等条件允许，&lt;br /&gt;
可以设置为&lt;code&gt;Inf&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 创建调优实例
instance &amp;lt;- ti(
 task = tsk(&apos;sonar&apos;),
 learner = learner,
 resampling = rsmp(&apos;holdout&apos;),
 measures = msr(&apos;classif.ce&apos;),
 terminator = trm(&apos;none&apos;)
)

# 将调优器选择为&apos;hyperband&apos;
tuner &amp;lt;- tnr(&apos;hyperband&apos;, eta = 2, repetitions = 1)
# 显示给定保真度级别和预算增加因子的调度情况
hyperband_schedule(r_min = 16, r_max = 128, eta = 2)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 10 x 4&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;bracket&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;stage&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;budget&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;n&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 16&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;8&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 32&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;4&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 64&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;128&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 32&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;6&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 64&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;128&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 64&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;4&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;128&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;128&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;4&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;开调
&lt;ul&gt;
&lt;li&gt;超带算法运行生成的存档包含额外的&lt;code&gt; &lt;/code&gt;bracket&lt;code&gt;和&lt;/code&gt;stage`可供查询&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;tuner$optimize(instance)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 1 x 11&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;alpha&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;colsample_bylevel&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;colsample_bytree&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;eta&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;lambda&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;max_depth&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;nrounds&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;subsample&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;learner_param_vals&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;x_domain&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;classif.ce&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;-6.172833&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.3635065&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.8039435&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-2.811107&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-2.935965&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;10&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;32&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.8351367&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.00000000, 0.00000000, 0.00208532, 0.36350653, 0.80394345, 0.06013836, 0.05307950, 10.00000000, 32.00000000, 0.83513674&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.00208532, 0.36350653, 0.80394345, 0.06013836, 0.05307950, 10.00000000, 32.00000000, 0.83513674&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.08695652&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;查看结果&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;instance$result[, .(classif.ce, nrounds)]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 1 x 2&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;classif.ce&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;nrounds&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.08695652&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;32&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;as.data.table(
 instance$
  archive
)[
 ,
 .(
  bracket, 
  stage, 
  classif.ce, 
  eta, 
  max_depth, 
  colsample_bytree
 )
]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 35 x 6&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;bracket&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;stage&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;classif.ce&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;eta&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;max_depth&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;colsample_bytree&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.18840580&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-8.4184092&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;14&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.1132001&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.14492754&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-2.8111074&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;10&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.8039435&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.17391304&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-8.9243113&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;12&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4971439&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.47826087&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-3.6697481&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.8741933&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.43478261&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-4.3152031&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;13&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.5225918&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.36231884&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-8.4627255&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;19&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.1774070&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.17391304&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-4.0383421&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 5&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.6494958&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.49275362&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-6.6481889&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2036302&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.36231884&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-1.6321229&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;16&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.8125073&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.59420290&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-2.9741057&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;12&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.9270787&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.21739130&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-3.5983812&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;12&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4030144&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.20289855&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-8.9486226&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.5908226&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.20289855&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-5.9648847&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;13&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.3665838&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.52173913&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-1.2237877&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;10&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2762483&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.08695652&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-2.8111074&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;10&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.8039435&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.18840580&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-8.9243113&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;12&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4971439&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.17391304&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-4.0383421&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 5&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.6494958&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.23188406&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-8.4184092&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;14&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.1132001&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.13043478&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-4.2164773&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 6&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.9656635&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.15942029&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-2.6815217&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;14&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2158201&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.43478261&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-0.2845524&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;14&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2034910&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.47826087&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-8.0905822&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 6&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4738960&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.11594203&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-2.8111074&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;10&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.8039435&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.18840580&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-4.0383421&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 5&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.6494958&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.18840580&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-8.9486226&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.5908226&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.15942029&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-5.9648847&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;13&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.3665838&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.17391304&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-3.5983812&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;12&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4030144&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.52173913&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-5.9619021&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;16&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.6184736&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.17391304&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-5.1422637&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;16&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.1687332&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.15942029&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-5.7223769&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 9&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.6430624&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.17391304&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-6.1107773&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;19&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.7558739&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.10144928&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-2.8111074&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;10&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.8039435&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.14492754&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-5.9648847&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;13&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.3665838&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.15942029&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-4.2164773&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 6&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.9656635&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.13043478&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-2.6815217&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;14&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2158201&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;h2&gt;贝叶斯优化（Bayesian Optimization, BO）&lt;/h2&gt;
&lt;h3&gt;简介&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;贝叶斯优化是基于模型的优化（Model Based Optimization）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;黑盒优化&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;简单来说，虽然超参数的设定影响模型的性能，&lt;br /&gt;
但我们无法判断什么样的超参数和带来什么样的性能&lt;/li&gt;
&lt;li&gt;这种只能通过输入输出试错并且不能了解内部原理的优化过程，&lt;br /&gt;
称作黑盒优化&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;贝叶斯优化&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一类样本高效的迭代全局黑盒优化算法，&lt;br /&gt;
这类算法依赖于在观测数据上训练的 &lt;strong&gt;代理模型&lt;/strong&gt; 来对黑盒函数进行建模
&lt;ul&gt;
&lt;li&gt;代理模型一般是一个非线性回归模型&lt;/li&gt;
&lt;li&gt;利用有限的观测数据来捕捉未知函数&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;每次迭代中，贝叶斯优化算法采用一个 &lt;strong&gt;采集函数（acquisition function’）&lt;/strong&gt;
来确定下一个待评估的候选点
&lt;ul&gt;
&lt;li&gt;采集函数基于代理模型的预测来衡量搜索空间内每个点的预期 &lt;strong&gt;效用（utility）&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;算法选择具有最佳采集函数值的候选点，并在该点评估黑盒函数，进而更新代理模型&lt;/li&gt;
&lt;li&gt;这个迭代过程持续进行，直到满足终止条件
&lt;ul&gt;
&lt;li&gt;例如达到预先指定的最大评估次数或实现所需的性能水平&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;贝叶斯优化是一种强大的方法，通常能产生良好的优化性能，&lt;br /&gt;
特别是当黑盒&lt;strong&gt;评估成本高昂且优化预算紧张&lt;/strong&gt;时&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在后续中，以优化下方正弦函数$f$为示例；&lt;br /&gt;
该函数具有两个局部最小值和一个全局最小值
$$f:[0,1] \rightarrow \mathbb{R}, x \mapsto 2x \times sin(14x) $$&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;黑箱优化&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;bbotk&lt;/code&gt;是用于黑箱优化工具包， 在&lt;code&gt;mlr3&lt;/code&gt;生态环境中主力调用用于调优&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;OptimInstanceBatchSingleCrit&lt;/code&gt;类和&lt;code&gt;OptimInstanceBatchMultiCrit&lt;/code&gt;类
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;TuningInstanceBatchSingleCrit&lt;/code&gt; 和 &lt;code&gt;TuningInstanceBatchMultiCrit&lt;/code&gt;&lt;br /&gt;
分别继承于它们&lt;/li&gt;
&lt;li&gt;用于构建描述优化问题并且存储结果的优化实例&lt;/li&gt;
&lt;li&gt;依赖于目标函数类（&lt;code&gt;Objective&lt;/code&gt;类）
&lt;ul&gt;
&lt;li&gt;包含从定义域（所有可能的函数输入）到陪域（所有可能的函数输出）的实际映射&lt;/li&gt;
&lt;li&gt;目标函数可以通过不同的类来创建&lt;/li&gt;
&lt;li&gt;这些类都继承自&lt;code&gt;Objective&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;这些类提供了不同的方式来定义和评估目标函数；&lt;br /&gt;
选择合适的类将减少类型转换开销
&lt;ul&gt;
&lt;li&gt;ObjectiveRFun：
&lt;ul&gt;
&lt;li&gt;封装了一个函数，该函数将描述 &lt;strong&gt;单个配置&lt;/strong&gt; 的列表作为输入，&lt;br /&gt;
其中元素可以是任何类型&lt;/li&gt;
&lt;li&gt;当底层函数评估机制是通过一次评估单个配置来实现时，它很适用&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ObjectiveRFunMany：
&lt;ul&gt;
&lt;li&gt;封装了一个函数，该函数接受一个包含 &lt;strong&gt;多种配置&lt;/strong&gt; 的列表作为输入，&lt;br /&gt;
其中元素可以是任何类型，甚至是混合类型&lt;/li&gt;
&lt;li&gt;当对多种配置的函数求值可以并行化时，这很有用&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ObjectiveRFunDt：
&lt;ul&gt;
&lt;li&gt;封装了一个对 &lt;code&gt;data.table&lt;/code&gt; 进行操作的函数&lt;/li&gt;
&lt;li&gt;它允许直接在 &lt;code&gt;data.table&lt;/code&gt; 对象上进行高效的向量化或批处理评估，&lt;br /&gt;
避免不必要的数据类型转换&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;OptimizerBatch&lt;/code&gt;类
&lt;ul&gt;
&lt;li&gt;用于构建和配置优化算法&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;创建&lt;code&gt;ObjectiveRFun&lt;/code&gt;类，以单个配置作为输入&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Objective&lt;/code&gt;需要指定要优化的函数及其定义域和值域&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;通过使用&lt;code&gt;&apos;minimize&apos;&lt;/code&gt;或&lt;code&gt;&apos;maximize&apos;&lt;/code&gt;标记值域来指定优化方向&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;下面的优化函数如何以一个名为&lt;code&gt;x&lt;/code&gt;的单元素&lt;code&gt;list&lt;/code&gt;作为输入&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# library(bbotk)

# 创建上述的函数f
sinus_1D &amp;lt;- function(xs) 2 * xs$x * sin(14 * xs$x)

# 定义域
domain &amp;lt;- ps(x = p_dbl(lower = 0, upper = 1))
# 陪域
codomain &amp;lt;- ps(y = p_dbl(tags = &apos;minimize&apos;))

# 创建一个
objective &amp;lt;- ObjectiveRFun$new(
 sinus_1D,
 domain = domain, 
 codomain = codomain
)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;再定义域范围内将函数可视化&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 加载`ggplot2`包
# library(ggplot2)

# 生成1001个观测，范围在`domain`定义的定义域范围
xydt &amp;lt;- generate_design_grid(domain, resolution = 1001)$data
# `:=`是`data.table`类的特殊用法：
# 就地修改，将`objective$eval_dt(xydt)$y`赋值到`y`
xydt[, y := objective$eval_dt(xydt)$y]

# 这里是预先计算好的局部和全局最小值
# 用于作图
optima &amp;lt;- data.table(x = c(0, 0.3509406, 0.7918238))
optima[, y := objective$eval_dt(optima)$y]
optima[, type := c(&apos;local&apos;, &apos;local&apos;, &apos;global&apos;)]

# 作图
ggplot(aes(x = x, y = y), data = xydt) +
  geom_line() +
  geom_point(
   aes(pch = type), 
   color = &apos;black&apos;, 
   size = 4, 
   data = optima
  ) +
  theme_minimal() +
  theme(legend.position = &apos;none&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./image_6.png&quot; alt=&quot;image_6&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;定义了目标函数后，可以使用&lt;code&gt;OptimInstanceBatchSingleCrit&lt;/code&gt;类对其进行优化&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;这个类允许我们封装目标函数，并显式指定搜索空间&lt;/li&gt;
&lt;li&gt;搜索空间定义了我们想要优化的输入值集合，&lt;br /&gt;
它通常是定义域的一个子集或变换，&lt;br /&gt;
尽管默认情况下整个定义域被用作搜索空间&lt;/li&gt;
&lt;li&gt;在黑盒优化中，定义域以及因此的搜索空间通常具有有限的盒约束&lt;/li&gt;
&lt;li&gt;与超参数优化类似，有时可以使用变换来更有效地搜索空间&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;接下来，使用简单随机搜索在整个域上优化正弦函数，并以常规方式检查&lt;code&gt;instance&lt;/code&gt;的结果&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用&lt;code&gt;oi()&lt;/code&gt;函数（optimization instance）构建一个优化实例&lt;/li&gt;
&lt;li&gt;与&lt;code&gt;Tuner&lt;/code&gt;类似，&lt;code&gt;bbotk&lt;/code&gt;中的&lt;code&gt;Optimizer&lt;/code&gt;存储在&lt;code&gt;mlr_optimizers&lt;/code&gt;字典中，&lt;br /&gt;
并且可以使用&lt;code&gt;opt()&lt;/code&gt;进行构建&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;首先看看&lt;code&gt;mlr_optimizers&lt;/code&gt;储存了哪些优化器（&lt;code&gt;Optimizer&lt;/code&gt;类）&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;mlr_optimizers
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 15 x 5&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;key&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;label&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;param_classes&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;properties&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;packages&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;async_design_points&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Asynchronous Design Points                     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;ParamLgl, ParamInt, ParamDbl, ParamFct, ParamUty&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;dependencies, single-crit , multi-crit  , async       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;bbotk, rush &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;async_grid_search  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Asynchronous Grid Search                       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;ParamLgl, ParamInt, ParamDbl, ParamFct&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;dependencies, single-crit , multi-crit  , async       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;bbotk, rush &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;async_random_search&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Asynchronous Random Search                     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;ParamLgl, ParamInt, ParamDbl, ParamFct&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;dependencies, single-crit , multi-crit  , async       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;bbotk, rush &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;chain              &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Chain Multiple Optimizers Sequentially         &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;ParamLgl, ParamInt, ParamDbl, ParamFct&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;dependencies, single-crit , multi-crit  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;bbotk&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;cmaes              &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Covariance Matrix Adaptation Evolution Strategy&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;ParamDbl&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;single-crit&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;bbotk , adagio&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;design_points      &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Design Points                                  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;ParamLgl, ParamInt, ParamDbl, ParamFct, ParamUty&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;dependencies, single-crit , multi-crit  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;bbotk&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;focus_search       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Focus Search                                   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;ParamLgl, ParamInt, ParamDbl, ParamFct&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;dependencies, single-crit &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;bbotk&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;gensa              &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Generalized Simulated Annealing                &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;ParamDbl&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;single-crit&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;bbotk, GenSA&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;grid_search        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Grid Search                                    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;ParamLgl, ParamInt, ParamDbl, ParamFct&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;dependencies, single-crit , multi-crit  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;bbotk&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;hyperband          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Hyperband                                      &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;ParamLgl, ParamInt, ParamDbl, ParamFct&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;dependencies, single-crit , multi-crit  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;bbotk        , mlr3hyperband&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;irace              &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Iterated Racing                                &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;ParamDbl, ParamInt, ParamFct, ParamLgl&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;dependencies, single-crit &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;bbotk, irace&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;local_search       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Local Search                                   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;ParamLgl, ParamInt, ParamDbl, ParamFct&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;dependencies, single-crit &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;bbotk&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;nloptr             &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Non-linear Optimization                        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;ParamDbl&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;single-crit&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;bbotk , nloptr&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;random_search      &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Random Search                                  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;ParamLgl, ParamInt, ParamDbl, ParamFct&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;dependencies, single-crit , multi-crit  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;bbotk&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;successive_halving &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Successive Halving                             &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;ParamLgl, ParamInt, ParamDbl, ParamFct&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;dependencies, single-crit , multi-crit  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;bbotk        , mlr3hyperband&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用&lt;code&gt;oi()&lt;/code&gt;构建优化实例并进行优化（类似于&lt;code&gt;vi()&lt;/code&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 构建优化实例
instance &amp;lt;- oi(
 objective,
 # 定义域传递到搜索空间
 search_space = domain,
 # 设定终止器，迭代20次后终止
 terminator = trm(&apos;evals&apos;, n_evals = 20)
)
# 构建优化器，算法为随机搜索
optimizer &amp;lt;- opt(&apos;random_search&apos;, batch_size = 20)
optimizer$optimize(instance)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 1 x 3&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;x&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;x_domain&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;y&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.7732799&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.7732799&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-1.524356&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;也可以使用&lt;code&gt;bb_optimize&lt;/code&gt;进行实例优化（类似于&lt;code&gt;tune()&lt;/code&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;optimal &amp;lt;- bb_optimize(
 objective, 
 method = &apos;random_search&apos;,
 max_evals = 20
)
optimal$instance$result
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 1 x 3&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;x&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;x_domain&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;y&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.7530768&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.7530768&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-1.35457&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;h3&gt;贝叶斯优化的构建模块（Building Blocks）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;步骤：&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;生成并评估初始设计&lt;/li&gt;
&lt;li&gt;循环：&lt;/li&gt;
&lt;li&gt;在目前所做的所有观测数据存档上拟合一个代理模型，以对未知的黑箱函数进行建模&lt;/li&gt;
&lt;li&gt;优化采集函数，以确定搜索空间中的哪些点是有前景的候选点，应在下一步进行评估&lt;/li&gt;
&lt;li&gt;评估下一个候选对象，并更新到目前为止所做的所有观察记录档案&lt;/li&gt;
&lt;li&gt;检查是否满足给定的终止条件，如果不满足，则返回步骤 (1)&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;采集函数（acquisition function）依赖于代理模型的均值和标准差预测，&lt;br /&gt;
无需对真实黑箱函数进行评估，因此优化成本相对较低&lt;/li&gt;
&lt;li&gt;好的采集函数会在两方面取得平衡：
&lt;ul&gt;
&lt;li&gt;利用观察到性能良好且代理模型不确定性较低的区域的知识&lt;/li&gt;
&lt;li&gt;探索尚未评估过的点且因此代理模型不确定性较高的区域&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./image_7.png&quot; alt=&quot;image_7&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;构建模块&lt;/strong&gt;：&lt;code&gt;OptimizerMbo&lt;/code&gt;类
&lt;ul&gt;
&lt;li&gt;BO算法循环结构（&lt;code&gt;loop_function&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;代理模型（&lt;code&gt;Surrogate&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;采集函数（&lt;code&gt;AcqFunction&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;采集函数优化器（&lt;code&gt;AcqOptimizer&lt;/code&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;模块由&lt;code&gt;mlr3mbo&lt;/code&gt;设计并反映&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;初步设计&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;在拟合代理模型之前评估的初始点集称为&lt;strong&gt;初始设计（Initial Design）&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;可以用&lt;code&gt;mlr3mbo&lt;/code&gt; 手动构建初始设计，&lt;br /&gt;
也可以用 loop_function 为构建并评估初始设计&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;用&lt;code&gt;mlr3mbo&lt;/code&gt; 手动构建初始设计可以对初始设计进行更多控制&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;构建初始设计的一种简单方法是使用 &lt;code&gt;paradox&lt;/code&gt; 中的四个设计生成器之一&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;generate_design_random()&lt;/code&gt;：随机均匀生成点&lt;/li&gt;
&lt;li&gt;&lt;code&gt;generate_design_grid()&lt;/code&gt;：在大小均匀的网格中生成点&lt;/li&gt;
&lt;li&gt;&lt;code&gt;generate_design_lhs()&lt;/code&gt;：拉丁超立方抽样（Latin hypercube sampling, LHS）
&lt;ul&gt;
&lt;li&gt;将每个输入变量划分为大小相等的区间，&lt;br /&gt;
并确保每个区间恰好由一个采样点表示，从而得到均匀的边缘分布&lt;/li&gt;
&lt;li&gt;在LHS设计中，两点之间的最小距离通常会最大化，从而实现对空间的空间填充覆盖&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;generate_design_sobol()&lt;/code&gt;：Sobol序列（Sobol sequence）
&lt;ul&gt;
&lt;li&gt;与LHS的工作方式类似，但在维度数量较大时，它能比LHS提供更好的覆盖&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;通常建议在贝叶斯优化（BO）中使用LHS或Sobol设计，&lt;br /&gt;
但与BO的其他设计选择相比，初始设计的影响通常较小&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./image_8.png&quot; alt=&quot;image_8&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;生成的&lt;code&gt;Design&lt;/code&gt;对象是围绕&lt;code&gt;data.table&lt;/code&gt;的包装器&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;sample_domain &amp;lt;- ps(x1 = p_dbl(0, 1), x2 = p_dbl(0, 1))
generate_design_random(sample_domain, n = 3)
generate_design_random(sample_domain, n = 3)$data
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;Design&amp;gt; with 3 rows:
          x1        x2
       &amp;lt;num&amp;gt;     &amp;lt;num&amp;gt;
1: 0.5406415 0.3784440
2: 0.9641830 0.3064937
3: 0.2573565 0.7557893
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 3 x 2&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;x1&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;x2&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.8539652&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.1333672&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.8623679&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.1129187&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.1020241&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.8403042&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;初始设计也可以通过自定义&lt;code&gt;data.table&lt;/code&gt;完成&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在构建初始设计后，进行优化前，&lt;br /&gt;
需要在&lt;code&gt;OptimInstance&lt;/code&gt;上进行评估&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 构建目标函数的优化实例
instance &amp;lt;- OptimInstanceSingleCrit$new(
 objective,
 terminator = trm(&apos;evals&apos;, n_evals = 20)
)
# 构建一个`data.table`类的设计矩阵
design &amp;lt;- data.table(x = c(0.1, 0.34, 0.65, 1))
# 输入设计的矩阵
instance$eval_batch(design)

# 查看输入的定义域数值对应产生的陪域数值
instance$archive$data
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;INFO  [16:59:32.257] [bbotk] Evaluating 4 configuration(s)
INFO  [16:59:32.287] [bbotk] Result of batch 1:
INFO  [16:59:32.288] [bbotk]     x          y
INFO  [16:59:32.288] [bbotk]  0.10  0.1970899
INFO  [16:59:32.288] [bbotk]  0.34 -0.6792294
INFO  [16:59:32.288] [bbotk]  0.65  0.4148279
INFO  [16:59:32.288] [bbotk]  1.00  1.9812147
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 4 x 5&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;x&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;y&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;x_domain&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;timestamp&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;batch_nr&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dttm&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.10&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 0.1970899&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-23 16:59:32&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.34&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-0.6792294&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.34&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-23 16:59:32&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.65&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 0.4148279&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.65&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-23 16:59:32&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;1.00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1.9812147&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-23 16:59:32&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;h4&gt;代理模型&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;在&lt;code&gt;mlr3mbo&lt;/code&gt;中，&lt;code&gt;SurrogateLearner&lt;/code&gt;是一个R6类&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;继承自基础&lt;code&gt;Surrogate&lt;/code&gt;类&lt;/li&gt;
&lt;li&gt;旨在构建和管理代理模型，  包括自动构建&lt;code&gt;TaskRegr&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;TaskRegr&lt;/code&gt;在每次BO循环的迭代中被训练&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;代理模型包装了一个回归学习器，&lt;br /&gt;
该学习器基于观测数据对未知的黑盒函数进行建模&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;回归学习器可以用任何&lt;code&gt;mlr3&lt;/code&gt;中的回归学习器&lt;/li&gt;
&lt;li&gt;大多数采集函数既依赖于代理模型的&lt;strong&gt;均值预测&lt;/strong&gt;，&lt;br /&gt;
也依赖于&lt;strong&gt;标准差预测&lt;/strong&gt;，而后者要求支持&lt;code&gt;predict_type = &apos;se&apos;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;代理模型的回归学习器的典型选择&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;lrn(&apos;regr.km&apos;)&lt;/code&gt;：高斯过程（Gaussian processes）&lt;br /&gt;
对于低到中等维度的数值搜索空间&lt;/li&gt;
&lt;li&gt;&lt;code&gt;lrn(&apos;regr.ranger&apos;)&lt;/code&gt;：随机森林&lt;br /&gt;
对于高维度混合（和/或分层）搜索空间&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;下面以高斯过程作为代理模型的算法为例&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;lrn_gp &amp;lt;- lrn(
 # 选择高斯过程为学习器
 &apos;regr.km&apos;, 
 # 使用具有Matérn 5/2核的高斯过程
 covtype = &apos;matern5_2&apos;, 
 # 使用BFGS作为优化器来寻找最优核参数
 optim.method = &apos;BFGS&apos;,
 # 设置`trace = FALSE`以防止在拟合过程中产生过多输出
 control = list(trace = FALSE)
)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;构建&lt;code&gt;SurrogateLearner&lt;/code&gt;对象：&lt;code&gt;srlrn()&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;需要传递&lt;code&gt;LearnerRegr&lt;/code&gt;对象与&lt;code&gt;Instance$archive&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 需要`mlr3mbo`包
# library(mlr3mbo)

# 构建`SurrogateLearner`对象
surrogate &amp;lt;- srlrn(
 lrn_gp, 
 archive = instance$archive
)

# 通过`SurrogateLearner$update()`的更新来拟合高斯过程
surrogate$update() 
# 访问拟合后的模型
surrogate$learner$model
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;Call:
DiceKriging::km(design = data, response = truth, covtype = &apos;matern5_2&apos;, 
    optim.method = &apos;BFGS&apos;, control = pv$control)

Trend  coeff.:
               Estimate
 (Intercept)     0.7899

Covar. type  : matern5_2 
Covar. coeff.:
               Estimate
    theta(x)     0.3014

Variance estimate: 1.069737
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;采集函数&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;采集函数依赖于代理模型的预测，&lt;br /&gt;
并量化搜索空间中每个点在下次迭代中进行评估时的预期 &lt;strong&gt;效用（utility）&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;以下方的 &lt;strong&gt;期望改善（expected improvement）&lt;/strong&gt; 为例
&lt;ul&gt;
&lt;li&gt;在给定代理模型的性能预测的情况下，&lt;br /&gt;
与目前观察到的最佳函数值（&lt;strong&gt;当前最优值&lt;/strong&gt;）相比，&lt;br /&gt;
可以期望一个候选点提升多少&lt;/li&gt;
&lt;li&gt;下方公式中：
&lt;ul&gt;
&lt;li&gt;$Y(x)$：给定输入点 $x$ 的代理模型预测值&lt;br /&gt;
（一个随机变量，在使用高斯过程时服从正态分布）&lt;/li&gt;
&lt;li&gt;$f_{min}$ ：目前观测到的最佳函数值（假设为最小化问题）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;计算期望提升需要模型给出&lt;strong&gt;均值&lt;/strong&gt;和&lt;strong&gt;标准差&lt;/strong&gt;预测&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;$$
\alpha_{\mathrm{EI}}(\mathbf{x}) = \mathbb{E} \left[ \max \left( f_{\mathrm{min}} - Y(\mathbf{x}), 0 \right) \right]
$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在 &lt;code&gt;mlr3mbo&lt;/code&gt; 中，采集函数为&lt;code&gt;AcqFunction&lt;/code&gt;类
&lt;ul&gt;
&lt;li&gt;存储在 &lt;code&gt;mlr_acqfunctions&lt;/code&gt; 字典中，可以通过 &lt;code&gt;acqf()&lt;/code&gt; 来构建&lt;/li&gt;
&lt;li&gt;在本示例中，使用期望改善（&lt;code&gt;acqf(&apos;ei&apos;)&lt;/code&gt;）来选择下一个待评估的候选对象&lt;/li&gt;
&lt;li&gt;如之前示例一样，&lt;br /&gt;
必须更新（&lt;code&gt;AcqFunction$update()&lt;/code&gt;）&lt;code&gt;AcqFunction&lt;/code&gt; 对当前最优解的看法，&lt;br /&gt;
以确保它仍然使用目前观察到的最佳值&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;acq_function &amp;lt;- acqf(&apos;ei&apos;, surrogate = surrogate)
acq_function$update()
acq_function$y_best
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;使用 &lt;code&gt;Objective$eval_dt()&lt;/code&gt; 对作为 &lt;code&gt;data.table&lt;/code&gt; 给出的域评估采集函数
&lt;ul&gt;
&lt;li&gt;使用高斯过程预测均值和标准误差&lt;/li&gt;
&lt;li&gt;在0到1区间的均匀点网格上评估期望改善&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 在0到1间生成1001个数据点
xydt &amp;lt;- generate_design_grid(domain, resolution = 1001)$data
# 用函数f生成x对应的真实y值
xydt[, y := objective$eval_dt(xydt)$y]
# 使用高斯过程计算期望改善
xydt[, ei :=  acq_function$eval_dt(xydt[, &apos;x&apos;])]
# 使用代理函数预测x对应的y的均值及标准误差
xydt[, c(&apos;mean&apos;, &apos;se&apos;) :=  surrogate$predict(xydt[, &apos;x&apos;])]
xydt[1:3]
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;通过作图可以发现：&lt;br /&gt;
在高斯过程的平均预测（灰色点线）较低或不确定性较高的区域，期望提升较高&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;ggplot(xydt, mapping = aes(x = x, y = y)) +
 geom_point(
  size = 2, 
  data = instance$archive$data
 ) +
 # 目标函数（黑色）
 geom_line() +
 # 代理模型预测均值（灰色点线）
 geom_line(
  aes(y = mean), 
  colour = &apos;gray&apos;, 
  linetype = 2
 ) +
 # 代理模型标准误差范围（灰色点线的条带）
 geom_ribbon(
  aes(min = mean - se, max = mean + se),
  fill = &apos;gray&apos;,
  alpha = 0.3
 ) +
 # 期待提升曲线（灰色实线）
 geom_line(
  aes(y = ei * 40), 
  linewidth = 1, 
  colour = &apos;darkgray&apos;
 ) +
 scale_y_continuous(
  &apos;y&apos;,
     sec.axis = sec_axis(
      ~ . * 0.025, 
      name = &apos;EI&apos;,
      breaks = c(0, 0.025, 0.05)
  )
 ) +
 theme_minimal()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./image_9.png&quot; alt=&quot;image_9&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;采集函数优化器&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;大多数常用的采集函数具有&lt;strong&gt;非凸性&lt;br /&gt;
（顺着梯度方向走到底只能保证是局部最优，不能保证是全局最优）&lt;/strong&gt;，&lt;br /&gt;
因此通常采用全局优化技术来优化采集函数&lt;/li&gt;
&lt;li&gt;优化采集函数的广泛使用方法包括无导数全局优化方法，如：
&lt;ul&gt;
&lt;li&gt;分支定界算法，如DIRECT算法&lt;/li&gt;
&lt;li&gt;多起点局部优化方法，如&lt;br /&gt;
多次从不同起点运行L - BFGS - B算法或进行局部搜索&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;因此，采集函数的优化问题本身可以作为一个黑盒优化问题来处理，&lt;br /&gt;
但它比原始问题的成本要低得多&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AcqOptimizer&lt;/code&gt;类
&lt;ul&gt;
&lt;li&gt;用于在有限的计算资源内，通过高效搜索潜在候选空间来优化采集函数&lt;/li&gt;
&lt;li&gt;用 &lt;code&gt;acqo()&lt;/code&gt; 构建
&lt;ul&gt;
&lt;li&gt;该函数将 &lt;code&gt;Optimizer&lt;/code&gt;、&lt;code&gt;Terminator&lt;/code&gt;和采集函数作为输入&lt;/li&gt;
&lt;li&gt;优化器存储在 &lt;code&gt;mlr_optimizers&lt;/code&gt; 字典中，并且可以通过便捷函数 &lt;code&gt;opt()&lt;/code&gt; 构建&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;mlr_optimizers %&amp;gt;% as.data.table()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 18 x 5&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;key&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;label&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;param_classes&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;properties&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;packages&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;adbo               &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Asynchronous Decentralized Bayesian Optimization&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;ParamLgl, ParamInt, ParamDbl, ParamFct&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;dependencies, single-crit &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3mbo, rush   &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;async_design_points&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Asynchronous Design Points                      &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;ParamLgl, ParamInt, ParamDbl, ParamFct, ParamUty&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;dependencies, single-crit , multi-crit  , async       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;bbotk, rush &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;async_grid_search  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Asynchronous Grid Search                        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;ParamLgl, ParamInt, ParamDbl, ParamFct&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;dependencies, single-crit , multi-crit  , async       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;bbotk, rush &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;async_mbo          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Asynchronous Model Based Optimization           &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;ParamLgl, ParamInt, ParamDbl, ParamFct&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;dependencies, single-crit &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3mbo, rush   &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;async_random_search&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Asynchronous Random Search                      &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;ParamLgl, ParamInt, ParamDbl, ParamFct&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;dependencies, single-crit , multi-crit  , async       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;bbotk, rush &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;chain              &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Chain Multiple Optimizers Sequentially          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;ParamLgl, ParamInt, ParamDbl, ParamFct&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;dependencies, single-crit , multi-crit  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;bbotk&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;cmaes              &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Covariance Matrix Adaptation Evolution Strategy &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;ParamDbl&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;single-crit&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;bbotk , adagio&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;design_points      &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Design Points                                   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;ParamLgl, ParamInt, ParamDbl, ParamFct, ParamUty&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;dependencies, single-crit , multi-crit  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;bbotk&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;focus_search       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Focus Search                                    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;ParamLgl, ParamInt, ParamDbl, ParamFct&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;dependencies, single-crit &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;bbotk&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;gensa              &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Generalized Simulated Annealing                 &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;ParamDbl&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;single-crit&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;bbotk, GenSA&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;grid_search        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Grid Search                                     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;ParamLgl, ParamInt, ParamDbl, ParamFct&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;dependencies, single-crit , multi-crit  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;bbotk&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;hyperband          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Hyperband                                       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;ParamLgl, ParamInt, ParamDbl, ParamFct&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;dependencies, single-crit , multi-crit  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;bbotk        , mlr3hyperband&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;irace              &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Iterated Racing                                 &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;ParamDbl, ParamInt, ParamFct, ParamLgl&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;dependencies, single-crit &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;bbotk, irace&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;local_search       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Local Search                                    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;ParamLgl, ParamInt, ParamDbl, ParamFct&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;dependencies, single-crit &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;bbotk&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;mbo                &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Model Based Optimization                        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;ParamLgl, ParamInt, ParamDbl, ParamFct&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;dependencies, single-crit , multi-crit  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3mbo&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;nloptr             &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Non-linear Optimization                         &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;ParamDbl&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;single-crit&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;bbotk , nloptr&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;random_search      &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Random Search                                   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;ParamLgl, ParamInt, ParamDbl, ParamFct&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;dependencies, single-crit , multi-crit  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;bbotk&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;successive_halving &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Successive Halving                              &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;ParamLgl, ParamInt, ParamDbl, ParamFct&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;dependencies, single-crit , multi-crit  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;bbotk        , mlr3hyperband&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;acq_optimizer &amp;lt;- acqo(
 # 调优器是非线性调优
 # 算法是&apos;NLOPT_GN_ORIG_DIRECT&apos;
 optimizer = opt(&apos;nloptr&apos;, algorithm = &apos;NLOPT_GN_ORIG_DIRECT&apos;),
 # 使用停滞超体积终止器，迭代100次，当提升小于1e-5时终止
 terminator = trm(&apos;stagnation&apos;, iters = 100, threshold = 1e-5),
 # 传递要调优的
 acq_function = acq_function
)

candidate &amp;lt;- acq_optimizer$optimize()
candidate
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 1 x 4&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;x&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;acq_ei&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;x_domain&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;.already_evaluated&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;lgl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.417289&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.06074387&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.417289&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;FALSE&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;h4&gt;使用和构建循环函数&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;使用&lt;code&gt;loop_function&lt;/code&gt;可以在全局层面决定贝叶斯优化算法的行为
&lt;ul&gt;
&lt;li&gt;通过定义每次迭代时执行的子例程（subroutine），&lt;br /&gt;
以生成新的待评估候选对象&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;loop_function&lt;/code&gt;储存在&lt;code&gt;mlr_loop_functions&lt;/code&gt;字典中&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;as.data.table(mlr_loop_functions)[, .(key, label, instance)]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 5 x 3&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;key&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;label&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;instance&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;bayesopt_ego   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Efficient Global Optimization&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;single-crit&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;bayesopt_emo   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Multi-Objective EGO          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;multi-crit &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;bayesopt_mpcl  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Multipoint Constant Liar     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;single-crit&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;bayesopt_parego&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;ParEGO                       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;multi-crit &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;bayesopt_smsego&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SMS-EGO                      &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;multi-crit &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;可以使用上述的循环函数，也可以自行编写&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;下面使用 &lt;strong&gt;高效全局优化（Efficient Global Optimization, EGO）&lt;/strong&gt; 进行循环全局优化&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在设定好了贝叶斯优化组件后，循环执行：
&lt;ul&gt;
&lt;li&gt;更新代理模型&lt;/li&gt;
&lt;li&gt;更新采集函数&lt;/li&gt;
&lt;li&gt;优化采集函数以生成新的候选解&lt;/li&gt;
&lt;li&gt;评估候选解并添加到存档&lt;code&gt;archive&lt;/code&gt;中&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;如果在循环过程中出现错误，则会使用回退机制，&lt;br /&gt;
即随机均匀地提出下一个候选解，&lt;br /&gt;
确保即使存在潜在问题，该过程仍能继续进行&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;这里是手动构建一个简化版的EGO算法代码，&lt;br /&gt;
也可以&lt;strong&gt;用来回顾上方的流程&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;my_simple_ego &amp;lt;- function(
 # 设定了贝叶斯优化部件
 instance, # 实例
 surrogate, # 代理模型
 acq_function, # 采集函数
 acq_optimizer, # 采集函数调优器
 # 这里的初始设计是`generate_design_sobol()`的参数`n`
 init_design_size 
  ) {

 # 下面这段可以看清楚这几个部件之间的传递关系
 # 实例存档传递到代理模型存档
 surrogate$archive &amp;lt;- instance$archive 
 # 代理模型传递到采集函数
 acq_function$surrogate &amp;lt;- surrogate
 # 采集函数传递到采集函数调整器
 acq_optimizer$acq_function &amp;lt;- acq_function 
 # 调取搜索空间
 search_space &amp;lt;- instance$search_space

  # 初始设计
  design &amp;lt;- generate_design_sobol(
   search_space, 
   n = init_design_size
  )$data
  # 生成y
  instance$eval_batch(design)

  # 基于模型的优化（MBO）的循环
  repeat {
 candidate &amp;lt;- tryCatch({
  # 更新代理模型
  acq_function$surrogate$update()
  # 更新采集函数
  acq_function$update()
  # 采集函数调优器调优
  acq_optimizer$optimize()
 }, 
 # 当发生错误时，使用备选方法：随机搜索
 mbo_error = function(mbo_error_condition) {
      generate_design_random(search_space, n = 1L)$data
 }) # 1L 表示整数型的 1

    # 评估候选点并保存到存档中
    tryCatch({
      instance$eval_batch(candidate)
    }, 
    terminated_error = function(cond) {
      # 这里写终止条件（如达到最大评估次数）
      # ......
    })
    # 检查终止条件
    if (instance$is_terminated) break
  }

  return(instance)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;使用OptimizerMbo实现贝叶斯优化自动化&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;上面是手动构建贝叶斯优化的流程&lt;/li&gt;
&lt;li&gt;可以将上述构建模块封装到&lt;code&gt;opt()&lt;/code&gt;构建的&lt;code&gt;OptimizerMbo&lt;/code&gt;对象中执行自动化贝叶斯优化&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 构建循环函数
bayesopt_ego &amp;lt;- mlr_loop_functions$get(&apos;bayesopt_ego&apos;)
# 构建代理模型
surrogate &amp;lt;- srlrn(
 lrn(
  &apos;regr.km&apos;, 
  covtype = &apos;matern5_2&apos;,
  optim.method = &apos;BFGS&apos;, 
  control = list(trace = FALSE)
 )
)
# 构建采集函数
acq_function &amp;lt;- acqf(&apos;ei&apos;)
# 构建采集函数模拟器优化器
acq_optimizer &amp;lt;- acqo(
 # 优化器算法
 opt(
  &apos;nloptr&apos;, 
  algorithm = &apos;NLOPT_GN_ORIG_DIRECT&apos;
 ),
 # 终止器算法
 terminator = trm(
  &apos;stagnation&apos;, 
  iters = 100, 
  threshold = 1e-5
 )
)
# 用`opt()`进行自动化BO封装
optimizer &amp;lt;- opt(
 &apos;mbo&apos;,
 loop_function = bayesopt_ego,
 surrogate = surrogate,
 acq_function = acq_function,
 acq_optimizer = acq_optimizer
)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;构建优化实例&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;instance &amp;lt;- OptimInstanceBatchSingleCrit$new(
 objective,
 terminator = trm(&apos;evals&apos;, n_evals = 20)
)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;design &amp;lt;- data.table(x = c(0.1, 0.34, 0.65, 1))
instance$eval_batch(design)
optimizer$optimize(instance)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 1 x 3&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;x&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;x_domain&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;y&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.7921811&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.7921811&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-1.577224&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果用&lt;code&gt;Instance$archive&lt;/code&gt;做图的话可以得到下面这个：
&lt;ul&gt;
&lt;li&gt;贝叶斯优化算法的采样轨迹初始设计的点用黑色三角形表示；&lt;br /&gt;
随着算法的推进，采样点用圆点表示，颜色从黑色逐渐变为白色&lt;/li&gt;
&lt;li&gt;在第17轮迭代的时候，采样点就来到了全局最优值的地方&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;然而，即使在优化的后期阶段，该算法仍在探索新的区域
&lt;ul&gt;
&lt;li&gt;这表明期望提升采集函数确实如我们所要求的那样，&lt;br /&gt;
在探索和利用之间取得了平衡&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./image_10.png&quot; alt=&quot;image_10&quot; /&gt;&lt;/p&gt;
&lt;p&gt;-　顺便看看&lt;code&gt;Instance$archive&lt;/code&gt; 的结果&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;instance$archive %&amp;gt;% as.data.table()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 20 x 7&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;x&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;y&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;timestamp&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;batch_nr&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;acq_ei&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;.already_evaluated&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;x_domain_x&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dttm&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;lgl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;1.000000e-01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1.970899e-01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-24 19:19:37&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;           NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;   NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e-01&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;3.400000e-01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-6.792294e-01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-24 19:19:37&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;           NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;   NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.400000e-01&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;6.500000e-01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 4.148279e-01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-24 19:19:37&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;           NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;   NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;6.500000e-01&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;1.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1.981215e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-24 19:19:37&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;           NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;   NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.000000e+00&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;4.172890e-01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-3.563394e-01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-24 19:19:38&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 6.074387e-02&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;FALSE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;4.172890e-01&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;2.843317e-01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-4.230907e-01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-24 19:19:39&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 6.085101e-02&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;FALSE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2.843317e-01&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;3.549510e-01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-6.866001e-01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-24 19:19:40&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 9.136180e-03&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;FALSE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.549510e-01&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;2.540263e-05&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1.806822e-08&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-24 19:19:41&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 5&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1.969525e-03&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;FALSE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2.540263e-05&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;3.503277e-01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-6.877539e-01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-24 19:19:42&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 6&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1.806029e-03&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;FALSE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.503277e-01&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;7.881166e-01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-1.575092e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-24 19:19:42&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 7&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 3.460028e-05&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;FALSE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;7.881166e-01&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;8.152467e-01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-1.490192e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-24 19:19:43&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 8&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 4.368291e-02&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;FALSE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;8.152467e-01&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;7.942641e-01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-1.576307e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-24 19:19:44&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 9&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 4.720211e-03&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;FALSE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;7.942641e-01&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;7.624092e-01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-1.446524e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-24 19:19:45&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;10&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 6.985420e-09&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;FALSE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;7.624092e-01&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;7.921811e-01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-1.577224e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-24 19:19:47&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;11&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 9.251675e-04&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;FALSE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;7.921811e-01&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;8.827160e-01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-3.651653e-01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-24 19:19:49&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;12&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 7.987685e-20&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;FALSE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;8.827160e-01&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;5.246914e-01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 9.167112e-01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-24 19:19:50&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;13&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 5.535251e-21&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;FALSE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5.246914e-01&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;1.872428e-01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1.861373e-01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-24 19:19:51&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;14&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1.408867e-24&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;FALSE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.872428e-01&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;7.222222e-01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-9.153515e-01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-24 19:19:53&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;15&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 7.389664e-67&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;FALSE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;7.222222e-01&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;4.320988e-02&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 4.914789e-02&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-24 19:19:54&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;16&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;8.721303e-111&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;FALSE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;4.320988e-02&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;7.798354e-01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-1.554943e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-24 19:19:55&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;17&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.960345e-163&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;FALSE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;7.798354e-01&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果将贝叶斯优化算法运行十次（采用随机初始设计和不同的随机种子），&lt;br /&gt;
并与随机搜索进行比较
&lt;ul&gt;
&lt;li&gt;可以看到，贝叶斯优化的性能更好，平均在大约15次函数评估后就能达到全局最优&lt;/li&gt;
&lt;li&gt;正如预期的那样，初始设计规模的性能与随机搜索的性能相近&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./image_11.png&quot; alt=&quot;image_11&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;用于超参数优化的贝叶斯优化&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;使用&lt;code&gt;mlr3mbo&lt;/code&gt;的&lt;code&gt;TunerMbo&lt;/code&gt;类可以进行超参数优化
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;TunerMbo&lt;/code&gt;类是&lt;code&gt;OptimizerMbo&lt;/code&gt;的包装器&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;下面例子中，在&lt;code&gt;tsk(&apos;sonar&apos;&lt;/code&gt;)上使用径向核，通过3折CV来调整&lt;br /&gt;
 &lt;code&gt;lrn(&apos;classif.svm&apos;)&lt;/code&gt; 的 &lt;code&gt;cost&lt;/code&gt; 和 &lt;code&gt;gamma&lt;/code&gt; 参数&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 构建调优器
tuner &amp;lt;- tnr(
 # 选择基于模型的调优
 &apos;mbo&apos;,
 # 选择贝叶斯优化的EGO算法
 loop_function = bayesopt_ego,
 # 传递代理模型
 surrogate = surrogate,
 # 传递采集函数
 acq_function = acq_function,
 # 传递采集函数调优器
 acq_optimizer = acq_optimizer
)

# 构建学习器
lrn_svm &amp;lt;- lrn(
 # 选择支持向量机
 &apos;classif.svm&apos;, 
 # 选择radial内核
 kernel = &apos;radial&apos;,
 # 选择分类问题
 type = &apos;C-classification&apos;,
 # 选择`cost`和`gamma`的调优范围
 cost  = to_tune(1e-5, 1e5, logscale = TRUE),
 gamma = to_tune(1e-5, 1e5, logscale = TRUE)
)

# 进行实例调优
instance &amp;lt;- tune(
 tuner, 
 tsk(&apos;sonar&apos;), 
 lrn_svm, 
 # 使用3折CV进行重采样
 rsmp(&apos;cv&apos;, folds = 3),
 # 使用交叉熵评估器
 msr(&apos;classif.ce&apos;), 
 # 迭代次数25次
 25
)

instance$result
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 1 x 5&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;cost&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;gamma&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;learner_param_vals&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;x_domain&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;classif.ce&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;8.287107&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-3.762188&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;radial            , C-classification  , 3972.32580037573  , 0.0232328628271241&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.972326e+03, 2.323286e-02&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.110628&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;接下来是多评估标准的例子
&lt;ul&gt;
&lt;li&gt;评估的标准是 真阳性率（TPR），假阳性率（FPR）
&lt;ul&gt;
&lt;li&gt;前者越大越好，后者越小越好&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;tuner &amp;lt;- tnr(
 &apos;mbo&apos;,
 loop_function = bayesopt_parego,
 surrogate = surrogate,
 acq_function = acq_function,
 acq_optimizer = acq_optimizer
)

lrn_rpart &amp;lt;- lrn(
 &apos;classif.rpart&apos;,
 cp = to_tune(1e-04, 1e-1),
 minsplit = to_tune(2, 64),
 maxdepth = to_tune(1, 30)
)

instance &amp;lt;- tune(
 tuner, 
 tsk(&apos;sonar&apos;), 
 lrn_svm, 
 rsmp(&apos;cv&apos;, folds = 3),
 # 这里就是2个评估器：
 # 真阳性率（TPR），假阳性率（FPR）
 msrs(c(&apos;classif.tpr&apos;, &apos;classif.fpr&apos;)), 
 25
)

instance$result
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 4 x 6&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;cost&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;gamma&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;learner_param_vals&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;x_domain&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;classif.tpr&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;classif.fpr&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;-2.078838&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-4.156062&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;radial            , C-classification  , 0.125075520793627 , 0.0156691447439775&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.12507552, 0.01566914&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.0000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.7383860&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; 3.126967&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-4.221932&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;radial            , C-classification  , 22.8047172214673  , 0.0146702678401885&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;22.80471722, 0.01467027&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.9081787&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.1999920&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; 3.411237&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-4.264046&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;radial            , C-classification  , 30.302710828664   , 0.0140652724210524&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;30.30271083, 0.01406527&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.9081787&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.1999920&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; 6.395485&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-2.990097&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;radial            , C-classification  , 599.133704193403  , 0.0502825699974251&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;599.13370419, 0.05028257&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.9264098&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2588602&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;h3&gt;含噪声贝叶斯优化&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;现实生活中模型是受到噪声影响的 -&amp;gt; 误差
&lt;ul&gt;
&lt;li&gt;在&lt;code&gt;bbotk&lt;/code&gt;中，可以通过将&lt;code&gt;&apos;noisy&apos;&lt;/code&gt;标签传递给&lt;code&gt;properties&lt;/code&gt;参数，&lt;br /&gt;
将&lt;code&gt;Objective&lt;/code&gt;对象标记为有噪声的
&lt;ul&gt;
&lt;li&gt;这使我们能够使用可以对这类目标进行不同处理的方法&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 定义一个受到误差干扰的目标函数
sinus_1D_noisy &amp;lt;- function(xs) {
  y &amp;lt;- 2 * xs$x * sin(14 * xs$x) + 
   # 这里以正态随机分布随机生成1个均值为0标准偏差为0.1的误差项为例
   rnorm(1, mean = 0, sd = 0.1)
  return(y)
}
# 定义域
domain &amp;lt;- ps(x = p_dbl(lower = 0, upper = 1))
# 陪域
codomain &amp;lt;- ps(y = p_dbl(tags = &apos;minimize&apos;))
# 
objective_noisy &amp;lt;- ObjectiveRFun$new(
 sinus_1D_noisy,
 domain = domain, 
 codomain = codomain, 
 # 对目标函数标记有噪声
 properties = &apos;noisy&apos;
)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;对于带有噪声的目标函数，处理方法有：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用代理模型来考虑噪声&lt;/li&gt;
&lt;li&gt;使用一种考虑噪声的采集函数&lt;/li&gt;
&lt;li&gt;优化后的最终最佳点（即实例的 &lt;code&gt;Instance$result&lt;/code&gt; 字段）的选择方式&lt;br /&gt;
可以反映噪声情况&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果使用代理模型来考虑噪声，&lt;br /&gt;
可以不用插值高斯过程（interpolating Gaussian process），&lt;br /&gt;
而是使用高斯过程回归（Gaussian process regression）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;这将导致高斯过程无法完美地对训练数据进行插值，&lt;br /&gt;
并且与训练数据相关的标准差预测将不为零
&lt;ul&gt;
&lt;li&gt;这反映了由于测量误差导致的观测函数值的不确定性&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;srlrn(
 lrn(
  &apos;regr.km&apos;, 
  # 设置`nugget.estim = TRUE`使用高斯过程回归
  nugget.estim = TRUE
 )
)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;如果使用一种考虑噪声的采集函数，&lt;br /&gt;
可以使用增强期望提升（Augmented expected improvement）
&lt;ul&gt;
&lt;li&gt;本质上是对期望提升进行重新缩放，同时考虑了测量误差&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;acq_function &amp;lt;- acqf(&apos;aei&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;最后，&lt;code&gt;mlr3mbo&lt;/code&gt; 允许通过结果分配器（assigner）&lt;br /&gt;
明确指定优化后的最终结果如何分配给优化实例（即 &lt;code&gt;Instance$result&lt;/code&gt; 中保存的内容）
&lt;ul&gt;
&lt;li&gt;可以在构建 &lt;code&gt;OptimizerMbo&lt;/code&gt; 或 &lt;code&gt;TunerMbo&lt;/code&gt; 时指定结果分配器&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ResultAssignerSurrogate&lt;/code&gt; 使用代理模型预测所有评估点的均值，&lt;br /&gt;
然后选择均值预测最佳的点作为最终优化结果&lt;/li&gt;
&lt;li&gt;默认方法 &lt;code&gt;ResultAssignerArchive&lt;/code&gt; 仅根据 &lt;code&gt;archive&lt;/code&gt; 中记录的评估结果选择最佳点&lt;/li&gt;
&lt;li&gt;结果分配器存储在 &lt;code&gt;mlr_result_assigners&lt;/code&gt; 字典中，&lt;br /&gt;
可以使用 &lt;code&gt;ras()&lt;/code&gt; 构建&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;opt(
 &apos;mbo&apos;,
 loop_function = bayesopt_ego,
 surrogate = surrogate,
 acq_function = acq_function,
 acq_optimizer = acq_optimizer,
 result_assigner = ras(&apos;surrogate&apos;)
)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;其实结果分配器就两种&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;mlr_result_assigners %&amp;gt;% as.data.table()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 2 x 3&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;key&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;label&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;man&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;archive  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Archive                  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3mbo::mlr_result_assigners_archive  &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;surrogate&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Mean Surrogate Prediction&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3mbo::mlr_result_assigners_surrogate&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;h3&gt;贝叶斯优化中的实际考量&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;mlr3mbo&lt;/code&gt;包在代理模型、采集函数、采集函数优化器甚至循环函数的选择上使用合理的默认值
&lt;ul&gt;
&lt;li&gt;例如在纯数值搜索空间的情况下，&lt;br /&gt;
&lt;code&gt;mlr3mbo&lt;/code&gt; 默认将使用高斯过程作为代理模型，&lt;br /&gt;
并使用随机森林作为回退学习器，&lt;br /&gt;
此外还封装了学习器&lt;/li&gt;
&lt;li&gt;在不指定任何与默认值不同的情况下执行贝叶斯优化，并且仍然期望获得不错的优化性能&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mlr3mbo.mlr-org.com/reference/mbo_defaults.html&quot;&gt;&lt;code&gt;mbo_defaults&lt;/code&gt;&lt;/a&gt; 的帮助页面给出了这些默认值&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;错误处理（Error Handling）&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;在贝叶斯优化的背景下，构建模块有&lt;strong&gt;很大的潜在失败空间&lt;/strong&gt;，这可能会破坏整个过程
&lt;ul&gt;
&lt;li&gt;例如，如果训练数据中的两个点彼此&lt;strong&gt;过于接近&lt;/strong&gt;，拟合高斯过程代理模型可能会失败&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;mlr3mbo 有几个内置的安全机制来捕获错误
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Surrogate&lt;/code&gt; 包含 &lt;code&gt;catch_errors&lt;/code&gt; 配置控制参数，&lt;br /&gt;
如果将其设置为 TRUE，则会捕获在代理模型训练或更新期间发生的所有错误&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AcqOptimizer&lt;/code&gt; 也有 &lt;code&gt;catch_errors&lt;/code&gt; 配置控制参数，&lt;br /&gt;
可用于捕获在采集函数优化期间发生的所有错误，&lt;br /&gt;
无论是由于代理模型预测失败还是采集函数优化器出错&lt;/li&gt;
&lt;li&gt;如果在这些步骤中的任何一步捕获到错误，&lt;br /&gt;
任何 &lt;code&gt;loop_function&lt;/code&gt; 的标准行为是&lt;strong&gt;触发回退学习器&lt;/strong&gt;，&lt;br /&gt;
即随机均匀地提出下一个候选解&lt;/li&gt;
&lt;li&gt;注意：为 &lt;code&gt;AcqOptimizer&lt;/code&gt; 设置 &lt;code&gt;catch_errors = TRUE&lt;/code&gt; 时，&lt;br /&gt;
通常无需也为 &lt;code&gt;Surrogate&lt;/code&gt; 显式设置 &lt;code&gt;catch_errors = TRUE&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;不过这在调试时可能会有用&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;在&lt;strong&gt;最坏&lt;/strong&gt;的情况下，如果所有迭代都出错，贝叶斯优化算法将&lt;strong&gt;直接进行随机搜索&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;理想&lt;/strong&gt;情况下，还应使用&lt;strong&gt;回退学习器&lt;/strong&gt;，在随机提出下一个候选解之前将采用该学习器&lt;/li&gt;
&lt;li&gt;采集函数的值也始终记录在优化实例的存档中，&lt;br /&gt;
因此检查该值是个好主意，以确保算法按预期运行&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;代理模型&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;在实践中，用户可能更喜欢一种更稳健的贝叶斯优化变体，&lt;br /&gt;
而不是一种可能性能更好但不稳定的变体&lt;/li&gt;
&lt;li&gt;即使&lt;code&gt;catch_errors&lt;/code&gt;参数已打开且从未触发，也不能保证BO算法按预期运行
&lt;ul&gt;
&lt;li&gt;例如，高斯过程对核函数及其参数的选择很敏感，&lt;br /&gt;
这些参数通常通过最大似然估计来估算，&lt;br /&gt;
次优的参数值可能会导致具有恒定均值和标准差预测的白噪声模型&lt;/li&gt;
&lt;li&gt;在这种情况下，代理模型将无法提供有用的均值和标准差预测，&lt;br /&gt;
从而导致BO算法的整体性能不佳&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;关于代理模型选择的另一个实际考虑因素可能是开销
&lt;ul&gt;
&lt;li&gt;拟合一个普通高斯过程的计算量与数据点的数量呈三次方关系，&lt;br /&gt;
因此BO算法的开销会随着迭代次数的增加而增长&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;普通高斯过程本身无法处理分类输入变量或搜索空间中的依赖关系&lt;br /&gt;
（在超参数优化中，我们经常处理混合层次空间）
&lt;ul&gt;
&lt;li&gt;相比之下，随机森林（在SMAC中广泛用作代理模型）训练成本低，&lt;br /&gt;
在某种意义上相当稳健
&lt;ul&gt;
&lt;li&gt;因为它不像高斯过程那样对其超参数敏感&lt;/li&gt;
&lt;li&gt;并且可以轻松处理混合层次空间&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;不利的一面是，随机森林并非真正的贝叶斯模型（即不存在后验预测分布），&lt;br /&gt;
并且在不确定性估计和外推方面表现不佳&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;热启动（Warmstarting）&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;热启动是优化中的一种技术
&lt;ul&gt;
&lt;li&gt;它利用先前的优化运行来提高新的相关优化运行的收敛速度和最终解决方案&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;在贝叶斯优化中，热启动可以通过在初始设计中&lt;br /&gt;
提供一组可能表现良好的配置来实现
&lt;ul&gt;
&lt;li&gt;这种方法特别有利，因为它允许代理模型在相关区域中利用优化空间的先验知识开始&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;在&lt;code&gt;mlr3mbo&lt;/code&gt;中，通过指定自定义初始设计，热启动很简单&lt;/li&gt;
&lt;li&gt;此外，&lt;code&gt;mlr3mbo&lt;/code&gt;的一个便捷功能是，即使在优化运行终止后，&lt;br /&gt;
也能够以在线方式继续优化
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;OptimizerMbo&lt;/code&gt;和&lt;code&gt;TunerMbo&lt;/code&gt;都支持此功能，&lt;br /&gt;
即使先前的优化被中断或终止，也能在给定实例上恢复优化&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;终止&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;常见的终止准则包括：
&lt;ul&gt;
&lt;li&gt;在固定次数的评估后停止&lt;/li&gt;
&lt;li&gt;一旦达到给定的时间预算&lt;/li&gt;
&lt;li&gt;当性能达到一定水平时&lt;/li&gt;
&lt;li&gt;当性能提升停滞时&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;在贝叶斯优化的背景下，&lt;br /&gt;
如果最佳采集函数值降至某个阈值以下，停止优化也是合理的
&lt;ul&gt;
&lt;li&gt;例如，如果下一个候选解的预期改进可以忽略不计，&lt;br /&gt;
终止优化可能是一种合理的方法&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;em&gt;然而目前基于采集函数的终止器尚未实现&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;并行化&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;大多数贝叶斯优化算法的标准行为是&lt;br /&gt;
按顺序提出下一个应评估的单个候选方案&lt;/li&gt;
&lt;li&gt;如果将贝叶斯优化用于超参数优化，那么最有效的方法是对嵌套重采样进行并行化&lt;/li&gt;
&lt;li&gt;如果循环函数支持批量提出候选方案（例如&lt;code&gt;bayesopt_parego()&lt;/code&gt;），&lt;br /&gt;
那么可以设置循环函数的 &lt;code&gt;q&lt;/code&gt; 参数，&lt;br /&gt;
以便在每次迭代中提出 &lt;code&gt;q&lt;/code&gt; 个候选方案
&lt;ul&gt;
&lt;li&gt;如果 &lt;code&gt;Objective&lt;/code&gt; 实现得当，这些候选方案可以并行评估&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>【mlr3】3.特征选择</title><link>https://nab-iak.github.io/posts/p12/p12/</link><guid isPermaLink="true">https://nab-iak.github.io/posts/p12/p12/</guid><description>mlr3特征选择</description><pubDate>Sun, 20 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Cover Pic by &lt;a href=&quot;https://www.pixiv.net/artworks/131750399&quot;&gt;@humugo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://mlr3book.mlr-org.com/&quot;&gt;Applied Machine Learning Using mlr3 in R&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;特征选择&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;特征选择的目的
&lt;ul&gt;
&lt;li&gt;提高预测性能，因为我们减少了对无关特征的过拟合&lt;/li&gt;
&lt;li&gt;不依赖噪声特征的稳健模型&lt;/li&gt;
&lt;li&gt;更简单且易于解释的模型&lt;/li&gt;
&lt;li&gt;更快的模型拟合，例如用于模型更新&lt;/li&gt;
&lt;li&gt;无需收集可能成本高昂的特征&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;过滤器（Filter）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;设置过滤器可以在训练模型前简单筛除一些无关特征变量，例如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;计算每个特征与数值型目标变量相关系数$\rho$，&lt;br /&gt;
并选择$\rho &amp;gt; 2$的特征变量&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;一些更先进的方法，例如基于特征重要性的多变量过滤器通常表现更好&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;单变量过滤器的一个优点是，它们通常比更复杂的过滤或包装方法计算成本更低&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;过滤算法通过为每个特征分配数值分数来选择特征&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;例如，特征与目标变量之间的相关性，&lt;br /&gt;
使用这些分数对特征进行排序，&lt;br /&gt;
并根据排序选择特征子集，&lt;br /&gt;
在后续建模步骤中，得分较低的特征将被忽略&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;所有过滤器（&lt;code&gt;Filter&lt;/code&gt;类）均通过包 &lt;code&gt;mlr3filters&lt;/code&gt; 实现&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;可以通过&lt;code&gt;mlr_filters&lt;/code&gt;字典查询所有过滤器，&lt;br /&gt;
通过&lt;code&gt;flt()&lt;/code&gt;函数来调取对应过滤器&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;mlr_filters %&amp;gt;% as.data.table()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 23 x 7&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;key&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;label&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;task_types&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;task_properties&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;params&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;feature_types&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;packages&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;anova            &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;ANOVA F-Test                                            &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer, numeric&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;stats&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;auc              &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Area Under the ROC Curve Score                          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;twoclass&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer, numeric&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3measures&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;boruta           &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Burota                                                  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;regr   , classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;pValue     , mcAdj      , maxRuns    , doTrace    , holdHistory, getImp     , keep       , num.threads&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer, numeric&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Boruta&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;carscore         &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Correlation-Adjusted coRrelation Score                  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;regr&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;lambda  , diagonal, verbose &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;logical, integer, numeric&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;care&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;carsurvscore     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Correlation-Adjusted coRrelation Survival Score         &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;surv&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;maxIPCweight, denom       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer, numeric&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;carSurv  , mlr3proba&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;cmim             &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Minimal Conditional Mutual Information Maximization     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif, regr   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;threads&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer, numeric, factor , ordered&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;praznik&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;correlation      &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Correlation                                             &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;regr&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;use   , method&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer, numeric&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;stats&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;disr             &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Double Input Symmetrical Relevance                      &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif, regr   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;threads&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer, numeric, factor , ordered&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;praznik&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;find_correlation &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Correlation-based Score                                 &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;use   , method&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer, numeric&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;stats&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;importance       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Importance Score                                        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;method&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;logical    , integer    , numeric    , character  , factor     , ordered    , POSIXct    , Date       , lazy_tensor&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;information_gain &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Information Gain                                        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif, regr   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;type        , equal       , discIntegers, threads     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer, numeric, factor , ordered&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;FSelectorRcpp&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;jmi              &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Joint Mutual Information                                &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif, regr   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;threads&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer, numeric, factor , ordered&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;praznik&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;jmim             &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Minimal Joint Mutual Information Maximization           &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif, regr   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;threads&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer, numeric, factor , ordered&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;praznik&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;kruskal_test     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Kruskal-Wallis Test                                     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;na.action&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer, numeric&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;stats&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;mim              &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Mutual Information Maximization                         &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif, regr   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;threads&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer, numeric, factor , ordered&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;praznik&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;mrmr             &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Minimum Redundancy Maximal Relevancy                    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif, regr   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;threads&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer, numeric, factor , ordered&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;praznik&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;njmim            &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Minimal Normalised Joint Mutual Information Maximization&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif, regr   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;threads&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer, numeric, factor , ordered&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;praznik&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;performance      &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Predictive Performance                                  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;method&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;logical    , integer    , numeric    , character  , factor     , ordered    , POSIXct    , Date       , lazy_tensor&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3        , mlr3measures&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;permutation      &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Permutation Score                                       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;standardize, nmc        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;logical    , integer    , numeric    , character  , factor     , ordered    , POSIXct    , Date       , lazy_tensor&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3        , mlr3measures&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;relief           &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RELIEF                                                  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif, regr   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;neighboursCount, sampleSize     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer, numeric, factor , ordered&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;FSelectorRcpp&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;selected_features&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Embedded Feature Selection                              &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;method&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;logical    , integer    , numeric    , character  , factor     , ordered    , POSIXct    , Date       , lazy_tensor&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;univariate_cox   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Univariate Cox Survival Score                           &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;surv&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer, numeric, logical&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;survival&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;variance         &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Variance                                                &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;na.rm&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer, numeric&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;stats&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;几种常用的过滤器：
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;flt(&apos;correlation&apos;)&lt;/code&gt;：  相关性，&lt;br /&gt;
计算数值特征与数值目标之间的皮尔逊（Pearson）或&lt;br /&gt;
斯皮尔曼（Spearman）相关性&lt;/li&gt;
&lt;li&gt;&lt;code&gt;flt(&apos;information_gain&apos;)&lt;/code&gt;：信息增益，&lt;br /&gt;
即特征与目标之间的互信息，&lt;br /&gt;
或者由于某个特征导致目标不确定性的降低&lt;/li&gt;
&lt;li&gt;&lt;code&gt;flt(&apos;jmim&apos;)&lt;/code&gt;：最小联合互信息最大化&lt;/li&gt;
&lt;li&gt;&lt;code&gt;flt(&apos;permutation&apos;)&lt;/code&gt;：排列分数，&lt;br /&gt;
它使用给定的学习器为每个特征计算排列特征重要性&lt;/li&gt;
&lt;li&gt;&lt;code&gt;flt(&apos;auc&apos;)&lt;/code&gt;：分别为每个特征计算的ROC曲线下面积&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;大多数过滤方法都有一些局限性&lt;br /&gt;
例如，相关性过滤器只能用于具有数值特征的回归任务
&lt;ul&gt;
&lt;li&gt;建议不要依赖单一的过滤方法，&lt;br /&gt;
如果可用的计算资源允许，尝试&lt;strong&gt;多种方法&lt;/strong&gt;；&lt;br /&gt;
如果只能使用一种过滤方法，&lt;br /&gt;
建议使用基于随机森林排列重要性的特征重要性过滤器&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;计算过滤器值&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;每一个&lt;code&gt;Filter&lt;/code&gt;类的对象都有一个&lt;code&gt;Filter$calculate()&lt;/code&gt;的方法
&lt;ul&gt;
&lt;li&gt;本例用的是&lt;strong&gt;信息增益过滤器&lt;/strong&gt;（其实就是stepwise法）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 加载R包
# library(mlr3filters)

# 创建`Task`
tsk_pen &amp;lt;- tsk(&apos;penguins&apos;)
# 创建信息增益过滤器
flt_gain &amp;lt;- flt(&apos;information_gain&apos;)

# 将`Filter`作用于`Task`
flt_gain$calculate(tsk_pen)

# 获取结果
as.data.table(flt_gain)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 7 x 2&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;feature&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;score&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;flipper_length&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.581167901&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;bill_length   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.544896584&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;bill_depth    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.538718879&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;island        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.520157171&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;body_mass     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.442879511&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;sex           &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.007244168&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;year          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.000000000&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;可以看到&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;结果保存在&lt;code&gt;Filter&lt;/code&gt;中&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sex&lt;/code&gt;和&lt;code&gt;year&lt;/code&gt;是最无关的变量&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;对于有参数的过滤器，也可以用&lt;code&gt;Filter$param_set&lt;/code&gt;调取&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 创建相关性过滤器，方法选择&apos;spearman相关性检验&apos;
flt_cor &amp;lt;- flt(&apos;correlation&apos;, method = &apos;spearman&apos;)
flt_cor$param_set
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;ParamSet(2)&amp;gt;
       id    class lower upper nlevels    default    value
   &amp;lt;char&amp;gt;   &amp;lt;char&amp;gt; &amp;lt;num&amp;gt; &amp;lt;num&amp;gt;   &amp;lt;num&amp;gt;     &amp;lt;list&amp;gt;   &amp;lt;list&amp;gt;
1:    use ParamFct    NA    NA       5 everything   [NULL]
2: method ParamFct    NA    NA       3    pearson spearman
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;特征重要性过滤器&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;要使用特征重要性过滤器，我们可以使用具有 &lt;code&gt;Filter$importance()&lt;/code&gt; 方法的学习器
&lt;ul&gt;
&lt;li&gt;简单看看哪些&lt;code&gt;Learner&lt;/code&gt;支持特征重要性计算&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;as.data.table(mlr_learners)[
 sapply(properties, function(x) &apos;importance&apos; %in% x)
]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 34 x 7&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;key&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;label&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;task_type&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;feature_types&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;packages&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;properties&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;predict_types&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.aorsf           &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Oblique Random Forest Classifier  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer, numeric, factor , ordered&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3             , mlr3extralearners, aorsf            &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;importance, multiclass, oob_error , twoclass  , weights   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response, prob    &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.catboost        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Gradient Boosting                 &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;numeric, factor , ordered&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3             , mlr3extralearners, catboost         &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;importance     , internal_tuning, missings       , multiclass     , twoclass       , validation     , weights        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response, prob    &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.featureless     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Featureless Classification Learner&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;logical    , integer    , numeric    , character  , factor     , ordered    , POSIXct    , Date       , lazy_tensor&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;featureless      , importance       , missings         , multiclass       , selected_features, twoclass         , weights          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response, prob    &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.gbm             &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Gradient Boosting                 &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer, numeric, factor , ordered&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3             , mlr3extralearners, gbm              &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;importance, missings  , twoclass  , weights   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response, prob    &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.imbalanced_rfsrc&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Imbalanced Random Forest          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;logical, integer, numeric, factor , ordered&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3           , randomForestSRC&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;importance, missings  , oob_error , twoclass  , weights   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response, prob    &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.lightgbm        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Gradient Boosting                 &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;logical, integer, numeric, factor &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3             , mlr3extralearners, lightgbm         &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;hotstart_forward, importance      , internal_tuning , missings        , multiclass      , twoclass        , validation      , weights         &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response, prob    &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.randomForest    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Random Forest                     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;logical, integer, numeric, factor , ordered&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3             , mlr3extralearners, randomForest     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;importance, multiclass, oob_error , twoclass  , weights   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response, prob    &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.ranger          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Random Forest                     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;logical  , integer  , numeric  , character, factor   , ordered  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3        , mlr3learners, ranger      &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;hotstart_backward, importance       , missings         , multiclass       , oob_error        , selected_features, twoclass         , weights          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response, prob    &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.rfsrc           &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Random Forest                     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;logical, integer, numeric, factor &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3             , mlr3extralearners, randomForestSRC  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;importance, missings  , multiclass, oob_error , twoclass  , weights   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response, prob    &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.rpart           &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Classification Tree               &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;logical, integer, numeric, factor , ordered&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3 , rpart&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;importance       , missings         , multiclass       , selected_features, twoclass         , weights          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response, prob    &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.torch_model     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Torch Model                       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;logical    , integer    , numeric    , character  , factor     , ordered    , POSIXct    , Date       , lazy_tensor&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3     , mlr3torch, torch    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;featureless      , hotstart_backward, hotstart_forward , importance       , internal_tuning  , marshal          , missings         , multiclass       , offset           , oob_error        , selected_features, twoclass         , validation       , weights          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response, prob    &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.xgboost         &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Extreme Gradient Boosting         &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;logical, integer, numeric&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3        , mlr3learners, xgboost     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;hotstart_forward, importance      , internal_tuning , missings        , multiclass      , offset          , twoclass        , validation      , weights         &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response, prob    &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;regr.aorsf              &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Oblique Random Forest Regressor   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;regr   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;logical, integer, numeric, factor , ordered&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3             , mlr3extralearners, aorsf            &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;importance, oob_error , weights   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;regr.catboost           &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Gradient Boosting                 &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;regr   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;numeric, factor , ordered&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3             , mlr3extralearners, catboost         &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;importance     , internal_tuning, missings       , validation     , weights        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;regr.featureless        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Featureless Regression Learner    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;regr   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;logical    , integer    , numeric    , character  , factor     , ordered    , POSIXct    , Date       , lazy_tensor&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3 , stats&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;featureless      , importance       , missings         , selected_features, weights          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response , se       , quantiles&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;regr.gbm                &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Gradient Boosting                 &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;regr   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer, numeric, factor , ordered&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3             , mlr3extralearners, gbm              &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;importance, missings  , weights   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response , quantiles&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;regr.lightgbm           &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Gradient Boosting                 &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;regr   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;logical, integer, numeric, factor &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3             , mlr3extralearners, lightgbm         &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;hotstart_forward, importance      , internal_tuning , missings        , validation      , weights         &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;regr.randomForest       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Random Forest                     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;regr   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;logical, integer, numeric, factor , ordered&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3             , mlr3extralearners, randomForest     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;importance, oob_error , weights   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;regr.ranger             &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Random Forest                     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;regr   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;logical  , integer  , numeric  , character, factor   , ordered  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3        , mlr3learners, ranger      &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;hotstart_backward, importance       , missings         , oob_error        , selected_features, weights          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response , se       , quantiles&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;regr.rfsrc              &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Random Forest                     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;regr   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;logical, integer, numeric, factor &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3             , mlr3extralearners, randomForestSRC  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;importance, missings  , oob_error , weights   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;regr.rpart              &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Regression Tree                   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;regr   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;logical, integer, numeric, factor , ordered&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3 , rpart&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;importance       , missings         , selected_features, weights          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;regr.torch_model        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Torch Model                       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;regr   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;logical    , integer    , numeric    , character  , factor     , ordered    , POSIXct    , Date       , lazy_tensor&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3     , mlr3torch, torch    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;featureless      , hotstart_backward, hotstart_forward , importance       , internal_tuning  , marshal          , missings         , offset           , oob_error        , selected_features, validation       , weights          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;regr.xgboost            &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Extreme Gradient Boosting         &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;regr   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;logical, integer, numeric&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3        , mlr3learners, xgboost     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;hotstart_forward, importance      , internal_tuning , missings        , offset          , validation      , weights         &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;surv.aorsf              &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Oblique Random Forest             &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;surv   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer, numeric, factor , ordered&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3             , mlr3proba        , mlr3extralearners, aorsf            , pracma           &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;importance, missings  , oob_error , weights   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;crank   , distr   , response&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;surv.bart               &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Bayesian Additive Regression Trees&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;surv   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;logical, integer, numeric&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3     , mlr3proba, BART     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;importance, missings  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;crank, distr&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;surv.gamboost           &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Boosted Generalized Additive Model&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;surv   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;logical, integer, numeric, factor &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3             , mlr3proba        , mlr3extralearners, mboost           , pracma           &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;importance       , offset           , selected_features, weights          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;crank, distr, lp   &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;surv.gbm                &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Gradient Boosting                 &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;surv   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer, numeric, factor , ordered&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3             , mlr3proba        , mlr3extralearners, gbm              &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;importance, missings  , weights   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;crank, lp   &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;surv.glmboost           &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Boosted Generalized Linear Model  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;surv   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;logical, integer, numeric, factor &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3             , mlr3proba        , mlr3extralearners, mboost           , pracma           &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;importance       , offset           , selected_features, weights          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;crank, distr, lp   &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;surv.mboost             &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Boosted Generalized Additive Model&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;surv   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;logical, integer, numeric, factor &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3             , mlr3proba        , mlr3extralearners, mboost           &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;importance       , offset           , selected_features, weights          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;crank, distr, lp   &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;surv.ranger             &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Random Forest                     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;surv   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;logical  , integer  , numeric  , character, factor   , ordered  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3             , mlr3proba        , mlr3extralearners, ranger           &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;importance, oob_error , weights   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;crank, distr&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;surv.rfsrc              &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Random Forest                     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;surv   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;logical, integer, numeric, factor &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3             , mlr3proba        , mlr3extralearners, randomForestSRC  , pracma           &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;importance, missings  , oob_error , weights   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;crank, distr&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;surv.rpart              &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Survival Tree                     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;surv   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;logical  , integer  , numeric  , character, factor   , ordered  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3     , mlr3proba, rpart    , distr6   , survival &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;importance       , missings         , selected_features, weights          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;crank&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;surv.xgboost.aft        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Extreme Gradient Boosting AFT     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;surv   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer, numeric&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3             , mlr3proba        , mlr3extralearners, xgboost          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;importance     , internal_tuning, missings       , validation     , weights        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;crank   , lp      , response&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;surv.xgboost.cox        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Extreme Gradient Boosting Cox     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;surv   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer, numeric&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3             , mlr3proba        , mlr3extralearners, xgboost          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;importance     , internal_tuning, marshal        , missings       , validation     , weights        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;crank, distr, lp   &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;对于一些学习器来说，需要将所需的过滤方法设置为一个超参数
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;lrn(&apos;classif.ranger&apos;)&lt;/code&gt; 带有多种集成方法，&lt;br /&gt;
可以在构建过程中进行选择
&lt;ul&gt;
&lt;li&gt;要使用特征重要性方法 &lt;code&gt;&apos;impurity&apos;&lt;/code&gt;，可在构建&lt;code&gt;Learner&lt;/code&gt;时选择它&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;lrn(&apos;classif.ranger&apos;)&lt;/code&gt;的&lt;code&gt;importance&lt;/code&gt;有哪些&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;lrn(&apos;classif.ranger&apos;)$param_set$levels$importance
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;选择用不纯度&lt;code&gt;&apos;impurity&apos;&lt;/code&gt;做为特征重要性计算方法的&lt;code&gt;lrn(&apos;classif.ranger&apos;)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;lrn_ranger &amp;lt;- lrn(&apos;classif.ranger&apos;, importance = &apos;impurity&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;由于&lt;code&gt;lrn(&apos;classif.ranger&apos;)&lt;/code&gt;不具备处理缺失数据的&lt;code&gt;&apos;missing&apos;&lt;/code&gt;属性，&lt;br /&gt;
所以先删除一下有缺失数据的行&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 创建`Task`
tsk_pen &amp;lt;- tsk(&apos;penguins&apos;)
# 删除缺失数据行
# 注意：运行`Task$filter()`后会就地修改数据
tsk_pen$filter(tsk_pen$row_ids[complete.cases(tsk_pen$data())])
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;之后就可以用&lt;code&gt;flt(&apos;importance&apos;)&lt;/code&gt; 来计算重要性值了
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;learner&lt;/code&gt;参数会调取传递的&lt;code&gt;Learner&lt;/code&gt;的计算方式&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 创建特征重要性过滤器
# 并将指定计算方法为`&apos;importance&apos;`的`Learner`传递过去
flt_importance &amp;lt;- flt(&apos;importance&apos;, learner = lrn_ranger)
# 计算特征重要性
flt_importance$calculate(tsk_pen)
# 获取结果
as.data.table(flt_importance)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 7 x 2&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;feature&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;score&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;bill_length   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;77.391297&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;flipper_length&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;48.663869&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;bill_depth    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;32.345189&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;island        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;27.669237&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;body_mass     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;25.625846&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;sex           &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1.259613&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;year          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1.146758&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;h4&gt;嵌入法（ Embedded Methods）&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;许多学习器会在内部选择一部分它们认为对预测有帮助的特征，而忽略其他特征
&lt;ul&gt;
&lt;li&gt;决策树可能永远不会选择某些特征进行分裂&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;这些子集可用于特征选择，称之为嵌入法，因为&lt;strong&gt;特征选择嵌入在学习器中&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;as.data.table(mlr_learners)[
 sapply(properties, function(x) &apos;selected_features&apos; %in% x)
]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 23 x 7&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;key&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;label&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;task_type&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;feature_types&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;packages&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;properties&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;predict_types&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.abess         &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Fast Best Subset Selection for Classification&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer, numeric&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3 , abess&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;multiclass       , selected_features, twoclass         , weights          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response, prob    &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.cv_glmnet     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;GLM with Elastic Net Regularization          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;logical, integer, numeric&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3        , mlr3learners, glmnet      &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;multiclass       , offset           , selected_features, twoclass         , weights          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response, prob    &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.featureless   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Featureless Classification Learner           &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;logical    , integer    , numeric    , character  , factor     , ordered    , POSIXct    , Date       , lazy_tensor&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;featureless      , importance       , missings         , multiclass       , selected_features, twoclass         , weights          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response, prob    &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.priority_lasso&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Priority Lasso                               &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;logical, integer, numeric&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3         , prioritylasso&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;selected_features, twoclass         , weights          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response, prob    &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.ranger        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Random Forest                                &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;logical  , integer  , numeric  , character, factor   , ordered  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3        , mlr3learners, ranger      &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;hotstart_backward, importance       , missings         , multiclass       , oob_error        , selected_features, twoclass         , weights          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response, prob    &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.rpart         &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Classification Tree                          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;logical, integer, numeric, factor , ordered&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3 , rpart&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;importance       , missings         , multiclass       , selected_features, twoclass         , weights          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response, prob    &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.torch_model   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Torch Model                                  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;logical    , integer    , numeric    , character  , factor     , ordered    , POSIXct    , Date       , lazy_tensor&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3     , mlr3torch, torch    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;featureless      , hotstart_backward, hotstart_forward , importance       , internal_tuning  , marshal          , missings         , multiclass       , offset           , oob_error        , selected_features, twoclass         , validation       , weights          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response, prob    &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;regr.abess            &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Fast Best Subset Selection for Regression    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;regr   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer, numeric&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3 , abess&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;selected_features, weights          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;regr.cv_glmnet        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;GLM with Elastic Net Regularization          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;regr   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;logical, integer, numeric&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3        , mlr3learners, glmnet      &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;offset           , selected_features, weights          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;regr.featureless      &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Featureless Regression Learner               &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;regr   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;logical    , integer    , numeric    , character  , factor     , ordered    , POSIXct    , Date       , lazy_tensor&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3 , stats&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;featureless      , importance       , missings         , selected_features, weights          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response , se       , quantiles&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;regr.priority_lasso   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Priority Lasso                               &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;regr   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;logical, integer, numeric&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3         , prioritylasso&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;selected_features, weights          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;regr.ranger           &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Random Forest                                &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;regr   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;logical  , integer  , numeric  , character, factor   , ordered  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3        , mlr3learners, ranger      &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;hotstart_backward, importance       , missings         , oob_error        , selected_features, weights          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response , se       , quantiles&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;regr.rpart            &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Regression Tree                              &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;regr   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;logical, integer, numeric, factor , ordered&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3 , rpart&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;importance       , missings         , selected_features, weights          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;regr.torch_model      &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Torch Model                                  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;regr   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;logical    , integer    , numeric    , character  , factor     , ordered    , POSIXct    , Date       , lazy_tensor&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3     , mlr3torch, torch    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;featureless      , hotstart_backward, hotstart_forward , importance       , internal_tuning  , marshal          , missings         , offset           , oob_error        , selected_features, validation       , weights          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;surv.coxboost         &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Likelihood-based Boosting                    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;surv   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer, numeric&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3             , mlr3proba        , mlr3extralearners, CoxBoost         , pracma           &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;selected_features, weights          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;crank, distr, lp   &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;surv.cv_coxboost      &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Likelihood-based Boosting                    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;surv   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer, numeric&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3             , mlr3proba        , mlr3extralearners, CoxBoost         , pracma           &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;selected_features, weights          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;crank, distr, lp   &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;surv.cv_glmnet        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Regularized Generalized Linear Model         &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;surv   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;logical, integer, numeric&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3             , mlr3proba        , mlr3extralearners, glmnet           &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;offset           , selected_features, weights          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;crank, distr, lp   &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;surv.gamboost         &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Boosted Generalized Additive Model           &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;surv   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;logical, integer, numeric, factor &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3             , mlr3proba        , mlr3extralearners, mboost           , pracma           &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;importance       , offset           , selected_features, weights          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;crank, distr, lp   &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;surv.glmboost         &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Boosted Generalized Linear Model             &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;surv   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;logical, integer, numeric, factor &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3             , mlr3proba        , mlr3extralearners, mboost           , pracma           &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;importance       , offset           , selected_features, weights          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;crank, distr, lp   &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;surv.glmnet           &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Regularized Generalized Linear Model         &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;surv   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;logical, integer, numeric&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3             , mlr3proba        , mlr3extralearners, glmnet           &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;offset           , selected_features, weights          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;crank, distr, lp   &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;surv.mboost           &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Boosted Generalized Additive Model           &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;surv   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;logical, integer, numeric, factor &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3             , mlr3proba        , mlr3extralearners, mboost           &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;importance       , offset           , selected_features, weights          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;crank, distr, lp   &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;surv.priority_lasso   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Priority Lasso                               &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;surv   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;logical, integer, numeric&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3         , mlr3proba    , prioritylasso&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;selected_features, weights          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;crank, distr, lp   &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;surv.rpart            &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Survival Tree                                &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;surv   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;logical  , integer  , numeric  , character, factor   , ordered  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3     , mlr3proba, rpart    , distr6   , survival &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;importance       , missings         , selected_features, weights          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;crank&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;对于嵌入式的过滤器，&lt;br /&gt;
首先要训练嵌入的学习器进行，&lt;br /&gt;
再调取选择的特征，&lt;br /&gt;
最后再用过滤器获取计算的结果&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 创建`Task`
tsk_pen &amp;lt;- tsk(&apos;penguins&apos;)
# 构建学习器
lrn_rpart &amp;lt;- lrn(&apos;classif.rpart&apos;)
# 训练模型
lrn_rpart$train(tsk_pen)
# 调取选择的特征
lrn_rpart$selected_features()
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&apos;flipper_length&apos;&apos;bill_length&apos;&apos;island&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;这里计算得分算了个什么东西呢？
&lt;ul&gt;
&lt;li&gt;就是算了个选择的特征变量在不在模型里头而已，，，&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 构建
flt_selected &amp;lt;- flt(&apos;selected_features&apos;, learner = lrn_rpart)
# 计算得分
flt_selected$calculate(tsk_pen)
# 调取结果
as.data.table(flt_selected)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 7 x 2&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;feature&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;score&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;bill_length   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;flipper_length&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;island        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;bill_depth    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;year          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;body_mass     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;sex           &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;h4&gt;基于过滤的特征选择（Filter-Based Feature Selection）&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;在为每个特征计算得分后，需要选择保留的特征或从后续建模步骤中剔除的特征&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;嵌入法的过滤&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;对于嵌入法而言，只需选择最后&lt;code&gt;score&lt;/code&gt;为&lt;code&gt;1&lt;/code&gt;的 特征即可&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;先看看特征变量选择前的变量名&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;tsk_pen$feature_names
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&apos;bill_depth&apos;&apos;bill_length&apos;&apos;body_mass&apos;&apos;flipper_length&apos;&apos;island&apos;&apos;sex&apos;&apos;year&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;进行特征变量筛选&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 计算得分
flt_selected$calculate(tsk_pen)
# 调取得分为`1`的特征变量
keep &amp;lt;- names(which(flt_selected$scores == 1))
# 进行选择
tsk_pen$select(keep)
# 查看选择后的特征变量名
tsk_pen$feature_names
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&apos;bill_length&apos;&apos;flipper_length&apos;&apos;island&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;分配连续分数的过滤&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;两种方法&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;按排名为前$k$个特征&lt;/li&gt;
&lt;li&gt;高于某阈值$\tau$的特征&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;$k$个特征&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 创建`Task`，`Filter`并计算得分
tsk_pen &amp;lt;- tsk(&apos;penguins&apos;)
flt_gain &amp;lt;- flt(&apos;information_gain&apos;)
flt_gain$calculate(tsk_pen)

# 设置k的个数
k = 3

# 筛选特征变量
keep &amp;lt;- names(head(flt_gain$scores, k))
tsk_pen$select(keep)
tsk_pen$feature_names
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&apos;bill_depth&apos;&apos;bill_length&apos;&apos;flipper_length&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;$\tau &amp;gt; 0.5$ 的特征&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 创建`Task`，`Filter`并计算得分
tsk_pen &amp;lt;- tsk(&apos;penguins&apos;)
flt_gain &amp;lt;- flt(&apos;information_gain&apos;)
flt_gain$calculate(tsk_pen)

# 设置阈值r
tau = 0.5

# 筛选特征变量
keep &amp;lt;- names(which(flt_gain$scores &amp;gt; tau))
tsk_pen$select(keep)
tsk_pen$feature_names
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&apos;bill_depth&apos;&apos;bill_length&apos;&apos;flipper_length&apos;&apos;island&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;包装器方法（Wrapper Methods）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;原理是在选定的特征子集上拟合模型并评估其性能&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;可以按顺序进行，例如在顺序前向选择中通过迭代向模型添加特征&lt;/li&gt;
&lt;li&gt;或者以并行方式进行，例如在随机搜索中评估随机特征子集&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;下图表示具有四个特征的顺序前向选择的二进制表示&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;绿色表示已评估的特征集，深绿色表示每次迭代中的最佳特征集，白色表示未评估的特征集&lt;/li&gt;
&lt;li&gt;从没有选择任何特征（所有特征均为“0”）的底部开始&lt;/li&gt;
&lt;li&gt;在下一次迭代中，分别测试所有特征（每个特征分别为“1”），&lt;br /&gt;
并选择最佳选项（第二行中颜色最深的）&lt;/li&gt;
&lt;li&gt;选择第二个、第三个和第四个特征时继续此过程&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./image_1.png&quot; alt=&quot;image_1&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;上述基于包装器的特征选择与超参数优化中的黑盒优化方法非常相似
&lt;ul&gt;
&lt;li&gt;主要区别在于，我们搜索的是性能良好的特征子集，而非超参数配置&lt;/li&gt;
&lt;li&gt;这种相似性不仅体现在基本概念和结构上，在 &lt;code&gt;mlr3&lt;/code&gt; 类和API方面也是如此；&lt;br /&gt;
API在很多地方几乎完全相同，我们可以使用相同的终止器，&lt;br /&gt;
结果以与调优类似的方式记录到存档中，&lt;br /&gt;
并且我们也可以通过类似的方式优化多个性能指标以创建帕累托最优解&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;简单前向选择示例&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;类似于&lt;code&gt;tune()&lt;/code&gt;的用法，这里也是&lt;code&gt;fselect()&lt;/code&gt;的用法也很类似，&lt;br /&gt;
约等于包装一个选择实例&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 加载R包
# library(mlr3fselect)

# 创建`Task`，并给予刚刚的选择结果进行特征筛选
tsk_pen &amp;lt;- tsk(&apos;penguins&apos;)
tsk_pen$select(
 c(
  &apos;bill_depth&apos;, 
  &apos;bill_length&apos;, 
  &apos;body_mass&apos;, 
  &apos;flipper_length&apos;
 )
)

# 进行特征实例选择
instance &amp;lt;- fselect(
 # 类似于`tune()`，传递的不是`Tuner`而是`FSelector`
 fselector = fs(&apos;sequential&apos;),
 # 和`tune()`一样，传递`Task`
 task =  tsk_pen,
 # 和`tune()`一样，传递`Learner`
 learner = lrn_rpart,
 # 和`tune()`一样，传递`Resampling`
 resampling = rsmp(&apos;cv&apos;, folds = 3),
 # # 和`tune()`一样，传递`Measure`
 measure = msr(&apos;classif.acc&apos;)
)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;查看迭代的结果&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;dt &amp;lt;- as.data.table(instance$archive)
dt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 10 x 13&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;bill_depth&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;bill_length&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;body_mass&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;flipper_length&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;classif.acc&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;runtime_learners&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;timestamp&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;batch_nr&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;warnings&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;errors&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;features&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;n_features&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;resample_result&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;lgl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;lgl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;lgl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;lgl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dttm&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; TRUE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;FALSE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;FALSE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;FALSE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.7355200&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.015&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-25 15:04:09&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;bill_depth&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x301ed9928&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;FALSE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; TRUE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;FALSE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;FALSE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.7674549&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.007&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-25 15:04:09&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;bill_length&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x301efcbd0&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;FALSE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;FALSE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; TRUE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;FALSE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.7150013&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.022&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-25 15:04:09&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;body_mass&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x14a691150&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;FALSE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;FALSE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;FALSE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; TRUE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.7935673&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.026&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-25 15:04:09&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;flipper_length&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x16a7b79f0&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; TRUE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;FALSE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;FALSE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; TRUE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.7819985&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.008&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-25 15:04:10&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span style=white-space:pre-wrap&amp;gt;bill_depth    , flipper_length&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x301f245e8&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;FALSE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; TRUE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;FALSE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; TRUE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.9360285&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.009&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-25 15:04:10&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span style=white-space:pre-wrap&amp;gt;bill_length   , flipper_length&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x301f4d490&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;FALSE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;FALSE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; TRUE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; TRUE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.7993644&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.008&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-25 15:04:10&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span style=white-space:pre-wrap&amp;gt;body_mass     , flipper_length&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x301f9eef0&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; TRUE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; TRUE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;FALSE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; TRUE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.9360285&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.010&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-25 15:04:10&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span style=white-space:pre-wrap&amp;gt;bill_depth    , bill_length   , flipper_length&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x301fcdfc8&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;FALSE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; TRUE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; TRUE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; TRUE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.9360285&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.007&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-25 15:04:10&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span style=white-space:pre-wrap&amp;gt;bill_length   , body_mass     , flipper_length&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x17bdd2f38&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; TRUE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; TRUE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; TRUE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; TRUE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.9360285&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.008&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2025-06-25 15:04:10&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span style=white-space:pre-wrap&amp;gt;bill_depth    , bill_length   , body_mass     , flipper_length&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x17bdfaeb0&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;分别看1–3次迭代的结果
&lt;ul&gt;
&lt;li&gt;特征 &lt;code&gt;flipper_length&lt;/code&gt; 在第一次迭代中实现了最高的预测性能，因此被选中&lt;/li&gt;
&lt;li&gt;在第二次迭代中，&lt;code&gt;bill_length&lt;/code&gt;加入后模型准确率高达93.6%&lt;/li&gt;
&lt;li&gt;第三次开始模型改善不大，&lt;br /&gt;
因此可选择一个稍差但只有两个特征的模型，以减小数据规模&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;dt[batch_nr == 1, 1:5]
dt[batch_nr == 2, 1:5]
dt[batch_nr == 3, 1:5]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 4 x 5&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;bill_depth&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;bill_length&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;body_mass&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;flipper_length&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;classif.acc&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;lgl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;lgl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;lgl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;lgl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; TRUE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;FALSE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;FALSE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;FALSE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.7355200&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;FALSE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; TRUE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;FALSE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;FALSE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.7674549&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;FALSE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;FALSE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; TRUE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;FALSE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.7150013&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;FALSE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;FALSE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;FALSE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; TRUE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.7935673&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 3 x 5&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;bill_depth&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;bill_length&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;body_mass&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;flipper_length&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;classif.acc&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;lgl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;lgl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;lgl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;lgl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; TRUE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;FALSE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;FALSE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;TRUE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.7819985&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;FALSE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; TRUE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;FALSE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;TRUE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.9360285&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;FALSE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;FALSE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; TRUE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;TRUE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.7993644&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 2 x 5&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;bill_depth&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;bill_length&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;body_mass&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;flipper_length&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;classif.acc&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;lgl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;lgl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;lgl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;lgl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; TRUE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;TRUE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;FALSE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;TRUE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.9360285&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;FALSE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;TRUE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; TRUE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;TRUE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.9360285&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;可以将每次迭代的评估结果可视化来看&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;autoplot(instance, type = &apos;performance&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./image_2.png&quot; alt=&quot;image_2&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;为了直接展示最佳特征集，&lt;br /&gt;
我们可以使用 &lt;code&gt;Instance$result_feature_set&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;它会按字母顺序（而非选择顺序）返回特征&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;instance$result_feature_set
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&apos;bill_length&apos;&apos;flipper_length&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;在内部，&lt;code&gt;fselect()&lt;/code&gt;函数会创建一个&lt;code&gt;FSelectInstanceBatchSingleCrit&lt;/code&gt;对象，&lt;br /&gt;
并基于所选方法，使用&lt;code&gt;FSelectorBatch&lt;/code&gt;对象执行特征选择
&lt;ul&gt;
&lt;li&gt;在本示例中是&lt;code&gt;FSelectorBatchSequential&lt;/code&gt;对象&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;这与tune()函数中的情况类似
&lt;ul&gt;
&lt;li&gt;它使用提供的重采样和度量方法，&lt;br /&gt;
在任务上评估由&lt;code&gt;FSelectorBatch&lt;/code&gt;提供的所有特征子集&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;FSelectInstance类&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;我们使用简化函数 &lt;code&gt;fsi()&lt;/code&gt; 创建一个 &lt;code&gt;FSelectInstanceBatchSingleCrit&lt;/code&gt; 对象
&lt;ul&gt;
&lt;li&gt;正如&lt;code&gt;fselect()&lt;/code&gt;类似于&lt;code&gt;tune&lt;/code&gt;，&lt;br /&gt;
&lt;code&gt;fsi()&lt;/code&gt;类似于&lt;code&gt;vi()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;instance &amp;lt;- fsi(
 task = tsk_pen,
 learner = lrn_rpart,
 resampling = rsmp(&apos;cv&apos;, folds = 3),
 measure = msr(&apos;classif.acc&apos;),
 terminator = trm(&apos;evals&apos;, n_evals = 20)
)
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;FSelector类&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;FSelectorBatch&lt;/code&gt;类是不同特征选择算法的基类&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;fs()&lt;/code&gt;创建&lt;/li&gt;
&lt;li&gt;&lt;code&gt;fs()&lt;/code&gt;类似于&lt;code&gt;tnr()&lt;/code&gt;，调取一个特征选择的算法&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;目前在&lt;code&gt;mlr3fselect&lt;/code&gt;中实现了以下算法：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;fs(&apos;random_search&apos;)&lt;/code&gt;：随机搜索&lt;br /&gt;
尝试随机特征子集，直到终止&lt;/li&gt;
&lt;li&gt;&lt;code&gt;fs(&apos;exhaustive_search&apos;)&lt;/code&gt;：穷举搜索&lt;br /&gt;
尝试所有可能的特征子集&lt;/li&gt;
&lt;li&gt;&lt;code&gt;fs(&apos;sequential&apos;)&lt;/code&gt;：顺序搜索&lt;br /&gt;
即顺序向前或向后选择&lt;/li&gt;
&lt;li&gt;&lt;code&gt;fs(&apos;rfe&apos;)&lt;/code&gt;：递归特征消除&lt;br /&gt;
它使用学习器的重要性分数来迭代地删除特征重要性较低的特征&lt;/li&gt;
&lt;li&gt;&lt;code&gt;fs(&apos;design_points&apos;)&lt;/code&gt;设计点&lt;br /&gt;
尝试所有用户提供的特征集&lt;/li&gt;
&lt;li&gt;&lt;code&gt;fs(&apos;genetic_search&apos;)&lt;/code&gt;：遗传搜索&lt;br /&gt;
实现一种遗传算法，该算法将特征视为二进制序列，并尝试通过变异找到最佳子集&lt;/li&gt;
&lt;li&gt;&lt;code&gt;fs(&apos;shadow_variable_search&apos;)&lt;/code&gt;：影子变量搜索&lt;br /&gt;
即添加所有特征的排列副本（影子变量），执行前向选择，并在选择到影子变量时停止&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;下面使用简单的随机搜索算法&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;fselector &amp;lt;- fs(&apos;random_search&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;开始特征选择&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;和&lt;code&gt;tnr()&lt;/code&gt;创建&lt;code&gt;Tuner&lt;/code&gt;，使用&lt;code&gt;Tuner$optimize()&lt;/code&gt;一样，&lt;br /&gt;
&lt;code&gt;fs()&lt;/code&gt;创建的&lt;code&gt;Fselector可以使用&lt;/code&gt; &lt;code&gt;Fselector$optimize(Instance)&lt;/code&gt;进行特征选择&lt;/li&gt;
&lt;li&gt;基于实例中的元素，特征选择的算法将如下执行：
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;FSelectorBatch&lt;/code&gt; 会提出至少一个特征子集，&lt;br /&gt;
也可能提出多个子集以便并行评估，&lt;br /&gt;
这可以通过 &lt;code&gt;batch_size&lt;/code&gt; 设置进行控制&lt;/li&gt;
&lt;li&gt;对于每个特征子集，&lt;br /&gt;
给定的学习器将使用提供的重采样方法在任务上进行拟合，&lt;br /&gt;
并使用给定的度量进行评估&lt;/li&gt;
&lt;li&gt;所有评估结果都存储在&lt;code&gt;FSelectInstanceBatchSingleCrit&lt;/code&gt;对象的存档中&lt;/li&gt;
&lt;li&gt;查询终止条件；&lt;br /&gt;
如果未触发终止标准，则转到第一步&lt;/li&gt;
&lt;li&gt;确定观察到的性能最佳的特征子集&lt;/li&gt;
&lt;li&gt;将表现最佳的特征子集作为结果存储在实例对象中&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;fselector$optimize(instance)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 1 x 7&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;bill_depth&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;bill_length&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;body_mass&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;flipper_length&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;features&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;n_features&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;classif.acc&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;lgl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;lgl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;lgl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;lgl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;TRUE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;TRUE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;TRUE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;TRUE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;bill_depth    , bill_length   , body_mass     , flipper_length&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.941851&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;结果储存在&lt;code&gt;Instance$result&lt;/code&gt;里面&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;as.data.table(instance$result)[, .(features, classif.acc)]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 1 x 2&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;features&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;classif.acc&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;bill_depth    , bill_length   , body_mass     , flipper_length&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.941851&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;也可以访问&lt;code&gt;FSelectInstanceBatchSingleCrit$archive&lt;/code&gt;查看所有子集的评估结果&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;as.data.table(instance$archive)[
 1:5,
 .(bill_depth, bill_length, body_mass, flipper_length, classif.acc)
]
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;经过优化的特征子集可用于对任务进行子集划分，并在所有观测数据上拟合模型&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 创建任务
tsk_pen &amp;lt;- tsk(&apos;penguins&apos;)
# 使用过滤后的特征变量
tsk_pen$select(instance$result_feature_set)
# 训练模型
lrn_rpart$train(tsk_pen)
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;优化多项性能指标&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;FSelectInstanceBatchMultiCrit&lt;/code&gt;，不解释了，熟悉的味道&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;instance &amp;lt;- fsi(
 task = tsk(&apos;sonar&apos;),
 learner = lrn_rpart,
 resampling = rsmp(&apos;holdout&apos;),
 # 这里是传递`用msrs()`给`measure`
 measure = msrs(c(&apos;classif.tpr&apos;, &apos;classif.tnr&apos;)),
 terminator = trm(&apos;evals&apos;, n_evals = 20)
)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;熟悉的味道&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;fselector &amp;lt;- fs(&apos;random_search&apos;)
fselector$optimize(instance)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;熟悉的味道，，，&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;as.data.table(instance$result)[, .(features, classif.tpr, classif.tnr)]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 9 x 3&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;features&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;classif.tpr&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;classif.tnr&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;V10, V11, V12, V14, V15, V16, V2 , V20, V24, V26, V27, V3 , V34, V39, V4 , V46, V5 , V50, V51, V54, V55, V57, V59, V9 &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.7428571&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.7647059&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;V11, V13, V14, V16, V20, V21, V24, V25, V27, V28, V31, V32, V33, V35, V38, V41, V42, V43, V48, V49, V5 , V50, V51, V54, V55, V57, V58, V9 &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.8285714&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.7352941&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;V1 , V10, V11, V12, V14, V15, V16, V17, V18, V2 , V20, V21, V25, V26, V27, V28, V29, V3 , V32, V33, V36, V38, V39, V4 , V41, V45, V49, V50, V51, V52, V53, V54, V55, V56, V57, V58, V59, V6 , V60, V7 , V8 , V9 &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.9714286&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.5000000&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;V1 , V10, V11, V12, V13, V14, V15, V16, V17, V18, V19, V2 , V20, V21, V22, V23, V24, V25, V26, V27, V28, V29, V3 , V30, V31, V32, V33, V34, V35, V36, V37, V38, V39, V4 , V40, V41, V42, V43, V44, V45, V46, V47, V48, V49, V5 , V50, V51, V52, V53, V54, V55, V56, V57, V58, V59, V6 , V60, V7 , V8 , V9 &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.9142857&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.5882353&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;V1 , V10, V11, V12, V13, V14, V15, V16, V17, V18, V19, V2 , V20, V21, V22, V23, V24, V25, V26, V27, V28, V29, V3 , V31, V32, V33, V34, V35, V36, V37, V38, V39, V4 , V40, V41, V42, V43, V45, V47, V49, V51, V52, V53, V54, V55, V56, V57, V59, V6 , V60, V7 , V9 &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.9142857&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.5882353&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;V1 , V10, V11, V12, V14, V15, V16, V18, V19, V2 , V20, V21, V22, V23, V24, V25, V29, V3 , V30, V31, V33, V34, V36, V37, V38, V39, V40, V42, V43, V46, V47, V48, V49, V5 , V50, V51, V52, V53, V54, V55, V56, V57, V58, V60, V7 , V8 , V9 &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.9428571&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.5588235&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;V1 , V10, V11, V12, V13, V14, V15, V16, V17, V18, V19, V2 , V20, V21, V22, V23, V24, V25, V26, V27, V28, V29, V3 , V30, V31, V32, V33, V34, V35, V36, V37, V38, V39, V4 , V40, V41, V42, V43, V44, V45, V46, V47, V48, V49, V5 , V50, V51, V52, V53, V54, V55, V56, V57, V58, V59, V6 , V60, V7 , V8 , V9 &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.9142857&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.5882353&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;V1 , V12, V14, V17, V18, V21, V23, V24, V25, V28, V29, V3 , V32, V36, V38, V39, V4 , V42, V43, V46, V5 , V50, V53, V54, V55, V57, V59, V6 , V7 , V8 , V9 &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.8571429&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.6176471&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;V1 , V10, V11, V12, V13, V15, V16, V17, V18, V19, V2 , V20, V21, V22, V23, V24, V26, V27, V28, V29, V3 , V30, V31, V32, V33, V34, V35, V36, V37, V38, V39, V4 , V40, V41, V42, V43, V44, V45, V46, V47, V48, V49, V5 , V50, V51, V52, V53, V54, V55, V56, V58, V59, V6 , V60, V7 , V8 , V9 &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.9142857&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.5882353&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;h4&gt;嵌套重采样&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;熟悉，就是&lt;code&gt;auto_tune()&lt;/code&gt;换成&lt;code&gt;auto_fselector()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;afs &amp;lt;- auto_fselector(
 fselector = fs(&apos;random_search&apos;),
 learner = lrn(&apos;classif.log_reg&apos;),
 resampling = rsmp(&apos;holdout&apos;),
 measure = msr(&apos;classif.acc&apos;),
 terminator = trm(&apos;evals&apos;, n_evals = 10)
)
afs
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;AutoFSelector:classif.log_reg.fselector&amp;gt;
* Model: list
* Packages: mlr3, mlr3fselect, mlr3learners, stats
* Predict Type: response
* Feature Types: logical, integer, numeric, character, factor, ordered
* Properties: offset, twoclass, weights
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;AutoFSelector&lt;/code&gt; 可传递给 &lt;code&gt;benchmark()&lt;/code&gt; 或 &lt;code&gt;resample()&lt;/code&gt; 以进行嵌套重采样&lt;/li&gt;
&lt;li&gt;下面将包装后的学习器 &lt;code&gt;afs&lt;/code&gt; 与普通逻辑回归 &lt;code&gt;lrn(&apos;classif.log_reg&apos;)&lt;/code&gt; 进行比较
&lt;ul&gt;
&lt;li&gt;看得出用&lt;code&gt;afs&lt;/code&gt;进行特征选择后，预测性能更好&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;grid &amp;lt;- benchmark_grid(
 tsk(&apos;sonar&apos;), 
 list(afs, lrn(&apos;classif.log_reg&apos;)),
 rsmp(&apos;cv&apos;, folds = 3)
)

bmr &amp;lt;- benchmark(grid)$aggregate(msr(&apos;classif.acc&apos;))
as.data.table(bmr)[, .(learner_id, classif.acc)]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 2 x 2&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;learner_id&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;classif.acc&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.log_reg.fselector&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.7497585&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.log_reg          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.6443064&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
</content:encoded></item><item><title>【mlr3】4.管道</title><link>https://nab-iak.github.io/posts/p13/p13/</link><guid isPermaLink="true">https://nab-iak.github.io/posts/p13/p13/</guid><description>mlr3管道</description><pubDate>Sat, 19 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Cover Pic by &lt;a href=&quot;https://www.pixiv.net/artworks/126490750&quot;&gt;@Rafa&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://mlr3book.mlr-org.com/&quot;&gt;Applied Machine Learning Using mlr3 in R&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;顺序管道&lt;/h2&gt;
&lt;h3&gt;简介&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;mlr3pipelines&lt;/code&gt;包将模块化推进得更多，&lt;br /&gt;
使得包括在数据预处理，构建基层模型甚至更复杂的元模型更加流程化&lt;/li&gt;
&lt;li&gt;mlr3pipelines 使得利用构建模块在 &lt;code&gt;Learner&lt;/code&gt; 中构建各个步骤成为可能，&lt;br /&gt;
这些构建模块继承自 &lt;code&gt;PipeOp&lt;/code&gt; 类
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;PipeOp&lt;/code&gt; 可以使用有向边连接起来，形成表示操作之间的数据流 &lt;code&gt;Graph&lt;/code&gt; 或 &lt;code&gt;pipeline&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;在模型训练期间，&lt;code&gt;Graph&lt;/code&gt; 中的 &lt;code&gt;PipeOp&lt;/code&gt; 会转换给定的 &lt;code&gt;Task&lt;/code&gt;，&lt;br /&gt;
后续的 &lt;code&gt;PipeOp&lt;/code&gt; 会接收转换后的 &lt;code&gt;Task&lt;/code&gt; 作为输入&lt;/li&gt;
&lt;li&gt;除了转换数据，&lt;code&gt;PipeOp&lt;/code&gt; 还会生成一个 状态
&lt;ul&gt;
&lt;li&gt;该状态用于在预测期间指导 PipeOp 的操作，&lt;br /&gt;
这类似于学习器在训练期间学习并存储模型参数/权重，&lt;br /&gt;
以指导模型预测&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;下图中，通过 &lt;em&gt;缩放&lt;/em&gt; &lt;code&gt;PipeOp&lt;/code&gt; 进行了可视化展示
&lt;ul&gt;
&lt;li&gt;该操作符在训练期间对特征进行缩放，&lt;br /&gt;
并将缩放因子保存为一种状态，以便在预测中使用&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./image_1.png&quot; alt=&quot;image_1&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;种类
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;顺序管道&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;指数据在管道中从一个&lt;code&gt;PipeOp&lt;/code&gt;直接移动到下一个，从头到尾依次进行&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;非顺序管道&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;数据是通过可能有多个输入和/或输出的&lt;code&gt;PipeOp&lt;/code&gt;进行处理的&lt;/li&gt;
&lt;li&gt;非顺序管道的特点是有多个分支，&lt;br /&gt;
因此数据可能在不同时间由不同的&lt;code&gt;PipeOp&lt;/code&gt;进行处理&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;code&gt;PipeOp&lt;/code&gt;：管道操作符&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;PipeOp&lt;/code&gt;是&lt;code&gt;mlr3pipelines&lt;/code&gt;的基本类&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;表示对输入（例如，训练&lt;code&gt;Task&lt;/code&gt;）的转换操作，产生一些输出&lt;/li&gt;
&lt;li&gt;与学习器类似，它包括一个&lt;code&gt;$train()&lt;/code&gt;和一个&lt;code&gt;$predict()&lt;/code&gt;方法
&lt;ul&gt;
&lt;li&gt;训练阶段通常会生成数据的特定模型，并将其保存为内部状态&lt;/li&gt;
&lt;li&gt;预测阶段&lt;code&gt;PipeOp&lt;/code&gt;使用保存状态中的信息对预测&lt;code&gt;Task&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;与学习器一样，PipeOp具有经过训练的参数（即&lt;strong&gt;状态&lt;/strong&gt;）&lt;/li&gt;
&lt;li&gt;除了参数之外，PipeOp还具有超参数，&lt;br /&gt;
用户可以在构造&lt;code&gt;PipeOp&lt;/code&gt;时或通过访问其&lt;code&gt;PipeOp$param_set&lt;/code&gt;来设置超参数&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PipeOp&lt;/code&gt;可以使用便捷函数&lt;code&gt;po()&lt;/code&gt;进行构造，&lt;br /&gt;
对于多个&lt;code&gt;PipeOp&lt;/code&gt;可以使用&lt;code&gt;pos()&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;并且所有可用的&lt;code&gt;PipeOp&lt;/code&gt;都可在字典&lt;code&gt;mlr_pipeops&lt;/code&gt;中找到&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;看看有哪些管道操作符&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;mlr_pipeops %&amp;gt;% as.data.table()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 174 x 11&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;key&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;label&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;packages&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;tags&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;feature_types&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;input.num&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;output.num&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;input.type.train&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;input.type.predict&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;output.type.train&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;output.type.predict&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;adas                          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;ADAS Balancing                                                                           &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3pipelines, smotefamily  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;imbalanced data, data transform &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;logical    , integer    , numeric    , character  , factor     , ordered    , POSIXct    , Date       , lazy_tensor&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;TaskClassif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;TaskClassif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;TaskClassif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;TaskClassif&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;augment_center_crop           &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Center Crop Augmentation                                                                 &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3pipelines, torchvision  , mlr3torch    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;torch         , data transform&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;lazy_tensor&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;augment_color_jitter          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Color Jitter Augmentation                                                                &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3pipelines, torchvision  , mlr3torch    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;torch         , data transform&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;lazy_tensor&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;augment_crop                  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Crop Augmentation                                                                        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3pipelines, torchvision  , mlr3torch    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;torch         , data transform&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;lazy_tensor&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;augment_hflip                 &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Horizontal Flip Augmentation                                                             &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3pipelines, torchvision  , mlr3torch    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;torch         , data transform&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;lazy_tensor&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;augment_random_affine         &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Random Affine Augmentation                                                               &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3pipelines, torchvision  , mlr3torch    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;torch         , data transform&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;lazy_tensor&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;augment_random_choice         &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Random Choice Augmentation                                                               &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3pipelines, torchvision  , mlr3torch    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;torch         , data transform&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;lazy_tensor&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;augment_random_crop           &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Random Crop Augmentation                                                                 &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3pipelines, torchvision  , mlr3torch    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;torch         , data transform&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;lazy_tensor&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;augment_random_horizontal_flip&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Random Horizontal Flip Augmentation                                                      &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3pipelines, torchvision  , mlr3torch    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;torch         , data transform&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;lazy_tensor&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;augment_random_order          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Random Order Augmentation                                                                &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3pipelines, torchvision  , mlr3torch    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;torch         , data transform&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;lazy_tensor&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;augment_random_resized_crop   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Random Resized Crop Augmentation                                                         &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3pipelines, torchvision  , mlr3torch    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;torch         , data transform&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;lazy_tensor&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;augment_random_vertical_flip  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Random Vertical Flip Augmentation                                                        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3pipelines, torchvision  , mlr3torch    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;torch         , data transform&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;lazy_tensor&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;augment_resized_crop          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Resized Crop Augmentation                                                                &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3pipelines, torchvision  , mlr3torch    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;torch         , data transform&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;lazy_tensor&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;augment_rotate                &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Rotate Augmentation                                                                      &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3pipelines, torchvision  , mlr3torch    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;torch         , data transform&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;lazy_tensor&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;augment_vflip                 &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Vertical Flip Augmentation                                                               &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3pipelines, torchvision  , mlr3torch    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;torch         , data transform&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;lazy_tensor&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;blsmote                       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;BLSMOTE Balancing                                                                        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3pipelines, smotefamily  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;imbalanced data, data transform &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;logical    , integer    , numeric    , character  , factor     , ordered    , POSIXct    , Date       , lazy_tensor&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;TaskClassif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;TaskClassif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;TaskClassif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;TaskClassif&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;boxcox                        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Box-Cox Transformation of Numeric Features                                               &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3pipelines, bestNormalize&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;data transform&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;numeric, integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;branch                        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Path Branching                                                                           &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3pipelines&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;meta&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;em&gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;/em&gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;em&gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;/em&gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;breslowcompose                &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Wrap a learner into a PipeOp with survival predictions estimated by the Breslow estimator&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3pipelines, mlr3         , mlr3proba    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;abstract&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;TaskSurv&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;TaskSurv&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NULL&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;PredictionSurv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;chunk                         &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Chunk Input into Multiple Outputs                                                        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3pipelines&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;meta&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classbalancing                &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Class Balancing                                                                          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3pipelines&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;imbalanced data, data transform &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;logical    , integer    , numeric    , character  , factor     , ordered    , POSIXct    , Date       , lazy_tensor&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;TaskClassif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;TaskClassif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;TaskClassif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;TaskClassif&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classifavg                    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Majority Vote Prediction                                                                 &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3pipelines, stats        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;ensemble&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NULL&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;PredictionClassif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NULL&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;PredictionClassif&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classweights                  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Class Weights for Sample Weighting                                                       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3pipelines&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;imbalanced data, data transform &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;logical    , integer    , numeric    , character  , factor     , ordered    , POSIXct    , Date       , lazy_tensor&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;TaskClassif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;TaskClassif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;TaskClassif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;TaskClassif&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;colapply                      &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Apply a Function to each Column of a Task                                                &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3pipelines&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;data transform&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;logical    , integer    , numeric    , character  , factor     , ordered    , POSIXct    , Date       , lazy_tensor&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;collapsefactors               &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Collapse Factors                                                                         &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3pipelines&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;data transform&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;factor , ordered&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;colroles                      &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Change Column Roles of a Task                                                            &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3pipelines&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;data transform&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;logical    , integer    , numeric    , character  , factor     , ordered    , POSIXct    , Date       , lazy_tensor&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;compose_probregr              &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;PipeOpProbregr                                                                           &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3pipelines, mlr3proba    , distr6       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;abstract&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NULL, NULL&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;PredictionRegr, PredictionRegr&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NULL&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;PredictionRegr&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;copy                          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Copy Input Multiple Times                                                                &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3pipelines&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;meta&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;em&gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;/em&gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;em&gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;/em&gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;crankcompose                  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;PipeOpCrankCompositor                                                                    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3pipelines, mlr3proba    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;abstract&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NULL&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;PredictionSurv&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NULL&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;PredictionSurv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;datefeatures                  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Preprocess Date Features                                                                 &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3pipelines&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;data transform&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;POSIXct&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;tomek                         &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Tomek Down-Sampling                              &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3pipelines, themis       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;imbalanced data, data transform &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;logical    , integer    , numeric    , character  , factor     , ordered    , POSIXct    , Date       , lazy_tensor&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;TaskClassif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;TaskClassif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;TaskClassif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;TaskClassif&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;torch_callbacks               &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Callback Configuration                           &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3pipelines&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;abstract&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;ModelDescriptor&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;ModelDescriptor&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;torch_ingress_categ           &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Torch Entry Point for Categorical Features       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3pipelines, mlr3torch    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;abstract&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;factor , ordered, logical&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;ModelDescriptor&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;torch_ingress_ltnsr           &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Ingress for Lazy Tensor                          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3pipelines, mlr3torch    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;abstract&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;lazy_tensor&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;ModelDescriptor&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;torch_ingress_num             &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Torch Entry Point for Numeric Features           &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3pipelines, mlr3torch    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;abstract&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;numeric, integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;ModelDescriptor&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;torch_loss                    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Loss Configuration                               &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3pipelines, torch        , mlr3torch    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;abstract&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;ModelDescriptor&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;ModelDescriptor&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;torch_model_classif           &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;PipeOp Torch Classifier                          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3pipelines, mlr3         , mlr3torch    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;learner&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;ModelDescriptor&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;TaskClassif&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NULL&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;PredictionClassif&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;torch_model_regr              &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Torch Regression Model                           &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3pipelines, mlr3         , mlr3torch    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;learner&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;ModelDescriptor&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;TaskRegr&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NULL&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;PredictionRegr&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;torch_optimizer               &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Optimizer Configuration                          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3pipelines, torch        , mlr3torch    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;abstract&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;ModelDescriptor&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;ModelDescriptor&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;trafo_adjust_brightness       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Adjust Brightness Transformation                 &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3pipelines, torchvision  , mlr3torch    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;torch         , data transform&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;lazy_tensor&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;trafo_adjust_gamma            &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Adjust Gamma Transformation                      &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3pipelines, torchvision  , mlr3torch    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;torch         , data transform&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;lazy_tensor&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;trafo_adjust_hue              &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Adjust Hue Transformation                        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3pipelines, torchvision  , mlr3torch    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;torch         , data transform&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;lazy_tensor&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;trafo_adjust_saturation       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Adjust Saturation Transformation                 &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3pipelines, torchvision  , mlr3torch    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;torch         , data transform&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;lazy_tensor&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;trafo_grayscale               &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Grayscale Transformation                         &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3pipelines, torchvision  , mlr3torch    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;torch         , data transform&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;lazy_tensor&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;trafo_nop                     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;No Transformation                                &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3pipelines, mlr3torch    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;torch         , data transform&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;lazy_tensor&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;trafo_normalize               &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Normalization Transformation                     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3pipelines, torchvision  , mlr3torch    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;torch         , data transform&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;lazy_tensor&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;trafo_pad                     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Padding Transformation                           &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3pipelines, torchvision  , mlr3torch    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;torch         , data transform&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;lazy_tensor&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;trafo_reshape                 &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Reshaping Transformation                         &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3pipelines, mlr3torch    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;torch         , data transform&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;lazy_tensor&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;trafo_resize                  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Resizing Transformation                          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3pipelines, torchvision  , mlr3torch    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;torch         , data transform&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;lazy_tensor&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;trafo_rgb_to_grayscale        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RGB to Grayscale Transformation                  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3pipelines, torchvision  , mlr3torch    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;torch         , data transform&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;lazy_tensor&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;trafopred_classifsurv_IPCW    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;PipeOpPredClassifSurvIPCW                        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3pipelines&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;abstract&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NULL, NULL&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;PredictionClassif, list             &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NULL&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;PredictionSurv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;trafopred_classifsurv_disctime&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;PipeOpPredClassifSurvDiscTime                    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3pipelines&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;abstract&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NULL      , data.table&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;PredictionClassif, data.table       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NULL&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;PredictionSurv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;trafopred_regrsurv_pem        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;PipeOpPredRegrSurvPEM                            &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3pipelines&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;abstract&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NULL      , data.table&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;PredictionRegr, data.table    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NULL&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;PredictionSurv&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;trafotask_survclassif_IPCW    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;PipeOpTaskSurvClassifIPCW                        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3pipelines&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;abstract&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;TaskSurv&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;TaskSurv&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;TaskClassif, NULL       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;TaskClassif, list       &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;trafotask_survclassif_disctime&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;PipeOpTaskSurvClassifDiscTime                    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3pipelines, pammtools    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;abstract&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;TaskSurv&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;TaskSurv&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;TaskClassif, data.table &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;TaskClassif, data.table &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;trafotask_survregr_pem        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;PipeOpTaskSurvRegrPEM                            &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3pipelines, pammtools    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;abstract&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;TaskSurv&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;TaskSurv&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;TaskRegr  , data.table&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;TaskRegr  , data.table&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;tunethreshold                 &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Tune the Threshold of a Classification Prediction&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3pipelines, bbotk        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;target transform&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NULL&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Prediction&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;unbranch                      &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Unbranch Different Paths                         &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3pipelines&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;meta&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;em&gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;/em&gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;em&gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;/em&gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;vtreat                        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Interface to the vtreat Package                  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3pipelines, vtreat       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;encode        , missings      , data transform&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;logical    , integer    , numeric    , character  , factor     , ordered    , POSIXct    , Date       , lazy_tensor&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;TaskSupervised&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;TaskSupervised&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;TaskSupervised&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;TaskSupervised&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;yeojohnson                    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Yeo-Johnson Transformation of Numeric Features   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;mlr3pipelines, bestNormalize&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;data transform&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;numeric, integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Task&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;下面构建并查看一个PCA管道&lt;/li&gt;
&lt;li&gt;在输出中
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;not trained&lt;/code&gt;：模型尚未被训练&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Input channels&lt;/code&gt;的&lt;code&gt;input [Task,Task]&lt;/code&gt;：&lt;br /&gt;
训练和预测都接受&lt;code&gt;Task&lt;/code&gt;的输入&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Output channels&lt;/code&gt;的&lt;code&gt;outnput [Task,Task]&lt;/code&gt;：&lt;br /&gt;
训练和预测都输出为&lt;code&gt;Task&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;与&lt;code&gt;Learner&lt;/code&gt;类不同的是，&lt;code&gt;PipeOp&lt;/code&gt;可以在训练阶段后返回结果&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 加载R包
# library(mlr3pipelines)

# 选择&apos;pca&apos;管道
po_pca &amp;lt;- po(&apos;pca&apos;, center = TRUE)
po_pca
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;PipeOp: &amp;lt;pca&amp;gt; (not trained)
values: &amp;lt;center=TRUE&amp;gt;
Input channels &amp;lt;name [train type, predict type]&amp;gt;:
  input [Task,Task]
Output channels &amp;lt;name [train type, predict type]&amp;gt;:
  output [Task,Task]
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;下面对&lt;code&gt;penguins_simple&lt;/code&gt;任务的缩小版进行PCA分析&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 创建任务
tsk_small &amp;lt;- tsk(&apos;penguins&apos;)
# 选择没有缺失值的数据
tsk_small$filter(
    tsk_small$
        row_ids[complete.cases(tsk_small$data())]
)

# 放到list里（必须）
poin &amp;lt;- list(tsk_small)
# 传递给`PipeOpPCA`训练
poout &amp;lt;- po_pca$train(poin)
# 查看结果
poout
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;$output

[36m--[39m [1m[34m&amp;lt;TaskClassif&amp;gt;[39m (333x8): Palmer Penguins[22m [36m--------------------------------------[39m
* Target: species
* Target classes: Adelie (44%), Gentoo (36%), Chinstrap (20%)
* Properties: multiclass
* Features (7):
  * dbl (5): PC1, PC2, PC3, PC4, PC5
  * fct (2): island, sex
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;查看PCA的结果&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 调取开头5个样本PCA结果
poout[[1]]$head()

# 查看全部样本的PCA结果
# poout[[1]]$data()
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;训练得到的旋转矩阵也会保存在内部 &lt;code&gt;$state&lt;/code&gt; 字段&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;po_pca$state
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;Standard deviations (1, .., p=5):
[1] 805.3157531   7.1258611   4.0205105   1.5392977   0.7748449

Rotation (n x k) = (5 x 5):
                         PC1         PC2          PC3           PC4
bill_depth     -1.154327e-03 -0.08678513  0.144143265  0.9837576340
bill_length     4.003162e-03  0.31883248  0.941332235 -0.1084192852
body_mass       9.998759e-01 -0.01571143  0.001020094 -0.0003315664
flipper_length  1.519455e-02  0.94325408 -0.304144443  0.1250176180
year            2.210512e-05  0.02896694 -0.024727723  0.0695461097
                         PC5
bill_depth     -0.0625351521
bill_length     0.0216496177
body_mass       0.0004828135
flipper_length -0.0436763258
year            0.9968514404
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;之后可以传递给&lt;code&gt;PipeOpPCA$predict()&lt;/code&gt;，获取预测结果&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 挑一个样本用于预测结果
# 注意使用`$clone()`，因为`filter()`是就地修改
tsk_onepenguin &amp;lt;- tsk_small$clone()$filter(42)
# 同样需要传入`list`
poin &amp;lt;- list(tsk_onepenguin)
# 预测
poout &amp;lt;- po_pca$predict(poin)
# 查看预测结果
poout[[1]]$data()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 1 x 8&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;species&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;island&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;sex&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;PC1&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;PC2&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;PC3&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;PC4&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;PC5&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;fct&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;fct&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;fct&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Adelie&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Dream&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;male&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-307.1238&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-1.959404&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-1.300082&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.8445978&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-1.072759&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;h3&gt;Graph：PipeOp网络&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;PipeOp&lt;/code&gt;代表机器学习管道中的各个计算步骤，&lt;br /&gt;
这些管道本身由 &lt;code&gt;Graph&lt;/code&gt; 对象定义&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Graph&lt;/code&gt; 是 &lt;code&gt;PipeOp&lt;/code&gt; 的集合，带有引导数据流的 &lt;strong&gt;边&lt;/strong&gt;（edge）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;构建&lt;code&gt;Graph&lt;/code&gt;最便捷的方式是使用&lt;code&gt;%&amp;gt;&amp;gt;%&lt;/code&gt;运算符（读作“双箭头”）连接一系列&lt;code&gt;PipeOp&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;给定两个&lt;code&gt;PipeOp&lt;/code&gt;时，该运算符会创建一个&lt;code&gt;Graph&lt;/code&gt;，&lt;br /&gt;
先执行左边的&lt;code&gt;PipeOp&lt;/code&gt;，再执行右边的&lt;/li&gt;
&lt;li&gt;还可用于连接&lt;code&gt;Graph&lt;/code&gt;与&lt;code&gt;PipeOp&lt;/code&gt;，或连接另一个&lt;code&gt;Graph&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;以下示例使用&lt;code&gt;po(&apos;mutate&apos;)&lt;/code&gt;为任务添加一个新特征，&lt;br /&gt;
然后使用&lt;code&gt;po(&apos;scale&apos;)&lt;/code&gt;对所有数值特征进行缩放和中心化&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 构建`PipeOpMutate`
po_mutate &amp;lt;- po(
 &apos;mutate&apos;,
 mutation = list(bill_ratio = ~ bill_length / bill_depth)
)
# 构建`PipeOpScale`
po_scale &amp;lt;- po(&apos;scale&apos;)
# 连接两个`PipeOp`构建`Graph`
graph &amp;lt;- po_mutate %&amp;gt;&amp;gt;% po_scale
# 查看`Graph`
graph
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;Graph with 2 PipeOps:
     ID         State sccssors prdcssors
 &amp;lt;char&amp;gt;        &amp;lt;char&amp;gt;   &amp;lt;char&amp;gt;    &amp;lt;char&amp;gt;
 mutate &amp;lt;&amp;lt;UNTRAINED&amp;gt;&amp;gt;    scale          
  scale &amp;lt;&amp;lt;UNTRAINED&amp;gt;&amp;gt;             mutate
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Graph$plot()&lt;/code&gt;可以进行管道可视化&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;graph$plot(horizontal = TRUE)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./image_2.png&quot; alt=&quot;image_2&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Graph$plot()&lt;/code&gt;打印组成的&lt;code&gt;PipeOp&lt;/code&gt;的详情&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;graph$pipeops
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;$mutate
PipeOp: &amp;lt;mutate&amp;gt; (not trained)
values: &amp;lt;mutation=&amp;lt;list&amp;gt;, delete_originals=FALSE&amp;gt;
Input channels &amp;lt;name [train type, predict type]&amp;gt;:
  input [Task,Task]
Output channels &amp;lt;name [train type, predict type]&amp;gt;:
  output [Task,Task]

$scale
PipeOp: &amp;lt;scale&amp;gt; (not trained)
values: &amp;lt;robust=FALSE&amp;gt;
Input channels &amp;lt;name [train type, predict type]&amp;gt;:
  input [Task,Task]
Output channels &amp;lt;name [train type, predict type]&amp;gt;:
  output [Task,Task]
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Graph$edges&lt;/code&gt;字段可用于访问边
&lt;ul&gt;
&lt;li&gt;它返回一个&lt;code&gt;data.table&lt;/code&gt;，&lt;br /&gt;
列出了沿每条边流动的数据的 &lt;strong&gt;源&lt;/strong&gt;（&lt;code&gt;src_id&lt;/code&gt;，&lt;code&gt;src_channel&lt;/code&gt;）和&lt;br /&gt;
&lt;strong&gt;目标&lt;/strong&gt;（&lt;code&gt;dst_id&lt;/code&gt;，&lt;code&gt;dst_channel&lt;/code&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;graph$edges
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 1 x 4&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;src_id&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;src_channel&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;dst_id&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;dst_channel&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;mutate&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;output&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;scale&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;input&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;除了使用 &lt;code&gt;%&amp;gt;&amp;gt;%&lt;/code&gt;，还可以使用 &lt;code&gt;$add_pipeop()&lt;/code&gt; 和 &lt;code&gt;$add_edge()&lt;/code&gt; 方法&lt;br /&gt;
显式创建一个 &lt;code&gt;Graph&lt;/code&gt;，以创建 &lt;code&gt;PipeOp&lt;/code&gt; 以及连接它们的边&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;graph &amp;lt;- Graph$new()$
 add_pipeop(po_mutate)$
 add_pipeop(po_scale)$
 add_edge(&apos;mutate&apos;, &apos;scale&apos;)
graph
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;Graph with 2 PipeOps:
     ID         State sccssors prdcssors
 &amp;lt;char&amp;gt;        &amp;lt;char&amp;gt;   &amp;lt;char&amp;gt;    &amp;lt;char&amp;gt;
 mutate &amp;lt;&amp;lt;UNTRAINED&amp;gt;&amp;gt;    scale          
  scale &amp;lt;&amp;lt;UNTRAINED&amp;gt;&amp;gt;             mutate
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;构建完成后，&lt;code&gt;Graph&lt;/code&gt; 可以像 &lt;code&gt;Learner&lt;/code&gt; 一样，&lt;br /&gt;
通过调用 &lt;code&gt;$train()&lt;/code&gt; 和 &lt;code&gt;$predict()&lt;/code&gt; 来使用
&lt;ul&gt;
&lt;li&gt;不过在训练和预测过程中，它仍然输出一个 &lt;code&gt;list&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;result &amp;lt;- graph$train(tsk_small)
result
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;$scale.output

[36m--[39m [1m[34m&amp;lt;TaskClassif&amp;gt;[39m (333x9): Palmer Penguins[22m [36m--------------------------------------[39m
* Target: species
* Target classes: Adelie (44%), Gentoo (36%), Chinstrap (20%)
* Properties: multiclass
* Features (8):
  * dbl (6): bill_depth, bill_length, bill_ratio, body_mass, flipper_length,
  year
  * fct (2): island, sex
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;result[[1]]$data()[1:3]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 3 x 9&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;species&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;island&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;sex&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;bill_depth&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;bill_length&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;bill_ratio&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;body_mass&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;flipper_length&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;year&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;fct&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;fct&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;fct&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Adelie&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Torgersen&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;male  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.7795590&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-0.8946955&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-1.0421499&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-0.5676206&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-1.4246077&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-1.281813&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Adelie&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Torgersen&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;female&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.1194043&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-0.8215515&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-0.6804365&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-0.5055254&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-1.0678666&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-1.281813&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Adelie&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Torgersen&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;female&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4240910&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-0.6752636&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-0.7434640&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-1.1885721&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-0.4257325&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-1.281813&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;result &amp;lt;- graph$predict(tsk_onepenguin)
result[[1]]$head()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 1 x 9&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;species&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;island&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;sex&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;bill_depth&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;bill_length&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;bill_ratio&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;body_mass&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;flipper_length&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;year&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;fct&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;fct&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;fct&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Adelie&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Dream&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;male&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.6272156&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-0.5838337&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-0.7868552&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-0.3813351&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-0.4257325&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-1.281813&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;h3&gt;顺序学习器管道&lt;/h3&gt;
&lt;h4&gt;简介&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;mlr3pipelines&lt;/code&gt;最常见的应用是用它来执行预处理任务，&lt;br /&gt;
如缺失值插补或因子编码，&lt;br /&gt;
然后将处理后的数据输入到&lt;code&gt;Learner&lt;/code&gt;中&lt;/li&gt;
&lt;li&gt;此工作流程的&lt;code&gt;Graph&lt;/code&gt;在训练期间对数据进行操作并拟合&lt;code&gt;Learner&lt;/code&gt;模型，&lt;br /&gt;
以确保在预测阶段以相同的方式处理数据&lt;/li&gt;
&lt;li&gt;下图表示顺序学习器管道内训练和预测过程的概念化
&lt;ul&gt;
&lt;li&gt;在训练过程中（顶行），数据通过预处理算子，&lt;br /&gt;
每个算子都会修改数据并创建一个&lt;code&gt;$state&lt;/code&gt;，&lt;br /&gt;
最后，学习器接收数据并创建一个模型&lt;/li&gt;
&lt;li&gt;在预测过程中（底行），数据同样由预处理算子进行转换，&lt;br /&gt;
在此过程中使用它们各自的&lt;code&gt;$state&lt;/code&gt;（灰色框）信息；&lt;br /&gt;
然后，学习器接收与训练期间所见数据格式相同的数据，并进行预测&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./image_3.png&quot; alt=&quot;image_3&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;将&lt;code&gt;Learner&lt;/code&gt;转换为&lt;code&gt;PipeOp&lt;/code&gt;，将&lt;code&gt;Graph&lt;/code&gt;转换为&lt;code&gt;Learner&lt;/code&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Learner&lt;/code&gt;可以通过&lt;code&gt;as_pipeop()&lt;/code&gt;转换为&lt;code&gt;PipeOp&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;使用&lt;code&gt;%&amp;gt;&amp;gt;%&lt;/code&gt;时无需手动转换，&lt;br /&gt;
仅当需要把单独的&lt;code&gt;Learner&lt;/code&gt;转换为&lt;code&gt;Graph&lt;/code&gt;时，&lt;br /&gt;
需要事先转换成&lt;code&gt;PipeOp&lt;/code&gt;过渡
&lt;ul&gt;
&lt;li&gt;见下方例子：&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# Learner被串起来的例子
lrn_logreg &amp;lt;- lrn(&apos;classif.log_reg&apos;)
graph &amp;lt;- po(&apos;imputesample&apos;) %&amp;gt;&amp;gt;% lrn_logreg
graph$plot(horizontal = TRUE)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./image_4.png&quot; alt=&quot;image_4&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;若要将&lt;code&gt;Graph&lt;/code&gt;作为具有相同接口的&lt;code&gt;Learner&lt;/code&gt;使用，&lt;br /&gt;
可以使用&lt;code&gt;as_learner()&lt;/code&gt;将其包装在一个&lt;code&gt;GraphLearner&lt;/code&gt;对象中，&lt;br /&gt;
然后，该&lt;code&gt;Graph&lt;/code&gt;就可以像其他任何&lt;code&gt;Learner&lt;/code&gt;一样使用&lt;/li&gt;
&lt;li&gt;下面例子中分别建立两种&lt;code&gt;Graph&lt;/code&gt;并进行benchmark比较
&lt;ul&gt;
&lt;li&gt;重采样插补的&lt;code&gt;glrn_sample&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;众数插补的&lt;code&gt;glrn_mode&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 将两个`Graph`转换为`Learner`
glrn_sample &amp;lt;- as_learner(graph)
glrn_mode &amp;lt;- as_learner(po(&apos;imputemode&apos;) %&amp;gt;&amp;gt;% lrn_logreg)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;即使转换成了&lt;code&gt;GraphLearner&lt;/code&gt;类，&lt;br /&gt;
依然可以使用&lt;code&gt;GraphLearner$plot(horizontal = TRUE)&lt;/code&gt;&lt;br /&gt;
对&lt;code&gt;Graph&lt;/code&gt;可视化&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;glrn_mode$plot(horizontal = TRUE)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./image_5.png&quot; alt=&quot;image_5&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;转化为&lt;code&gt;GraphLearner&lt;/code&gt;后可以和普通的&lt;code&gt;Learner&lt;/code&gt;一样&lt;br /&gt;
传递到&lt;code&gt;benchmark()&lt;/code&gt;中进行比较
&lt;ul&gt;
&lt;li&gt;在下例中可以看出：&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 创建一个benchmark矩阵
design &amp;lt;- benchmark_grid(
 tsk(&apos;pima&apos;), 
 list(glrn_sample, glrn_mode),
 rsmp(&apos;cv&apos;, folds = 3)
)
# 执行benchmark比较
bmr &amp;lt;- benchmark(design)
# 储存聚合结果
aggr &amp;lt;- bmr$aggregate()[, .(learner_id, classif.ce)]
# 查看结果
aggr
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A bmr_aggregate: 2 x 2&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;learner_id&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;classif.ce&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;imputesample.classif.log_reg&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2330729&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;imputemode.classif.log_reg  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2278646&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;h4&gt;检查&lt;code&gt;Graph&lt;/code&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;如果相检查管道和数据流以进一步了解你的管道或对其进行调试
&lt;ul&gt;
&lt;li&gt;首先需要将 &lt;code&gt;$keep_results&lt;/code&gt; 标签设置为 &lt;code&gt;TRUE&lt;/code&gt;，&lt;br /&gt;
以便保留中间结果，默认情况下该标志是关闭的，以节省内存&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 可以在`as_learner()`前设定
graph$keep_results &amp;lt;- TRUE
glrn_sample$graph_model$keep_results &amp;lt;- TRUE
glrn_sample$train(tsk(&apos;pima&apos;))
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;GraphLearner&lt;/code&gt;中的&lt;code&gt;$graph_model&lt;/code&gt;字段包含了&lt;code&gt;Graph&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;因此可以对&lt;code&gt;GraphLearner$graph_model&lt;/code&gt;进行所有和&lt;code&gt;Graph&lt;/code&gt;相同的操作&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;下列例子中可以查看全部中间结果&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;imputesample_output &amp;lt;- glrn_sample$
 graph_model$
 pipeops$
 imputesample$
 .result
imputesample_output[[1]]$missings()
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;diabetes      age pedigree pregnant  glucose  insulin     mass pressure 
       0        0        0        0        0        0        0        0 
 triceps 
       0 
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;可以通过&lt;code&gt;Graph$$pipeops&lt;/code&gt;访问底层&lt;code&gt;Learner&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;下面分别显示了每一级的&lt;strong&gt;类&lt;/strong&gt;，方便了解这些包装关系&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;pipeop_logreg &amp;lt;- glrn_sample$ # GraphLearner
 graph_model$ # Graph
 pipeops$ # PipeOp
 classif.log_reg # PipeOpLearner
learner_logreg &amp;lt;- pipeop_logreg$learner_model # LearnerClassifLogReg
learner_logreg
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;到这里不妨我们再重新按顺序构建一遍，&lt;br /&gt;
并看看它们的类&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 1
lrn(&apos;classif.log_reg&apos;) %&amp;gt;% class()
# 2
lrn(&apos;classif.log_reg&apos;) %&amp;gt;% po() %&amp;gt;% class()
# 3
po(&apos;imputesample&apos;) %&amp;gt;&amp;gt;% {lrn(&apos;classif.log_reg&apos;) %&amp;gt;% po()} %&amp;gt;% class()
# 4
po(&apos;imputesample&apos;) %&amp;gt;&amp;gt;% {lrn(&apos;classif.log_reg&apos;) %&amp;gt;% po()} %&amp;gt;% as_learner() %&amp;gt;% class()
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&apos;LearnerClassifLogReg&apos;&apos;LearnerClassif&apos;&apos;Learner&apos;&apos;R6&apos;

&apos;PipeOpLearner&apos;&apos;PipeOp&apos;&apos;R6&apos;

&apos;Graph&apos;&apos;R6&apos;

&apos;GraphLearner&apos;&apos;Learner&apos;&apos;R6&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;配置管道超参数&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;PipeOp&lt;/code&gt;的超参数集中收集在图的 &lt;code&gt;$param_set&lt;/code&gt; 中&lt;/li&gt;
&lt;li&gt;可以使用完全一样的&lt;code&gt;PipeOp&lt;/code&gt;，前提是设置&lt;code&gt;id&lt;/code&gt;，以避免参数名冲突&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;graph &amp;lt;- po(&apos;scale&apos;, center = FALSE, scale = TRUE, id = &apos;scale&apos;) %&amp;gt;&amp;gt;%
  po(&apos;scale&apos;, center = TRUE, scale = FALSE, id = &apos;center&apos;) %&amp;gt;&amp;gt;%
  lrn(&apos;classif.rpart&apos;, cp = 1)
graph$param_set$values
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;注意&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;如果你需要更改 &lt;code&gt;Graph&lt;/code&gt; 中&lt;code&gt;PipeOp&lt;/code&gt;的ID，&lt;br /&gt;
则使用&lt;code&gt;Graph&lt;/code&gt;类中的&lt;code&gt;$set_names&lt;/code&gt;方法
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;some_graph$set_names(old = &apos;old_name&apos;, new = &apos;new_name&apos;)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;不可通过&lt;br /&gt;
&lt;code&gt;graph$pipeops$&amp;lt;old_id&amp;gt;$id &amp;lt;- &amp;lt;new_id&amp;gt;&lt;/code&gt;更改&lt;code&gt;PipeOp&lt;/code&gt;的ID
&lt;ul&gt;
&lt;li&gt;因为这只会更改&lt;code&gt;PipeOp&lt;/code&gt;对自身ID的记录，而不会更改&lt;code&gt;Graph&lt;/code&gt;的记录，这将导致错误&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;$scale.center
FALSE
$scale.scale
TRUE
$scale.robust
FALSE
$center.center
TRUE
$center.scale
FALSE
$center.robust
FALSE
$classif.rpart.cp
1
$classif.rpart.xval
0
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;无论将管道视为&lt;code&gt;Graph&lt;/code&gt;还是&lt;code&gt;GraphLearner&lt;/code&gt;，超参数的更新和访问方式都是相同的&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# `Graph`两种方法
graph$param_set$values$classif.rpart.maxdepth &amp;lt;- 6
graph$param_set$values
graph$param_set$set_values(classif.rpart.maxdepth = 1)
graph$param_set$values

# 转换成`GraphLearner`
graph_learner &amp;lt;- as_learner(graph)

# `GraphLearner`依然两种方法
graph_learner$param_set$values$classif.rpart.maxdepth &amp;lt;- 3
graph_learner$param_set$values
graph_learner$param_set$set_values(classif.rpart.maxdepth = 2)
graph_learner$param_set$values
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;非顺序管道及调优&lt;/h2&gt;
&lt;h3&gt;简单演示&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;%&amp;gt;&amp;gt;%&lt;/code&gt;能够将&lt;code&gt;PipeOp&lt;/code&gt;排列成线性的&lt;code&gt;Graph&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gunion()&lt;/code&gt;则可以将&lt;br /&gt;
&lt;code&gt;PipeOP&lt;/code&gt;，&lt;code&gt;Graph&lt;/code&gt;或它们的组合&lt;br /&gt;
拼接成可以并行的&lt;code&gt;Graph&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# library(mlr3pipelines)

# 简单的并联
# 首先用scale开头
graph &amp;lt;- po(&apos;scale&apos;, center = TRUE, scale = FALSE) %&amp;gt;&amp;gt;%
    # `gunion()`接受`list`的传递
    gunion(
     # `list`内部则是要并联的管道元件
        list(
         # 辨别某特征是否存在缺失值
            po(&apos;missind&apos;), 
            # 对缺失值用中位数填充
            po(&apos;imputemedian&apos;) 
        )
    ) %&amp;gt;&amp;gt;%
    # 最后再串联一个管道元件
    # 合并分支输出的结果
    po(&apos;featureunion&apos;)

graph$plot(horizontal = TRUE)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./image_6.png&quot; alt=&quot;image_6&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Graph$edges&lt;/code&gt;依然可以查看输入与输出的表格&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;graph$edges
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 4 x 4&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;src_id&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;src_channel&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;dst_id&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;dst_channel&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;scale       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;output&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;missind     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;input&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;scale       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;output&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;imputemedian&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;input&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;missind     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;output&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;featureunion&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;...  &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;imputemedian&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;output&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;featureunion&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;...  &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;用刚刚构建的&lt;code&gt;graph&lt;/code&gt;作用于&lt;code&gt;tsk(&apos;pima&apos;)&lt;/code&gt;的前三行，&lt;br /&gt;
可以看到它如何估算缺失数据，并添加一个列来指示哪些值是缺失的&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;tsk_pima_head &amp;lt;- tsk(&apos;pima&apos;)$filter(1:3)
tsk_pima_head$data(cols = c(&apos;diabetes&apos;, &apos;insulin&apos;, &apos;triceps&apos;))

result &amp;lt;- graph$train(tsk_pima_head)[[1]]
result$data(
 cols = c(
  &apos;diabetes&apos;, 
  &apos;insulin&apos;, 
  &apos;missing_insulin&apos;, 
  &apos;triceps&apos;,
  &apos;missing_triceps&apos;
  )
)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 3 x 3&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;diabetes&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;insulin&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;triceps&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;fct&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;pos&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;35&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;neg&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;29&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;pos&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 3 x 5&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;diabetes&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;insulin&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;missing_insulin&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;triceps&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;missing_triceps&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;fct&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;fct&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;fct&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;pos&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;missing&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;present&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;neg&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;missing&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;present&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;pos&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;missing&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;missing&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;h3&gt;选择器与并行管道&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;下图展现了两种操作思路：
&lt;ul&gt;
&lt;li&gt;第一个：先对一部分列进行操作1，再对剩余部分进行操作2&lt;/li&gt;
&lt;li&gt;第二个：对一部分列进行操作1和对剩余部分进行操作2是并行的，&lt;br /&gt;
最后用&lt;code&gt;po(&apos;featureunion&apos;)&lt;/code&gt;进行整合&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./image_7.png&quot; alt=&quot;image_7&quot; /&gt;
&lt;img src=&quot;./image_8.png&quot; alt=&quot;image_8&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;上述用了&lt;code&gt;Selector&lt;/code&gt;系列的选择器函数&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;selector_grep()&lt;/code&gt;：&lt;br /&gt;
正则表达式匹配列&lt;/li&gt;
&lt;li&gt;&lt;code&gt;selector_name&lt;/code&gt;：&lt;br /&gt;
选择和名字完全匹配的列&lt;/li&gt;
&lt;li&gt;&lt;code&gt;selector_type()&lt;/code&gt;：&lt;br /&gt;
列类型匹配列&lt;/li&gt;
&lt;li&gt;&lt;code&gt;selector_intersect&lt;/code&gt;：&lt;br /&gt;
选择交集&lt;/li&gt;
&lt;li&gt;&lt;code&gt;selector_union()&lt;/code&gt;：&lt;br /&gt;
选择并集&lt;/li&gt;
&lt;li&gt;&lt;code&gt;selector_setdiff()&lt;/code&gt;：&lt;br /&gt;
选择差集&lt;/li&gt;
&lt;li&gt;&lt;code&gt;selector_invert()&lt;/code&gt;：&lt;br /&gt;
选择补集&lt;/li&gt;
&lt;li&gt;&lt;code&gt;selector_missing()&lt;/code&gt;：&lt;br /&gt;
选择有缺失值的列&lt;/li&gt;
&lt;li&gt;&lt;code&gt;selector_cardinality_greater_than()&lt;/code&gt;：&lt;br /&gt;
选择基数大雨给定阈值的&lt;strong&gt;分类特征&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;selector_all()&lt;/code&gt;：&lt;br /&gt;
选择所有列&lt;/li&gt;
&lt;li&gt;&lt;code&gt;selector_none()&lt;/code&gt;：&lt;br /&gt;
不选择任何列&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;下面是不使用&lt;code&gt;Task$select()&lt;/code&gt;，&lt;br /&gt;
而是&lt;code&gt;select_grep()&lt;/code&gt;和&lt;code&gt;select_invert()&lt;/code&gt;的方便操作&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# tsk(&apos;penguins_simple&apos;)在`mlr3data`包中
# library(mlr3data)

# 建立两个选择器：
# 所有开头为`bill`
sel_bill &amp;lt;- selector_grep(&apos;^bill&apos;)
# 上面选择器的补集
sel_not_bill &amp;lt;- selector_invert(sel_bill)

# 建立一个`Graph`：
# 先对开头不为`bill`的列缩放
graph &amp;lt;- po(&apos;scale&apos;, affect_columns = sel_not_bill) %&amp;gt;&amp;gt;% 
 # 再对开头为`bill`的列进行PCA
 po(&apos;pca&apos;, affect_columns = sel_bill)

# 对`Task`运行`Graph`
result &amp;lt;- graph$train(tsk(&apos;penguins&apos;))

# 查看前三行结果
result[[1]]$data()[1:3, ]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 3 x 11&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;species&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;PC1&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;PC2&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;body_mass&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;flipper_length&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;island.Biscoe&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;island.Dream&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;island.Torgersen&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;sex.female&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;sex.male&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;year&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;fct&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Adelie&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-5.014734&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1.0716828&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-0.5676206&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-1.4246077&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-0.977724&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-0.7641697&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2.463094&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-0.9895421&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 0.9895421&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-1.281813&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Adelie&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-4.495124&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-0.1852998&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-0.5055254&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-1.0678666&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-0.977724&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-0.7641697&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2.463094&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1.0075337&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-1.0075337&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-1.281813&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Adelie&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-3.754628&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 0.4867612&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-1.1885721&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-0.4257325&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-0.977724&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-0.7641697&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2.463094&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 1.0075337&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-1.0075337&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-1.281813&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;对于上面的串联&lt;code&gt;Graph&lt;/code&gt;而言，如果顺序 弄混，则会导致结果出现重大错误&lt;/li&gt;
&lt;li&gt;为了避免这种情况发生，更好的是建立一个并联&lt;code&gt;Graph&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;po_select_bill &amp;lt;- po(
 &apos;select&apos;, 
 id = &apos;s_bill&apos;, 
 selector = sel_bill
)
po_select_not_bill &amp;lt;- po(
 &apos;select&apos;, 
 id = &apos;s_notbill&apos;,
 selector = sel_not_bill
)

path_pca &amp;lt;-  po_select_bill %&amp;gt;&amp;gt;% po(&apos;pca&apos;)
path_scale &amp;lt;- po_select_not_bill %&amp;gt;&amp;gt;% po(&apos;scale&apos;)

graph &amp;lt;- gunion(list(path_pca, path_scale)) %&amp;gt;&amp;gt;% po(&apos;featureunion&apos;)

# 可视化`Graph`流程
graph$plot(horizontal = TRUE)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./image_9.png&quot; alt=&quot;image_9&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用&lt;code&gt;po(&apos;nop&apos;)&lt;/code&gt;表示不进行任何操作&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;graph &amp;lt;- gunion(list(
 po_select_bill %&amp;gt;&amp;gt;% po(&apos;scale&apos;),
 po_select_not_bill %&amp;gt;&amp;gt;% po(&apos;nop&apos;)
)) %&amp;gt;&amp;gt;% po(&apos;featureunion&apos;)

graph$plot(horizontal = TRUE)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./image_10.png&quot; alt=&quot;image_10&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;graph$train(tsk(&apos;penguins_simple&apos;))[[1]]$data()[1:3,]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 3 x 11&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;species&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;bill_depth&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;bill_length&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;body_mass&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;flipper_length&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;island.Biscoe&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;island.Dream&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;island.Torgersen&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;sex.female&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;sex.male&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;year&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;fct&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Adelie&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.7795590&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-0.8946955&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3750&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;181&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2007&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Adelie&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.1194043&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-0.8215515&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3800&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;186&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2007&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Adelie&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4240910&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-0.6752636&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3250&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;195&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2007&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;h3&gt;常见模式与&lt;code&gt;ppl()&lt;/code&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;由于大部分的机器学习的一些处理是共同的，&lt;br /&gt;
&lt;code&gt;mlr3&lt;/code&gt;预设了一些管道&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ppl()&lt;/code&gt;可以快速调用&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;几种常用的&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ppl(&apos;bagging&apos;, graph)&lt;/code&gt;：装袋
&lt;ul&gt;
&lt;li&gt;在&lt;code&gt;mlr3pipelines&lt;/code&gt;中，&lt;br /&gt;
装袋是指在不同的数据样本上多次运行&lt;code&gt;graph&lt;/code&gt;，&lt;br /&gt;
然后对结果取平均值的过程&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ppl(&apos;branch&apos;, graphs)&lt;/code&gt;：
&lt;ul&gt;
&lt;li&gt;使用 &lt;code&gt;PipeOpBranch&lt;/code&gt; 从给定的 &lt;code&gt;graphs&lt;/code&gt; 中创建不同的路径分支，&lt;br /&gt;
其中只有一个分支会被求值&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ppl(&apos;greplicate&apos;, graph, n)&lt;/code&gt;：
&lt;ul&gt;
&lt;li&gt;创建一个 &lt;code&gt;Graph&lt;/code&gt;，该图将 &lt;code&gt;graph&lt;/code&gt;（也可以是单个 &lt;code&gt;PipeOp&lt;/code&gt;）复制 &lt;code&gt;n&lt;/code&gt; 次&lt;/li&gt;
&lt;li&gt;该管道通过向每个 &lt;code&gt;PipeOp&lt;/code&gt; 添加后缀来避免ID冲突&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ppl(&apos;ovr&apos;, graph)&lt;/code&gt;：一对多分类
&lt;ul&gt;
&lt;li&gt;用于将多分类任务转换为多个二分类任务，&lt;br /&gt;
每个任务对应原始任务中的一个类别&lt;/li&gt;
&lt;li&gt;然后，这些任务由给定的 &lt;code&gt;graph&lt;/code&gt; 进行评估，&lt;br /&gt;
&lt;code&gt;graph&lt;/code&gt; 应该是一个学习器&lt;br /&gt;
（或包含一个能生成预测结果的学习器的管道）&lt;/li&gt;
&lt;li&gt;对二分类任务所做的预测将合并为原始任务所需的多分类预测&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ppl(&apos;robustify&apos;)&lt;/code&gt;：
&lt;ul&gt;
&lt;li&gt;执行常见的预处理步骤，&lt;br /&gt;
使任何 &lt;code&gt;Task&lt;/code&gt; 都能与给定的 &lt;code&gt;Learner&lt;/code&gt; 兼容&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ppl(&apos;stacking&apos;, base_learners, super_learner)&lt;/code&gt;：堆叠法
&lt;ul&gt;
&lt;li&gt;是指将一个或多个模型（&lt;code&gt;base_learners&lt;/code&gt;）的预测结果&lt;br /&gt;
作为后续模型（&lt;code&gt;super_learner&lt;/code&gt;）的特征的过程&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ppl(&apos;targettrafo&apos;, graph)&lt;/code&gt;：
&lt;ul&gt;
&lt;li&gt;创建一个&lt;code&gt;Graph&lt;/code&gt;，该&lt;code&gt;Graph&lt;/code&gt;转换&lt;code&gt;Task&lt;/code&gt;的预测目标，&lt;br /&gt;
并确保在训练期间应用的任何变换&lt;br /&gt;
（使用传递给&lt;code&gt;targetmutate.trafo&lt;/code&gt;超参数的函数）&lt;br /&gt;
在最终预测中被反转&lt;br /&gt;
（使用传递给&lt;code&gt;targetmutate.inverter&lt;/code&gt;超参数的函数）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;例子&lt;/h3&gt;
&lt;h4&gt;使用&lt;code&gt;greplicate&lt;/code&gt;和&lt;code&gt;subsample&lt;/code&gt;进行装袋（Bagging）&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;装袋法&lt;/strong&gt;（源于“自助聚集”（&lt;strong&gt;b&lt;/strong&gt;ootstrapp &lt;strong&gt;agg&lt;/strong&gt;regat&lt;strong&gt;ing&lt;/strong&gt;））
&lt;ul&gt;
&lt;li&gt;基本思想即把多个预测器聚合成一个更强有力的单一预测器&lt;/li&gt;
&lt;li&gt;对于回归任务，预测结果通常通过算术平均进行聚合；&lt;br /&gt;
对于分类任务，则通过多数表决进行聚合&lt;/li&gt;
&lt;li&gt;装袋法背后的潜在直觉是，&lt;br /&gt;
对一组不稳定且多样（即仅弱相关）的预测器进行平均，&lt;br /&gt;
可以降低总体预测的方差&lt;/li&gt;
&lt;li&gt;每个学习器都在原始数据的不同随机样本上进行训练&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;下图表示了基本原理：
&lt;ul&gt;
&lt;li&gt;通过对数据进行独立子采样并拟合单个决策树学习器来执行装袋法的图&lt;/li&gt;
&lt;li&gt;最终的预测结果由多数投票 &lt;code&gt;PipeOp&lt;/code&gt; 汇总得出&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./image_11.png&quot; alt=&quot;image_11&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;下面&lt;strong&gt;手动构建&lt;/strong&gt;一个bagging的&lt;code&gt;Graph&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 建立一个`Graph`：
# 从样本中进行0.7比例的无放回采样
# 用采样后的样本训练rpart
gr_single_pred &amp;lt;- po(&apos;subsample&apos;, frac = 0.7) %&amp;gt;&amp;gt;% lrn(&apos;classif.rpart&apos;)

# 将`Graph``gr_single_pred`重复10次
gr_pred_set &amp;lt;- ppl(&apos;greplicate&apos;, graph = gr_single_pred, n = 10)

# 将`Graph``gr_pred_set`传递给`po(&apos;classifavg&apos;)
# 并输入`innum = 10`以传输重复10次的信息
gr_bagging &amp;lt;- gr_pred_set %&amp;gt;&amp;gt;% po(&apos;classifavg&apos;, innum = 10)

# 对最终的`Graph`可视化
gr_bagging$plot()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./image_12.png&quot; alt=&quot;image_12&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;将刚构建的bagging&lt;code&gt;Graph&lt;/code&gt;用于`tsk(&apos;sonar&apos;)
&lt;ul&gt;
&lt;li&gt;可以看出bagging比决策树效果好，&lt;br /&gt;
但是差于随机森林&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 将`Graph`转换成`GraphLearner`
glrn_bagging &amp;lt;- as_learner(gr_bagging)
glrn_bagging$id &amp;lt;- &apos;bagging&apos;

lrn_rpart &amp;lt;- lrn(&apos;classif.rpart&apos;)
# 将`glrn_bagging`，`lrn_rpart`, 
# 以及`lrn(&apos;classif.ranger&apos;)`进行benchmark比较
learners &amp;lt;- c(glrn_bagging, lrn_rpart, lrn(&apos;classif.ranger&apos;))

# 进行benchmark比较
bmr &amp;lt;- benchmark(
 benchmark_grid(
  tsk(&apos;sonar&apos;), 
  learners,
  rsmp(&apos;cv&apos;, folds = 3)
 )
)

# 查看整合后的学习器结果
bmr$aggregate()[, .(learner_id, classif.ce)]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A bmr_aggregate: 3 x 2&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;learner_id&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;classif.ce&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;bagging       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2404417&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.rpart &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2979986&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.ranger&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.1878537&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;对于上面的bagging &lt;code&gt;Graph&lt;/code&gt; 更简单的&lt;strong&gt;自动构建&lt;/strong&gt;方法是用&lt;code&gt;ppl(&apos;bagging&apos;, ...)&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;collect_multiplicity&lt;/code&gt;：是否收集跨路径预测结果&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;ppl(
 &apos;bagging&apos;, 
 rn(&apos;classif.rpart&apos;),
 iterations = 10, frac = 0.7,
 averager = po(
  &apos;classifavg&apos;, 
  collect_multiplicity = TRUE
 )
)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;随机森林算法进行了特征变量的子采样
&lt;ul&gt;
&lt;li&gt;为了模拟这一个过程，可以进行如下管道设定&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 创建一个采样器
# 这里的采样器只是一个简单的函数：
# 从`Task`中特征变量中，
# 随机挑选特征变量数量的算术平方根个变量
selector_subsample &amp;lt;- function(task) {
 sample(
  task$feature_names, 
  sqrt(length(task$feature_names))
 )
}

# 创建一个bagging `Graph`
gr_bagging_quasi_rf &amp;lt;- ppl(
 &apos;bagging&apos;,
 graph = po(&apos;select&apos;, selector = selector_subsample) %&amp;gt;&amp;gt;%
     lrn(&apos;classif.rpart&apos;, minsplit = 1),
 # 迭代100次
 iterations = 100,
 # 设置结果的整合方式
 averager = po(&apos;classifavg&apos;, collect_multiplicity = TRUE)
)

# 将重采样是否返回设定为TRUE
# 因此变成了自助法重采样
gr_bagging_quasi_rf$
 param_set$
 values$
 subsample.replace &amp;lt;- TRUE

# 将`Graph`转变为`GraphLearner`
glrn_quasi_rf &amp;lt;- as_learner(gr_bagging_quasi_rf)
# 设置一个唯一ID
glrn_quasi_rf$id &amp;lt;- &apos;quasi.rf&apos;

# 进行benchmark比较
design &amp;lt;- benchmark_grid(
 tsks(&apos;sonar&apos;),
 c(
  glrn_quasi_rf, 
  lrn(&apos;classif.ranger&apos;, num.trees = 100)
 ),
 rsmp(&apos;cv&apos;, folds = 5)
)
bmr &amp;lt;- benchmark(design)

# 查看聚合结果
bmr$aggregate()[, .(learner_id, classif.ce)]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A bmr_aggregate: 2 x 2&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;learner_id&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;classif.ce&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;quasi.rf      &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.1732869&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.ranger&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.1681765&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;h4&gt;使用&lt;code&gt;po(“learner_cv”)&lt;/code&gt;进行堆叠&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;堆叠
&lt;ul&gt;
&lt;li&gt;将多个模型（通常称为0层模型）的预测结果作为后续模型（1层模型）的特征，&lt;br /&gt;
而1层模型又会结合这些预测结果&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;一种简单的组合方式可以是线性模型（如果有许多0层模型，可能需要进行正则化），&lt;br /&gt;
因为0层模型的加权和通常是合理且足够好的&lt;/li&gt;
&lt;li&gt;不过，也可以使用非线性的1层模型，&lt;br /&gt;
并且1层模型也有可能同时访问输入特征和0层模型的预测结果&lt;/li&gt;
&lt;li&gt;从概念上讲，在&lt;code&gt;mlr3&lt;/code&gt;中也可以构建超过两层的堆叠结构，&lt;br /&gt;
但在这里只局限于这种更简单的设置，因为它在实际应用中通常也表现良好&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./image_13.png&quot; alt=&quot;image_13&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;这里创建了3个学习器，并且通过连接CV重采样各自形成3个&lt;code&gt;Graph&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;lrn_rpart &amp;lt;- lrn(&apos;classif.rpart&apos;, predict_type = &apos;prob&apos;)
po_rpart_cv &amp;lt;- po(
 &apos;learner_cv&apos;, 
 learner = lrn_rpart,
 resampling.folds = 2, 
 id = &apos;rpart_cv&apos;
)

lrn_knn &amp;lt;- lrn(&apos;classif.kknn&apos;, predict_type = &apos;prob&apos;)
po_knn_cv &amp;lt;- po(
 &apos;learner_cv&apos;,
 learner = lrn_knn,
 resampling.folds = 2, 
 id = &apos;knn_cv&apos;
)

lrn_glmnet &amp;lt;- lrn(&apos;classif.glmnet&apos;, predict_type = &apos;prob&apos;)
po_glmnet_cv &amp;lt;- po(
 &apos;learner_cv&apos;,
 learner = lrn_glmnet,
 resampling.folds = 2, 
 id = &apos;glmnet_cv&apos;
)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;将上述3个&lt;code&gt;Graph&lt;/code&gt;并联，并连接一个整合结果的&lt;code&gt;PipeOp&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;将这个构成的&lt;code&gt;Graph&lt;/code&gt;训练&lt;code&gt;tsk(&apos;sonar&apos;)&lt;/code&gt;并查看结果&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;gr_level_0 &amp;lt;- gunion(list(po_rpart_cv, po_knn_cv, po_glmnet_cv))
gr_combined &amp;lt;- gr_level_0 %&amp;gt;&amp;gt;% po(&apos;featureunion&apos;)

# 由于`GraphLearner`接受和输出都是`list`
# 对于只有一个起点的输入而言输出也是只包含一个元素的`list`
# 因此用`list[[1]]`来调取
gr_combined$train(tsk(&apos;sonar&apos;))[[1]]$head()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 6 x 7&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;Class&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;rpart_cv.prob.M&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;rpart_cv.prob.R&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;knn_cv.prob.M&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;knn_cv.prob.R&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;glmnet_cv.prob.M&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;glmnet_cv.prob.R&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;fct&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;R&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.05555556&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.94444444&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.42308735&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.5769126&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.77722963&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2227703659&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;R&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.93333333&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.06666667&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.72902464&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2709754&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.57270947&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4272905324&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;R&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.89473684&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.10526316&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.52294416&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4770558&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.99908407&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.0009159289&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;R&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.58333333&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.41666667&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.32588147&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.6741185&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.46964796&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.5303520359&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;R&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.41666667&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.58333333&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.58797952&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4120205&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.39418320&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.6058167974&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;R&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.41666667&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.58333333&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.07610223&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.9238978&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.02457426&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.9754257401&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;由于这是一个二元分类的问题，只需要选择预测&lt;code&gt;M&lt;/code&gt;或&lt;code&gt;R&lt;/code&gt;即可
&lt;ul&gt;
&lt;li&gt;这里只选择预测&lt;code&gt;M&lt;/code&gt;的概率以及结果&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;gr_stack &amp;lt;- gr_combined %&amp;gt;&amp;gt;%
  po(&apos;select&apos;, selector = selector_grep(&apos;\\.M$&apos;))
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;连接1级学习器&lt;code&gt;lrn(&apos;classif.log_reg&apos;)}&lt;/code&gt;，&lt;br /&gt;
并对&lt;code&gt;Graph&lt;/code&gt;可视化&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;gr_stack &amp;lt;- gr_stack %&amp;gt;&amp;gt;% po(&apos;learner&apos;, lrn(&apos;classif.log_reg&apos;))
gr_stack$plot(horizontal = TRUE)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./image_14.png&quot; alt=&quot;image_14&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Graph&lt;/code&gt;转换为&lt;code&gt;GraphLearner&lt;/code&gt;，并用于训练&lt;code&gt;tsk(&apos;sonar&apos;)&lt;/code&gt;，&lt;br /&gt;
再通过查看最终训练好的模型来检查0级学习器的权重
&lt;ul&gt;
&lt;li&gt;模型权重表明，K近邻算法（KNN）以最大的系数对预测结果影响最大&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;glrn_stack &amp;lt;- as_learner(gr_stack)
glrn_stack$train(tsk(&apos;sonar&apos;))
glrn_stack$base_learner()$model
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;Call:  stats::glm(formula = form, family = &apos;binomial&apos;, data = data, 
    model = FALSE)

Coefficients:
     (Intercept)   rpart_cv.prob.M     knn_cv.prob.M  glmnet_cv.prob.M  
          -4.863             1.423             6.058             1.095  

Degrees of Freedom: 207 Total (i.e. Null);  204 Residual
Null Deviance:     287.4 
Residual Deviance: 144  AIC: 152
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;将各个模型与堆叠管道一起进行基准测试以验证0级学习器中KNN的效果最佳&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;glrn_stack$id &amp;lt;- &apos;stacking&apos;

design &amp;lt;- benchmark_grid(
 tsk(&apos;sonar&apos;),
 list(lrn_rpart, lrn_knn, lrn_glmnet, glrn_stack), 
 rsmp(&apos;repeated_cv&apos;)
)
bmr &amp;lt;- benchmark(design)

bmr$aggregate()[, .(learner_id, classif.ce)]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A bmr_aggregate: 4 x 2&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;learner_id&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;classif.ce&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.rpart &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2884048&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.kknn  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.1413095&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.glmnet&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2471429&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;stacking      &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.1296667&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ppl(&apos;stacking&apos;, ...)&lt;/code&gt;可以快速&lt;strong&gt;自动创建&lt;/strong&gt;上述的堆叠&lt;code&gt;Graph&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;ppl(
 &apos;stacking&apos;,
 base_learners = lrns(
  c(
   &apos;classif.rpart&apos;, 
   &apos;classif.kknn&apos;,
   &apos;classif.glmnet&apos;)
  ),
 super_learner = lrn(&apos;classif.log_reg&apos;)
)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;调优Graphs&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;可以进行2方面的调优工作：
&lt;ul&gt;
&lt;li&gt;用给定的学习器进行预处理，通过固定的，通常为顺序执行的管道进行调优&lt;/li&gt;
&lt;li&gt;除了对管道的超参数调优以外，还要确定具体应将哪些PipeOp应用于数据
&lt;ul&gt;
&lt;li&gt;组合算法选择与超参数优化&lt;br /&gt;
（Combined Algorithm Selection and Hyperparameter optimization）&lt;/li&gt;
&lt;li&gt;通过创建分支（branching）或代理（proxy），&lt;br /&gt;
可以方便地创建自己的微型自动化机器学习系统（mini AutoML systems），&lt;br /&gt;
甚至可以针对特定任务进行优化&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;调优Graphs超参数&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;下面的例子中，我们要做的是：
&lt;ul&gt;
&lt;li&gt;先构建一个PCA -&amp;gt; KKNN的&lt;code&gt;GraphLearner&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;再分别对PCA的&lt;code&gt;rank.&lt;/code&gt;超参数和KKNN的&lt;code&gt;k&lt;/code&gt;超参数进行调优&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 设置调优范围并构建`GraphLearner`
po_pca &amp;lt;- po(&apos;pca&apos;, rank. = to_tune(2, 20))
lrn_knn &amp;lt;- lrn(&apos;classif.kknn&apos;, k = to_tune(1, 32))
graph_learner &amp;lt;- as_learner(po_pca %&amp;gt;&amp;gt;% lrn_knn)

# 简单确认`GraphLearner`的参数设置情况
graph_learner$param_set$values
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;可以看到被标记的待调优超参数&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;$pca.rank.
Tuning over:
range [2, 20]


$classif.kknn.k
Tuning over:
range [1, 32]
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;接下来是熟悉的&lt;code&gt;auto_tuner()&lt;/code&gt;构建一个预备调优的管道和一个不调优的管道，&lt;br /&gt;
通过benchmark比较两者性能的差异
&lt;ul&gt;
&lt;li&gt;最后结果可以看出调优的管道性能更好（有更低的交叉熵）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 调优管道
glrn_tuned &amp;lt;- auto_tuner(
 tnr(&apos;random_search&apos;), 
 graph_learner,
 rsmp(&apos;holdout&apos;), 
 term_evals = 10
)
# 不调优管道
glrn_untuned &amp;lt;- po(&apos;pca&apos;) %&amp;gt;&amp;gt;% lrn(&apos;classif.kknn&apos;)

# Benchmark比较
design &amp;lt;- benchmark_grid(
 tsk(&apos;sonar&apos;), 
 # 注意：
 # 这里的`glrn_tuned`是`autoTuner`和`Learner`类
 # `glrn_untuned`则是单纯的`Graph`
 # 依然可以作为`Learner`传递
 c(glrn_tuned, glrn_untuned),
 rsmp(&apos;cv&apos;, folds = 5))
benchmark(design)$aggregate()[, .(learner_id, classif.ce)]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A bmr_aggregate: 2 x 2&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;learner_id&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;classif.ce&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;pca.classif.kknn.tuned&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2062718&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;pca.classif.kknn      &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2307782&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;h4&gt;使用&lt;code&gt;po(&apos;branch&apos;)&lt;/code&gt;调整备选路径&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;如果只是单纯根据上面的流程对PCA参数进行调优，&lt;br /&gt;
是没有考虑调优后的PCA是否真的有利于构建后续模型&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./image_15.png&quot; alt=&quot;image_15&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 加载R包
# library(mlr3oml)

# 下载例子数据
otsk_mnist &amp;lt;- otsk(id = 3573)
# 创建`Task`，通过子集化减少运行本例子的工作量
tsk_mnist &amp;lt;- as_task(otsk_mnist)$
 filter(sample(70000, 1000))$
 select(otsk_mnist$feature_names[sample(700, 100)])

# 创建3个预处理管道名称：
# 无操作，PCA，Yeo-Johnson变换
# 注意：这里只是指定名称而已，类似于id
# 也可以叫A，B，C
paths &amp;lt;- c(&apos;nop&apos;, &apos;pca&apos;, &apos;yeojohnson&apos;)

# 构建一个分支管道
graph &amp;lt;- po(
 &apos;branch&apos;, # 指定为&apos;branch&apos;
 paths, # 传递需要分支的管道
 id = &apos;brnchPO&apos; # 设置管道id
) %&amp;gt;&amp;gt;%
 # 传递需要并联的管道
 gunion(
  # 记得按照上面名称的顺序
  list(
   # 无操作管道
      po(&apos;nop&apos;),
      # PCA管道
      po(&apos;pca&apos;),
      # Yeo-Johnson变换管道
      po(&apos;removeconstants&apos;, id = &apos;rm_const&apos;) %&amp;gt;&amp;gt;%
       po(&apos;yeojohnson&apos;, id = &apos;YJ&apos;)
  )
) %&amp;gt;&amp;gt;% 
 # 接触分支
 po(&apos;unbranch&apos;, paths, id = &apos;unbrnchPO&apos;)

# 对`Graph`可视化观察一下
graph$plot(horizontal = TRUE)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./image_16.png&quot; alt=&quot;image_16&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;指定选定的管道的话，传递选用的管道名称到&lt;br /&gt;
&lt;code&gt;Graph$param_set$values$brnchPO.selection&lt;/code&gt;即可
&lt;ul&gt;
&lt;li&gt;下例为使用PCA管道&lt;/li&gt;
&lt;li&gt;可以看到结果是经过PCA降纬后的特征变量了&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 指定管道为PCA
graph$
 param_set$
 values$
 brnchPO.selection &amp;lt;- &apos;pca&apos;
# 查看选择PCA后的`Graph`的训练结果
head(graph$train(tsk_mnist)[[1]]$feature_names)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;使用&lt;code&gt;ppl(&apos;branch&apos;, ...)&lt;/code&gt;可以快速简化上面流程&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;ppl(&apos;branch&apos;, graphs = pos(c(&apos;nop&apos;, &apos;pca&apos;, &apos;yeojohnson&apos;)))
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;构建一个后续包含学习器分支的&lt;code&gt;Graph&lt;/code&gt;，并可视化&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;graph_learner &amp;lt;- graph %&amp;gt;&amp;gt;%
 ppl(&apos;branch&apos;, lrns(c(&apos;classif.rpart&apos;, &apos;classif.kknn&apos;)))

graph_learner$plot(horizontal = TRUE)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./image_17.png&quot; alt=&quot;image_17&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;可以将&lt;code&gt;selection&lt;/code&gt;看作超参数，用来选择最合适的管道&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# `Graph`将`GraphLearner`
graph_learner &amp;lt;- as_learner(graph_learner)

# 设置待调优的超参数
graph_learner$
 param_set$
 set_values(
  # 第一个branch：预处理branch
  brnchPO.selection = to_tune(paths),
  # 第二个branch：学习器branch
  branch.selection = to_tune(
    c(&apos;classif.rpart&apos;, &apos;classif.kknn&apos;)
  ),
  # 单独设置有依赖关系的kknn的`k`
  # 因为`k`仅在选择&apos;classif.kknn&apos;时生效
  classif.kknn.k = to_tune(
   p_int(
    1, 32,
    depends = branch.selection == &apos;classif.kknn&apos;
   )
  )
 )

# 进行实例调优
instance &amp;lt;- tune(
 tnr(&apos;grid_search&apos;), 
 tsk_mnist, 
 graph_learner,
 rsmp(&apos;repeated_cv&apos;, folds = 3, repeats = 3), 
 msr(&apos;classif.ce&apos;)
)

# 查看结果
instance$archive$data[order(classif.ce)[1:5],
  .(brnchPO.selection, classif.kknn.k, branch.selection, classif.ce)]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 5 x 4&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;brnchPO.selection&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;classif.kknn.k&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;branch.selection&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;classif.ce&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;yeojohnson&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;11&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.kknn&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2533272&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;yeojohnson&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;18&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.kknn&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2556648&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;yeojohnson&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;15&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.kknn&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2556658&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;yeojohnson&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 8&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.kknn&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2563362&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;yeojohnson&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;22&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.kknn&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2600015&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;autoplot(instance)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./image_18.png&quot; alt=&quot;image_18&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;使用&lt;code&gt;po(“proxy”)&lt;/code&gt;进行调优&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;po(&apos;proxy&apos;)&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;一个元运算符，它执行存储在其 &lt;code&gt;content&lt;/code&gt; 超参数中的操作&lt;/li&gt;
&lt;li&gt;超参数可以是另一个 &lt;code&gt;PipeOp&lt;/code&gt; 或 &lt;code&gt;Graph&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;可用于调整和选择可以传递给此超参数的不同 &lt;code&gt;PipeOp&lt;/code&gt; 或 &lt;code&gt;Graph&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./image_19.png&quot; alt=&quot;image_19&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;首先要用&lt;code&gt;po()&apos;proxy&apos;)&lt;/code&gt;创建占位符 &lt;code&gt;PipeOpProxy&lt;/code&gt; 运算符&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;graph_learner &amp;lt;- po(&apos;proxy&apos;, id = &apos;preproc&apos;) %&amp;gt;&amp;gt;%
 po(&apos;proxy&apos;, id = &apos;learner&apos;)
graph_learner &amp;lt;- as_learner(graph_learner)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;超参数&lt;code&gt;content&lt;/code&gt;需要传入&lt;code&gt;p_fct()&lt;/code&gt;
内容为一组带评估的离散元素&lt;/li&gt;
&lt;li&gt;对于复杂的学习器而言，  不能直接对代理管道的内部的学习器超参数直接调优
&lt;ul&gt;
&lt;li&gt;需要对学习器进行调优，因此要创建一个上层的超参数进行调优，&lt;br /&gt;
再把调优过的上层超参数传递给下层学习器里的超参数&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# -------预处理管道
# `p_fct()`创建`content`
preproc.content &amp;lt;- p_fct(
 list(
  nop = po(&apos;nop&apos;),
  pca = po(&apos;pca&apos;),
  yeojohnson = po(&apos;removeconstants&apos;) %&amp;gt;&amp;gt;% po(&apos;yeojohnson&apos;)
 )
)

# -------学习器管道
# `p_fct()`创建`content`
learner.content &amp;lt;- p_fct(
 list(
     classif.rpart = lrn(&apos;classif.rpart&apos;),
     classif.kknn = lrn(&apos;classif.kknn&apos;)
 )
)
# 创建上层的超参数传递规则
trafo &amp;lt;- function(x, param_set) {
 if (!is.null(x$classif.kknn.k)) {
  # `$clone(deep = TRUE)`就是python的`.deepcopy()`
  # 一定要用深度复制，不然会修改掉原有`Learner`的超参数
  x$learner.content = x$learner.content$clone(deep = TRUE)
  # 将`classif.kknn.k`传递给原本KKNN学习器的`k`
  x$learner.content$param_set$values$k = x$classif.kknn.k
  # 清空`classif.kknn.k`
  x$classif.kknn.k = NULL
    }
    return(x)
}

# 创建搜索空间并将传递规则包装进去
search_space &amp;lt;- ps(
 preproc.content = preproc.content,
 learner.content = learner.content,
 # tune KKNN parameter as normal
 classif.kknn.k = p_int(
  1, 32,
  depends = learner.content == &apos;classif.kknn&apos;
 ),
 .extra_trafo = trafo
)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;将上面的构建用&lt;code&gt;tune()&lt;/code&gt;包装并进行实例调优&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 实例调优
instance &amp;lt;- tune(
 tnr(&apos;grid_search&apos;), 
 tsk_mnist, 
 graph_learner,
 rsmp(&apos;repeated_cv&apos;, folds = 3, repeats = 3), 
 msr(&apos;classif.ce&apos;),
 search_space = search_space
)

# 查看结果
as.data.table(instance$result)[,
 .(preproc.content,
 classif.kknn.k = x_domain[[1]]$learner.content$param_set$values$k,
 learner.content, classif.ce)
]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 1 x 4&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;preproc.content&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;classif.kknn.k&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;learner.content&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;classif.ce&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;yeojohnson&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;11&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.kknn&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2583492&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;关于这里&lt;code&gt;$clone(deep = TRUE)&lt;/code&gt;的用法，可以简单看看这个例子
&lt;ul&gt;
&lt;li&gt;修改&lt;code&gt;lrn.clone&lt;/code&gt;的&lt;code&gt;param_set&lt;/code&gt;也会导致&lt;code&gt;lrn&lt;/code&gt;被修改&lt;/li&gt;
&lt;li&gt;原因就是浅拷贝了&lt;code&gt;lrn&lt;/code&gt;而没有复制&lt;code&gt;lrn&lt;/code&gt;内部镶嵌的数据，&lt;br /&gt;
导致表层虽然被复制，当内部镶嵌的数据依然指向&lt;code&gt;lrn&lt;/code&gt;的内部镶嵌数据
&lt;ul&gt;
&lt;li&gt;意即：&lt;code&gt;lrn.clone&lt;/code&gt;内部镶嵌的地址和&lt;code&gt;lrn&lt;/code&gt;相同，&lt;br /&gt;
内部数据&lt;strong&gt;并非复制&lt;/strong&gt;，而是&lt;strong&gt;引用&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;lrn &amp;lt;- lrn(&apos;classif.rpart&apos;)
# Output 1
lrn$param_set

lrn.clone &amp;lt;- lrn$clone()
lrn.clone$param_set$set_values(cp = 0.5)

# Output 2
lrn.clone$param_set

# Output 3
lrn$param_set
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;ParamSet(10)&amp;gt;
                id    class lower upper nlevels        default  value
            &amp;lt;char&amp;gt;   &amp;lt;char&amp;gt; &amp;lt;num&amp;gt; &amp;lt;num&amp;gt;   &amp;lt;num&amp;gt;         &amp;lt;list&amp;gt; &amp;lt;list&amp;gt;
 1:             cp ParamDbl     0     1     Inf           0.01 [NULL]
 2:     keep_model ParamLgl    NA    NA       2          FALSE [NULL]
 3:     maxcompete ParamInt     0   Inf     Inf              4 [NULL]
 4:       maxdepth ParamInt     1    30      30             30 [NULL]
 5:   maxsurrogate ParamInt     0   Inf     Inf              5 [NULL]
 6:      minbucket ParamInt     1   Inf     Inf &amp;lt;NoDefault[0]&amp;gt; [NULL]
 7:       minsplit ParamInt     1   Inf     Inf             20 [NULL]
 8: surrogatestyle ParamInt     0     1       2              0 [NULL]
 9:   usesurrogate ParamInt     0     2       3              2 [NULL]
10:           xval ParamInt     0   Inf     Inf             10      

0&amp;lt;ParamSet(10)&amp;gt;
                id    class lower upper nlevels        default  value
            &amp;lt;char&amp;gt;   &amp;lt;char&amp;gt; &amp;lt;num&amp;gt; &amp;lt;num&amp;gt;   &amp;lt;num&amp;gt;         &amp;lt;list&amp;gt; &amp;lt;list&amp;gt;
 1:             cp ParamDbl     0     1     Inf           0.01    0.5
 2:     keep_model ParamLgl    NA    NA       2          FALSE [NULL]
 3:     maxcompete ParamInt     0   Inf     Inf              4 [NULL]
 4:       maxdepth ParamInt     1    30      30             30 [NULL]
 5:   maxsurrogate ParamInt     0   Inf     Inf              5 [NULL]
 6:      minbucket ParamInt     1   Inf     Inf &amp;lt;NoDefault[0]&amp;gt; [NULL]
 7:       minsplit ParamInt     1   Inf     Inf             20 [NULL]
 8: surrogatestyle ParamInt     0     1       2              0 [NULL]
 9:   usesurrogate ParamInt     0     2       3              2 [NULL]
10:           xval ParamInt     0   Inf     Inf             10      

0&amp;lt;ParamSet(10)&amp;gt;
                id    class lower upper nlevels        default  value
            &amp;lt;char&amp;gt;   &amp;lt;char&amp;gt; &amp;lt;num&amp;gt; &amp;lt;num&amp;gt;   &amp;lt;num&amp;gt;         &amp;lt;list&amp;gt; &amp;lt;list&amp;gt;
 1:             cp ParamDbl     0     1     Inf           0.01    0.5
 2:     keep_model ParamLgl    NA    NA       2          FALSE [NULL]
 3:     maxcompete ParamInt     0   Inf     Inf              4 [NULL]
 4:       maxdepth ParamInt     1    30      30             30 [NULL]
 5:   maxsurrogate ParamInt     0   Inf     Inf              5 [NULL]
 6:      minbucket ParamInt     1   Inf     Inf &amp;lt;NoDefault[0]&amp;gt; [NULL]
 7:       minsplit ParamInt     1   Inf     Inf             20 [NULL]
 8: surrogatestyle ParamInt     0     1       2              0 [NULL]
 9:   usesurrogate ParamInt     0     2       3              2 [NULL]
10:           xval ParamInt     0   Inf     Inf             10      0
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;带子采样的超带算法&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;本例子中用SVM来建模&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 加载R包
# library(mlr3tuning)

# 构建一个待调优的SVM学习器
learner &amp;lt;- lrn(
 &apos;classif.svm&apos;, 
 id = &apos;svm&apos;, 
 type = &apos;C-classification&apos;,
 kernel = &apos;radial&apos;, 
 cost  = to_tune(1e-5, 1e5, logscale = TRUE),
 gamma = to_tune(1e-5, 1e5, logscale = TRUE)
)

# 构建`GraphLearner`
graph_learner &amp;lt;- as_learner(
 po(
  &apos;subsample&apos;, 
  frac = to_tune(
   # `tags = &apos;budget&apos;`是传递给超带算法的标签
   # 告诉超带算法`frac`是保真度参数
   p_dbl(3^-3, 1, tags = &apos;budget&apos;)
  )
 ) %&amp;gt;&amp;gt;%
 learner
)

# 封装函数并设立回退学习器
graph_learner$encapsulate(&apos;evaluate&apos;, lrn(&apos;classif.featureless&apos;))
graph_learner$timeout &amp;lt;- c(train = 30, predict = 30)

# 实例调优
instance &amp;lt;- tune(
 tnr(&apos;hyperband&apos;, eta = 3), 
 tsk(&apos;sonar&apos;), 
 graph_learner,
 rsmp(&apos;cv&apos;, folds = 3), 
 msr(&apos;classif.ce&apos;)
)

# 查看结果
instance$result_x_domain
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;$subsample.frac
[1] 1

$svm.cost
[1] 48971.58

$svm.gamma
[1] 0.004148232
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;使用过滤管道进行特征选择&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;选择3个特征变量&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 加载R包
# library(mlr3filters)
# library(mlr3fselect)

# 创建`Task`
task_pen &amp;lt;- tsk(&apos;penguins&apos;)

# 创建连接过滤器和学习器的`Graph`
po_flt &amp;lt;- po(
 &apos;filter&apos;, 
 filter = flt(&apos;information_gain&apos;), 
 filter.nfeat = 3
)
graph &amp;lt;- po_flt %&amp;gt;&amp;gt;% po(&apos;learner&apos;, lrn(&apos;classif.rpart&apos;))

# 先用`po_flt`训练`Task`，然后打印选择后的特征变量名
po(&apos;filter&apos;, filter = flt(&apos;information_gain&apos;), filter.nfeat = 3)$
  train(list(task_pen))[[1]]$feature_names
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&apos;bill_depth&apos;&apos;bill_length&apos;&apos;flipper_length&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;对变量选择的数量进行调优&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 对过滤器的特征数量标记调优
po_filter &amp;lt;- po(
 &apos;filter&apos;, 
 filter = flt(&apos;information_gain&apos;),
 filter.nfeat = to_tune(1, task_pen$ncol)
)

# 创建一个`GraphLearner`
graph &amp;lt;- as_learner(
 po_filter %&amp;gt;&amp;gt;% 
 po(&apos;learner&apos;, lrn(&apos;classif.rpart&apos;))
)

# 实例调优
instance &amp;lt;- tune(
 tnr(&apos;random_search&apos;), 
 task_pen, graph,
 rsmp(&apos;cv&apos;, folds = 3), 
 term_evals = 10
)

# 查看结果
instance$result
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 1 x 4&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;information_gain.filter.nfeat&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;learner_param_vals&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;x_domain&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;classif.ce&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;8&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0, 8&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;8&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.06676837&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;可视化每次迭代的交叉熵
&lt;ul&gt;
&lt;li&gt;虽然交叉熵最低的是选择8个变量，&lt;br /&gt;
但事实上变量少的模型的交叉熵也不是非常高，而是几乎接近
&lt;ul&gt;
&lt;li&gt;从易解释性上而言，可以不使用最佳结果，&lt;br /&gt;
而是挑选更少的特征变量来建模&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;autoplot(instance)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./image_20.png&quot; alt=&quot;image_20&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;预处理&lt;/h2&gt;
&lt;h3&gt;示例数据&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;示例数据为&lt;code&gt;ames_housing&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;ames &amp;lt;- mlr3data::ames_housing
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;head(ames)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 6 x 82&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;Sale_Price&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;Alley&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;Bedroom_AbvGr&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;Bldg_Type&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;Bsmt_Cond&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;Bsmt_Exposure&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;Bsmt_Full_Bath&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;Bsmt_Half_Bath&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;Bsmt_Qual&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;Bsmt_Unf_SF&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;...&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;Second_Flr_SF&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;Street&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;Three_season_porch&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;Total_Bsmt_SF&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;TotRms_AbvGrd&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;Utilities&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;Wood_Deck_SF&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;Year_Built&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;Year_Remod_Add&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;Year_Sold&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;fct&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;fct&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;fct&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;fct&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;fct&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;...&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;fct&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;fct&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;215000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;OneFam&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Good   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Gd&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Typical&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 441&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;  0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Pave&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1080&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;7&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;AllPub&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;210&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1960&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1960&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2010&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;105000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;OneFam&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Typical&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;No&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Typical&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 270&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;  0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Pave&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 882&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;AllPub&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;140&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1961&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1961&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2010&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;172000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;OneFam&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Typical&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;No&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Typical&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 406&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;  0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Pave&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1329&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;6&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;AllPub&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;393&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1958&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1958&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2010&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;244000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;OneFam&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Typical&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;No&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Typical&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1045&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;  0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Pave&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2110&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;8&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;AllPub&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;  0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1968&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1968&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2010&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;189900&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;OneFam&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Typical&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;No&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Good   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 137&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;701&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Pave&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 928&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;6&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;AllPub&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;212&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1997&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1998&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2010&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;195500&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;OneFam&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Typical&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;No&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Typical&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 324&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;678&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Pave&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 926&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;7&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;AllPub&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;360&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1998&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1998&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2010&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;h3&gt;数据清洗&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;通过简单检查数据，可以发现几个问题：&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;分类仅一种（常量特征）&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;summary(ames$Misc_Feature_2)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;Othr: 2930
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;数据完全一致&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;identical(ames$Condition_2, ames$Condition_3)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;TRUE
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;尺度上数据相同&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;cor(ames$Lot_Area, ames$Lot_Area_m2)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;1
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;对于上述特征，最好的方法就是直接删除它们&lt;/li&gt;
&lt;li&gt;可以简单先标记出来&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;to_remove &amp;lt;- c(&apos;Lot_Area_m2&apos;, &apos;Condition_3&apos;, &apos;Misc_Feature_2&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;除此以外还应该检查
&lt;ul&gt;
&lt;li&gt;是否有&lt;strong&gt;重复样本&lt;/strong&gt;：&lt;code&gt;ID&lt;/code&gt;列是否全部的值是唯一的&lt;/li&gt;
&lt;li&gt;是否有&lt;strong&gt;缺失值&lt;/strong&gt;：&lt;code&gt;NA&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;是否有&lt;strong&gt;语义错误&lt;/strong&gt;：负的&lt;code&gt;Lot_Area&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;对于无法处理数值特征的学习器，&lt;br /&gt;
应该将数值特征&lt;strong&gt;编码转换&lt;/strong&gt;为分类特征&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 创建`Task`
tsk_ames &amp;lt;- as_task_regr(ames, target = &apos;Sale_Price&apos;, id = &apos;ames&apos;)
# 删除上述标记的有问题的特征变量
tsk_ames$select(setdiff(tsk_ames$feature_names, to_remove))

# 创建评估器
msr_mae &amp;lt;- msr(&apos;regr.mae&apos;)
# 创建重采样器
rsmp_cv3 &amp;lt;- rsmp(&apos;cv&apos;, folds = 3)
# 对需要重采样的`Task`构建重采样实例
rsmp_cv3$instantiate(tsk_ames)

# 创建一个无特征回归学习器，并对中位数进行预测
lrn_baseline &amp;lt;- lrn(&apos;regr.featureless&apos;, robust = TRUE) 
# 修改id名，以在后续流程中更容易识别
lrn_baseline$id &amp;lt;- &apos;Baseline&apos; 
# 进行重采样
rr_baseline &amp;lt;- resample(tsk_ames, lrn_baseline, rsmp_cv3) 

# 获取整合结果
rr_baseline$aggregate(msr_mae)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;regr.mae: 56067.172671583
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;因子编码&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;分类变量可以基于基数（cardinality）进行分组：
&lt;ul&gt;
&lt;li&gt;二元特征
&lt;ul&gt;
&lt;li&gt;独热编码&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;低基数特征
&lt;ul&gt;
&lt;li&gt;独热编码&lt;/li&gt;
&lt;li&gt;虚拟编码
&lt;ul&gt;
&lt;li&gt;广义线性模型（GLM）&lt;/li&gt;
&lt;li&gt;加法模型（GAM）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;高基数特征
&lt;ul&gt;
&lt;li&gt;影响编码
&lt;ul&gt;
&lt;li&gt;使用目标特征在分类特征和一个数值之间创建映射，&lt;br /&gt;
该数值反映其在预测目标特征时的重要性&lt;/li&gt;
&lt;li&gt;步骤
&lt;ul&gt;
&lt;li&gt;按分类特征对目标变量进行分组&lt;/li&gt;
&lt;li&gt;计算每个组中目标变量的均值&lt;/li&gt;
&lt;li&gt;计算目标变量的全局均值&lt;/li&gt;
&lt;li&gt;计算每个组的影响得分，&lt;br /&gt;
即该组目标变量的均值与目标变量全局均值之间的差值&lt;/li&gt;
&lt;li&gt;用影响得分替换分类特征&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;由于使用目标信息来计算影响分数，&lt;br /&gt;
编码过程必须嵌入到交叉验证中，&lt;br /&gt;
以避免训练数据和测试数据之间的信息泄露&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;去除常量特征&lt;/li&gt;
&lt;li&gt;合并小类别&lt;/li&gt;
&lt;li&gt;分层&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;通常超过&lt;strong&gt;10&lt;/strong&gt;个基数的可以被视为&lt;strong&gt;高基数特征&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 找出高基数特征
names(which(lengths(tsk_ames$levels()) &amp;gt; 10))
# 找出二元特征
names(which(lengths(tsk_ames$levels()) == 2))
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&apos;Exterior_1st&apos;&apos;Exterior_2nd&apos;&apos;MS_SubClass&apos;&apos;Neighborhood&apos;

&apos;Alley&apos;&apos;Central_Air&apos;&apos;Street&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;构建一个预处理的&lt;code&gt;Graph&lt;/code&gt;，注意下面顺序&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;factor_pipeline &amp;lt;-
 # 去除常量特征
    po(&apos;removeconstants&apos;) %&amp;gt;&amp;gt;%
    # 合并罕见类别
 po(
  # 合并
  &apos;collapsefactors&apos;, 
  # 设置对频率低于1%的类别进行合并
  no_collapse_above_prevalence = 0.01
 ) %&amp;gt;&amp;gt;%
 # 对高基数特征数值编码
 po(
  # 对满足指定条件的特征进行数值编码
  &apos;encodeimpact&apos;,
  # 指定作用于基数&amp;gt;2的特征
  affect_columns = selector_cardinality_greater_than(10),
  # 设置识别id
  id = &apos;high_card_enc&apos;
 ) %&amp;gt;&amp;gt;%
 # 独热编码
 po(
  # 指定处理为因子编码
  &apos;encode&apos;, 
  # 指定为独热编码
  method = &apos;one-hot&apos;,
  # 指定作用于基数&amp;gt;2的特征
  affect_columns = selector_cardinality_greater_than(2),
  # 设置识别id
  id = &apos;low_card_enc&apos;
 ) %&amp;gt;&amp;gt;%
 # 将二元特征哑变量处理
 po(
  # 指定处理为因子编码
  &apos;encode&apos;, 
  # 省略因子中第一个级别的变量
  method = &apos;treatment&apos;,
  # 指定类型为因子的特征
  # 到这一步都已经转化为数值了，
  # 所以直接筛选因子即可
  affect_columns = selector_type(&apos;factor&apos;), 
  # 设置识别id
  id = &apos;binary_enc&apos;
 )
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;将上述预处理与仅进行独热编码预处理两种方式进行benchmark比较
&lt;ul&gt;
&lt;li&gt;可见上述预处理管道的平均绝对误差比仅进行独热编码预处理更好，&lt;br /&gt;
因为平均绝对误差更小&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 构建xgboost学习器
lrn_xgb &amp;lt;- lrn(&apos;regr.xgboost&apos;, nrounds = 100)

# 将预处理管道与学习器连接并构建`GraphLearner`
glrn_xgb_impact &amp;lt;- as_learner(factor_pipeline %&amp;gt;&amp;gt;% lrn_xgb)
# 设置识别id
glrn_xgb_impact$id &amp;lt;- &apos;XGB_enc_impact&apos;

# 将仅进行独热编码的管道与学习器连接并构建`GraphLearner`
glrn_xgb_one_hot &amp;lt;- as_learner(po(&apos;encode&apos;) %&amp;gt;&amp;gt;% lrn_xgb)
# 设置识别id
glrn_xgb_one_hot$id &amp;lt;- &apos;XGB_enc_onehot&apos;

# benchmark比较
bmr &amp;lt;- benchmark(
 benchmark_grid(
  tsk_ames,
  c(lrn_baseline, glrn_xgb_impact, glrn_xgb_one_hot), 
  rsmp_cv3
 )
)

# 打印整合结果
bmr$aggregate(measure = msr_mae)[, .(learner_id, regr.mae)]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A bmr_aggregate: 3 x 2&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;learner_id&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;regr.mae&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Baseline      &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;56089.88&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;XGB_enc_impact&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;15962.13&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;XGB_enc_onehot&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;16500.48&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;h3&gt;缺失值&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;几种插补方法&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;po(&apos;imputemean&apos;)&lt;/code&gt;：均值插补&lt;/li&gt;
&lt;li&gt;&lt;code&gt;po(&apos;imputemedian&apos;)&lt;/code&gt;：中位数插补&lt;/li&gt;
&lt;li&gt;&lt;code&gt;po(&apos;imputemode&apos;)&lt;/code&gt;：众数插补&lt;/li&gt;
&lt;li&gt;&lt;code&gt;po(&apos;imputehist&apos;)&lt;/code&gt;：通过直方图估算数值特征插补&lt;/li&gt;
&lt;li&gt;&lt;code&gt;po(&apos;imputeoor&apos;)&lt;/code&gt;：&lt;br /&gt;
&lt;code&gt;.MISSING&lt;/code&gt;，范围外插补（Out of Range Imputation ）&lt;br /&gt;
用低于最小值或高于最大值的常数值填补数值特征&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;下图为均值插补的示例&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./image_21.png&quot; alt=&quot;image_21&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;查看&lt;code&gt;Task&lt;/code&gt;中包含缺失值的特征（）&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;names(which(tsk_ames$missings() &amp;gt; 0))
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&apos;Alley&apos;&apos;BsmtFin_SF_1&apos;&apos;BsmtFin_SF_2&apos;&apos;BsmtFin_Type_1&apos;&apos;BsmtFin_Type_2&apos;&apos;Bsmt_Cond&apos;&apos;Bsmt_Exposure&apos;&apos;Bsmt_Full_Bath&apos;&apos;Bsmt_Half_Bath&apos;&apos;Bsmt_Qual&apos;&apos;Bsmt_Unf_SF&apos;&apos;Electrical&apos;&apos;Fence&apos;&apos;Fireplace_Qu&apos;&apos;Garage_Area&apos;&apos;Garage_Cars&apos;&apos;Garage_Cond&apos;&apos;Garage_Finish&apos;&apos;Garage_Qual&apos;&apos;Garage_Type&apos;&apos;Garage_Yr_Blt&apos;&apos;Lot_Frontage&apos;&apos;Mas_Vnr_Area&apos;&apos;Mas_Vnr_Type&apos;&apos;Misc_Feature&apos;&apos;Pool_QC&apos;&apos;Total_Bsmt_SF&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;impute_hist &amp;lt;- list(
 # 跟踪缺失值
 po(
  # 对缺失值标记为1，否则为0
  &apos;missind&apos;, 
  # 对数据里的整数型变量生成缺失值指示变量
  type = &apos;integer&apos;,
  # 选择整数列
  affect_columns = selector_type(&apos;integer&apos;)
 ),
 # 直方图插补
 po(
  # 选择为直方图插补
  &apos;imputehist&apos;, 
  # 选择整数列
  affect_columns = selector_type(&apos;integer&apos;)
 )
) %&amp;gt;&amp;gt;%
 # 特征合并
 po(&apos;featureunion&apos;) %&amp;gt;&amp;gt;%
 # 范围外插补
 po(
  # 选择范围外插补
  &apos;imputeoor&apos;, 
  # 选择因子列
  affect_columns = selector_type(&apos;factor&apos;)
 )

# 可视化一下`Graph`
impute_hist$plot(horizontal = TRUE)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./image_22.png&quot; alt=&quot;image_22&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;通过benchmark比较上述管道和纯imputeoor方法插补的模型的性能差异&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 用上面的管道进行插补并连接随机森林
glrn_rf_impute_hist &amp;lt;- as_learner(impute_hist %&amp;gt;&amp;gt;% lrn(&apos;regr.ranger&apos;))
glrn_rf_impute_hist$id &amp;lt;- &apos;RF_imp_Hist&apos;

# 仅用imputeoor方法插补并连接随机森林
glrn_rf_impute_oor &amp;lt;- as_learner(po(&apos;imputeoor&apos;) %&amp;gt;&amp;gt;% lrn(&apos;regr.ranger&apos;))
glrn_rf_impute_oor$id &amp;lt;- &apos;RF_imp_OOR&apos;

# 进行两者的benchmark比较
design &amp;lt;- benchmark_grid(
 tsk_ames,
 c(glrn_rf_impute_hist, glrn_rf_impute_oor), 
 rsmp_cv3
)

# 这里代码有问题，会报错
# 以下为官网给出的结果
bmr_new &amp;lt;- benchmark(design)

# 查看结果
bmr$combine(bmr_new)
bmr$aggregate(measure = msr_mae)[, .(learner_id, regr.mae)]
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;       learner_id regr.mae
1:       Baseline    56056
2: XGB_enc_impact    16068
3: XGB_enc_onehot    16098
4:    RF_imp_Hist    16400
5:     RF_imp_OOR    16395
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;管道稳健化&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;ppl(&apos;robustify&apos;)&lt;/code&gt;包含以下的内容：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;po(&apos;removeconstants&apos;)&lt;/code&gt;：&lt;br /&gt;
移除常量特征&lt;/li&gt;
&lt;li&gt;&lt;code&gt;po(&apos;colapply&apos;)&lt;/code&gt;：&lt;br /&gt;
字符和序号特征编码为分类特征，&lt;br /&gt;
日期/时间特征编码为数值特征&lt;/li&gt;
&lt;li&gt;&lt;code&gt;po(&apos;imputehist&apos;)&lt;/code&gt;：&lt;br /&gt;
数值特征通过直方图采样进行插补&lt;/li&gt;
&lt;li&gt;&lt;code&gt;po(&apos;imputesample&apos;)&lt;/code&gt;：&lt;br /&gt;
逻辑特征通过从经验分布中采样进行插补，&lt;br /&gt;
这仅影响 &lt;code&gt;$predict()&lt;/code&gt; 步骤&lt;/li&gt;
&lt;li&gt;&lt;code&gt;po(&apos;missind&apos;)&lt;/code&gt;：&lt;br /&gt;
为估算的数值变量和逻辑变量添加缺失数据指示符&lt;/li&gt;
&lt;li&gt;&lt;code&gt;po(&apos;imputeoor&apos;)&lt;/code&gt;：&lt;br /&gt;
分类特征的缺失值用一个新的类别进行编码&lt;/li&gt;
&lt;li&gt;&lt;code&gt;po(&apos;fixfactors&apos;)&lt;/code&gt;：&lt;br /&gt;
修正分类特征的水平，&lt;br /&gt;
以便在预测和训练期间具有相同的水平（这可能涉及删除空因子水平）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;po(&apos;imputesample&apos;)&lt;/code&gt;：&lt;br /&gt;
上一步中因删除类别而在分类特征中引入的缺失值，&lt;br /&gt;
通过从经验分布中采样来进行插补&lt;/li&gt;
&lt;li&gt;&lt;code&gt;po(&apos;collapsefactors&apos;)&lt;/code&gt;：&lt;br /&gt;
分类特征的水平会被合并（从训练数据中最罕见的因素开始），&lt;br /&gt;
直到水平数量少于某个特定数量，
该数量由 &lt;code&gt;max_cardinality&lt;/code&gt; 参数控制（保守默认值为 &lt;code&gt;1000&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;po(&apos;encode&apos;)&lt;/code&gt;：&lt;br /&gt;
分类特征进行独热编码&lt;/li&gt;
&lt;li&gt;&lt;code&gt;po(&apos;removeconstants&apos;)&lt;/code&gt;：&lt;br /&gt;
移除可能在先前步骤中创建的常量特征&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;ppl(&apos;robustify&apos;)&lt;/code&gt; 有可选参数 &lt;code&gt;task&lt;/code&gt; 和 &lt;code&gt;learner&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果提供了这些参数，&lt;br /&gt;
那么生成的管道将被设置为专门处理给定的任务和学习器&lt;/li&gt;
&lt;li&gt;例如，如果学习器具有 &lt;code&gt;&apos;missings&apos;&lt;/code&gt; 属性，&lt;br /&gt;
或者如果任务中一开始就没有缺失值，&lt;br /&gt;
它将不会插补缺失值&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;这里用线性回归为例子&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 构建一个`GraphLearner`并命名id
glrn_lm_robust &amp;lt;- as_learner(ppl(&apos;robustify&apos;) %&amp;gt;&amp;gt;% lrn(&apos;regr.lm&apos;))
glrn_lm_robust$id &amp;lt;- &apos;lm_robust&apos;

# benchmark比较
bmr_new &amp;lt;- benchmark(
 benchmark_grid(
  tsk_ames, 
  glrn_lm_robust,  
  rsmp_cv3
 )
)
# 新管道结果与之前的bmr结果合并
bmr$combine(bmr_new)
# 获取整合结果
bmr$aggregate(measure = msr_mae)[, .(learner_id, regr.mae)]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A bmr_aggregate: 4 x 2&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;learner_id&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;regr.mae&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Baseline      &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;56159.11&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;XGB_enc_impact&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;15959.01&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;XGB_enc_onehot&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;16374.55&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;lm_robust     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;16139.08&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;h3&gt;转换特征和目标&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;对特征和目标进行简单的变换，对于某些学习器可能是有益的
&lt;ul&gt;
&lt;li&gt;对目标进行对数变换有助于使分布更加对称，并有助于减少异常值的影响&lt;/li&gt;
&lt;li&gt;对有偏态的特征进行对数变换也有助于降低异常值的影响&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;下面代码绘制了ames数据集中目标的分布，然后绘制了经过对数变换后的目标分布
对变量取对数使分布更加对称，异常值也更少。&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 加载合并plot的R包
# library(patchwork)

# 创建一个用于对数转换的
log_ames &amp;lt;- ames
# 对`Sale_Price`进行对数转换
log_ames[, logSalePrice := log(Sale_Price)]
# 绘图
autoplot(as_task_regr(log_ames, target = &apos;Sale_Price&apos;)) +
 autoplot(as_task_regr(log_ames, target = &apos;logSalePrice&apos;))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./image_23.png&quot; alt=&quot;image_23&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;手动进行简单的对数转换&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 用随机数创建示例数据
df &amp;lt;- data.table(x = runif(5), y = runif(5, 10, 20))
df

# 对y进行对数转换
df[, y := log(y)]
df$y

# 用回归模型拟合数据后进行预测
yhat = predict(lm(y ~ x, df), df)
yhat

exp(yhat)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 5 x 2&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;x&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;y&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.16287878&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;16.01323&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.17030617&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;13.71607&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.03883123&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;19.62250&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.23552246&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;10.14073&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.67070117&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;13.95870&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;       1        2        3        4        5 
2.695238 2.692759 2.736655 2.670984 2.525687 

       1        2        3        4        5 
14.80905 14.77237 15.43527 14.45419 12.49948 
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;管道&lt;code&gt;ppl(&apos;targettrafo&apos;)&lt;/code&gt;可以在重采样和benchmark比较时，&lt;br /&gt;
简单地将数据转换嵌入进去
&lt;ul&gt;
&lt;li&gt;只需要指定2个参数即可
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;targetmutate.trafo&lt;/code&gt;：&lt;br /&gt;
用于在训练期间对目标应用变换&lt;/li&gt;
&lt;li&gt;&lt;code&gt;targetmutate.inverter&lt;/code&gt;：&lt;br /&gt;
用于在预测期间应用变换以反转原始变换&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;也就是说，在训练和预测时都用转换后的数据，&lt;br /&gt;
但是在返回结果的时候是将数据反转回来的&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;glrn_log_lm_robust &amp;lt;- as_learner(
 ppl(
  &apos;targettrafo&apos;,
  graph = glrn_lm_robust,
  targetmutate.trafo = function(x) log(x),
  targetmutate.inverter = function(x){
   list(response = exp(x$response))
  }
 )
)
glrn_log_lm_robust$id &amp;lt;- &apos;lm_robust_logtrafo&apos;

bmr_new &amp;lt;- benchmark(
 benchmark_grid(
  tsk_ames, 
  glrn_log_lm_robust,
  rsmp_cv3
 )
)

bmr$combine(bmr_new)
bmr$aggregate(measure = msr_mae)[, .(learner_id, regr.mae)]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A bmr_aggregate: 5 x 2&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;learner_id&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;regr.mae&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Baseline          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;56159.11&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;XGB_enc_impact    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;15959.01&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;XGB_enc_onehot    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;16374.55&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;lm_robust         &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;16139.41&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;lm_robust_logtrafo&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;15501.52&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;h3&gt;函数特征提取&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;本节关注相互依赖的特征
&lt;ul&gt;
&lt;li&gt;因为这些特征单独存在没有用处，&lt;br /&gt;
但组合起来会提供有用信息&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;下图中
&lt;ul&gt;
&lt;li&gt;变量x1、x2、x3是常规特征&lt;/li&gt;
&lt;li&gt;变量xt1，…，xt365是函数特征&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./image_24.png&quot; alt=&quot;image_24&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;本节的示例数据
&lt;ul&gt;
&lt;li&gt;在这个数据集中，每一行代表一栋房屋，&lt;br /&gt;
每个特征是给定时间厨房电器的总耗电量&lt;/li&gt;
&lt;li&gt;耗电量以2分钟为间隔进行测量，因此产生了720个特征&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;energy_data &amp;lt;- mlr3data::energy_usage
head(energy_data)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 6 x 720&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;att1&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;att2&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;att3&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;att4&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;att5&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;att6&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;att7&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;att8&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;att9&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;att10&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;...&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;att711&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;att712&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;att713&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;att714&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;att715&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;att716&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;att717&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;att718&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;att719&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;att720&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;...&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.7152669&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.7152669&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.7152669&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.7152669&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.7152669&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.7152669&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.7152669&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.7152669&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.7152669&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.7152669&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.5711418&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.5051663&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.5011082&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.5711418&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.5051663&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 0.5011082&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 0.5711418&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 0.5751999&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 0.7112089&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 0.7112089&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.2670886&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2670886&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2670886&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2670886&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2670886&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2670886&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2670886&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2670886&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2670886&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2670886&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2670886&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2670886&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2670886&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2670886&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2670886&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 0.2670886&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 0.2670886&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 0.2670886&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 0.2670886&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 0.2670886&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.4635391&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4635391&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4796599&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4635391&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4635391&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4635391&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4796599&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4635391&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4635391&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4796599&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4796599&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4635391&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4635391&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4635391&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4796599&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 0.4635391&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 0.4635391&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 0.4635391&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 0.4796599&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 0.4635391&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.5989330&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.5989330&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.5989330&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.5026779&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.5989330&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.5989330&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.5989330&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.5026779&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.5989330&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.5989330&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.5989330&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.5989330&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.5026779&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.5989330&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.5989330&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 0.5989330&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 0.5026779&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 0.5989330&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 0.5989330&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 0.5989330&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.3445082&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.3445082&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2493033&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.3445082&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.3445082&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.3445082&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.3445082&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2493033&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.3445082&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.3445082&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.3445082&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.3445082&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.3445082&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.3445082&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5.9254138&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;10.8020196&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;13.1427906&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;10.8020196&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;11.3593466&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;10.5233566&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.3728099&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2765897&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2287661&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2765897&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.3728099&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2765897&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2765897&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.3246998&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2287661&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2765897&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.3770731&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.3070396&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.3070396&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.3292495&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.3070396&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 0.3070396&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 0.3770731&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 0.3770731&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 0.4693166&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 0.5171402&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;为了确认哪些特征是有用的，&lt;br /&gt;
先对第一个样本将2分钟间隔的连续时间点上的电力消费量做图&lt;/li&gt;
&lt;li&gt;由于每个单独的特征无法提供有用的信息，&lt;br /&gt;
不可能将720个特征都用来建模，&lt;br /&gt;
也无法选择最佳的特征变量子集&lt;/li&gt;
&lt;li&gt;可以提取曲线中有用的信息：
&lt;ul&gt;
&lt;li&gt;最大使用功率&lt;/li&gt;
&lt;li&gt;总使用功率&lt;/li&gt;
&lt;li&gt;峰值数量&lt;/li&gt;
&lt;li&gt;其他曲线中的有用特征&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 加载绘图包
# library(ggplot2)

# 对2分钟间隔的连续时间点上的电力消费量做图
ggplot(
 data.frame(y = as.numeric(energy_data[1, ])),
    aes(y = y, x = 1:720)
) +
  geom_line() + 
  theme_minimal() +
  labs(x = &apos;2-Minute Interval&apos;, y = &apos;Power Consumption&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./image_28.png&quot; alt=&quot;image_28&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;编写一个R6类的函数用于提取&lt;br /&gt;
提取功耗的均值、最小值、最大值和方差，&lt;br /&gt;
然后删除原有的特征变量&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;PipeOpFuncExtract &amp;lt;- R6::R6Class(
 # 定义一个新类`PipeOpFuncExtract`
 &apos;PipeOpFuncExtract&apos;,
 # 选择继承自`PipeOpTaskPreprocSimple`
 inherit = mlr3pipelines::PipeOpTaskPreprocSimple,
 # 定义一个私有方法
 private = list(
  # 定义函数用来变量提取
  .transform_dt = function(dt, levels) {
   # 选择所有&apos;att&apos;开头的特征变量
   ffeat_names &amp;lt;- paste0(&apos;att&apos;, 1:720)
   # 
   ffeats &amp;lt;- dt[, ..ffeat_names]
   # 提取功耗均值，最小值，最大值，反差
   dt[, energy_means := apply(ffeats, 1, mean)]
   dt[, energy_mins := apply(ffeats, 1, min)]
   dt[, energy_maxs := apply(ffeats, 1, max)]
   dt[, energy_vars := apply(ffeats, 1, var)]
   # 删除原有的特征变量
   dt[, (ffeat_names) := NULL]
   # 返回数据集
   return(dt)
  }
 )
)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;测试&lt;code&gt;PipeOp&lt;/code&gt;是否按预期工作&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 合并房屋和功耗数据集（原本是同一批样本）
tsk_ames_ext &amp;lt;- cbind(ames, energy_data)
# 创建`Task`，并更改id
tsk_ames_ext &amp;lt;- as_task_regr(tsk_ames_ext, &apos;Sale_Price&apos;, &apos;ames_ext&apos;)
# 移除那些有问题的特征（本章开头筛选出来的）
tsk_ames_ext$select(setdiff(tsk_ames_ext$feature_names, to_remove))

# 创建`PipeOpFuncExtract`类的实例并命名id
func_extractor &amp;lt;- PipeOpFuncExtract$new(&apos;energy_extract&apos;)
# 用创造的实例处理`tsk_ames_ext`
tsk_ames_ext &amp;lt;- func_extractor$train(list(tsk_ames_ext))[[1]]

# 查看第一个样本的
tsk_ames_ext$data(
 1,
 c(&apos;energy_means&apos;, &apos;energy_mins&apos;, &apos;energy_maxs&apos;, &apos;energy_vars&apos;)
)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 1 x 4&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;energy_means&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;energy_mins&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;energy_maxs&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;energy_vars&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;1.061558&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.01426834&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;21.97755&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.708473&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;接下来用benchmark比较这些管道的模型效果
&lt;ul&gt;
&lt;li&gt;通过添加合并后的电力消耗信息可以让模型拟合的更好&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;learners &amp;lt;- list(
 lrn_baseline, 
 lrn(&apos;regr.rpart&apos;), 
 glrn_xgb_impact,
 # 这个是之前构建失败的，这里就没用它了
    # glrn_rf_impute_oor, 
    glrn_lm_robust, 
    glrn_log_lm_robust
)

bmr_final &amp;lt;- benchmark(
 benchmark_grid(
 c(tsk_ames_ext, tsk_ames), 
 learners,
 rsmp_cv3)
)

# 整合结果
perf &amp;lt;- bmr_final$aggregate(measure = msr_mae)
# 对整合的结果排序后打印
perf[order(learner_id, task_id), .(task_id, learner_id, regr.mae)]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A bmr_aggregate: 10 x 3&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;task_id&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;learner_id&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;regr.mae&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;ames    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Baseline          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;56159.11&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;ames_ext&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Baseline          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;56159.11&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;ames    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;XGB_enc_impact    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;15959.01&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;ames_ext&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;XGB_enc_impact    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;14537.98&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;ames    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;lm_robust         &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;16123.83&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;ames_ext&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;lm_robust         &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;14969.29&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;ames    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;lm_robust_logtrafo&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;15510.96&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;ames_ext&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;lm_robust_logtrafo&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;13903.53&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;ames    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;regr.rpart        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;27979.09&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;ames_ext&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;regr.rpart        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;27689.78&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;h2&gt;并行化&lt;/h2&gt;
&lt;h3&gt;简介&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;使用&lt;code&gt;parallel&lt;/code&gt;包演示简单的并行化
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;chunk.size&lt;/code&gt;：处理区块&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 加载R包并设置并行化参数
# library(parallel)
cores &amp;lt;- 4
cl &amp;lt;- makeCluster(cores)

# 创建一个简单的函数
x = 1:10000
f = function(y) sqrt(y + 1)

# 单个运行
system.time({parSapply(cl, x, f, chunk.size = 1)})
# 一个区块2500个数据运行
system.time({parSapply(cl, x, f, chunk.size = 2500)})
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;   user  system elapsed 
  0.392   0.187   1.605 

   user  system elapsed 
  0.002   0.000   0.016 
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;学习器的并行化&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;构建一个随机森林学习器
&lt;ul&gt;
&lt;li&gt;查看默认线程数可知为1个（无并行化）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 构建学习器学习器
lrn_ranger &amp;lt;- lrn(&apos;classif.ranger&apos;)
lrn_ranger$param_set$ids(tags = &apos;threads&apos;)

# 查看初始默认线程数
lrn_ranger$param_set$values$num.threads
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;1
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;设置指定的线程数&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;set_threads(lrn_ranger, n = 4)
lrn_ranger$param_set$values$num.threads
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;4
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;查看可用的线程数&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;availableCores()
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;8
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;自动检测并设定最大可用线程数&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;set_threads(lrn_ranger)
lrn_ranger$param_set$values$num.threads
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;8
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;如果要控制默认使用的线程数量，&lt;br /&gt;
可在&lt;code&gt;.Rprofile&lt;/code&gt;文件中如下设置&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 设置最大4个
options(mc.cores = 4)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;重采样和benchmark的并行化&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;mlr3 利用 &lt;code&gt;future&lt;/code&gt; 实现使用并行后端对重采样迭代进行并行化
&lt;ul&gt;
&lt;li&gt;可通过 &lt;code&gt;plan()&lt;/code&gt; 函数对此进行配置&lt;/li&gt;
&lt;li&gt;默认情况下，除非在 &lt;code&gt;future::plan()&lt;/code&gt; 中指定参数 &lt;code&gt;workers&lt;/code&gt;，&lt;br /&gt;
否则会使用机器的所有 CPU&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 加载R包
# library(future)

# 计划为多核模式
future::plan(&apos;multisession&apos;)

# 重采样
tsk_sonar &amp;lt;- tsk(&apos;sonar&apos;)
lrn_rpart &amp;lt;- lrn(&apos;classif.rpart&apos;)
rsmp_cv3 &amp;lt;- rsmp(&apos;cv&apos;, folds = 3)
system.time({resample(tsk_sonar, lrn_rpart, rsmp_cv3)})
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;   user  system elapsed 
  0.471   0.053   1.926 
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;一般来说，建议&lt;strong&gt;仅对每次迭代至少运行几秒&lt;/strong&gt;的重采样考虑并行化&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;有两个 &lt;code&gt;mlr3&lt;/code&gt; 选项可用于控制执行和粒度：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果&lt;code&gt;mlr3.exec_random&lt;/code&gt;设置为&lt;code&gt;TRUE&lt;/code&gt;（默认值），
则在重抽样和基准测试中，&lt;br /&gt;
任务的顺序将被随机化；&lt;br /&gt;
适用于在运行基准测试或调参时遇到运行时间差异较大的情况&lt;/li&gt;
&lt;li&gt;选项 &lt;code&gt;mlr3.exec_chunk_size&lt;/code&gt; 可用于&lt;br /&gt;
控制将多少个任务映射到单个 &lt;code&gt;future&lt;/code&gt;，&lt;br /&gt;
默认值为 &lt;code&gt;1&lt;/code&gt;；&lt;br /&gt;
此选项的值会传递给 &lt;code&gt;future_mapply()&lt;/code&gt;，&lt;br /&gt;
并且 &lt;code&gt;future.scheduling&lt;/code&gt; 始终设置为 &lt;code&gt;TRUE&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;调整块大小在某些罕见情况下有助于减少并行化开销，&lt;br /&gt;
但在较大问题或较长运行时间的情况下不太可能有用&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;下图展示上面3折CV的重采样并行化流程：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;主进程调用&lt;code&gt;resample()&lt;/code&gt;函数，该函数启动并行化过程，&lt;br /&gt;
并将计算任务分为三个部分用于三折交叉验证&lt;/li&gt;
&lt;li&gt;这些折被传递给三个worker，&lt;br /&gt;
每个worker在任务的相应子集上拟合模型，&lt;br /&gt;
并对留出的观测值进行预测&lt;/li&gt;
&lt;li&gt;预测结果（和训练好的模型）被传回主进程，&lt;br /&gt;
主进程将它们合并为一个&lt;code&gt;ResampleResult&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./image_25.png&quot; alt=&quot;image_25&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;基准测试可以看作是多个独立重采样的集合，&lt;br /&gt;
其中任务、学习器和重采样策略的组合定义了要执行的一次重采样&lt;/li&gt;
&lt;li&gt;可以选择以下两种方式之一：
&lt;ul&gt;
&lt;li&gt;对所有重采样进行并行处理，并按顺序执行每个重采样（并行化外层循环）&lt;/li&gt;
&lt;li&gt;遍历所有重采样，并并行执行每个重采样（并行化内循环）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;foreach combination of (task, learner, resampling strategy) {
    foreach resampling iteration {
        execute(resampling, j)
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;mlr3&lt;/code&gt; 通过将所有实验展平到同一级别，&lt;br /&gt;
即 &lt;code&gt;benchmark()&lt;/code&gt; 会遍历外层和内层循环迭代的笛卡尔积中的元素
&lt;ul&gt;
&lt;li&gt;因此，无需决定是要并行化调参还是重采样，因为始终对两者都进行并行化&lt;/li&gt;
&lt;li&gt;这种方法使计算更加精细，&lt;br /&gt;
并允许 &lt;code&gt;future&lt;/code&gt; 后端将任务分组为合适大小的块（取决于工作线程数），&lt;br /&gt;
还使该过程与并行化重采样完全相同&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 创建benchmark设计
design &amp;lt;- benchmark_grid(
 tsks(c(&apos;sonar&apos;, &apos;penguins&apos;)),
 lrns(c(&apos;classif.featureless&apos;, &apos;classif.rpart&apos;)), 
 rsmp_cv3
)

# 设置并行化计算
future::plan(&apos;multisession&apos;)

# 执行并行化的benchmark比较
bmr &amp;lt;- benchmark(design)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;调优的并行化&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;调优一般是迭代的过程
&lt;ul&gt;
&lt;li&gt;每次迭代后，&lt;br /&gt;
大多数调优器会根据获得的性能值以某种方式进行自我调整&lt;/li&gt;
&lt;li&gt;随机搜索和网格搜索是例外
&lt;ul&gt;
&lt;li&gt;它们并不根据过往结果选择配置&lt;/li&gt;
&lt;li&gt;对于这些调优器而言，所有评估都是相互独立的&lt;/li&gt;
&lt;li&gt;原则上可以完全并行化。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;在&lt;code&gt;mlr3&lt;/code&gt;中作为迭代benchmark测试来实现
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Tuner&lt;/code&gt;提出一批学习器，&lt;br /&gt;
每个学习器的 param_set$values`具有不同的配置，&lt;br /&gt;
其中批次大小通常可以通过batch_size配置参数进行控制&lt;/li&gt;
&lt;li&gt;该批次会连同调优实例的重采样策略一起传递给&lt;code&gt;benchmark()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;由于每次对 &lt;code&gt;benchmark()&lt;/code&gt; 的调用都依赖于先前的结果，&lt;br /&gt;
因此通常无法在比单个基准测试更高的级别上并行化调优
&lt;ul&gt;
&lt;li&gt;相反，单个 &lt;code&gt;benchmark()&lt;/code&gt; 评估由 &lt;code&gt;mlr3&lt;/code&gt; 并行化，&lt;br /&gt;
就好像它们是无需调优的实验一样&lt;/li&gt;
&lt;li&gt;这意味着每个评估配置的单个重采样迭代都同时被并行化&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;为确保完全并行化，应确保 &lt;code&gt;batch_size&lt;/code&gt; 乘以重采样迭代次数至少等于可用工作线程数
&lt;ul&gt;
&lt;li&gt;如果期望运行时是均匀的，&lt;br /&gt;
即对单个学习器或管道进行调优，且没有任何对运行时有重大影响的超参数
&lt;ul&gt;
&lt;li&gt;那么目标是工作线程数的倍数&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;一般来说，批次越大，并行化程度越高，而批次越小，则意味着更频繁地检查终止条件&lt;/li&gt;
&lt;li&gt;无论是否使用并行化，终止条件仅在批次评估之间进行检查。&lt;/li&gt;
&lt;li&gt;以下代码展示了随机搜索的并行执行
&lt;ul&gt;
&lt;li&gt;终止条件设置为20次迭代&lt;/li&gt;
&lt;li&gt;采用中等批量大小，&lt;br /&gt;
其中36个重采样分割（每个分割有12种配置，共3种分割）在4个worker上并行评估&lt;/li&gt;
&lt;li&gt;批量大小设置为worker的倍数，以确保有效利用可用资源&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;注意：调优仅在给定批量大小的倍数之后才会终止
&lt;ul&gt;
&lt;li&gt;在这种情况下，是在24次评估之后&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;future::plan(&apos;multisession&apos;, workers = 4)

instance &amp;lt;- tune(
 tnr(&apos;random_search&apos;, batch_size = 12),
 tsk(&apos;penguins&apos;),
 lrn(&apos;classif.rpart&apos;, minsplit = to_tune(2, 128)),
 rsmp(&apos;cv&apos;, folds = 3),
 term_evals = 20
)

instance$archive$n_evals
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;24
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;结果的&lt;code&gt;24&lt;/code&gt;是怎么来的？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;batch_size = 12&lt;/code&gt;表示测试12组超参数&lt;/li&gt;
&lt;li&gt;每一组是不可拆分的，当&lt;code&gt;term_evals=20&lt;/code&gt;时
&lt;ul&gt;
&lt;li&gt;1组为12，没有超过20&lt;/li&gt;
&lt;li&gt;2折则有24组，超过了20&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;当超过20的时候，不会进行下一折的计算，&lt;br /&gt;
但是每组中的超参数都会被测试&lt;/li&gt;
&lt;li&gt;更改&lt;code&gt;batch_size = 11&lt;/code&gt;，结果为&lt;code&gt;22&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;$11 \times 2 = 22 &amp;gt; 20$&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;更改&lt;code&gt;term_evals = 37&lt;/code&gt;，结果为&lt;code&gt;48&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;$12 \times 3 =36 &amp;lt; 37$，故测试组 $(3+1) \times 12 = 48$&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;线程数的作用是什么？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;每一组的12个超参数平均分配到线程数（4）个，&lt;br /&gt;
每一个worker处理3个超参数&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CV的折数有什么关系？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;无论是3折还是30折，重采样都由相同的worker进行&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;虽然这里&lt;code&gt;term_evals&lt;/code&gt;被设置为20，但是有时并不适用于其他情况&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;例如&lt;code&gt;trm(&apos;perf_reached&apos;)&lt;/code&gt;：&lt;br /&gt;
即使该批次的第一个配置产生的性能优于给定阈值，&lt;br /&gt;
其余11个配置仍会进行不必要的评估&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;嵌套重采样并行化&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;嵌套重采样在概念上可以在三个不同层次上并行化，每个层次对应不同粒度的任务：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;外部重采样的并行化&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;一项任务就是在外部重采样分割的相应训练集上对学习器进行调优&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;在一次调优迭代中对所提出的一批超参数配置进行并行评估&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;一项任务可能是对这样一种配置进行交叉验证&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;调优中内部重采样的并行化&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;一项任务即为单个配置的训练-预测-评分步骤&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;下面是嵌套重采样并行化的伪代码的简化版&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第二层中利用了&lt;code&gt;benchmark()&lt;/code&gt;的功能：
&lt;ul&gt;
&lt;li&gt;为每个提议的超参数配置创建一个&lt;code&gt;Learner&lt;/code&gt;对象，&lt;br /&gt;
并且在最内层的for循环中，&lt;br /&gt;
所有学习器都在一个基准实验中进行重采样，&lt;br /&gt;
从而有效地在更细的粒度上&lt;br /&gt;
（提议点数乘以内部重采样迭代次数）&lt;br /&gt;
同时执行第二层和第三层&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;因此，当在&lt;code&gt;mlr3&lt;/code&gt;中对嵌套重采样进行并行化时，&lt;br /&gt;
只需要在两个选项中做出选择：
&lt;ul&gt;
&lt;li&gt;对外部重采样进行并行化&lt;/li&gt;
&lt;li&gt;还是对内部基准测试进行并行化。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# outer resampling, level 1:
for (i in seq_len(n_outer_splits)) {
 # tuning instance, in this example mainly represents the archive
 tuning_inst = ti(...)
 inner_task = get_training_task(task, outer_splits[[i]])
 # tuning loop, the details of which depend on the tuner being used
 # This does not correspond to a level:
 while (!tuning_inst$is_terminated) {
  proposed_points = propose_points(tuning_inst$archive, batch_size)
  # Evaluation of configurations, level 2:
  for (hp_configuration in proposed_points) {
   split_performances = numeric()
   # Inner resampling, level 3:
   for (j in seq_len(n_inner_splits)) {
   split_performances[j] = evaluate_performance(
    learner, 
    hp_configuration, 
    inner_task, 
    inner_splits[[j]]
   )
  }
   performance = aggregate(split_performances)
   update_archive(
    tuning_inst$archive, 
    configuration, 
    performance
   )
  }
  }
   evaluate_performance(
   learner, 
   tuning_inst$result, 
   task, outer_splits[[i]]
  )
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;下面用单程计算进重采样&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 加载R包
#library(mlr3tuning)
# 设置为单程计算
future::plan(&apos;sequential&apos;)

# 构建学习器，标记`minsplit`标记
lrn_rpart &amp;lt;- lrn(
 &apos;classif.rpart&apos;,
 minsplit  = to_tune(2, 128)
)

lrn_rpart_tuned &amp;lt;- auto_tuner(
 tnr(&apos;random_search&apos;, batch_size = 2),
 lrn_rpart, 
 rsmp(&apos;holdout&apos;), 
 msr(&apos;classif.ce&apos;), 
 2
)

rr &amp;lt;- resample(
 tsk(&apos;penguins&apos;), 
 lrn_rpart_tuned, 
 rsmp(&apos;cv&apos;, folds = 5)
)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;对于是否并行也可以选择不同的方法&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 仅对外层重采样进行并行运算
# 第二个和第一个是一样的
# 因为如果不指定为&apos;multisession&apos;都默认为&apos;sequential&apos;
future::plan(list(&apos;multisession&apos;, &apos;sequential&apos;))
future::plan(&apos;multisession&apos;)

# 仅对内层重采样进行并行运算
future::plan(list(&apos;sequential&apos;, &apos;multisession&apos;))
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;在外部5重交叉验证中并行化内部顺序2重交叉验证时四个CPU的利用率
&lt;ul&gt;
&lt;li&gt;任务标记为[外部迭代次数]-[内部迭代次数]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./image_26.png&quot; alt=&quot;image_26&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在外部使用顺序5折交叉验证对内部基准测试（由2次留出评估组成）进行并行化时，&lt;br /&gt;
四个核心的CPU利用率
&lt;ul&gt;
&lt;li&gt;任务标记为[外部迭代次数]-[内部迭代次数]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./image_27.png&quot; alt=&quot;image_27&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;在上述例子中，两种并行化方式都没有充分发挥四个核心的全部潜力&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;通过对外循环进行并行化，所有结果在16秒后计算完成&lt;/li&gt;
&lt;li&gt;如果对内循环进行并行化，则在20秒后得到结果&lt;/li&gt;
&lt;li&gt;在这两种情况下，至少在某些时间段内，部分CPU核心处于空闲状态&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;mlr3&lt;/code&gt;和&lt;code&gt;future&lt;/code&gt;使得嵌套并行化的两个循环都能够实现并行化，&lt;br /&gt;
即使在不同的并行化后端上也可以，&lt;br /&gt;
这在一些分布式计算设置中可能会很有用
对于这种嵌套并行化，可用核心的检测不起作用，&lt;br /&gt;
必须手动设置工作线程数&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;这个示例将在本地机器上最多使用四个核心运行：
&lt;ul&gt;
&lt;li&gt;首先，为外部循环生成两个新会话&lt;/li&gt;
&lt;li&gt;然后，这两个新会话各自再生成两个额外的会话，&lt;br /&gt;
以评估内部基准测试&lt;/li&gt;
&lt;li&gt;尽管在第5次外部重采样迭代运行时仍有2个核心处于空闲状态，&lt;br /&gt;
但这种方法将总运行时间缩短至12秒，&lt;br /&gt;
在这个示例中这是最优的&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;future::plan(list(
  tweak(&apos;multisession&apos;, workers = 2),
  tweak(&apos;multisession&apos;, workers = 2)
))
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;预测的并行化&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;由于多个观测值的预测相互独立，单个学习器的预测可以并行化&lt;/li&gt;
&lt;li&gt;当测试数据集非常大时，预测并行化可以缩短时间&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 构建任务，学习器并训练模型
tsk_sonar &amp;lt;- tsk(&apos;sonar&apos;)
lrn_rpart &amp;lt;- lrn(&apos;classif.rpart&apos;)
lrn_rpart$train(tsk_sonar)

# 设置并行化线程数
future::plan(&apos;multisession&apos;, workers = 4)
# 启动预测并行化，只需要设置`Learner$parallel_predict = TRUE`即可
lrn_rpart$parallel_predict = TRUE

# 预测
prediction &amp;lt;- lrn_rpart$predict(tsk_sonar)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;错误处理&lt;/h2&gt;
&lt;h3&gt;简介&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;实际构建模型中会出现很多难以预料的问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;学习器无法处理缺失值而报错&lt;/li&gt;
&lt;li&gt;存在无法处理的观测值&lt;/li&gt;
&lt;li&gt;学习器无法收敛&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;lrn(&apos;classif.debug&apos;)&lt;/code&gt;可以模拟机器学习中经常遇到的问题&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 创建任务
tsk_penguins &amp;lt;- tsk(&apos;penguins&apos;)
# 创建模拟debug学习器
lrn_debug &amp;lt;- lrn(&apos;classif.debug&apos;)
lrn_debug
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[36m--[39m [1m[34m&amp;lt;LearnerClassifDebug&amp;gt;[39m (classif.debug): Debug Learner for Classification[22m [36m-----[39m
* Model: -
* Parameters: list()
* Validate: [34m&amp;lt;NULL&amp;gt;[39m
* Packages: [34mmlr3[39m
* Predict Types: [response] and prob
* Feature Types: logical, integer, numeric, character, factor, and ordered
* Encapsulation: none (fallback: -)
* Properties: hotstart_forward, internal_tuning, marshal, missings, multiclass,
twoclass, validation, and weights
* Other settings: use_weights = &apos;use&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;默认设置下，学习者会记住一个随机标签，&lt;br /&gt;
并在不发出任何条件信号的情况下持续预测该标签
&lt;ul&gt;
&lt;li&gt;在以下代码中，让学习者在训练步骤中发出错误信号&lt;/li&gt;
&lt;li&gt;&lt;code&gt;lrn(&apos;classif.debug&apos;)&lt;/code&gt;也可以用于测试流程中如果发生错误时，&lt;br /&gt;
封装和回退学习器是否能够正常工作&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 将发出错误信号的概率设置为`1`
lrn_debug$param_set$values$error_train &amp;lt;- 1
lrn_debug$train(tsk_penguins)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;Error in get_private(learner)$.train(task): Error from classif.debug-&amp;gt;train()
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;封装（Encapsulation）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;封装可确保截获信号条件（例如消息、警告和错误），&lt;br /&gt;
并将训练或预测步骤中引发的所有条件记录到学习器中，&lt;br /&gt;
而不会中断程序流程
&lt;ul&gt;
&lt;li&gt;这意味着模型可用于拟合和预测，&lt;br /&gt;
并且任何条件都可以事后分析&lt;/li&gt;
&lt;li&gt;但是，根据错误发生的位置，实验结果&lt;strong&gt;可能会缺少模型和/或预测&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;每个&lt;code&gt;Learner&lt;/code&gt;都有方法&lt;code&gt;Learner$encapsulate()&lt;/code&gt;来控制训练或预测步骤的封装方式&lt;/li&gt;
&lt;li&gt;第一种封装执行的方式由&lt;code&gt;evaluate&lt;/code&gt;包提供
&lt;ul&gt;
&lt;li&gt;该包计算R表达式并捕获和跟踪条件（输出、消息、警告或错误）&lt;/li&gt;
&lt;li&gt;不会让它们停止进程&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# `warning_train = 1`：将训练时触发警告的概率设置为100%
# `error_train = 1`：将训练时触发错误的概率设置为100%
lrn_debug &amp;lt;- lrn(&apos;classif.debug&apos;, warning_train = 1, error_train = 1)

# 设置封装方法和回退学习器
lrn_debug$encapsulate(&apos;evaluate&apos;, fallback = lrn(&apos;classif.featureless&apos;))

# 训练模型
lrn_debug$train(tsk_penguins)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;WARN  [17:30:10.822] [mlr3] train: Warning from classif.debug-&amp;gt;train()
ERROR [17:30:10.829] [mlr3] train: Error from classif.debug-&amp;gt;train()
INFO  [17:30:10.836] [mlr3] Learner &apos;classif.debug&apos; on task &apos;penguins&apos; failed to train a model {learner: &amp;lt;LearnerClassifDebug/LearnerClassif/Learner/R6&amp;gt;, messages: (Warning from classif.debug-&amp;gt;train(), Error from classif.debug-&amp;gt;train())}
INFO  [17:30:10.841] [mlr3] Calling train method of fallback &apos;classif.featureless&apos; on task &apos;penguins&apos; with 344 observations {learner: &amp;lt;LearnerClassifFeatureless/LearnerClassif/Learner/R6&amp;gt;}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;查看警告和错误的记录&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;lrn_debug$log
lrn_debug$warnings
lrn_debug$errors
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 2 x 3&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;stage&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;class&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;msg&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;fct&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;ord&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;train&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;warning&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Warning from classif.debug-&amp;gt;train()&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;train&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span style=white-space:pre-wrap&amp;gt;error  &amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span style=white-space:pre-wrap&amp;gt;Error from classif.debug-&amp;gt;train()  &amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&apos;Warning from classif.debug-&amp;gt;train()&apos;

&apos;Error from classif.debug-&amp;gt;train()&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;另一种封装方法在&lt;code&gt;callr&lt;/code&gt;包中实现&lt;/li&gt;
&lt;li&gt;与&lt;code&gt;evaluate&lt;/code&gt;不同，计算在一个单独的R进程中处理
&lt;ul&gt;
&lt;li&gt;这可以保护调用会话免受段错误的影响，&lt;br /&gt;
否则段错误会终止整个主R会话&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;不利的一面是，启动新进程会带来相对更多的计算开销&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 设置封装方法为&apos;callr&apos;以及回退学习器
lrn_debug$encapsulate(&apos;callr&apos;, fallback = lrn(&apos;classif.featureless&apos;))
# 将错误类型修改为段错误
lrn_debug$param_set$values &amp;lt;- list(segfault_train = 1)
# 训练模型并查看错误信息
lrn_debug$train(task = tsk_penguins)$errors
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;ERROR [19:23:25.504] [mlr3] train: reached elapsed time limit
INFO  [19:23:25.509] [mlr3] Learner &apos;classif.debug&apos; on task &apos;penguins&apos; failed to train a model {learner: &amp;lt;LearnerClassifDebug/LearnerClassif/Learner/R6&amp;gt;, messages: `reached elapsed time limit`}
INFO  [19:23:25.513] [mlr3] Calling train method of fallback &apos;classif.featureless&apos; on task &apos;penguins&apos; with 344 observations {learner: &amp;lt;LearnerClassifFeatureless/LearnerClassif/Learner/R6&amp;gt;}
&apos;reached elapsed time limit&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;除了捕获错误，还可以设置一个超时时间（以秒为单位）
&lt;ul&gt;
&lt;li&gt;这样学习器就不会无限期运行（例如，由于无法收敛），&lt;br /&gt;
而是在指定时间后终止&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;在使用 &lt;code&gt;callr&lt;/code&gt; 封装时，这种方法最为可靠
&lt;ul&gt;
&lt;li&gt;因为如果学习器陷入外部编译代码中，&lt;br /&gt;
&lt;code&gt;evaluate&lt;/code&gt; 方法有时无法中断学习器&lt;/li&gt;
&lt;li&gt;如果学习器被中断，那么封装过程会将其记录为错误&lt;/li&gt;
&lt;li&gt;同样，超时时间可以针对训练和预测分别设置：&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;lrn_debug$timeout &amp;lt;- c(train = 1e-5, predict = Inf)
lrn_debug$train(task = tsk_penguins)$errors
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;WARN  [19:19:47.270] [mlr3] train: Warning from classif.debug-&amp;gt;train()
ERROR [19:19:47.281] [mlr3] train: Error from classif.debug-&amp;gt;train()
INFO  [19:19:47.289] [mlr3] Learner &apos;classif.debug&apos; on task &apos;penguins&apos; failed to train a model {learner: &amp;lt;LearnerClassifDebug/LearnerClassif/Learner/R6&amp;gt;, messages: (Warning from classif.debug-&amp;gt;train(), Error from classif.debug-&amp;gt;train())}
INFO  [19:19:47.295] [mlr3] Calling train method of fallback &apos;classif.featureless&apos; on task &apos;penguins&apos; with 344 observations {learner: &amp;lt;LearnerClassifFeatureless/LearnerClassif/Learner/R6&amp;gt;}
&apos;Error from classif.debug-&amp;gt;train()&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;如果在训练过程中出现错误，那么将没有训练好的模型可供查询&lt;/li&gt;
&lt;li&gt;或者如果在预测过程中出现错误，那么将没有预测结果可供分析&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 这里模拟训练过程中出错时，没有模型被储存的情况
lrn(&apos;classif.debug&apos;, error_train = 1)$train(tsk_penguins)$model
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;Error in get_private(learner)$.train(task): Error from classif.debug-&amp;gt;train()
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 这里模拟预测过程中出错时，有模型被储存的情况
lrn_debug &amp;lt;- lrn(&apos;classif.debug&apos;, error_predict = 1)$train(tsk_penguins)
lrn_debug$model

# 但预测是不能完成的
lrn_debug$predict(tsk_penguins)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;$response
[1] &apos;Adelie&apos;

$pid
[1] 5913

$id
[1] &apos;4461f9b7-8390-4e69-a17f-7db817b5b336&apos;

$random_number
[1] 2403

$iter
[1] 1

attr(,&apos;class&apos;)
[1] &apos;classif.debug_model&apos;


Error in get_private(learner)$.predict(task): Error from classif.debug-&amp;gt;predict()
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;回退学习器（Fallback Learners）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;假设在重采样过程中，&lt;br /&gt;
模型训练的一次或多次迭代中出现了错误，&lt;br /&gt;
有三种方法可以继续实验：
&lt;ul&gt;
&lt;li&gt;忽略出现失败的迭代
&lt;ul&gt;
&lt;li&gt;这可能是实践中最常用的方法，但从统计学角度来看并不合理&lt;/li&gt;
&lt;li&gt;假设在试图评估一个模型的性能时，&lt;br /&gt;
在某些重采样划分中，&lt;br /&gt;
如果预测时出现训练期间未见过的因子水平，&lt;br /&gt;
该模型可能会出错，&lt;br /&gt;
从而导致模型无法处理这些情况并报错；&lt;br /&gt;
如果丢弃失败的迭代，尽管模型无法对一整类特征进行预测，&lt;br /&gt;
但它看起来仍会表现良好&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;惩罚失败的学习器
&lt;ul&gt;
&lt;li&gt;不忽略失败的迭代，&lt;br /&gt;
而是估算出最差的分数（由给定的&lt;code&gt;Measure&lt;/code&gt;定义），&lt;br /&gt;
从而对失败的学习器进行严厉惩罚&lt;/li&gt;
&lt;li&gt;然而，对于许多问题来说过于苛刻&lt;/li&gt;
&lt;li&gt;而且对于某些度量，没有合理的数值可供估算&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;使用回退学习器进行训练和预测
&lt;ul&gt;
&lt;li&gt;训练一个基线学习器，并根据该模型进行预测，&lt;br /&gt;
而不是用最差的分数进行插补&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;推荐使用&lt;code&gt;lrn(&apos;classif.featureless&apos;)&lt;/code&gt;或&lt;br /&gt;
&lt;code&gt;lrn(&apos;classif.featureless&apos;)&lt;/code&gt;作为回退学习器&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 设置模拟debug学习器为训练期间发生错误
lrn_debug &amp;lt;- lrn(&apos;classif.debug&apos;, error_train = 1)
# 使用&apos;evaluate&apos;方法并设置无特征分类学习器
lrn_debug$encapsulate(&apos;evaluate&apos;, fallback = lrn(&apos;classif.featureless&apos;))
# 训练`Task`
lrn_debug$train(tsk_penguins)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;ERROR [20:27:27.572] [mlr3] train: Error from classif.debug-&amp;gt;train()
INFO  [20:27:27.576] [mlr3] Learner &apos;classif.debug&apos; on task &apos;penguins&apos; failed to train a model {learner: &amp;lt;LearnerClassifDebug/LearnerClassif/Learner/R6&amp;gt;, messages: `Error from classif.debug-&amp;gt;train()`}
INFO  [20:27:27.579] [mlr3] Calling train method of fallback &apos;classif.featureless&apos; on task &apos;penguins&apos; with 344 observations {learner: &amp;lt;LearnerClassifFeatureless/LearnerClassif/Learner/R6&amp;gt;}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;查看训练结果
&lt;ul&gt;
&lt;li&gt;由于训练发生了错误，因此没有任何模型被储存&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;lrn_debug
lrn_debug$log
lrn_debug$model
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[36m--[39m [1m[34m&amp;lt;LearnerClassifDebug&amp;gt;[39m (classif.debug): Debug Learner for Classification[22m [36m-----[39m
* Model: -
* Parameters: error_train=1
* Validate: [34m&amp;lt;NULL&amp;gt;[39m
* Packages: [34mmlr3[39m
* Predict Types: [response] and prob
* Feature Types: logical, integer, numeric, character, factor, and ordered
* Encapsulation: evaluate (fallback: LearnerClassifFeatureless)
* Properties: hotstart_forward, internal_tuning, marshal, missings, multiclass,
twoclass, validation, and weights
* Other settings: use_weights = &apos;use&apos;
[31mx[39m Errors: Error from classif.debug-&amp;gt;train()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 1 x 3&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;stage&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;class&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;msg&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;fct&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;ord&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;train&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;error&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Error from classif.debug-&amp;gt;train()&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;NULL
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;没有模型储存的话，理应是无法预测才对&lt;/li&gt;
&lt;li&gt;但是通过设置了回退学习器，预测依然可以通过`lrn(&apos;classif.featureless&apos;)执行&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;prediction &amp;lt;- lrn_debug$predict(tsk_penguins)
prediction$score()
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;classif.ce: 0.558139534883721
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;这次将错误发生几率降低到0.5&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 设置模拟debug学习器，错误几率0.5
lrn_debug &amp;lt;- lrn(&apos;classif.debug&apos;, error_train = 0.5)
# 用`evaluate`方法封装信息，并设置回退学习器
lrn_debug$encapsulate(&apos;evaluate&apos;, fallback = lrn(&apos;classif.featureless&apos;))

# benchmark比较两种方法
aggr &amp;lt;- benchmark(
 benchmark_grid(
  tsk_penguins,
  list(lrn_debug, lrn(&apos;classif.rpart&apos;)),
  rsmp(&apos;cv&apos;, folds = 20)
 )
)$aggregate(conditions = TRUE)

# 查看整合结果
aggr[, .(learner_id, warnings, errors, classif.ce)]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A bmr_aggregate: 2 x 4&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;learner_id&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;warnings&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;errors&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;classif.ce&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.debug&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;13&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.55866013&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.rpart&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.05228758&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果只是查看某一个学习器的迭代中发生错误的结果，&lt;br /&gt;
可以进行如下操作&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;rr &amp;lt;- aggr[learner_id == &apos;classif.debug&apos;]$resample_result[[1L]]
# 只看
rr$errors
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 13 x 2&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;iteration&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;msg&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Error from classif.debug-&amp;gt;train()&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; 2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Error from classif.debug-&amp;gt;train()&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; 3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Error from classif.debug-&amp;gt;train()&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; 5&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Error from classif.debug-&amp;gt;train()&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; 7&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Error from classif.debug-&amp;gt;train()&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; 8&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Error from classif.debug-&amp;gt;train()&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;10&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Error from classif.debug-&amp;gt;train()&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;13&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Error from classif.debug-&amp;gt;train()&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;14&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Error from classif.debug-&amp;gt;train()&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;16&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Error from classif.debug-&amp;gt;train()&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;18&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Error from classif.debug-&amp;gt;train()&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;19&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Error from classif.debug-&amp;gt;train()&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;20&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Error from classif.debug-&amp;gt;train()&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;h2&gt;日志记录（Logging）&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;mlr3&lt;/code&gt;中使用&lt;code&gt;lgr&lt;/code&gt;包控制输出的详细程度
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;“warn”&lt;/code&gt;：仅记录不会中断程序的警告&lt;/li&gt;
&lt;li&gt;&lt;code&gt;“info”&lt;/code&gt;：记录模型运行时间等信息以及警告信息&lt;/li&gt;
&lt;li&gt;&lt;code&gt;“debug”&lt;/code&gt;：用于调试的详细消息，以及信息和警告&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mlr3&lt;/code&gt;中默认log级别为 &lt;code&gt;&quot;info&quot;&lt;/code&gt;，&lt;br /&gt;
这意味着仅显示提供信息或更严重级别的消息，&lt;br /&gt;
即 &lt;code&gt;&quot;info&quot;&lt;/code&gt; 和 &lt;code&gt;&quot;warn&quot;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;lgr::get_logger(&apos;mlr3&apos;)$set_threshold(&apos;debug&apos;)
lgr::get_logger(&apos;mlr3&apos;)$set_threshold(&apos;warn&apos;)
lgr::get_logger(&apos;mlr3&apos;)$set_threshold(&apos;info&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;也可以针对特定R包进行设置&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;lgr::get_logger(&apos;bbotk&apos;)$set_threshold(&apos;info&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;将log输出到其他格式文件中
&lt;ul&gt;
&lt;li&gt;以下以JSON文件为例&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 生成一个唯一的临时文件路径
# 前缀为&quot;mlr3log_&quot;，扩展名固定为“.json”
tf &amp;lt;- tempfile(&apos;mlr3log_&apos;, fileext = &apos;.json&apos;)

# 获取 mlr3 的log
logger &amp;lt;- lgr::get_logger(&apos;mlr3&apos;)

# 添加JSON格式的log输出器
logger$add_appender(lgr::AppenderJson$new(tf), name = &apos;json&apos;)

# 触发警告log
logger$warn(&apos;this is a warning from mlr3&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;WARN  [22:44:09.578] this is a warning from mlr3
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;# 读取日志文件内容
x &amp;lt;- readLines(tf)
# 打印
cat(paste0(substr(x, 1, 71), &apos;\n&apos;, substr(x, 72, nchar(x))))
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;{&quot;level&quot;:300,&quot;timestamp&quot;:&quot;2025-07-08 22:44:09&quot;,&quot;logger&quot;:&quot;mlr3&quot;,&quot;caller&quot;
:&quot;eval&quot;,&quot;msg&quot;:&quot;this is a warning from mlr3&quot;}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;# 移除appender避免后续继续写入
logger$remove_appender(&apos;json&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;注意：&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;在使用并行化和/或封装时，&lt;br /&gt;
日志可能会延迟、顺序错乱，&lt;br /&gt;
或者在出现某些错误时根本不存在&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;当需要立即访问日志消息时，例如在调试时，可以选择禁用 &lt;code&gt;future&lt;/code&gt; 和封装&lt;/li&gt;
&lt;li&gt;要启用 调试模式，设置 &lt;code&gt;options(mlr3.debug = TRUE)&lt;/code&gt; 并确保学习器的 &lt;code&gt;Learner$encapsulate&lt;/code&gt; 插槽设置为 &lt;code&gt;&quot;none&quot;&lt;/code&gt;（默认值）或 &lt;code&gt;&quot;evaluate&quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;调试模式应&lt;strong&gt;仅在调试期间启用&lt;/strong&gt;，而不应在生产环境中使用，&lt;br /&gt;
因为它会禁用并行化并导致意外的随机数生成器（RNG）行为，&lt;br /&gt;
从而无法实现可重复性&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&amp;gt;-------------&lt;/h2&gt;
&lt;h2&gt;数据后端（Data Backends）&lt;/h2&gt;
&lt;h3&gt;简介&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Task&lt;/code&gt;对象将其数据存储在一个抽象数据对象，即 &lt;code&gt;DataBackend&lt;/code&gt; 中&lt;/li&gt;
&lt;li&gt;数据后端提供了一个统一的API，用于检索数据子集或查询有关数据的信息
&lt;ul&gt;
&lt;li&gt;无论数据在系统中是如何存储的&lt;/li&gt;
&lt;li&gt;默认后端通过 &lt;code&gt;DataBackendDataTable&lt;/code&gt; 类使用 &lt;code&gt;data.table&lt;/code&gt;，&lt;br /&gt;
作为一个非常快速高效的内存数据库&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;虽然将任务数据存储在内存中对于模型拟合时访问数据来说效率最高，&lt;br /&gt;
但存在两个主要缺点：
&lt;ul&gt;
&lt;li&gt;即使只需要一小部分数据，例如在进行子采样时，完整的数据集也会占用内存&lt;/li&gt;
&lt;li&gt;同时处理大型任务或多个任务，例如进行基准测试，这就会成为一个特别严重的问题&lt;/li&gt;
&lt;li&gt;在并行化过程中，需要将完整的数据传输给工作节点，这可能会增加开销&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;处理的方法有：
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;DataBackendDplyr&lt;/code&gt;：&lt;br /&gt;
为R包&lt;code&gt;dbplyr&lt;/code&gt;提供接口，扩展了&lt;code&gt;dplyr&lt;/code&gt;，&lt;br /&gt;
使其能够在许多流行的SQL数据库（如MariaDB、PostgresSQL或SQLite）上运行&lt;/li&gt;
&lt;li&gt;&lt;code&gt;DataBackendDuckDB&lt;/code&gt;：&lt;br /&gt;
用于通过 &lt;code&gt;duckdb&lt;/code&gt; 连接的 DuckDB 数据库，&lt;br /&gt;
它是 SQLite 的一种快速、零配置替代方案。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;DataBackendDuckDB&lt;/code&gt;：&lt;br /&gt;
用于Parquet文件，&lt;br /&gt;
这意味着数据无需转换为&lt;code&gt;DuckDB&lt;/code&gt;的原生存储格式，&lt;br /&gt;
而是可以直接处理包含一个或多个以流行的&lt;code&gt;Parquet&lt;/code&gt;格式存储的文件的目录&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;由于不是重点，本章略&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;使用&lt;code&gt;DataBackendDplyr&lt;/code&gt;的数据库&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# load data
requireNamespace(&apos;DBI&apos;)
requireNamespace(&apos;RSQLite&apos;)
requireNamespace(&apos;nycflights13&apos;)
data(&apos;flights&apos;, package = &apos;nycflights13&apos;)
dim(flights)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;# add column of unique row ids
flights$row_id = seq(nrow(flights))

# create sqlite database in temporary file
path = tempfile(&apos;flights&apos;, fileext = &apos;.sqlite&apos;)
con = DBI::dbConnect(RSQLite::SQLite(), path)
tbl = DBI::dbWriteTable(con, &apos;flights&apos;, as.data.frame(flights))
DBI::dbDisconnect(con)

# remove in-memory data
rm(flights)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;# establish connection
con = DBI::dbConnect(RSQLite::SQLite(), path)

# select the &apos;flights&apos; table
library(dplyr)
library(dbplyr)
tbl = tbl(con, &apos;flights&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;# 1. subset columns
keep = c(&apos;row_id&apos;, &apos;year&apos;, &apos;month&apos;, &apos;day&apos;, &apos;hour&apos;, &apos;minute&apos;, &apos;dep_time&apos;,
  &apos;arr_time&apos;, &apos;carrier&apos;, &apos;flight&apos;, &apos;air_time&apos;, &apos;distance&apos;, &apos;arr_delay&apos;)
tbl = select(tbl, all_of(keep))

# 2. filter by missing
tbl = filter(tbl, !is.na(arr_delay))

# 3. select every other row
tbl = filter(tbl, row_id %% 2 == 0)

# 4. merge infrequent carriers
infrequent = c(&apos;OO&apos;, &apos;HA&apos;, &apos;YV&apos;, &apos;F9&apos;, &apos;AS&apos;, &apos;FL&apos;, &apos;VX&apos;, &apos;WN&apos;)
tbl = mutate(tbl, carrier = case_when(
  carrier %in% infrequent ~ &apos;other&apos;,
  TRUE ~ carrier))
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;library(mlr3db)
backend_flights = as_data_backend(tbl, primary_key = &apos;row_id&apos;)
c(nrow = backend_flights$nrow, ncol = backend_flights$ncol)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;backend_flights$head()
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;tsk_flights = as_task_regr(backend_flights, id = &apos;flights_sqlite&apos;,
  target = &apos;arr_delay&apos;)
rsmp_sub002 = rsmp(&apos;subsampling&apos;, ratio = 0.02, repeats = 3)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;rr = resample(tsk_flights, lrn(&apos;regr.rpart&apos;), rsmp_sub002)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;measures = msrs(c(&apos;regr.rmse&apos;, &apos;time_train&apos;, &apos;time_predict&apos;))
rr$aggregate(measures)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;measures = msrs(c(&apos;regr.rmse&apos;, &apos;time_train&apos;, &apos;time_predict&apos;))
rr$aggregate(measures)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;rm(tbl)
DBI::dbDisconnect(con)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;使用&lt;code&gt;DataBackendDuckDB&lt;/code&gt;的&lt;code&gt;Parquet&lt;/code&gt;文件&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;path = system.file(file.path(&apos;extdata&apos;, &apos;spam.parquet&apos;),
  package = &apos;mlr3db&apos;)
backend = as_duckdb_backend(path)
as_task_classif(backend, target = &apos;type&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;扩展&lt;code&gt;mlr3&lt;/code&gt;并定义新的&lt;code&gt;Measure&lt;/code&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;过程
&lt;ul&gt;
&lt;li&gt;找到要继承的正确类&lt;/li&gt;
&lt;li&gt;使用正确的属性初始化对象（&lt;code&gt;$initialize()&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;实现执行实际计算的公共和私有方法
&lt;ul&gt;
&lt;li&gt;下例中为私有方法 &lt;code&gt;$.score()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;下面定义一个评估器
&lt;ul&gt;
&lt;li&gt;若真实值与预测值之间的差异小于真实值的一个标准差，&lt;br /&gt;
则将预测评分为 &lt;code&gt;1&lt;/code&gt;，否则将预测评分为 &lt;code&gt;0&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;$f(y, \hat{y}) = \frac{1}{n} \sum_{i=1}^n \mathbb{I}(|y_i - \hat{y}_i| &amp;lt; \sigma_y)$
&lt;ul&gt;
&lt;li&gt;$\sigma_y$：真实值的标准差&lt;/li&gt;
&lt;li&gt;$\mathbb{I}$：指示函数&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;可以用下面函数表示&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 自定义的函数
threshold_acc &amp;lt;- function(truth, response) {
 mean(ifelse(abs(truth - response) &amp;lt; sd(truth), 1, 0))
}

# 用随意的两组数据测试一下
threshold_acc(c(100, 0, 1), c(1, 11, 6))
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;0.666666666666667
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;如果要在&lt;code&gt;mlr3&lt;/code&gt;中使用的话，需要创建一个新的&lt;code&gt;R6Class&lt;/code&gt;，并且继承于&lt;code&gt;Measure&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;由于上面例子适用于回归任务，所以继承于&lt;code&gt;MeasureRegr&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;在头两行命名了类 &lt;code&gt;MeasureRegrThresholdAcc&lt;/code&gt;，&lt;br /&gt;
然后声明这是一个回归度量，它继承自 &lt;code&gt;MeasureRegr&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;通过声明其唯一ID为&lt;code&gt;&quot;thresh_acc&quot;&lt;/code&gt;，&lt;br /&gt;
不需要任何外部包（&lt;code&gt;packages = character()&lt;/code&gt;），&lt;br /&gt;
以及没有特殊属性（&lt;code&gt;properties = character()&lt;/code&gt;）&lt;br /&gt;
来初始化该类&lt;/li&gt;
&lt;li&gt;传递损失函数的具体细节，即：&lt;br /&gt;
它衡量“响应”类型预测的质量，其值介于(0, 1)之间，&lt;br /&gt;
并且该损失函数以其最大值为优化目标（&lt;code&gt;minimize = FALSE&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;将分数本身定义为一个名为 &lt;code&gt;.score&lt;/code&gt; 的私有方法，&lt;br /&gt;
在这个方法中，将预测结果传递给刚刚定义的损失函数&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;MeasureRegrThresholdAcc &amp;lt;- R6::R6Class(&apos;MeasureRegrThresholdAcc&apos;,
 # 继承`MeasureRegr`
 inherit = mlr3::MeasureRegr, 
 # 公共方法
 public = list(
  initialize = function() { # initialize class
  super$initialize(
   # 定义默认用于识别的ID
   id = &apos;thresh_acc&apos;, 
   # 依赖包：无
   packages = character(), 
   # 属性：无
   properties = character(),
   # 预测的种类：响应值&apos;response&apos;
   predict_type = &apos;response&apos;, 
   # 范围：0–1
   range = c(0, 1), 
   # 越大越好，无需最小化
   minimize = FALSE 
  )
 }
),
 # 私有方法
 private = list(
  # 定义评估方法
  .score = function(prediction, ...) {
   # 内容就是上述的函数
   threshold_acc = function(truth, response) {
    mean(ifelse(abs(truth - response) &amp;lt; sd(truth), 1, 0))
    }
   # 设置返回值
   return(threshold_acc(prediction$truth, prediction$response))
  }
 )
)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;将上面定义的&lt;code&gt;Measure&lt;/code&gt;实操&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;tsk_mtcars &amp;lt;- tsk(&apos;mtcars&apos;)
split &amp;lt;- partition(tsk_mtcars)
lrn_featureless &amp;lt;- lrn(&apos;regr.featureless&apos;)$train(tsk_mtcars, split$train)
prediction &amp;lt;- lrn_featureless$predict(tsk_mtcars, split$test)
prediction$score(MeasureRegrThresholdAcc$new())
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;thresh_acc: 0.727272727272727
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;# 也可以直接把放到`mlr_measures`通过命名`id`直接调用
mlr3::mlr_measures$add(&apos;regr.thresh_acc&apos;, MeasureRegrThresholdAcc)
prediction$score(msr(&apos;regr.thresh_acc&apos;))
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;扩展&lt;code&gt;mlr3&lt;/code&gt;并定义新的&lt;code&gt;Learner&lt;/code&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://mlr3extralearners.mlr-org.com/articles/extending.html&quot;&gt;Creating a new Learner&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 加载R包
# library(mlr3)
# library(paradox)
# library(R6)
# library(mlr3misc)

LearnerRegrRpartSimple &amp;lt;- R6Class(&quot;LearnerRegrRpartSimple&quot;,
  inherit = LearnerRegr,
  public = list(
    initialize = function() {
      param_set = ps(
        cp             = p_dbl(0, 1, default = 0.01, tags = &quot;train&quot;),
        maxcompete     = p_int(0L, default = 4L, tags = &quot;train&quot;),
        maxdepth       = p_int(1L, 30L, default = 30L, tags = &quot;train&quot;),
        maxsurrogate   = p_int(0L, default = 5L, tags = &quot;train&quot;),
        minbucket      = p_int(1L, tags = &quot;train&quot;),
        minsplit       = p_int(1L, default = 20L, tags = &quot;train&quot;),
        surrogatestyle = p_int(0L, 1L, default = 0L, tags = &quot;train&quot;),
        usesurrogate   = p_int(0L, 2L, default = 2L, tags = &quot;train&quot;),
        xval           = p_int(0L, default = 10L, tags = &quot;train&quot;)
      )
      param_set$set_values(xval = 10L)
      super$initialize(
        id = &quot;regr.rpart_simple&quot;,
        feature_types = c(&quot;logical&quot;, &quot;integer&quot;, &quot;numeric&quot;, &quot;factor&quot;, &quot;ordered&quot;),
        predict_types = &quot;response&quot;,
        packages = &quot;rpart&quot;,
        param_set = param_set,
        properties = c(&quot;weights&quot;, &quot;missings&quot;, &quot;importance&quot;),
        label = &quot;Regression Tree&quot;,
        man = &quot;mlr3::mlr_learners_regr.rpart&quot;
      )
    },
    importance = function() {
      if (is.null(self$model)) {
        stopf(&quot;No model stored&quot;)
      }
      # importance is only present if there is at least on split
      if (is.null(self$model$variable.importance)) {
        set_names(numeric())
      } else {
        sort(self$model$variable.importance, decreasing = TRUE)
      }
    }
  ),
  private = list(
    .train = function(task) {
      pv = self$param_set$get_values(tags = &quot;train&quot;)
      pv$weights = private$.get_weights(task)
      
      invoke(
        rpart::rpart,
        formula = task$formula(),
        data = task$data(),
        .args = pv
      )
    },
    .predict = function(task) {
      pv = self$param_set$get_values(tags = &quot;predict&quot;)

      # ensure same column order in train and predict
      newdata = mlr3extralearners:::ordered_features(task, self)
      response = invoke(predict, self$model, newdata = newdata, .args = pv)
      list(response = unname(response))
    }
  )
)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;&lt;code&gt;openML&lt;/code&gt;：用于大规模benchmarking&lt;/h2&gt;
&lt;h3&gt;简介&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;大规模（large-scale）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;意味着它们可能会使用许多数据集、度量标准和学习器&lt;/li&gt;
&lt;li&gt;数据集必须涵盖广泛的领域和问题类型，&lt;br /&gt;
因为只能针对基准研究中所使用的数据集类型得出结论&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;mlr3oml&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;为&lt;code&gt;mlr3&lt;/code&gt;和OpenML提供一个借口
&lt;ul&gt;
&lt;li&gt;OpenML：用于上传和下载数据集的常用工具&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;mlr3batchmark&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;将&lt;code&gt;mlr3&lt;/code&gt;和&lt;code&gt;batchtools&lt;/code&gt;连接起来
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;batchtools&lt;/code&gt;：提供了高性能计算群集上管理和执行实验的方法&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;首先先进行简单的benchmark比较&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;除了&lt;code&gt;german_credit&lt;/code&gt;数据集，&lt;br /&gt;
其他两个数据集上随机森林的表现更优&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# ----------构建学习器
# 无特征值基线学习器
lrn_baseline &amp;lt;- lrn(&quot;classif.featureless&quot;, id = &quot;featureless&quot;)

# 构建逻辑回归学习器
lrn_lr &amp;lt;- lrn(&quot;classif.log_reg&quot;)
# 构建用于逻辑回归的`GraphLearner`
# ppl(&quot;robustify&quot;, learner = lrn_lr)表示用于逻辑回归的管道
lrn_lr &amp;lt;- as_learner(ppl(&quot;robustify&quot;, learner = lrn_lr) %&amp;gt;&amp;gt;% lrn_lr)
# 识别id
lrn_lr$id &amp;lt;- &quot;logreg&quot;
# 封装及回退学习器
lrn_lr$encapsulate(&quot;try&quot;, fallback = lrn_baseline)

# 构建随机森林学习器
lrn_rf &amp;lt;- lrn(&quot;classif.ranger&quot;)
# 构建用于随机森林的`GraphLearner`
lrn_rf &amp;lt;- as_learner(ppl(&quot;robustify&quot;, learner = lrn_rf) %&amp;gt;&amp;gt;% lrn_rf)
# 识别id
lrn_rf$id &amp;lt;- &quot;ranger&quot;
# 封装及回退学习器
lrn_rf$encapsulate(&quot;try&quot;, fallback = lrn_baseline)

# 放到一个`list`里
learners &amp;lt;- list(lrn_lr, lrn_rf, lrn_baseline)

# ----------benchmark比较
# benchmark比较的实验设计
design &amp;lt;- benchmark_grid(
 tsks(c(&quot;german_credit&quot;, &quot;sonar&quot;, &quot;pima&quot;)),
 learners, 
 rsmp(&quot;cv&quot;, folds = 10)
)
# 执行benchmark比较
bmr &amp;lt;- benchmark(design)
# 查看结果
bmr$aggregate(msr(&quot;classif.acc&quot;))[, .(task_id, learner_id, classif.acc)]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&quot;dataframe&quot;&amp;gt;
&amp;lt;caption&amp;gt;A bmr_aggregate: 9 x 3&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;task_id&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;learner_id&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;classif.acc&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;german_credit&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;logreg     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.7510000&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;german_credit&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;ranger     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.7670000&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;german_credit&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;featureless&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.7000000&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;sonar        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;logreg     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.7345238&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;sonar        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;ranger     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.8076190&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;sonar        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;featureless&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.5333333&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;pima         &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;logreg     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.7708134&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;pima         &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;ranger     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.7708647&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;pima         &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;featureless&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.6510253&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;h3&gt;使用OpenML获取数据&lt;/h3&gt;
&lt;h4&gt;数据集&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;可以通过网站或其REST API（&lt;code&gt;mlr3oml&lt;/code&gt;接口）从OpenML中查找数据&lt;/li&gt;
&lt;li&gt;&lt;code&gt;list_oml_data()&lt;/code&gt; 可用于根据特定属性筛选数据集，&lt;br /&gt;
例如根据特征数量、行数或分类问题中的类别数量进行筛选&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 加载R包
# library(mlr3oml)

# 筛选数据mm
odatasets &amp;lt;- list_oml_data(
 # 特征量在10–20间
 number_features = c(10, 20),
 # 样本数量在45000–50000间
 number_instances = c(45000, 50000),
 # 分类级别为2个
 number_classes = 2
)

# 打印筛选出来的数据集
odatasets[
 NumberOfFeatures &amp;lt; 16,
 c(
  &quot;data_id&quot;, 
  &quot;name&quot;, 
  &quot;NumberOfFeatures&quot;, 
  &quot;NumberOfInstances&quot;
 )
]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&quot;dataframe&quot;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 12 x 4&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;data_id&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;name&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;NumberOfFeatures&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;NumberOfInstances&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;  179&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;adult                                   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;15&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;48842&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; 1590&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;adult                                   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;15&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;48842&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;43898&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;adult                                   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;15&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;48790&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;45051&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;adult-test                              &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;15&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;48842&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;45068&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;adult                                   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;15&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;48842&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;46468&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Give-Me-Some-Credit-Sampled             &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;11&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;45000&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;46518&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Give-Me-Some-Credit-Sampled-Preprocessed&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;11&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;45000&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;46553&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Loan_Status                             &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;14&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;45000&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;46554&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Loan_Status                             &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;14&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;45000&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;46563&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Loan_Approval_Status_Classification     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;14&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;45000&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;46565&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Loan_Approval_Status                    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;14&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;45000&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;46910&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;bank-marketing                          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;14&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;45211&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;OMLData&lt;/code&gt;对象包含有关数据集的元数据，不包含数据本身
&lt;ul&gt;
&lt;li&gt;这意味着，无需将整个数据加载到内存中就可以查询有关数据集的信息&lt;/li&gt;
&lt;li&gt;例如，数据的许可协议和维度&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;如果想处理实际数据，那么访问&lt;code&gt;$data&lt;/code&gt; 字段将下载数据，&lt;br /&gt;
然后将 &lt;code&gt;data.table&lt;/code&gt; 存储在 &lt;code&gt;OMLData&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;缓存：&lt;br /&gt;
在首次调用 &lt;code&gt;$data&lt;/code&gt; 之后，&lt;br /&gt;
所有后续对 &lt;code&gt;$data&lt;/code&gt; 的调用将被透明地重定向到内存中的 data.frame&lt;/li&gt;
&lt;li&gt;通过将选项 &lt;code&gt;mlr3oml.cache&lt;/code&gt; 设置为 &lt;code&gt;TRUE&lt;/code&gt; 或设置为用作缓存文件夹的特定路径，&lt;br /&gt;
许多对象可以永久缓存在本地文件系统上&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;查看&lt;code&gt;id&lt;/code&gt;为&lt;code&gt;1590&lt;/code&gt;的数据集&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 选择数据集
odata &amp;lt;- odt(id = 1590)
odata

# 许可协议
odata$license

# 纬度
c(nrow = odata$nrow, ncol = odata$ncol)

# 下载部分切片
odata$data[1:5, 1:5]
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&apos;Public&apos;
nrow48842ncol15
INFO  [23:34:36.779] Retrieving ARFF {url: `https://api.openml.org/data/v1/download/1595261/adult.arff`, authenticated: `FALSE`}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&quot;dataframe&quot;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 5 x 5&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;age&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;workclass&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;fnlwgt&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;education&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;education.num&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;fct&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;fct&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;25&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Private  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;226802&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;11th        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 7&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;38&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Private  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 89814&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;HS-grad     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 9&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;28&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Local-gov&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;336951&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Assoc-acdm  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;12&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;44&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Private  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;160323&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Some-college&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;10&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;18&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;103497&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Some-college&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;10&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;可以使用 &lt;code&gt;as_data_backend()&lt;/code&gt; 函数转换为 &lt;code&gt;mlr3&lt;/code&gt; 后端，然后再转换为任务&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 转换后端
backend &amp;lt;- as_data_backend(odata)
# 创建`Task`
tsk_adult &amp;lt;- as_task_classif(backend, target = &quot;class&quot;)
# 查看`Task`
tsk_adult
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;
[36m--[39m [1m[34m&amp;lt;TaskClassif&amp;gt;[39m (48842x15)[22m [36m----------------------------------------------------[39m
* Target: class
* Target classes: &amp;gt;50K (positive class, 24%), &amp;lt;=50K (76%)
* Properties: twoclass
* Features (14):
  * fct (8): education, marital.status, native.country, occupation, race,
  relationship, sex, workclass
  * int (6): age, capital.gain, capital.loss, education.num, fnlwgt,
  hours.per.week
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;OpenML上的一些数据集包含既不应用作特征也不应用作目标的列&lt;/li&gt;
&lt;li&gt;通常作为特征包含的列名可通过字段 &lt;code&gt;$feature_names&lt;/code&gt; 访问，&lt;br /&gt;
可以相应地将它们分配给 &lt;code&gt;mlr3&lt;/code&gt; 任务&lt;/li&gt;
&lt;li&gt;虽然对于当前的数据集而言非必要操作，&lt;br /&gt;
因为所有非目标列都将被视为预测变量，&lt;br /&gt;
但为清晰起见，还是将其包含在内&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;tsk_adult$col_roles$feature &amp;lt;- odata$feature_names
tsk_adult
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[36m--[39m [1m[34m&amp;lt;TaskClassif&amp;gt;[39m (48842x15)[22m [36m----------------------------------------------------[39m
* Target: class
* Target classes: &amp;gt;50K (positive class, 24%), &amp;lt;=50K (76%)
* Properties: twoclass
* Features (14):
  * fct (8): education, marital.status, native.country, occupation, race,
  relationship, sex, workclass
  * int (6): age, capital.gain, capital.loss, education.num, fnlwgt,
  hours.per.week
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;任务&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;OpenML任务构建在OpenML数据集之上&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;额外指定目标变量，用于重采样的训练-测试分割等&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;OpenML任务与&lt;code&gt;mlr3&lt;/code&gt; &lt;code&gt;Task&lt;/code&gt;对象不同，&lt;br /&gt;
&lt;strong&gt;后者不包含有关重采样过程的信息&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;与&lt;code&gt;mlr3&lt;/code&gt;类似，OpenML有不同类型的任务，如回归和分类&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;与筛选数据集类似，任务可以使用&lt;code&gt;list_oml_tasks()&lt;/code&gt;进行筛选&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;例子还是刚刚&lt;code&gt;id = 1590&lt;/code&gt;的数据集&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 将刚刚的数据集id传递给`data_id`参数以便于识别
adult_tasks &amp;lt;- list_oml_tasks(data_id = 1590)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;由数据集创建的任务有很多
&lt;ul&gt;
&lt;li&gt;这里选择&lt;code&gt;&apos;Supervised Classification&apos;&lt;/code&gt;的任务&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;adult_tasks[task_type == &quot;Supervised Classification&quot;, task_id]
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;1. 7592
2. 14947
3. 126025
4. 146154
5. 146598
6. 168878
7. 233099
8. 359983
9. 361515
10. 362136
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;otsk()&lt;/code&gt;加载对象数据集，返回一个&lt;code&gt;OMLTask&lt;/code&gt;对象&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 选择任务
otask &amp;lt;- otsk(id = 359983)

# 查看任务
otask

# 查看完整数据
otask$data

# 查看数据集的划分
otask$task_splits %&amp;gt;% head()
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;OMLTask:359983&amp;gt;
 * Type: Supervised Classification
 * Data: adult (id: 1590; dim: 48842x15)
 * Target: class
 * Estimation: crossvalidation (id: 1; repeats: 1, folds: 10)


&amp;lt;OMLData:1590:adult&amp;gt; (48842x15)
 * Default target: class
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&quot;dataframe&quot;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 6 x 4&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;type&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;rowid&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;repeat.&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;fold&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;fct&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;TRAIN&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;32427&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;TRAIN&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;13077&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;TRAIN&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;15902&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;TRAIN&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;17703&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;TRAIN&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;35511&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;TRAIN&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;44497&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;从&lt;code&gt;OMLTask&lt;/code&gt;对象&lt;strong&gt;提取&lt;/strong&gt;&lt;code&gt;Task&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;tsk_adult &amp;lt;- as_task(otask)
tsk_adult
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[36m--[39m [1m[34m&amp;lt;TaskClassif&amp;gt;[39m (48842x15)[22m [36m----------------------------------------------------[39m
* Target: class
* Target classes: &amp;gt;50K (positive class, 24%), &amp;lt;=50K (76%)
* Properties: twoclass
* Features (14):
  * fct (8): education, marital.status, native.country, occupation, race,
  relationship, sex, workclass
  * int (6): age, capital.gain, capital.loss, education.num, fnlwgt,
  hours.per.week
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;从&lt;code&gt;OMLTask&lt;/code&gt;里&lt;strong&gt;提取&lt;/strong&gt;&lt;code&gt;Resampling&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;resampling &amp;lt;- as_resampling(otask)
resampling
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[36m--[39m [1m[34m&amp;lt;ResamplingCustom&amp;gt;[39m : Custom Splits[22m [36m------------------------------------------[39m
* Iterations: [34m10[39m
* Instantiated: [34mTRUE[39m
* Parameters: list()
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;tsk()&lt;/code&gt;可以允许上面两个步骤一步到位&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;tsk(&quot;oml&quot;, task_id = 359983)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[36m--[39m [1m[34m&amp;lt;TaskClassif&amp;gt;[39m (48842x15)[22m [36m----------------------------------------------------[39m
* Target: class
* Target classes: &amp;gt;50K (positive class, 24%), &amp;lt;=50K (76%)
* Properties: twoclass
* Features (14):
  * fct (8): education, marital.status, native.country, occupation, race,
  relationship, sex, workclass
  * int (6): age, capital.gain, capital.loss, education.num, fnlwgt,
  hours.per.week
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;任务集合&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;OpenML任务集合是一个捆绑现有任务的容器对象
&lt;ul&gt;
&lt;li&gt;这使得可以创建benchmark测试套件，&lt;br /&gt;
即满足特定质量标准的指定任务集合&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;OMLCollection&lt;/code&gt;对象通过&lt;code&gt;ocl()&lt;/code&gt;加载&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;otask_collection &amp;lt;- ocl(id = 99)
otask_collection
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;INFO  [01:38:51.539] Retrieving JSON [90m{[39m[38;5;169murl[39m[90m: [39m`https://www.openml.org/api/v1/json/study/99`[90m, [39m[38;5;169mauthenticated[39m[90m: [39m`FALSE`[90m}[39m
&amp;lt;OMLCollection: 99&amp;gt; OpenML-CC18 Curated Class[...]
 * data:  72
 * tasks: 72
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;查看前五个任务&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;otask_collection$task_ids[1:5] 
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[1]  3  6 11 12 14
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;任务集合可用于在 &lt;code&gt;mlr3&lt;/code&gt; 中快速定义基准实验&lt;/li&gt;
&lt;li&gt;使用 &lt;code&gt;as_tasks()&lt;/code&gt;和 &lt;code&gt;as_resamplings()&lt;/code&gt;&lt;br /&gt;
轻松构建基准测试套件中的所有任务和重采样&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;tasks &amp;lt;- as_tasks(otask_collection)
resamplings &amp;lt;- as_resamplings(otask_collection)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;进一步筛选数据
&lt;ul&gt;
&lt;li&gt;进行一个包含六项任务的二分类实验，&lt;br /&gt;
我们可以将CC - 18数据集中的任务ID作为参数&lt;code&gt;task_id&lt;/code&gt;来运行&lt;code&gt;list_oml_tasks()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;既可以使用&lt;code&gt;list_oml_tasks()&lt;/code&gt;的参数，&lt;br /&gt;
要求类别数量为&lt;code&gt;2&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;可以通过&lt;code&gt;list_oml_tasks()&lt;/code&gt;的返回结果是&lt;code&gt;data.table&lt;/code&gt;，&lt;br /&gt;
从而对生成的表格进行子集化处理&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;binary_cc18 &amp;lt;- list_oml_tasks(
  # 上限6个任务
  limit = 6,
  # 用id选择任务
  task_id = otask_collection$task_ids,
  # 筛选二元分类的变量
  number_classes = 2
)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;将选定的任务转换为&lt;code&gt;OMLTask&lt;/code&gt;并提取&lt;code&gt;Task&lt;/code&gt;和&lt;code&gt;Resampling&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 批量传递选择的id给`otsk()`
otasks &amp;lt;- lapply(binary_cc18$task_id, otsk)

# 提取`Task`和`Resampling`
tasks &amp;lt;- as_tasks(otasks)
resamplings &amp;lt;- as_resamplings(otasks)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;设计benchmark测试&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# ----------这里是最开始的学习器管道
# 无特征值基线学习器
lrn_baseline &amp;lt;- lrn(&quot;classif.featureless&quot;, id = &quot;featureless&quot;)

# 构建逻辑回归学习器
lrn_lr &amp;lt;- lrn(&quot;classif.log_reg&quot;)
# 构建用于逻辑回归的`GraphLearner`
# ppl(&quot;robustify&quot;, learner = lrn_lr)表示用于逻辑回归的管道
lrn_lr &amp;lt;- as_learner(ppl(&quot;robustify&quot;, learner = lrn_lr) %&amp;gt;&amp;gt;% lrn_lr)
# 识别id
lrn_lr$id &amp;lt;- &quot;logreg&quot;
# 封装及回退学习器
lrn_lr$encapsulate(&quot;try&quot;, fallback = lrn_baseline)

# 构建随机森林学习器
lrn_rf &amp;lt;- lrn(&quot;classif.ranger&quot;)
# 构建用于随机森林的`GraphLearner`
lrn_rf &amp;lt;- as_learner(ppl(&quot;robustify&quot;, learner = lrn_rf) %&amp;gt;&amp;gt;% lrn_rf)
# 识别id
lrn_rf$id &amp;lt;- &quot;ranger&quot;
# 封装及回退学习器
lrn_rf$encapsulate(&quot;try&quot;, fallback = lrn_baseline)

# 放到一个`list`里
learners &amp;lt;- list(lrn_lr, lrn_rf, lrn_baseline)


# benchmark设计
large_design &amp;lt;- benchmark_grid(
 tasks, 
 learners, 
 resamplings,
 paired = TRUE
)
# 查看前六个实验
large_design[1:6] 
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;       task     learner resampling
     &amp;lt;char&amp;gt;      &amp;lt;char&amp;gt;     &amp;lt;char&amp;gt;
1: kr-vs-kp      logreg     custom
2: kr-vs-kp      ranger     custom
3: kr-vs-kp featureless     custom
4: breast-w      logreg     custom
5: breast-w      ranger     custom
6: breast-w featureless     custom
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;高性能计算集群上的benchmark测试&lt;/h2&gt;
&lt;h3&gt;简介&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;batchtools&lt;/code&gt; 提供了一个框架，&lt;br /&gt;
用于简化在这类站点上从R语言并行运行大量计算实验的过程
&lt;ul&gt;
&lt;li&gt;它具有高度的灵活性，适用于各种计算实验，&lt;br /&gt;
包括机器学习、优化、模拟等&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./image_29.png&quot; alt=&quot;image_29&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;实验注册表设置&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;library(batchtools)

# create registry
reg = makeExperimentRegistry(
  file.dir = &quot;./experiments&quot;,
  seed = 1,
  packages = &quot;mlr3verse&quot;
)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;library(mlr3batchmark)
batchmark(large_design, reg = reg)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;reg
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;job_table = getJobTable(reg = reg)
job_table = unwrap(job_table)
job_table = job_table[,
  .(job.id, learner_id, task_id, resampling_id, repl)
]

job_table
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;作业工作&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;result = testJob(1, external = TRUE, reg = reg)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;cf = makeClusterFunctionsSlurm(template = &quot;slurm-simple&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;reg$cluster.functions = cf
saveRegistry(reg = reg)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;ids = job_table$job.id
chunks = data.table(
  job.id = ids, chunk = chunk(ids, chunk.size = 5, shuffle = FALSE)
)
chunks[1:6] # first 6 jobs
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;resources = list(ncpus = 1, walltime = 3600, memory = 8000)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;submitJobs(ids = chunks, resources = resources, reg = reg)

# wait for all jobs to terminate
waitForJobs(reg = reg)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;工作监控、错误处理与结果收集&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;getStatus(reg = reg)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;extra_design = benchmark_grid(tasks,
  lrn(&quot;classif.debug&quot;, error_train = 0.5), resamplings, paired = TRUE)

batchmark(extra_design, reg = reg)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;ids = findNotSubmitted(reg = reg)
submitJobs(ids, reg = reg)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;getStatus(reg = reg)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;error_ids = findErrors(reg = reg)
summarizeExperiments(error_ids, by = c(&quot;task_id&quot;, &quot;learner_id&quot;),
  reg = reg)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;ids = findExperiments(algo.pars = learner_id != &quot;classif.debug&quot;,
  reg = reg)
bmr = reduceResultsBatchmark(ids, reg = reg)
bmr$aggregate()[1:5]
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;使用batchtools进行自定义实验&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;reg = makeExperimentRegistry(
  file.dir = &quot;./experiments-custom&quot;,
  seed = 1,
  packages = &quot;mlr3verse&quot;
)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;for (i in seq_along(tasks)) {
  addProblem(
    name = tasks[[i]]$id,
    data = list(task = tasks[[i]], resampling = resamplings[[i]]),
    fun = function(data, job, ...) data,
    reg = reg
  )
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./image_30.png&quot; alt=&quot;image_30&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;addAlgorithm(
  &quot;run_learner&quot;,
  fun = function(instance, learner, job, ...) {
    resample(instance$task, learner, instance$resampling)
  },
  reg = reg
)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;alg_des = list(run_learner = data.table(learner = learners))
addExperiments(algo.designs = alg_des, reg = reg)
summarizeExperiments()
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;submitJobs(reg = reg)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;rr = loadResult(1, reg = reg)
as.data.table(rr)[1:5]
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;bmr = reduceResults(c, reg = reg)
bmr$aggregate()[1:5]
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;统计分析&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;library(mlr3benchmark)
bma = as_benchmark_aggr(bmr, measures = msr(&quot;classif.ce&quot;))
bma$friedman_posthoc()
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;autoplot(bma, type = &quot;cd&quot;, ratio = 1/5)
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>【mlr3】5.模型解释</title><link>https://nab-iak.github.io/posts/p14/p14/</link><guid isPermaLink="true">https://nab-iak.github.io/posts/p14/p14/</guid><description>mlr3模型解释</description><pubDate>Fri, 18 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Cover Pic by &lt;a href=&quot;https://www.pixiv.net/artworks/131650016&quot;&gt;@Lin&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://mlr3book.mlr-org.com/&quot;&gt;Applied Machine Learning Using mlr3 in R&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;简介&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;模型解释的方法
&lt;ul&gt;
&lt;li&gt;为了全面了解一个模型，&lt;br /&gt;
确定哪些特征总体上最为重要，&lt;br /&gt;
或者这些特征如何影响预测结果&lt;/li&gt;
&lt;li&gt;如果（在数据或模型中）发现缺陷，&lt;br /&gt;
例如模型意外地依赖于某一特征，&lt;br /&gt;
需对模型进行改进&lt;/li&gt;
&lt;li&gt;为了理解和控制单个预测，&lt;br /&gt;
例如确定如果某个特征发生改变，&lt;br /&gt;
给定的预测可能会如何变化&lt;/li&gt;
&lt;li&gt;为了评估算法公平性，&lt;br /&gt;
检查模型是否对某些子群体或个体产生不利影响&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;示例学习器&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;以一个梯度提升机（GBM）为例，&lt;br /&gt;
该模型拟合了“german_credit”任务中一半的特征&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 加载R包
# library(mlr3verse)

tsk_german &amp;lt;- tsk(&apos;german_credit&apos;)$
 select(
  cols = c(
   &apos;duration&apos;, 
   &apos;amount&apos;, 
   &apos;age&apos;, 
   &apos;status&apos;, 
   &apos;savings&apos;, 
   &apos;purpose&apos;,
   &apos;credit_history&apos;, 
   &apos;property&apos;, 
   &apos;employment_duration&apos;, 
   &apos;other_debtors&apos;
  )
)
split &amp;lt;- partition(tsk_german)
lrn_gbm &amp;lt;- lrn(&apos;classif.gbm&apos;, predict_type = &apos;prob&apos;)
lrn_gbm$train(tsk_german, row_ids = split$train)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;&lt;code&gt;iml&lt;/code&gt; 包&lt;/h2&gt;
&lt;h3&gt;简介&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;iml&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;为各种与模型无关的解释方法实现了一个统一接口，&lt;br /&gt;
有助于分析和解释机器学习模型&lt;/li&gt;
&lt;li&gt;支持由 &lt;strong&gt;任何&lt;/strong&gt; R 包拟合的机器学习模型（用于分类或回归），&lt;br /&gt;
特别是所有 &lt;code&gt;mlr3&lt;/code&gt; 模型都通过将学习器包装在 Predictor 对象中来提供支持，&lt;br /&gt;
该对象统一了训练模型的输入输出行为&lt;/li&gt;
&lt;li&gt;此对象包含预测模型以及用于分析模型和生成所需解释的数据&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 加载R包
# library(iml)

# 测试集的特征变量
credit_x &amp;lt;- tsk_german$data(
 rows = split$test,
 cols = tsk_german$feature_names
)
# 测试集的预测变量
credit_y &amp;lt;- tsk_german$data(
 rows = split$test,
 cols = tsk_german$target_names
)

# 构建一个预测器
predictor &amp;lt;- Predictor$new(lrn_gbm, data = credit_x, y = credit_y)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;特征重要性（Feature Importance）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;最流行的特征重要性方法之一是排列特征重要性（PFI）
&lt;ul&gt;
&lt;li&gt;特征排列是指对数据集中单个特征的观测值进行随机打乱的过程&lt;/li&gt;
&lt;li&gt;这会消除该特征与目标变量以及所有其他特征之间的原始依赖结构，&lt;br /&gt;
同时保持该特征的边际分布&lt;/li&gt;
&lt;li&gt;PFI衡量的是在排列某个特征之前（原始模型性能）和&lt;br /&gt;
之后（排列后模型性能）模型性能的变化&lt;/li&gt;
&lt;li&gt;如果某个特征不重要，那么排列该特征后模型性能的变化就会很小；&lt;br /&gt;
相反，如果该特征更为重要，我们预计模型性能会明显下降&lt;/li&gt;
&lt;li&gt;通常建议重复排列过程，并在多次重复中汇总性能变化，&lt;br /&gt;
以减少结果的随机性&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;在&lt;code&gt;iml&lt;/code&gt;中运行PFI，需构建一个&lt;code&gt;FeatureImp&lt;/code&gt;类的对象，并指定性能度量，
&lt;ul&gt;
&lt;li&gt;这里我们使用分类误差&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;默认情况下，为缩短计算时间，&lt;br /&gt;
排列重复五次，并且在每次重复中，计算与分类误差变化相对应的重要性值
&lt;ul&gt;
&lt;li&gt;在调用构造函数&lt;code&gt;$new()&lt;/code&gt;时，&lt;br /&gt;
可以使用&lt;code&gt;n.repetitions&lt;/code&gt;改变此设置，&lt;br /&gt;
本例中设置&lt;code&gt;n.repetitions = 100&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$plot()&lt;/code&gt;方法展示五个所得重要性值的中位数（以点表示），&lt;br /&gt;
图中的误差线边界对应重要性值的5%和95%分位数&lt;/li&gt;
&lt;li&gt;默认情况下，&lt;code&gt;FeatureImp&lt;/code&gt;会将重排前后模型性能的&lt;strong&gt;比率&lt;/strong&gt;作为重要性值进行计算；&lt;br /&gt;
在调用&lt;code&gt;$new()&lt;/code&gt;时传入&lt;code&gt;compare = &apos;difference&apos;&lt;/code&gt;，则可以返回性能指标的&lt;strong&gt;差值&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;importance &amp;lt;- FeatureImp$new(
 predictor, 
 loss = &apos;ce&apos;, 
 n.repetitions = 100
)
importance$plot() + theme_bw()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./image_1.png&quot; alt=&quot;image_1&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;特征效应（Feature Effects）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;通过分析当改变一个特征时预测如何变化，来描述一个特征对模型预测的贡献方式或程度&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;这些方法可以分为局部特征效应方法和全局特征效应方法&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;全局特征效应方法：&lt;br /&gt;
是指当一个特征发生变化时，平均而言预测如何变化&lt;/li&gt;
&lt;li&gt;局部特征效应方法：&lt;br /&gt;
当一个特征值发生变化时，给定观测值的单个预测如何变化&lt;/li&gt;
&lt;li&gt;当局部效应存在异质性时，&lt;br /&gt;
即如果局部效应的变化在不同观测值之间有所不同，&lt;br /&gt;
局部特征效应方法可以揭示模型中的&lt;strong&gt;相互作用&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;个体条件期望（ICE）曲线（其他条件不变效应&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一种局部特征效应方法，&lt;br /&gt;
用于展示在改变某个感兴趣特征时，&lt;br /&gt;
单个观测值的预测结果如何变化，而所有其他特征保持不变&lt;/li&gt;
&lt;li&gt;构建方法：&lt;br /&gt;
选取单个观测值和感兴趣的特征，然后用另一个值替换该特征的值，&lt;br /&gt;
并绘制新的预测结果，随后对该特征的许多值重复此过程&lt;br /&gt;
（例如，在该特征值范围的等距网格上进行）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;特征效应与线性模型中的回归系数 β 非常相似&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;回归系数的解释为：&lt;br /&gt;
如果在其他所有特征保持不变的情况下，将此特征增加一个单位，预测值平均会增加 β”&lt;/li&gt;
&lt;li&gt;特征效应并不局限于线性效应，还可以应用于任何类型的预测模型&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;下例为对特征&lt;code&gt;amount&lt;/code&gt;的效应的评估&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;传递感兴趣的特征名称和特征效应方法，初始化&lt;code&gt;FeatureEffect&lt;/code&gt;类的对象&lt;/li&gt;
&lt;li&gt;使用&lt;code&gt;&apos;pdp+ice&apos;&lt;/code&gt;表示希望用部分依赖（PD）图（ICE曲线的平均值）来&lt;br /&gt;
可视化个体条件期望（ICE）曲线&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;下图中，黄色的部分依赖（PD）图和黑色的个体条件期望（ICE）曲线，&lt;br /&gt;
展示了信贷金额如何影响预测的信用风险&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果金额大致小于10,000，那么平均而言，&lt;br /&gt;
预测信用状况良好的可能性很大&lt;/li&gt;
&lt;li&gt;ICE曲线大致平行，这意味着在涉及金额的情况下，&lt;br /&gt;
似乎不存在强烈的相互作用&lt;/li&gt;
&lt;li&gt;建议始终将PD曲线和ICE曲线一起绘制，因为单独的PD图可能会掩盖异质性效应&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;effect &amp;lt;- FeatureEffect$new(
 predictor, 
 feature = &apos;amount&apos;,
 method = &apos;pdp+ice&apos;
)
effect$plot() + theme_bw()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./image_2.png&quot; alt=&quot;image_2&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;代理模型（Surrogate Models）&lt;/h3&gt;
&lt;h4&gt;简介&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;可解释模型（如决策树或线性模型）可用作替代模型，以近似或模拟通常非常复杂的黑箱模型&lt;/li&gt;
&lt;li&gt;用于训练替代模型的特征通常与用于训练黑盒模型的特征相同，&lt;br /&gt;
或者至少是具有相同分布的数据，&lt;br /&gt;
以确保输入空间具有代表性
&lt;ul&gt;
&lt;li&gt;用于训练替代模型的目标是从黑盒模型获得的预测结果，&lt;br /&gt;
而不是基础数据的真实结果&lt;/li&gt;
&lt;li&gt;只有当替代模型很好地逼近黑盒模型时（即模型保真度较高时），&lt;br /&gt;
从替代模型得出的结论才有效
&lt;ul&gt;
&lt;li&gt;测量并报告替代模型的逼近误差也很重要&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;用于训练黑盒模型的数据可能非常复杂或有限，&lt;br /&gt;
这使得直接在这些数据上训练一个表现良好的可解释模型具有挑战性&lt;/li&gt;
&lt;li&gt;可以使用黑盒模型在输入空间的特定区域生成新的带标签数据，&lt;br /&gt;
利用这些数据来扩充原始数据&lt;/li&gt;
&lt;li&gt;扩充后的数据可用于训练一个可解释模型，
该模型能够捕捉并解释黑盒模型（在特定区域）学到的关系，&lt;br /&gt;
或者识别缺陷或意外行为。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;全局代理模型&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;初始化 &lt;code&gt;TreeSurrogate&lt;/code&gt; 类会将条件推断树（&lt;code&gt;ctree()&lt;/code&gt;）替代模型&lt;br /&gt;
应用于训练好的模型的预测结果
&lt;ul&gt;
&lt;li&gt;该类提取由树替代模型创建的决策规则&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$plot()&lt;/code&gt; 方法可视化每个终端节点预测结果的分布&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;下例中，向构造函数传入 &lt;code&gt;maxdepth = 2&lt;/code&gt; 以构建具有两个二元分裂的树，&lt;br /&gt;
从而产生四个终端节点&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;tree_surrogate &amp;lt;- TreeSurrogate$new(predictor, maxdepth = 2L)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;首先需要检查代理模型是否准确地逼近预测模型
&lt;ul&gt;
&lt;li&gt;可以通过比较树状代理模型的预测结果与黑箱模型的预测结果来进行评估&lt;/li&gt;
&lt;li&gt;例如，可以量化匹配预测的数量，&lt;br /&gt;
并衡量代理模型在预测黑箱GBM模型预测结果时的准确性&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;在输出结果中
&lt;ul&gt;
&lt;li&gt;与黑盒模型相比，代理模型的预测准确率约为82%&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;pred_surrogate &amp;lt;- tree_surrogate$predict(
 credit_x, 
 type = &apos;class&apos;
)$.class
pred_surrogate &amp;lt;- factor(
 pred_surrogate, 
 levels = c(&apos;good&apos;, &apos;bad&apos;)
)
pred_gbm &amp;lt;- lrn_gbm$predict_newdata(credit_x)$response
confusion &amp;lt;- mlr3measures::confusion_matrix(
 pred_surrogate, 
 pred_gbm,
 positive = &apos;good&apos;
)
confusion
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;        truth
response good bad
    good  261  13
    bad    31  25
acc :  0.8667; ce  :  0.1333; dor :  16.1911; f1  :  0.9223 
fdr :  0.0474; fnr :  0.1062; fomr:  0.5536; fpr :  0.3421 
mcc :  0.4692; npv :  0.4464; ppv :  0.9526; tnr :  0.6579 
tpr :  0.8938 
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;通过绘制终端节点中的分割情况对上述结果作进一步解释，&lt;br /&gt;
结果中：
&lt;ul&gt;
&lt;li&gt;图片展示由树替代模型识别的每个终端节点的预测结果分布&lt;/li&gt;
&lt;li&gt;前两个节点包含账户余额为正的申请&lt;br /&gt;
（status为&apos;0 &amp;lt;= ... &amp;lt; 200 DM&apos;、&apos;... &amp;gt;= 200 DM&apos;或&apos;salary for at least 1 year&apos;），&lt;br /&gt;
且期限小于或等于42个月（左上方），或超过42个月（右上方）&lt;/li&gt;
&lt;li&gt;底部节点包含没有支票账户或账户余额为负的申请人（status），&lt;br /&gt;
且期限小于或等于36个月（左下方）或超过36个月（右下方）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;tree_surrogate$plot() + theme_bw()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./image_3.png&quot; alt=&quot;image_3&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;通过&lt;code&gt;$tree&lt;/code&gt;字段访问训练好的树形代理，&lt;br /&gt;
该字段属于&lt;code&gt;TreeSurrogate&lt;/code&gt;对象，&lt;br /&gt;
之后便能访问&lt;code&gt;partykit&lt;/code&gt;中的所有方法&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;partykit::print.party(tree_surrogate$tree)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[1] root
|   [2] status in no checking account, ... &amp;lt; 0 DM
|   |   [3] credit_history in delay in paying off in the past, critical account/other credits elsewhere, existing credits paid back duly till now: *
|   |   [4] credit_history in no credits taken/all credits paid back duly, all credits at this bank paid back duly: *
|   [5] status in 0&amp;lt;= ... &amp;lt; 200 DM, ... &amp;gt;= 200 DM / salary for at least 1 year
|   |   [6] credit_history in delay in paying off in the past, critical account/other credits elsewhere, existing credits paid back duly till now: *
|   |   [7] credit_history in no credits taken/all credits paid back duly, all credits at this bank paid back duly: *
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;局部代理模型&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;一般来说，要在整个特征空间中用可解释的替代模型准确逼近黑盒模型是非常困难的&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;因此，局部替代模型聚焦于特征空间中围绕感兴趣点的一个小区域&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;局部替代模型构建如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;获取黑盒模型对给定数据集的预测结果&lt;/li&gt;
&lt;li&gt;根据观测值与我们所关注的点的接近程度，对该数据集中的观测值进行加权&lt;/li&gt;
&lt;li&gt;在加权数据集上使用黑箱模型的预测结果作为目标，拟合一个可解释的替代模型&lt;/li&gt;
&lt;li&gt;用代理模型解释我们感兴趣点的预测结果&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;下例中，选择一个样本并取名为&lt;code&gt;Charlie&lt;/code&gt;为例&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;首先查看黑箱预测的结果&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;以60.1%的概率预测类别为&lt;code&gt;&apos;good&apos;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 选择样本
Charlie &amp;lt;- tsk_german$data(
 rows = 127L, 
 cols = tsk_german$feature_names
)
# 预测
gbm_predict &amp;lt;- predictor$predict(Charlie)
# 查看
gbm_predict
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.frame: 1 x 2&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;good&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;bad&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.671859&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.328141&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;可以使用&lt;code&gt;LocalModel&lt;/code&gt;来找出做出此预测的原因
&lt;ul&gt;
&lt;li&gt;底层代理模型是局部加权L1惩罚线性回归模型，&lt;br /&gt;
这样每个类别只有预先定义数量的特征，&lt;br /&gt;
即k（默认值为3），会有非零系数
&lt;ul&gt;
&lt;li&gt;因此这些特征就是k个最具影响力的特征&lt;/li&gt;
&lt;li&gt;本例中将&lt;code&gt;k = 2&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;还可以设置参数&lt;code&gt;gower.power&lt;/code&gt;指定了局部模型的邻域大小&lt;br /&gt;
（默认值为&lt;code&gt;gower.power = 1&lt;/code&gt;），&lt;br /&gt;
该值越小，模型就越关注靠近感兴趣点的点
&lt;ul&gt;
&lt;li&gt;本例中将&lt;code&gt;gower.power = 0.1&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;此实现与局部可解释模型无关解释（LIME）密切相关&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;predictor$class &amp;lt;- &apos;good&apos; 
local_surrogate &amp;lt;- LocalModel$new(
 predictor, 
 Charlie, 
 gower.power = 0.1,
 k = 2
)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;如果局部模型的预测结果与黑盒梯度提升机（GBM）模型的预测结果差异很大，&lt;br /&gt;
那么可能需要尝试更改 &lt;code&gt;k&lt;/code&gt; 和 &lt;code&gt;gower.power&lt;/code&gt; 参数
&lt;ul&gt;
&lt;li&gt;这些参数可被视为局部代理模型的超参数，&lt;br /&gt;
为获得准确的局部代理模型，应对其进行调整&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;检查对Charlie的预测结果是否匹配：&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;c(
 gbm = gbm_predict[[1]], 
 local = local_surrogate$predict()[[1]]
)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;      gbm     local 
0.6718590 0.6450047 
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;理想情况下，应该评估查理局部邻域内代理模型的保真度，&lt;br /&gt;
即局部代理模型对查理附近多个数据点的黑盒梯度提升机（GBM）模型预测的近似程度
&lt;ul&gt;
&lt;li&gt;评估这种局部模型保真度的一种实用方法是，&lt;br /&gt;
在查理的局部邻域内生成人工数据点&lt;br /&gt;
（并可能应用基于距离的加权），&lt;br /&gt;
或者从原始数据中选择k个最近邻&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;为了便于说明，使用根据高尔距离从10个最近邻（包括查理）&lt;br /&gt;
计算出的平均绝对误差来量化近似误差
&lt;ul&gt;
&lt;li&gt;针对查理的10个最近邻，&lt;br /&gt;
局部代理模型与黑箱模型的预测结果仅相差0.084，
可以认为局部模型与黑箱模型之间有良好一致性&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 提取最邻近的10个样本的id
ind_10nn &amp;lt;- gower::gower_topn(
 Charlie, 
 credit_x, 
 n = 10)$index[, 1]
# 用id索引数据
Charlie_10nn &amp;lt;- credit_x[ind_10nn, ]

# 预测器预测结果
gbm_pred_10nn &amp;lt;- predictor$predict(Charlie_10nn)[[1]]
# 代理模型预测结果
local_pred_10nn &amp;lt;- local_surrogate$predict(Charlie_10nn)[[1]]
# 计算平均绝对误差
mean(abs(gbm_pred_10nn - local_pred_10nn))
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[1] 0.08418002
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;预测影响结果影响最大的特征
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;duration&lt;/code&gt;和&lt;code&gt;status=no checking account&lt;/code&gt;是重要的特征&lt;/li&gt;
&lt;li&gt;它们的影响均是负面的&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;local_surrogate$results[, c(&apos;feature.value&apos;, &apos;effect&apos;)]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&quot;dataframe&quot;&amp;gt;
&amp;lt;caption&amp;gt;A data.frame: 2 x 2&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;feature.value&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;effect&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;duration&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;duration=12               &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-0.005847644&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;status=no checking account&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;status=no checking account&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-0.092311934&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;h3&gt;夏普利值（Shapley Values）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;沙普利值最初是在合作博弈论的背景下提出的，&lt;br /&gt;
用于研究如何在组成团队的参与者之间公平分配博弈的收益&lt;/li&gt;
&lt;li&gt;在机器学习中，作为一种局部解释方法，&lt;br /&gt;
用于解释每个输入特征对单个观测值的最终模型预测的贡献
&lt;ul&gt;
&lt;li&gt;参与者即特征&lt;/li&gt;
&lt;li&gt;应在各特征之间公平分配的收益，&lt;br /&gt;
指的是单个观测值的预测与平均预测之间的差异&lt;/li&gt;
&lt;li&gt;夏普利值估计了每个输入特征对单个观测值的最终预测贡献了多少&lt;br /&gt;
（在减去平均预测值之后）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;与作为局部代理模型的惩罚线性模型相比，&lt;br /&gt;
夏普利值保证了预测在各个特征之间得到公平分配，&lt;br /&gt;
因为在计算每个特征的贡献时，也考虑了特征之间的&lt;strong&gt;相互作用&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;沙普利值经常被&lt;strong&gt;误解&lt;/strong&gt;为从模型训练中移除特征后预测值之间的差异
&lt;ul&gt;
&lt;li&gt;一个特征的沙普利值是通过考虑所有可能的特征子集，&lt;br /&gt;
并计算包含和不包含感兴趣特征时模型预测的差异来计算的&lt;/li&gt;
&lt;li&gt;它指的是在给定当前特征集的情况下，&lt;br /&gt;
一个特征对实际预测值与平均预测值之差的平均边际贡献&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;通过将&lt;code&gt;Predictor&lt;/code&gt;和感兴趣的观测值传递给&lt;code&gt;Shapley&lt;/code&gt;的构造函数，&lt;br /&gt;
可以计算夏普利值
&lt;ul&gt;
&lt;li&gt;夏普利值的精确计算很耗时，&lt;br /&gt;
因为这涉及考虑所有可能的特征组合来计算某个特征的边际贡献，&lt;br /&gt;
因此，夏普利值的估计通常采用近似计算&lt;/li&gt;
&lt;li&gt;可以增大&lt;code&gt;sample.size&lt;/code&gt;参数（默认值为&lt;code&gt;sample.size = 100&lt;/code&gt;），&lt;br /&gt;
以获得对精确夏普利值更准确的近似&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;下面是对&lt;code&gt;Charlie&lt;/code&gt;的夏普利值的计算及可视化
&lt;ul&gt;
&lt;li&gt;实际预测值（0.63）表示模型对我们感兴趣的观测值的预测&lt;/li&gt;
&lt;li&gt;平均预测值（0.71）表示给定测试数据集上的平均预测值&lt;/li&gt;
&lt;li&gt;每个水平条是给定特征的夏普里值（phi）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;shapley &amp;lt;- Shapley$new(
 predictor, 
 x.interest = as.data.frame(Charlie),
 sample.size = 1000
)
shapley$plot() + theme_bw()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./image_4.png&quot; alt=&quot;image_4&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;特征的夏普值（$\phi$）展示了如何在给定特征之间，&lt;br /&gt;
将&lt;code&gt;Charlie&lt;/code&gt;信用良好的概率与数据集平均概率之间的差异进行公平分配
&lt;ul&gt;
&lt;li&gt;如果所有夏普值（$\phi$）之和等于实际预测值与平均预测值之间的差异，&lt;br /&gt;
那么这种近似就足够好&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;在这里使用了&lt;code&gt;sample.size = 1000&lt;/code&gt;，&lt;br /&gt;
使得查理的实际预测值（0.601）与&lt;br /&gt;
平均预测值（0.696）之间的预测差异达到 -0.09，&lt;br /&gt;
效果足够好&lt;/li&gt;
&lt;li&gt;变量&lt;code&gt;purpose&lt;/code&gt;对信用良好的概率具有最积极的影响，&lt;br /&gt;
预测概率增加了约5%&lt;/li&gt;
&lt;li&gt;相比之下，变量&lt;code&gt;status&lt;/code&gt;导致预测概率降低了超过10%&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;code&gt;counterfactuals&lt;/code&gt;包&lt;/h2&gt;
&lt;h3&gt;简介&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;counterfactuals&lt;/code&gt;包试图找出&lt;br /&gt;
对给定观测的输入特征进行尽可能小的改变，&lt;br /&gt;
从而导致不同的预测&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./image_5.png&quot; alt=&quot;image_5&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;假设分析法（What-If Method）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;对于要解释的给定预测，反事实是数据集中具有所需预测的最接近的数据点&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;通常，可能存在许多可能的反事实数据点&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;一些早期的假设分析法仅生成单个、有点随意的反事实解释，&lt;br /&gt;
当反事实用于对模型的洞察或采取行动时可能会被视为有问题&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;可以使用假设分析方法来了解为使预测概率提高到75%，各特征需要如何变化&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用&lt;code&gt;WhatIfClassif&lt;/code&gt;对象和&lt;code&gt;Predictor&lt;/code&gt;进行初始化，&lt;br /&gt;
并声明我们只想找到一个反事实（&lt;code&gt;n_counterfactuals = 1L&lt;/code&gt;），&lt;br /&gt;
增加&lt;code&gt;n_counterfactuals&lt;/code&gt;会返回指定数量的最接近感兴趣点的反事实&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$find_counterfactuals()&lt;/code&gt;方法生成一个&lt;code&gt;Counterfactuals&lt;/code&gt;类的反事实
&lt;ul&gt;
&lt;li&gt;本例中将期望的预测概率设置在0.75到1之间（&lt;code&gt;desired_prob = c(0.75, 1)&lt;/code&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$evaluate(show_diff = TRUE)&lt;/code&gt;方法表示需要如何改变特征以生成我们期望的类别&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;下例的输出结果中表示为了达到75%的信用良好概率，&lt;br /&gt;
各个特征需要做出的变化条件&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 加载R包
# library(counterfactuals)

whatif &amp;lt;- WhatIfClassif$new(predictor, n_counterfactuals = 1L)
cfe &amp;lt;- whatif$find_counterfactuals(
 Charlie,
 desired_class = &apos;good&apos;, 
 desired_prob = c(0.75, 1)
)
data.frame(cfe$evaluate(show_diff = TRUE))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&quot;dataframe&quot;&amp;gt;
&amp;lt;caption&amp;gt;A data.frame: 1 x 15&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;age&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;amount&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;credit_history&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;duration&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;employment_duration&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;other_debtors&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;property&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;purpose&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;savings&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;status&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;dist_x_interest&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;no_changed&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;dist_train&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;dist_target&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;minimality&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;-10&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;6&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;... &amp;gt;= 200 DM / salary for at least 1 year&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.1178903&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;h3&gt;最小改变量（MOC）方法&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;生成多个通过人工生成的反事实，这些反事实可能与给定数据集中的观测值不相等。反事实的生成基于一个优化问题，该问题旨在生成满足以下条件的反事实：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;具有期望的预测结&lt;/li&gt;
&lt;li&gt;接近所关注的观测值&lt;/li&gt;
&lt;li&gt;只需要改变几个特征&lt;/li&gt;
&lt;li&gt;与给定数据集中的观测值源自相同的分布&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在多目标优化反事实生成法（MOC）中，&lt;br /&gt;
所有四个目标通过一种多目标优化方法同时进行优化&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;其他几种反事实方法依赖于单目标优化方法，&lt;br /&gt;
即多个目标被合并为一个单一目标，例如，使用加权和
&lt;ul&gt;
&lt;li&gt;单目标方法引发了对目标适当加权的担忧，&lt;br /&gt;
并且无法考虑各个目标之间固有的权衡&lt;/li&gt;
&lt;li&gt;此外，它可能会将反事实搜索的解集限制为单个候选解&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;多目标优化反事实生成法（MOC）返回一组相对于这四个目标而言&lt;br /&gt;
非支配的、因此同样良好的反事实（类似于帕累托前沿）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;调用MOC方法与假设分析方法类似，但使用的是一个&lt;code&gt;MOCClassif()&lt;/code&gt;对象&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;将&lt;code&gt;epsilon&lt;/code&gt;参数设置为0，&lt;br /&gt;
以便在优化过程中对预测值超出所需范围的反事实情况进行惩罚&lt;/li&gt;
&lt;li&gt;可以通过&lt;code&gt;fixed_features&lt;/code&gt;参数禁止特定特征发生变化，&lt;br /&gt;
本例中限制&lt;code&gt;age&lt;/code&gt;变量的变化&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;仅让多目标优化器运行30次以减少计算时间&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;moc &amp;lt;- MOCClassif$new(
 predictor, 
 epsilon = 0, 
 n_generations = 30L,
 fixed_features = &apos;age&apos;
)
cfe_multi &amp;lt;- moc$find_counterfactuals(
 Charlie,
 desired_class = &apos;good&apos;, 
 desired_prob = c(0.75, 1)
)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;多目标方法并不能保证所有反事实样本都具有所需的预测结果，&lt;br /&gt;
因此使用 &lt;code&gt;$subset_to_valid()&lt;/code&gt; 将反事实样本限制为感兴趣的那些&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;cfe_multi$subset_to_valid()
cfe_multi
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;3 Counterfactual(s) 
 
Desired class: good 
Desired predicted probability range: [0.75, 1] 
 
Head: 
     age amount                              credit_history duration
   &amp;lt;int&amp;gt;  &amp;lt;int&amp;gt;                                      &amp;lt;fctr&amp;gt;    &amp;lt;int&amp;gt;
1:    40    701 no credits taken/all credits paid back duly       12
2:    40   2418 no credits taken/all credits paid back duly        5
3:    40    701 no credits taken/all credits paid back duly        8
   employment_duration other_debtors              property             purpose
                &amp;lt;fctr&amp;gt;        &amp;lt;fctr&amp;gt;                &amp;lt;fctr&amp;gt;              &amp;lt;fctr&amp;gt;
1:    1 &amp;lt;= ... &amp;lt; 4 yrs          none unknown / no property furniture/equipment
2:    1 &amp;lt;= ... &amp;lt; 4 yrs          none unknown / no property furniture/equipment
3:    1 &amp;lt;= ... &amp;lt; 4 yrs          none unknown / no property furniture/equipment
                      savings                                     status
                       &amp;lt;fctr&amp;gt;                                     &amp;lt;fctr&amp;gt;
1: unknown/no savings account ... &amp;gt;= 200 DM / salary for at least 1 year
2: unknown/no savings account                        no checking account
3: unknown/no savings account                        no checking account
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;这种方法生成了3个反事实样本
&lt;ul&gt;
&lt;li&gt;但由于这些样本是人工生成的，&lt;br /&gt;
因此不一定等同于基础数据集中的实际观测值&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$get_freq_of_feature_changes()&lt;/code&gt;方法
&lt;ul&gt;
&lt;li&gt;返回计算的数值结果&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$plot_freq_of_feature_changes()&lt;/code&gt; 方法
&lt;ul&gt;
&lt;li&gt;该方法将可视化所有返回的反事实样本中特征变化的频率&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;cfe_multi$get_freq_of_feature_changes()
cfe_multi$plot_freq_of_feature_changes()
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;           duration              amount              status                 age 
          0.6666667           0.3333333           0.3333333           0.0000000 
     credit_history employment_duration       other_debtors            property 
          0.0000000           0.0000000           0.0000000           0.0000000 
            purpose             savings 
          0.0000000           0.0000000 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./image_6.png&quot; alt=&quot;image_6&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;可视化&lt;code&gt;duration&lt;/code&gt;和&lt;code&gt;amount&lt;/code&gt;的二位ICE图
&lt;ul&gt;
&lt;li&gt;预测值越高颜色越浅&lt;/li&gt;
&lt;li&gt;颜色和等高线表示当&lt;code&gt;duration和&lt;/code&gt;amount`不同，&lt;br /&gt;
而所有其他特征设置为真实值时模型的预测值&lt;/li&gt;
&lt;li&gt;白点显示真实预测值，&lt;br /&gt;
黑点是仅对这两个特征进行改变的反事实值&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;cfe_multi$plot_surface(
 # 因为只能是二维的，所以只能写2个
 feature_names = c(&apos;duration&apos;, &apos;amount&apos;)
) +
    theme(
  axis.text.x = element_text(
   angle = 15, 
   hjust = .7
  )
 )
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./image_7.png&quot; alt=&quot;image_7&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;&lt;code&gt;DALEX&lt;/code&gt;包&lt;/h2&gt;
&lt;h3&gt;简介&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;方法类似于&lt;code&gt;iml&lt;/code&gt;，但侧重于模型比较&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;该R包的逻辑假设：  拉氏视角&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;探索模型的过程是迭代的，在连续的迭代中，&lt;br /&gt;
我们希望比较不同的视角，包括不同模型呈现/学习到的视角&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;DALEX&lt;/code&gt; 包能与使用 &lt;code&gt;mlr3&lt;/code&gt; 构建的任何分类和回归模型一起使用，&lt;br /&gt;
也可以与 R 中的其他框架一起使用&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;一旦熟悉了使用 DALEX 包的原理，就可以使用这个系列中的其他包，例如&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;fairmodels&lt;/code&gt;：用于检测和减轻偏差&lt;/li&gt;
&lt;li&gt;&lt;code&gt;modelStudio&lt;/code&gt;：用于交互式模型探索&lt;/li&gt;
&lt;li&gt;&lt;code&gt;modelDown&lt;/code&gt;：用于自动生成可解释机器学习（IML）模型文档&lt;/li&gt;
&lt;li&gt;&lt;code&gt;survex&lt;/code&gt;：用于解释生存模型&lt;/li&gt;
&lt;li&gt;&lt;code&gt;treeshap&lt;/code&gt;：用于分析基于树的模型&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;对模型的分析通常是一个交互式过程&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;首先基于一个或多个性能指标对模型进行评估，这被称为&lt;strong&gt;浅层分析&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;在随后的一系列步骤中，可以通过探索单个变量或变量对的重要性，&lt;br /&gt;
逐步深入到对选定变量与模型结果之间关系的深度分析，&lt;br /&gt;
从而系统地加深对模型的理解&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;DALEX&lt;/code&gt; 也实现了一个包装器，为其功能提供了统一的接口&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;对于使用 &lt;code&gt;mlr3&lt;/code&gt; 包创建的模型，使用 &lt;code&gt;explain_mlr3()&lt;/code&gt;，&lt;br /&gt;
它会创建一个 S3 &lt;code&gt;explainer&lt;/code&gt; 对象&lt;/li&gt;
&lt;li&gt;该对象是一个列表，至少包含：
&lt;ul&gt;
&lt;li&gt;模型对象&lt;/li&gt;
&lt;li&gt;将用于计算解释的数据集&lt;/li&gt;
&lt;li&gt;预测函数&lt;/li&gt;
&lt;li&gt;计算残差的函数&lt;/li&gt;
&lt;li&gt;模型名称/标签&lt;/li&gt;
&lt;li&gt;有关模型的其他附加信息&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 加载R包
# library(DALEX)
# library(DALEXtra)

gbm_exp &amp;lt;- DALEXtra::explain_mlr3(
 # 学习器
 lrn_gbm,
 # 预测变量/特征变量
 data = credit_x,
 # 目的变量
 # 这里要转换成数值
 y = as.numeric(
  credit_y$credit_risk == &apos;bad&apos;
 ),
 # 加一个类似于标题的模型标签
 label = &apos;GBM Credit&apos;,
 # 关闭输出中编码高亮
 colorize = FALSE
)

gbm_exp
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;Preparation of a new explainer is initiated
  -&amp;gt; model label       :  GBM Credit 
  -&amp;gt; data              :  330  rows  10  cols 
  -&amp;gt; target variable   :  330  values 
  -&amp;gt; predict function  :  yhat.LearnerClassif  will be used (  default  )
  -&amp;gt; predicted values  :  No value for predict function target column. (  default  )
  -&amp;gt; model_info        :  package mlr3 , ver. 1.0.1 , task classification (  default  ) 
  -&amp;gt; predicted values  :  numerical, min =  0.03676402 , mean =  0.2926774 , max =  0.8648177  
  -&amp;gt; residual function :  difference between y and yhat (  default  )
  -&amp;gt; residuals         :  numerical, min =  -0.8589291 , mean =  -0.007828932 , max =  0.9025613  
  A new explainer has been created!  


Model label:  GBM Credit 
Model class:  LearnerClassifGBM,LearnerClassif,Learner,R6 
Data head  :
  age amount                              credit_history duration
1  67   1169     all credits at this bank paid back duly        6
2  25   1295 no credits taken/all credits paid back duly       12
  employment_duration other_debtors                                    property
1            &amp;gt;= 7 yrs          none                       unknown / no property
2              &amp;lt; 1 yr          none building soc. savings agr. / life insurance
              purpose                    savings              status
1 furniture/equipment             ... &amp;gt;= 1000 DM no checking account
2              others unknown/no savings account          ... &amp;lt; 0 DM
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;全局EMA&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;全局EMA旨在了解模型对一组观测值的平均表现&lt;/li&gt;
&lt;li&gt;在&lt;code&gt;DALEX&lt;/code&gt;中，用于全局层面分析的函数都以&lt;code&gt;model_&lt;/code&gt;为前缀&lt;/li&gt;
&lt;li&gt;&lt;code&gt;model_performance()&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;检测任务类型并选择最合适的度量&lt;/li&gt;
&lt;li&gt;由于本例使用的是二分类，该函数会自动推荐&lt;br /&gt;
召回率、精确率、F1分数、准确率和AUC&lt;/li&gt;
&lt;li&gt;同样，默认的绘图方法也是根据任务类型选择的，&lt;br /&gt;
本例中选择的是ROC&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;perf_credit &amp;lt;- model_performance(gbm_exp)
perf_credit
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;Measures for:  classification
recall     : 0.393617 
precision  : 0.6607143 
f1         : 0.4933333 
accuracy   : 0.769697 
auc        : 0.815678

Residuals:
         0%         10%         20%         30%         40%         50% 
-0.85892907 -0.41538465 -0.30027241 -0.21133774 -0.16170458 -0.13283445 
        60%         70%         80%         90%        100% 
-0.08615409 -0.04690813  0.45116163  0.64841892  0.90256128 
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;可视化ROC曲线&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 设置绘图风格
# Explanatory Model Analysis, EMA
old_theme &amp;lt;- set_theme_dalex(&apos;ema&apos;)
plot(perf_credit, geom = &apos;roc&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./image_8.png&quot; alt=&quot;image_8&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;特征重要性方法可以通过 &lt;code&gt;model_parts()&lt;/code&gt; 计算，然后绘制成图&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;gbm_effect &amp;lt;- model_parts(gbm_exp)
head(gbm_effect)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&quot;dataframe&quot;&amp;gt;
&amp;lt;caption&amp;gt;A model_parts: 6 x 4&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;variable&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;permutation&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;dropout_loss&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;label&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;1&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;&lt;em&gt;full_model&lt;/em&gt;       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.1843220&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;GBM Credit&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;2&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;other_debtors      &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.1839434&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;GBM Credit&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;3&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;property           &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.1863190&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;GBM Credit&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;4&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;employment_duration&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.1892851&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;GBM Credit&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;5&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;age                &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.1897268&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;GBM Credit&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;6&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;savings            &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.1962698&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;GBM Credit&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;model_parts&lt;/code&gt;函数中的&lt;code&gt;type&lt;/code&gt;参数可让指定如何计算特征的重要性，方式包括：
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;type = &quot;difference&quot;&lt;/code&gt;：损失函数的差值&lt;/li&gt;
&lt;li&gt;&lt;code&gt;type = &quot;ratio&quot;&lt;/code&gt;：比例&lt;/li&gt;
&lt;li&gt;&lt;code&gt;type = &quot;raw&quot;&lt;/code&gt;：不进行任何变换&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;plot(gbm_effect, show_boxplots = FALSE)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./image_9.png&quot; alt=&quot;image_9&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;特征效应可以通过 &lt;code&gt;model_profile()&lt;/code&gt; 计算
&lt;ul&gt;
&lt;li&gt;默认情况下以PD图的形式绘制&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 计算特征效应
gbm_profiles &amp;lt;- model_profile(gbm_exp)
# 输出结果
# 但这里只是类似于`head()`出来的上面部分
gbm_profiles
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;Top profiles    : 
   _vname_    _label_ _x_    _yhat_ _ids_
1 duration GBM Credit   4 0.2219987     0
2 duration GBM Credit   5 0.2219987     0
3 duration GBM Credit   6 0.2219987     0
4 duration GBM Credit   7 0.2219987     0
5 duration GBM Credit   8 0.2219987     0
6 duration GBM Credit   9 0.2393805     0
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;绘制全局EMA图，可以发现
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;age&lt;/code&gt;在到40岁前都是负相关&lt;/li&gt;
&lt;li&gt;&lt;code&gt;amount&lt;/code&gt;在10000刀后是正相关，&lt;br /&gt;
10000刀以前是一个不稳定的U型相关&lt;/li&gt;
&lt;li&gt;&lt;code&gt;duration&lt;/code&gt;与较强的正相关&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;plot(gbm_profiles) +
 theme(legend.position = &apos;top&apos;) +
 ggtitle(&apos;Partial Dependence for GBM Credit model&apos;,&apos;&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./image_10.png&quot; alt=&quot;image_10&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;局部EMA&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;旨在了解模型对单个观测值的表现&lt;/li&gt;
&lt;li&gt;在&lt;code&gt;DALEX&lt;/code&gt;中，用于局部分析的函数都以&lt;code&gt;predict_&lt;/code&gt;为前缀&lt;/li&gt;
&lt;li&gt;再次使用&lt;code&gt;Charlie&lt;/code&gt;进行以下示例。&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;predict(gbm_exp, Charlie)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;bad: 0.328141025695372
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;分解（break down）图
&lt;ul&gt;
&lt;li&gt;将模型的预测分解为可归因于不同解释变量的贡献&lt;/li&gt;
&lt;li&gt;使用 &lt;code&gt;predict_parts()&lt;/code&gt; 计算得出的&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;下图中
&lt;ul&gt;
&lt;li&gt;正归因以绿色显示&lt;/li&gt;
&lt;li&gt;负归因以红色显示&lt;/li&gt;
&lt;li&gt;紫色条形对应于被解释观测值的模型预测&lt;/li&gt;
&lt;li&gt;虚线对应于模型平均预测&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;plot(
 predict_parts(
  gbm_exp, 
  new_observation = Charlie
 )
)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./image_11.png&quot; alt=&quot;image_11&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;predict_parts()&lt;/code&gt;函数还可通过设置&lt;code&gt;type = &quot;shap&quot;&lt;/code&gt;，&lt;br /&gt;
使用SHAP算法绘制夏普值
&lt;ul&gt;
&lt;li&gt;分解和SHAP方法的结果通常相似&lt;/li&gt;
&lt;li&gt;如果模型中存在许多复杂的相互作用，就会出现差异&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;计算夏普利值可能需要很长时间
&lt;ul&gt;
&lt;li&gt;这个过程可以通过牺牲准确性来加快&lt;/li&gt;
&lt;li&gt;参数 &lt;code&gt;B&lt;/code&gt; 和 &lt;code&gt;N&lt;/code&gt; 可用于调整这种权衡
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;N&lt;/code&gt;：用于估计条件期望值的观测数量（默认值为500）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;B&lt;/code&gt;：用于计算夏普利值的随机路径数量（默认值为25）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;plot(
 predict_parts(
  gbm_exp, 
  new_observation = Charlie, 
  type = &apos;shap&apos;
 ),
 show_boxplots = FALSE
)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./image_12.png&quot; alt=&quot;image_12&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用 &lt;code&gt;predict_profile()&lt;/code&gt; 绘制ICE曲线&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;plot(
 predict_profile(
  gbm_exp,  
  credit_x[30:40, ]
 )
)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./image_13.png&quot; alt=&quot;image_13&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;注意事项&lt;/h2&gt;
&lt;h3&gt;相关特征（Correlated Features）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;如果特征之间存在相关性，那么在使用解释方法得出见解时应谨慎对待&lt;/li&gt;
&lt;li&gt;在不考虑与其他特征相关性的情况下改变某个观测值的特征值，&lt;br /&gt;
会导致特征值出现不切实际的组合&lt;/li&gt;
&lt;li&gt;由于这种特征组合也不太可能出现在训练数据中，&lt;br /&gt;
模型很可能会在这些区域进行外推
&lt;ul&gt;
&lt;li&gt;这会扭曲基于改变单个特征值的方法的解释，&lt;br /&gt;
比如排列特征重要性（PFI）、部分依赖（PD）图和夏普值&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;在这种情况下，替代方法可能会有所帮助：
&lt;ul&gt;
&lt;li&gt;用条件特征重要性替代排列特征重要性（PFI）&lt;/li&gt;
&lt;li&gt;用累积局部效应图替代部分依赖（PD）图&lt;/li&gt;
&lt;li&gt;用核夏普（KernelSHAP）方法替代夏普值&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;罗生门效应（Rashomon Effect）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;从解释方法得出的解释可能具有模糊性&lt;/li&gt;
&lt;li&gt;一种方法可能会给出多个同样合理但可能相互矛盾的解释&lt;/li&gt;
&lt;li&gt;这种效应可能是由于超参数，基础数据集，&lt;br /&gt;
甚至初始随机种子的变化导致的&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;高维数据（High-Dimensional Data）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;由于计算成本巨大，将现成的解释方法应用于高维数据集往往不可行
&lt;ul&gt;
&lt;li&gt;诸如使用基于核的估计量的夏普利值等最新方法已被开发出来以帮助克服这一问题&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;另一个挑战是，为高维数据集生成的高维可解释机器学习输出可能会让用户应接不暇
&lt;ul&gt;
&lt;li&gt;如果能够对特征进行有意义的分组，就可以应用分组版本的方法，例如分组特征重要性&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>【mlr3】6.回归与分类以外问题</title><link>https://nab-iak.github.io/posts/p15/p15/</link><guid isPermaLink="true">https://nab-iak.github.io/posts/p15/p15/</guid><description>mlr3回归与分类以外问题</description><pubDate>Thu, 17 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Cover Pic by &lt;a href=&quot;https://www.pixiv.net/artworks/132241477&quot;&gt;@bybao&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://mlr3book.mlr-org.com/&quot;&gt;Applied Machine Learning Using mlr3 in R&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;简介&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;mlr3&lt;/code&gt;中主要的包含4个&lt;strong&gt;构建块&lt;/strong&gt;（building block）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Task&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Learner&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Prediction&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Measure&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;部分可与&lt;code&gt;mlr3&lt;/code&gt;框架配合使用的扩展任务表&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;th&gt;Package&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Deterministic regression&lt;/td&gt;
&lt;td&gt;&lt;code&gt;mlr3&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Point prediction of a continuous variable.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deterministic single-label classification&lt;/td&gt;
&lt;td&gt;&lt;code&gt;mlr3&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Prediction of a single class for each observation.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Probabilistic single-label classification&lt;/td&gt;
&lt;td&gt;&lt;code&gt;mlr3&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Prediction of the probability of an observation falling into one or more mutually exclusive categories.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost-sensitive classification&lt;/td&gt;
&lt;td&gt;&lt;code&gt;mlr3&lt;/code&gt; and &lt;code&gt;mlr3pipelines&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Classification predictions with unequal costs associated with misclassifications.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Survival analysis&lt;/td&gt;
&lt;td&gt;&lt;code&gt;mlr3proba&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Time-to-event predictions with possible ‘censoring’.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Density estimation&lt;/td&gt;
&lt;td&gt;&lt;code&gt;mlr3proba&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Unsupervised estimation of probability density functions.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Spatiotemporal analysis&lt;/td&gt;
&lt;td&gt;&lt;code&gt;mlr3spatiotempcv&lt;/code&gt; and &lt;code&gt;mlr3spatial&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Supervised prediction of data with spatial (e.g., coordinates) and/or temporal outcomes.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cluster analysis&lt;/td&gt;
&lt;td&gt;&lt;code&gt;mlr3cluster&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Unsupervised estimation of homogeneous clusters of data points.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;代价敏感分类（Cost-Sensitive Classification）&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;代价敏感分类的目标是使预期代价最小化&lt;/li&gt;
&lt;li&gt;示例任务：&lt;code&gt;tsk(&apos;german_credit&apos;)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;背景：  假设试图计算借给某人5000美元，&lt;br /&gt;
一年后是否能盈利，前提是预计他们会偿还6000美元&lt;/li&gt;
&lt;li&gt;为了进行这个计算，你需要预测这个人是否有良好的信用
&lt;ul&gt;
&lt;li&gt;这是一个确定性分类问题，需要预测某人属于&apos;好&apos;或&apos;坏&apos;类别&lt;/li&gt;
&lt;li&gt;现在让考虑与每个预测和最终结果相关的一些潜在成本
&lt;ul&gt;
&lt;li&gt;由于成本敏感分类是一个最小化问题，&lt;br /&gt;
假设成本越低，利润/积极结果就越高，&lt;br /&gt;
因此将利润记为负值，损失记为正值&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;costs &amp;lt;- matrix(
 c(
  # 预测守信且真守信
  -1, # 赚1000
  # 预测失信但守信
  0, # 无得失，因为不会借
  # 预测守信但失信
  5, # 打水飘，亏5000
  # 预测失信且真失信
  0 # 无得失，因为不会借
 ), 
 nrow = 2, 
 dimnames = list(
  &apos;Predicted Credit&apos; = c(&apos;good&apos;, &apos;bad&apos;),
  Truth = c(&apos;good&apos;, &apos;bad&apos;)
 )
)

costs
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;                Truth
Predicted Credit good bad
            good -1   5  
            bad   0   0  
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;成本敏感度量&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;msr(&apos;classif.costs&apos;)&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;cost&lt;/code&gt;传递成本计算矩阵&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 加载R包
# library(mlr3verse)

# 任务
tsk_german &amp;lt;- tsk(&apos;german_credit&apos;)
# 评估器
msr_costs &amp;lt;- msr(&apos;classif.costs&apos;, costs = costs)
# 查看评估器
msr_costs
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[36m--[39m [1m[34m&amp;lt;MeasureClassifCosts&amp;gt;[39m (classif.costs): Cost-sensitive Classification[22m [36m--------[39m
* Packages: [34mmlr3[39m
* Range: [-Inf, Inf]
* Minimize: [34mTRUE[39m
* Average: macro
* Parameters: normalize=TRUE
* Properties: weights
* Predict type: response
* Predict sets: test
* Aggregator: mean()
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;使用3种算法的学习器进行benchmark比较
&lt;ul&gt;
&lt;li&gt;可以看到逻辑回归学习器表现最好，&lt;br /&gt;
因为有最低的成本&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;learners &amp;lt;- lrns(
 c(
 &apos;classif.log_reg&apos;, 
 &apos;classif.featureless&apos;,
 &apos;classif.ranger&apos;
 )
)
bmr &amp;lt;- benchmark(
 benchmark_grid(
  tsk_german, 
  learners,
  rsmp(&apos;cv&apos;, folds = 3)
 )
)
bmr$aggregate(msr_costs)[, c(4, 7)]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A bmr_aggregate: 3 x 2&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;learner_id&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;classif.costs&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.log_reg    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.1608225&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.featureless&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.7999317&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.ranger     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2218926&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;h3&gt;阈值调整&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;下图为不同概率判断阈值时，成本的曲线变化
&lt;ul&gt;
&lt;li&gt;虽然默认的阈值是&lt;code&gt;0.5&lt;/code&gt;，&lt;br /&gt;
但很显然，通过提高阈值可以降低成本&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;prediction &amp;lt;- lrn(
 &apos;classif.log_reg&apos;,
 predict_type =&apos;prob&apos;
)$train(tsk_german)$predict(tsk_german)

autoplot(
 prediction, 
 type = &apos;threshold&apos;, 
 measure = msr_costs
)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./image_1.png&quot; alt=&quot;image_1&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;对&lt;code&gt;po(&apos;tunethreshold&apos;)&lt;/code&gt;进行调优，&lt;br /&gt;
以自动确定最优阈值
&lt;ul&gt;
&lt;li&gt;过使用&lt;code&gt;po(&apos;learner_cv&apos;)&lt;/code&gt;进行内部重采样，&lt;br /&gt;
并使用&lt;code&gt;po(&apos;tunethreshold&apos;)&lt;/code&gt;来寻找最佳阈值，&lt;br /&gt;
显著提高了模型性能，甚至有望实现盈利&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;po_cv &amp;lt;- po(
 &apos;learner_cv&apos;, 
 lrn(
  &apos;classif.log_reg&apos;, 
  predict_type = &apos;prob&apos;
 )
)
graph &amp;lt;- po_cv %&amp;gt;&amp;gt;% po(&apos;tunethreshold&apos;, measure = msr_costs)

learners &amp;lt;- list(as_learner(graph), lrn(&apos;classif.log_reg&apos;))
bmr &amp;lt;- benchmark(
 benchmark_grid(
  tsk_german, 
  learners,
  rsmp(&apos;cv&apos;, folds = 3)
 )
)

bmr$aggregate(msr_costs)[, c(4, 7)]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A bmr_aggregate: 2 x 2&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;learner_id&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;classif.costs&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.log_reg.tunethreshold&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-0.1270222&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classif.log_reg              &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 0.1069962&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;h2&gt;生存分析（Survival Analysis）&lt;/h2&gt;
&lt;h3&gt;简介&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;生存分析建模的关键在于，假设存在一个假设时间，&lt;br /&gt;
即如果马拉松运动员没有被删失，他们本应完成比赛的时间
&lt;ul&gt;
&lt;li&gt;生存分析学习器的任务就是估计类似运动员在&lt;strong&gt;未被&lt;/strong&gt;删失的情况下的&lt;br /&gt;
真实生存时间&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;从数学角度来看，假设用事件时间$Y$，&lt;br /&gt;
假设删失时间$C$，&lt;br /&gt;
观察到的结果时间$T=min(Y,C)$，
事件指示符$Δ:=(T=Y)$以及通常的一些特征X来表示&lt;/li&gt;
&lt;li&gt;学习器基于$(T,Δ)$进行训练，&lt;br /&gt;
但关键的是，要根据之前&lt;strong&gt;未见过的特征&lt;/strong&gt;对Y进行预测&lt;/li&gt;
&lt;li&gt;这意味着与分类和回归不同，学习器基于&lt;strong&gt;两个变量&lt;/strong&gt;$(T,Δ)$进行训练
&lt;ul&gt;
&lt;li&gt;在R语言中，这通常用一个&lt;code&gt;Surv&lt;/code&gt;对象来表示&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mlr3&lt;/code&gt; 只能讨论&lt;strong&gt;右删失问题&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./image_2.png&quot; alt=&quot;image_2&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;本例中，随机生成六个生存时间和六个事件指示符，&lt;br /&gt;
结果中带有&lt;code&gt;+&lt;/code&gt;表示该结果被删失，&lt;br /&gt;
否则表示发生了感兴趣的事件&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 加载R包
# library(survival)

# 随机生成数据，用`Surv`包装
Surv(runif(6), rbinom(6, 1, 0.5))
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[1] 0.33865314  0.82852654+ 0.20506836  0.05573181+ 0.48054274  0.44972267 
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;TaskSurv&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;使用 &lt;code&gt;as_task_surv()&lt;/code&gt; 创建生存任务，&lt;br /&gt;
并有额外参数：
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;time&lt;/code&gt;：时间&lt;/li&gt;
&lt;li&gt;&lt;code&gt;event&lt;/code&gt;：事件&lt;/li&gt;
&lt;li&gt;&lt;code&gt;type&lt;/code&gt;：目前只能为&lt;code&gt;&apos;right&apos;&lt;/code&gt;且默认&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 加载R包
# library(mlr3verse)
# library(mlr3proba)
# library(survival)

tsk_rats &amp;lt;- as_task_surv(
 survival::rats, 
 time = &apos;time&apos;,
 event = &apos;status&apos;, 
 type = &apos;right&apos;, 
 id = &apos;rats&apos;
)

tsk_rats$head()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 6 x 5&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;time&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;status&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;litter&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;rx&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;sex&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;101&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;f&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; 49&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;f&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;104&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;f&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; 91&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;m&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;104&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;m&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;102&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;m&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;绘制 Kaplan-Meier 图
&lt;ul&gt;
&lt;li&gt;该图是训练集中平均观测值生存概率的非参数估计&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;autoplot(tsk_rats)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./image_3.png&quot; alt=&quot;image_3&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;加载其他用于练习的任务&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;as.data.table(mlr_tasks)[task_type == &apos;surv&apos;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 10 x 15&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;key&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;label&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;task_type&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;nrow&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;ncol&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;properties&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;lgl&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;int&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;dbl&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;chr&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;fct&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;ord&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;pxc&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;dte&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;lt&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;actg   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;ACTG 320                   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;surv&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1151&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;13&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;gbcs   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;German Breast Cancer       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;surv&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 686&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;10&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;gbsg   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;German Breast Cancer       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;surv&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 686&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;10&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;grace  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;GRACE 1000                 &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;surv&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 8&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;lung   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Lung Cancer                &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;surv&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 168&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 9&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;6&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;mgus   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;MGUS                       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;surv&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 176&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 9&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;6&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;pbc    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Primary Biliary Cholangitis&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;surv&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 276&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;19&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;7&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;rats   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Rats                       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;surv&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 300&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 5&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;veteran&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Veteran                    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;surv&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 137&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 8&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;whas   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Worcester Heart Attack     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;surv&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 481&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;11&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;h3&gt;&lt;code&gt;LearnerSurv&lt;/code&gt;，&lt;code&gt;PredictionSurv&lt;/code&gt; 以及预测类型&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;mlr3proba&lt;/code&gt;与&lt;code&gt;mlr3&lt;/code&gt;的预测接口不同
&lt;ul&gt;
&lt;li&gt;对于所有生存模型，只要有可能，&lt;br /&gt;
就会返回所有可能的预测类型&lt;/li&gt;
&lt;li&gt;如果一个模型能够计算出特定的预测类型，&lt;br /&gt;
它就会在&lt;code&gt;PredictionSurv&lt;/code&gt;中返回&lt;/li&gt;
&lt;li&gt;做出这种设计决策的原因是，&lt;br /&gt;
所有这些预测类型都可以相互转换
&lt;ul&gt;
&lt;li&gt;因此一次性返回所有类型在计算上比&lt;br /&gt;
重新运行模型以更改预测类型更简单&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;可预测的类型
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;response&lt;/code&gt;：预测的生存时间&lt;/li&gt;
&lt;li&gt;&lt;code&gt;distr&lt;/code&gt;：预测的生存分布，离散或连续分布均可&lt;/li&gt;
&lt;li&gt;&lt;code&gt;lp&lt;/code&gt;：通过将拟合系数与测试数据相乘计算得出的线性预测值&lt;/li&gt;
&lt;li&gt;&lt;code&gt;crank&lt;/code&gt;：连续风险排名&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;tsk_rats &amp;lt;- tsk(&apos;rats&apos;)
split &amp;lt;- partition(tsk_rats)
prediction_cph &amp;lt;- lrn(&apos;surv.coxph&apos;)$
 train(tsk_rats,split$train)$
 predict(tsk_rats, split$test)
prediction_cph
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[36m--[39m [1m[34m&amp;lt;PredictionSurv&amp;gt;[39m for [34m99[39m observations:[22m [36m---------------------------------------[39m
 row_ids time status      crank         lp     distr
       2   49   TRUE -0.5700703 -0.5700703 &amp;lt;list[1]&amp;gt;
       9  104  FALSE -0.5470661 -0.5470661 &amp;lt;list[1]&amp;gt;
      10   91  FALSE -2.1443968 -2.1443968 &amp;lt;list[1]&amp;gt;
     ---  ---    ---        ---        ---       ---
     286  104  FALSE -1.0862016 -1.0862016 &amp;lt;list[1]&amp;gt;
     295  104  FALSE  1.4477346  1.4477346 &amp;lt;list[1]&amp;gt;
     296  104  FALSE  0.5571376  0.5571376 &amp;lt;list[1]&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;&lt;code&gt;predict_type = &apos;response&apos;&lt;/code&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;从预测的结果看出，&lt;br /&gt;
预测的结果并不准确
&lt;ul&gt;
&lt;li&gt;由于每个真实值都是删失时间，&lt;br /&gt;
预测结果是略有偏差还是糟糕透顶无法得知&lt;/li&gt;
&lt;li&gt;由于没有切实可行的方法来评估这些模型，&lt;br /&gt;
生存时间预测的实际用处不大&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 加载R包
# library(mlr3extralearners)

# 选择支持向量机
prediction_svm &amp;lt;- lrn(
 # 生存问题的支持向量机
 &apos;surv.svm&apos;, 
 # `type = &apos;regression&apos;` 优化生存时间预测的算法
 type = &apos;regression&apos;, 
 # 通常应该先调优
 gamma = 1e-3
)$
 # 训练
 train(tsk_rats, split$train)$
 # 预测
 predict(tsk_rats, split$test)

# 查看结果
data.frame(
 pred = prediction_svm$response[1:3],
 truth = prediction_svm$truth[1:3]
)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.frame: 3 x 2&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;pred&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;truth&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;Surv&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;93.52197&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 49, 1&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;93.11679&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;104, 0&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;92.91621&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 91, 0&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;h4&gt;&lt;code&gt;predict_type = &apos;distr&apos;&lt;/code&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;与回归中最常见的确定性/点预测不同，&lt;br /&gt;
生存分析中，分布预测更为常见&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;mlr3proba&lt;/code&gt; 中的大多数生存模型默认会进行分布预测&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;这些预测是使用 &lt;code&gt;distr6&lt;/code&gt; 包实现的，&lt;br /&gt;
该包支持对生存曲线（定义为 $1− 累积分布函数$）进行可视化和评估&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;下面示例中提取前三个 &lt;code&gt;$distr&lt;/code&gt; 预测，&lt;br /&gt;
并计算在 $t=77$ 时的生存概率&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;预测的前三只老鼠在 $t=77$ 时存活的概率分别为&lt;br /&gt;
97.1%，97.0%和99.4%&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;prediction_cph$distr[1:3]$survival(77)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;A matrix: 1 x 3 of type dbl
77 0.9708998 0.9702328 0.9939012
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;&lt;code&gt;predict_type = &apos;lp&apos;&lt;/code&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;线性预测值（lp），在学术写作中常写为$η$，&lt;br /&gt;
在计算上是最简单的预测方式，&lt;br /&gt;
并且在回归建模中有自然的类似形式&lt;/li&gt;
&lt;li&gt;在拟合简单线性回归模型$Y = Xβ$时，我们在估计$β$的值，&lt;br /&gt;
然后估计出的线性预测值为$X\hat{β}$
&lt;ul&gt;
&lt;li&gt;其中$\hat{β}$是估计出的系数&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;在简单生存模型中，线性预测值是相同的量（但估计方式略为复杂）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mlr3proba&lt;/code&gt;中的学习器实现主要聚焦于机器学习，&lt;br /&gt;
这些模型中很少有简单的线性形式，&lt;br /&gt;
这意味着对于大多数此类模型无法计算线性预测值&lt;/li&gt;
&lt;li&gt;在实际应用中，当用于预测时，&lt;br /&gt;
线性预测值是相对风险/连续排序预测的替代&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;&lt;code&gt;predict_type = &apos;crank&apos;&lt;/code&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;在生存分析中最为常见，也是最容易混淆的&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;学术文献在生存分析中常常提到 &lt;strong&gt;风险&lt;/strong&gt; 预测&lt;br /&gt;
（生存模型常被称为 &lt;em&gt;风险预测模型&lt;/em&gt;），&lt;br /&gt;
却没有定义风险的含义
&lt;ul&gt;
&lt;li&gt;通常，风险被定义为 $exp⁡(η)$，&lt;br /&gt;
因为这是简单线性生存模型中常见的量&lt;/li&gt;
&lt;li&gt;有时风险被定义为 $exp⁡(−η)$&lt;/li&gt;
&lt;li&gt;有时它可能是一个没有明确意义的任意量&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;在 &lt;code&gt;mlr3proba&lt;/code&gt; 为了避免混淆而定义了预测类型 &lt;code&gt;crank&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;它代表 &lt;strong&gt;c&lt;/strong&gt;ontinuous（连续的）&lt;strong&gt;rank&lt;/strong&gt;ing（排序）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;下方输出的结果中：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第3只老鼠的死亡风险最低（数值越小代表风险越低），&lt;br /&gt;
而第2只老鼠的死亡风险最高&lt;/li&gt;
&lt;li&gt;预测值之间的差距还表明，&lt;br /&gt;
第1只和第2只老鼠之间的风险差异&lt;br /&gt;
小于第2只和第3只老鼠之间的差异&lt;/li&gt;
&lt;li&gt;实际数值本身并无意义，&lt;br /&gt;
因此比较样本（或论文或实验）&lt;br /&gt;
之间的 &lt;code&gt;crank&lt;/code&gt; 值并无意义。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;prediction_cph$crank[1:3]
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;         1          2          3 
-0.5700703 -0.5470661 -2.1443968 
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;注意&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;对于生存预测中&apos;风险&apos;的解释，不同的R包之间存在差异，&lt;br /&gt;
有时甚至同一包中的不同模型之间也有差异&lt;/li&gt;
&lt;li&gt;在&lt;code&gt;mlr3proba&lt;/code&gt;中，对crank有一个统一的解释：&lt;br /&gt;
值越低，事件发生的风险越低；值越高，事件发生的风险越高&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;&lt;code&gt;MeasureSurv&lt;/code&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;使用&lt;code&gt;MeasureSurv&lt;/code&gt;对象进行评估
&lt;ul&gt;
&lt;li&gt;这些对象通过&lt;code&gt;msr()&lt;/code&gt;以常规方式构建&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;生存度量可分为
&lt;ul&gt;
&lt;li&gt;判别措施：&lt;br /&gt;
量化模型是否能正确识别&lt;br /&gt;
一个观察结果的风险是否高于另一个；&lt;br /&gt;
评估crank和/或lp预测&lt;/li&gt;
&lt;li&gt;校准度量：&lt;br /&gt;
量化平均预测是否接近真实情况&lt;br /&gt;
（遗憾的是，在生存背景下，所有校准定义都不明确）；&lt;br /&gt;
评估&lt;code&gt;crank&lt;/code&gt;和/或&lt;code&gt;lp&lt;/code&gt;预测&lt;/li&gt;
&lt;li&gt;评分规则：&lt;br /&gt;
量化概率预测是否接近真实值；&lt;br /&gt;
评估&lt;code&gt;distr&lt;/code&gt;预测&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;建议的评估方法
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;distr&lt;/code&gt;预测的质量：&lt;br /&gt;
综合生存布赖尔分数（ISBS）（&lt;code&gt;msr(&apos;surv.graf&apos;)&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;模型的区分度：&lt;br /&gt;
使用一致性指数（&lt;code&gt;msr(&apos;surv.cindex&apos;)&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;模型的校准度：&lt;br /&gt;
使用D校准（&lt;code&gt;msr(&apos;surv.dcalib&apos;)&lt;/code&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;全部用于生存任务的评估器&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;as.data.table(mlr_measures)[
  task_type == &apos;surv&apos;, c(&apos;key&apos;, &apos;predict_type&apos;)]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 25 x 2&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;key&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;predict_type&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;surv.brier        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;distr   &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;surv.calib_alpha  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;distr   &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;surv.calib_beta   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;lp      &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;surv.calib_index  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;distr   &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;surv.chambless_auc&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;lp      &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;surv.cindex       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;crank   &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;surv.dcalib       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;distr   &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;surv.graf         &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;distr   &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;surv.hung_auc     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;lp      &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;surv.intlogloss   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;distr   &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;surv.logloss      &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;distr   &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;surv.mae          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;surv.mse          &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;surv.nagelk_r2    &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;lp      &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;surv.oquigley_r2  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;lp      &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;surv.rcll         &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;distr   &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;surv.rmse         &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;response&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;surv.schmid       &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;distr   &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;surv.song_auc     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;lp      &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;surv.song_tnr     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;lp      &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;surv.song_tpr     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;lp      &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;surv.uno_auc      &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;lp      &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;surv.uno_tnr      &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;lp      &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;surv.uno_tpr      &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;lp      &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;surv.xu_r2        &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;lp      &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;评估预测的结果
&lt;ul&gt;
&lt;li&gt;C指数&amp;gt;0.5，ISBS较低&lt;/li&gt;
&lt;li&gt;但是DCalib较高&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;然而，如果不与某些基线&lt;br /&gt;
（通常是Kaplan-Meier法）进行比较，&lt;br /&gt;
就很难确定任何生存模型的性能&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;prediction_cph$score(msrs(c(&apos;surv.graf&apos;, &apos;surv.cindex&apos;, &apos;surv.dcalib&apos;)))
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;  surv.graf surv.cindex surv.dcalib 
 0.07465018  0.79166669  2.19975256 
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;合成（Composition）&lt;/h3&gt;
&lt;h4&gt;简介&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;原生（native）：未经任何后处理的情况下做出的预测&lt;/li&gt;
&lt;li&gt;合成（composed）：在后处理后返回的预测&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;内部合成（Internal Composition）&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;mlr3proba&lt;/code&gt; 在内部使用合成方式，&lt;br /&gt;
为每个学习器返回一个&lt;code&gt;&apos;crank&apos;&lt;/code&gt;预测
&lt;ul&gt;
&lt;li&gt;这是为了确保至少能依据一个标准（区分性能）&lt;br /&gt;
对所有模型进行有意义的benchmark测试&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mlr3proba&lt;/code&gt;使用以下规则来创建&lt;code&gt;&quot;crank&quot;&lt;/code&gt;预测
&lt;ul&gt;
&lt;li&gt;如果一个模型返回一个&lt;code&gt;&apos;risk&apos;&lt;/code&gt;预测，&lt;br /&gt;
那么&lt;code&gt;crank = risk&lt;/code&gt;（我们可能会将其乘以，以确保“低数值低风险”的解释）&lt;/li&gt;
&lt;li&gt;如果模型返回一个&lt;code&gt;response&lt;/code&gt;预测值，那么 &lt;code&gt;crank = -response&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;如果一个模型返回一个&lt;code&gt;lp&lt;/code&gt;预测值，那么 &lt;code&gt;crank = lp&lt;/code&gt;&lt;br /&gt;
（如果需要，也可以 &lt;code&gt;crank = -lp&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;如果一个模型返回一个&lt;code&gt;distr&lt;/code&gt;预测，那么&lt;code&gt;crank&lt;/code&gt;设置为累积风险函数的总和&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;显式合成（Explicit Composition）与管道&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;预测类型的转换管道&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;pipeline_crankcompositor()&lt;/code&gt;：&lt;br /&gt;
将&lt;code&gt;&quot;distr&quot;&lt;/code&gt;预测转换为&lt;code&gt;&quot;crank&quot;&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;每当生存模型返回预测结果时，&lt;br /&gt;
内部会使用该管道的一个版本，&lt;br /&gt;
这样每个模型都有一个&lt;code&gt;&quot;crank&quot;&lt;/code&gt;预测类型——&lt;br /&gt;
所以只使用该管道来覆盖这些排名预测&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pipeline_distrcompositor()&lt;/code&gt;：&lt;br /&gt;
将 &lt;code&gt;&quot;lp&quot;&lt;/code&gt; 预测转换为 &lt;code&gt;&quot;distr&quot;&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;在实践中该管道更常见，&lt;br /&gt;
因为Cox或加速失效时间（AFT）类型的模型&lt;br /&gt;
总是返回一个线性预测值（&lt;code&gt;&quot;lp&quot;&lt;/code&gt;），&lt;br /&gt;
但有时内部的&lt;code&gt;predict()&lt;/code&gt;函数&lt;br /&gt;
并不提供转换为生存分布预测（&lt;code&gt;&quot;distr&quot;&lt;/code&gt;）的功能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pipeline_responsecompositor()&lt;/code&gt;：&lt;br /&gt;
将 &lt;code&gt;&quot;distr&quot;&lt;/code&gt; 预测转换为 &lt;code&gt;&quot;response&quot;&lt;/code&gt;（生存时间）
&lt;ul&gt;
&lt;li&gt;将预测的生存曲线汇总为一个单一数字（预期生存时间）&lt;/li&gt;
&lt;li&gt;如前所述，这对于评估生存机器学习模型的性能很少有用&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在本示例中&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;加载&lt;code&gt;rats&lt;/code&gt;数据集&lt;/li&gt;
&lt;li&gt;删除因子列&lt;/li&gt;
&lt;li&gt;将数据划分为训练集和测试集&lt;/li&gt;
&lt;li&gt;围绕生存XGBoost加速失效时间（AFT）学习器&lt;br /&gt;
（&lt;code&gt;lrn(&quot;surv.xgboost.aft&quot;)&lt;/code&gt;）&lt;br /&gt;
构建&lt;code&gt;distrcompositor&lt;/code&gt;管道
&lt;ul&gt;
&lt;li&gt;该学习器默认对&lt;code&gt;&quot;lp&quot;&lt;/code&gt;、&lt;code&gt;&quot;crank&quot;&lt;/code&gt;和&lt;code&gt;&quot;response&quot;&lt;/code&gt;进行预测&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;管道中&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;指定将使用Kaplan - Meier估计器（&lt;code&gt;estimator = &quot;kaplan&quot;&lt;/code&gt;）估计基线分布，&lt;br /&gt;
并假设我们估计的分布采用AFT形式（&lt;code&gt;form = &quot;aft&quot;&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;以通常的方式进行训练和预测&lt;/li&gt;
&lt;li&gt;在输出中可以看到&lt;code&gt;distr&lt;/code&gt;预测&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 加载R包
# library(mlr3verse)
# library(mlr3extralearners)

# 数据预处理
tsk_rats &amp;lt;- tsk(&apos;rats&apos;)$select(c(&apos;litter&apos;, &apos;rx&apos;))
split &amp;lt;- partition(tsk_rats)

# 学习器
learner &amp;lt;- lrn(&apos;surv.xgboost.aft&apos;, nrounds = 10)
# 训练和预测
learner$
 train(tsk_rats, split$train)$
 predict(tsk_rats, split$test)

# `GraphLearner`：`lp` -&amp;gt; `distr`
graph_learner &amp;lt;- ppl(
 &apos;distrcompositor&apos;,
 learner = learner,
 estimator = &apos;kaplan&apos;,
 form = &apos;aft&apos;,
 graph_learner = TRUE
)
# 训练和预测
graph_learner$
 train(tsk_rats, split$train)$
 predict(tsk_rats, split$test)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[36m--[39m [1m[34m&amp;lt;PredictionSurv&amp;gt;[39m for [34m99[39m observations:[22m [36m---------------------------------------[39m
 row_ids time status     crank        lp response
       2   49   TRUE -5.671391 -5.671391 290.4381
       3  104  FALSE -5.671391 -5.671391 290.4381
       5  104  FALSE -5.671391 -5.671391 290.4381
     ---  ---    ---       ---       ---      ---
     295  104  FALSE -4.918093 -4.918093 136.7416
     298   92  FALSE -4.918093 -4.918093 136.7416
     299  104  FALSE -4.918093 -4.918093 136.7416



[36m--[39m [1m[34m&amp;lt;PredictionSurv&amp;gt;[39m for [34m99[39m observations:[22m [36m---------------------------------------[39m
 row_ids time status     crank        lp response     distr
       2   49   TRUE -5.671391 -5.671391 290.4381 &amp;lt;list[1]&amp;gt;
       3  104  FALSE -5.671391 -5.671391 290.4381 &amp;lt;list[1]&amp;gt;
       5  104  FALSE -5.671391 -5.671391 290.4381 &amp;lt;list[1]&amp;gt;
     ---  ---    ---       ---       ---      ---       ---
     295  104  FALSE -4.918093 -4.918093 136.7416 &amp;lt;list[1]&amp;gt;
     298   92  FALSE -4.918093 -4.918093 136.7416 &amp;lt;list[1]&amp;gt;
     299  104  FALSE -4.918093 -4.918093 136.7416 &amp;lt;list[1]&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;从数学角度来看，上述的转换过程为
&lt;ul&gt;
&lt;li&gt;假设我们估计的分布形式为 $S(t) = S_0(\frac{t}{\exp(\eta)})$
&lt;ul&gt;
&lt;li&gt;$S$：生存函数&lt;/li&gt;
&lt;li&gt;$S_0$：基线生存函数&lt;/li&gt;
&lt;li&gt;$\eta$：是线性预测值&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;使用XGBoost估计 $\eta$ 预测值 $\hat{\eta}$&lt;/li&gt;
&lt;li&gt;使用 Kaplan-Meier 估计器估计 $\hat{S}_0(t)$&lt;/li&gt;
&lt;li&gt;将这些整合为$S(t) = \hat{S}_0(\frac{t}{\exp(\hat{\eta})})$&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;总揽流程&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;下面是整体流程
&lt;ul&gt;
&lt;li&gt;用ISBS，D校准和C指数来评估预测结果&lt;/li&gt;
&lt;li&gt;结果
&lt;ul&gt;
&lt;li&gt;XGBoost-AFT和Cox PH具有最佳的区分度&lt;/li&gt;
&lt;li&gt;Kaplan-Meier基线具有最佳的校准度&lt;/li&gt;
&lt;li&gt;Cox PH具有最佳的整体预测准确度（ISBS最低）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 设置随机数种子
# set.seed(42)
# 加载R包
# library(mlr3extralearners)

# 加载任务
tsk_grace &amp;lt;- tsk(&apos;grace&apos;)
# 随机挑选500个样本以减少演示例子耗时
tsk_grace$
 filter(
  sample(
   tsk_grace$nrow, 
   500
  )
 )
# 挑选评估器
msr_txt = c(&quot;surv.graf&quot;, &quot;surv.cindex&quot;, &quot;surv.dcalib&quot;)
measures &amp;lt;- msrs(msr_txt)

# 构建`GraphLearner`
graph_learner &amp;lt;- ppl(
  &apos;distrcompositor&apos;,
  learner = lrn(&apos;surv.xgboost.aft&apos;, nrounds = 10),
  estimator = &apos;kaplan&apos;,
  form = &apos;aft&apos;,
  graph_learner = TRUE,
  scale_lp = TRUE
)
# 修改识别id
graph_learner$id = &apos;XGBoost-AFT&apos;


bmr &amp;lt;- benchmark(
 benchmark_grid(
  tsk_grace, 
  # benchmark比较管道和2种基础学习器
  c(
   lrns(c(&apos;surv.coxph&apos;, &apos;surv.kaplan&apos;)), 
   graph_learner
  ),
  rsmp(&apos;cv&apos;, folds = 3)
 )
)
# 整合结果
bmr$aggregate(measures)[, c(&apos;learner_id&apos;, ..msr_txt)]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&quot;dataframe&quot;&amp;gt;
&amp;lt;caption&amp;gt;A bmr_aggregate: 3 x 4&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;learner_id&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;surv.graf&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;surv.cindex&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;surv.dcalib&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;surv.coxph &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.09897859&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.8421613&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5.328825&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;surv.kaplan&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.20225391&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.5000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;4.148996&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;XGBoost-AFT&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.21336577&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.8371936&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5.789641&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;h2&gt;密度估计（Density Estimation）&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;密度估计旨在估计生成单变量数据集的未知分布&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;更简单地说，估计单个变量的概率密度（或质量）函数&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;与生存分析一样，密度估计在&lt;code&gt;mlr3proba&lt;/code&gt;中实现&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;因为两者都可以进行概率分布预测（因此得名“&lt;strong&gt;mlr3proba&lt;/strong&gt;bilistic”）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;无条件密度估计（即不使用任何协变量估计目标）被视为无监督任务，&lt;br /&gt;
这意味着真实情况永远是&lt;strong&gt;未知&lt;/strong&gt;的&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;mlr3proba&lt;/code&gt;包使用以下用于密度估计的对象对&lt;code&gt;mlr3&lt;/code&gt;进行了扩展&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;TaskDens&lt;/code&gt;：密度问题任务&lt;/li&gt;
&lt;li&gt;&lt;code&gt;LearnerDens&lt;/code&gt;：密度学习器&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PredictionDens&lt;/code&gt;：密度预测&lt;/li&gt;
&lt;li&gt;&lt;code&gt;MeasureDens&lt;/code&gt;：密度性能评估器&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;code&gt;TaskDens&lt;/code&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;as_task_dens()&lt;/code&gt; 构建密度估计任务&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;tsk_dens &amp;lt;- as_task_dens(data.table(x = rnorm(1000)))
tsk_dens
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[36m--[39m [1m[34m&amp;lt;TaskDens&amp;gt;[39m (1000x1)[22m [36m---------------------------------------------------------[39m
* Target:
* Properties: -
* Features (1):
  * dbl (1): x
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;查看自带的一些密度估计任务&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;as.data.table(mlr_tasks)[task_type == &apos;dens&apos;, c(1:2, 4:5)]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&quot;dataframe&quot;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 2 x 4&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;key&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;label&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;nrow&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;ncol&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;faithful&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Old Faithful Eruptions&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;272&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;precip  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Annual Precipitation  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 70&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;h3&gt;&lt;code&gt;LearnerDens&lt;/code&gt; 和 &lt;code&gt;PredictionDens&lt;/code&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;密度学习器可能返回以下预测类型：
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;distr&lt;/code&gt;：概率分布&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pdf&lt;/code&gt;：概率密度函数&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cdf&lt;/code&gt;：累积分布函数&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;所有的学习器都会返回一个&lt;code&gt;distr&lt;/code&gt;和&lt;code&gt;pdf&lt;/code&gt;预测，&lt;br /&gt;
但只有部分学习器能够进行&lt;code&gt;cdf&lt;/code&gt;预测&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 直方图学习器
lrn_hist &amp;lt;- lrn(&apos;dens.hist&apos;)
# 训练和预测
prediction &amp;lt;- lrn_hist$
 train(tsk_dens, 1:900)$
 predict(tsk_dens, 901:1000)
# 设置区间
x &amp;lt;- seq.int(-2, 2, 0.01)
# 创建区间内每个点的概率密度dataframe
df &amp;lt;- data.frame(
 x = x, 
 y = prediction$distr$pdf(x)
)
# 可视化
ggplot(df, aes(x = x, y = y)) + 
 geom_line() + 
 theme_minimal()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./image_4.png&quot; alt=&quot;image_4&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;pdf&lt;/code&gt;和&lt;code&gt;cdf&lt;/code&gt;预测类型分别只是围绕&lt;code&gt;distr$pdf&lt;/code&gt;和&lt;code&gt;distr$cdf&lt;/code&gt;的简单包装器&lt;/li&gt;
&lt;li&gt;这里可以发现
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;pdf&lt;/code&gt;和&lt;code&gt;cdf&lt;/code&gt;都储存在&lt;code&gt;prediction&lt;/code&gt;里&lt;/li&gt;
&lt;li&gt;也可从&lt;code&gt;Prediction$distr$pdf()&lt;/code&gt;和&lt;br /&gt;
&lt;code&gt;Prediction$distr$cdf()&lt;/code&gt;调用学习器重新计算
&lt;ul&gt;
&lt;li&gt;结果是一致的&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;prediction &amp;lt;- lrn_hist$
 train(tsk_dens, 1:10)$
 predict(tsk_dens, 11:13)
prediction
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[36m--[39m [1m[34m&amp;lt;PredictionDens&amp;gt;[39m for [34m3[39m observations:[22m [36m----------------------------------------[39m
 row_ids pdf       cdf
      11 0.0 1.0000000
      12 0.6 0.7617717
      13 0.4 0.4279775
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;cbind(
 prediction$
  distr$
  cdf(tsk_dens$data()$x[11:13]),
 prediction$cdf[1:3]
)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&quot;dataframe&quot;&amp;gt;
&amp;lt;caption&amp;gt;A matrix: 3 x 2 of type dbl&amp;lt;/caption&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;1.0000000&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.0000000&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.7617717&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.7617717&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.4279775&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4279775&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;h3&gt;&lt;code&gt;MeasureDens&lt;/code&gt; 和总揽上述流程&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;mlr3proba&lt;/code&gt; 中用于密度估计的唯一已实施度量是对数损失（logloss）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;其定义方式与分类中的定义相同，&lt;br /&gt;
即 $L(y) = -\log(\hat{f}_Y(y))$
&lt;ul&gt;
&lt;li&gt;$\hat{f}_Y$：估计的概率密度函数&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;创建密度评估问题的评估器&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;msr_logloss &amp;lt;- msr(&apos;dens.logloss&apos;)
msr_logloss
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[36m--[39m [1m[34m&amp;lt;MeasureDensLogloss&amp;gt;[39m (dens.logloss): Log Loss[22m [36m-------------------------------[39m
* Packages: [34mmlr3[39m and [34mmlr3proba[39m
* Range: [0, Inf]
* Minimize: [34mTRUE[39m
* Average: macro
* Parameters: eps=1e-15
* Properties: -
* Predict type: pdf
* Predict sets: test
* Aggregator: mean()
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;标准的评估器传递&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;prediction$score(msr_logloss)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;dens.logloss: 11.9886309168503
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;benchmark比较不同密度评估学习器&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 加载R包
# library(mlr3extralearners)

# 任务
tsk_faithful &amp;lt;- tsk(&apos;faithful&apos;)
# 学习器
learners &amp;lt;- lrns(c(&apos;dens.hist&apos;, &apos;dens.pen&apos;, &apos;dens.kde&apos;))
# 评估器
measure &amp;lt;- msr(&apos;dens.logloss&apos;)

# benchmark比较
bmr &amp;lt;- benchmark(
 benchmark_grid(
  tsk_faithful, 
  learners,
  rsmp(&apos;cv&apos;, folds = 3)
 )
)

# 结果整合
bmr$aggregate(measure)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;      nr  task_id learner_id resampling_id iters dens.logloss
   &amp;lt;int&amp;gt;   &amp;lt;char&amp;gt;     &amp;lt;char&amp;gt;        &amp;lt;char&amp;gt; &amp;lt;int&amp;gt;        &amp;lt;num&amp;gt;
1:     1 faithful  dens.hist            cv     3     1.115927
2:     2 faithful   dens.pen            cv     3     1.377325
3:     3 faithful   dens.kde            cv     3     1.026440
Hidden columns: resample_result
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;可视化3种学习器的性能
&lt;ul&gt;
&lt;li&gt;复杂的惩罚密度估计器的表现并不优于基线直方图，&lt;br /&gt;
但核密度估计器至少在对数损失结果上更好&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;autoplot(bmr, measure = measure)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./image_5.png&quot; alt=&quot;image_5&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;聚类分析（Cluster Analysis）&lt;/h2&gt;
&lt;h3&gt;简介&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;mlr3cluster&lt;/code&gt;使用以下用于聚类分析的对象对&lt;code&gt;mlr3&lt;/code&gt;进行了扩展：
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;TaskClust&lt;/code&gt;：聚类任务&lt;/li&gt;
&lt;li&gt;&lt;code&gt;LearnerClust&lt;/code&gt;：聚类学习器的基类&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PredictionClust&lt;/code&gt;：聚类预测结果的&lt;code&gt;Prediction&lt;/code&gt;对象的特定类&lt;/li&gt;
&lt;li&gt;&lt;code&gt;MeasureClust&lt;/code&gt;：聚类性能评估器&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;code&gt;TaskClust&lt;/code&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;以&lt;code&gt;cluster&lt;/code&gt;包自带的数据集&lt;code&gt;ruspini&lt;/code&gt;为例&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 加载R包
# library(mlr3verse)
# library(cluster)

# 创建聚类任务
tsk_ruspini &amp;lt;- as_task_clust(ruspini)
tsk_ruspini
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[36m--[39m [1m[34m&amp;lt;TaskClust&amp;gt;[39m (75x2)[22m [36m----------------------------------------------------------[39m
* Target:
* Properties: -
* Features (2):
  * int (2): x, y
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;tsk_ruspini$data(1:3) 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&quot;dataframe&quot;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 3 x 2&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;x&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;y&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; 4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;53&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; 5&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;63&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;10&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;59&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;鲁西尼（Ruspini）数据集的分布情况&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;autoplot(tsk_ruspini)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./image_6.png&quot; alt=&quot;image_6&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;查看所有自带的聚类任务&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;as.data.table(mlr_tasks)[task_type == &apos;clust&apos;, c(1:2, 4:5)]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&quot;dataframe&quot;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 2 x 4&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;key&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;label&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;nrow&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;ncol&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;ruspini  &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Ruspini   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;75&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;usarrests&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;US Arrests&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;50&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;4&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;h3&gt;&lt;code&gt;LearnerClust&lt;/code&gt; 和 &lt;code&gt;PredictionClust&lt;/code&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;聚类学习器有两种&lt;code&gt;predict_types&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&apos;partition&apos;&lt;/code&gt;：对观测值所属聚类的估计&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&apos;prob&apos;&lt;/code&gt;：一个观测值属于每个聚类的概率&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;与分类类似，&lt;br /&gt;
聚类学习器的预测类型要么是确定性的（&lt;code&gt;&quot;partition&quot;&lt;/code&gt;），&lt;br /&gt;
要么是概率性的（&lt;code&gt;&quot;prob&quot;&lt;/code&gt;）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;下例中构建一个预测类型为 &lt;code&gt;&quot;prob&quot;&lt;/code&gt; ，&lt;br /&gt;
且有3个聚类（&lt;code&gt;centers = 3&lt;/code&gt;）的C均值聚类学习器，&lt;br /&gt;
在 &lt;code&gt;ruspini&lt;/code&gt; 数据集上对其进行训练，&lt;br /&gt;
然后返回六个随机观测值的聚类分配（&lt;code&gt;$assignments&lt;/code&gt;）&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;lrn_cmeans &amp;lt;- lrn(
 &apos;clust.cmeans&apos;, 
 predict_type = &apos;prob&apos;, 
 centers = 3
)
lrn_cmeans
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[36m--[39m [1m[34m&amp;lt;LearnerClustCMeans&amp;gt;[39m (clust.cmeans): Fuzzy C-Means Clustering Learner[22m [36m-------[39m
* Model: -
* Parameters: centers=3
* Packages: [34mmlr3[39m, [34mmlr3cluster[39m, and [34me1071[39m
* Predict Types: partition and [prob]
* Feature Types: logical, integer, and numeric
* Encapsulation: none (fallback: -)
* Properties: complete, fuzzy, and partitional
* Other settings: use_weights = &apos;error&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;lrn_cmeans$train(tsk_ruspini)
lrn_cmeans$assignments[sample(tsk_ruspini$nrow, 6)]
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[1] 2 1 1 1 3 2
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;由于聚类是无监督的，&lt;br /&gt;
对新数据使用&lt;code&gt;predict&lt;/code&gt;通常&lt;strong&gt;没有意义&lt;/strong&gt;，&lt;br /&gt;
不过使用&lt;code&gt;mlr3&lt;/code&gt;接口仍有可能实现&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;lrn_cmeans$
 train(tsk_ruspini, 1:30)$
 predict(tsk_ruspini, 31:32)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;
[36m--[39m [1m[34m&amp;lt;PredictionClust&amp;gt;[39m for [34m2[39m observations:[22m [36m---------------------------------------[39m
 row_ids partition     prob.1     prob.2    prob.3
      31         3 0.01814044 0.01552007 0.9663395
      32         3 0.01177598 0.01002160 0.9782024
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;对整个数据集进行聚类，并且可视化聚类结果的分布&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;prediction &amp;lt;- lrn_cmeans$
 train(tsk_ruspini)$
 predict(tsk_ruspini)
autoplot(prediction, tsk_ruspini)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./image_7.png&quot; alt=&quot;image_7&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;虽然有两种可能的预测类型，但有些学习器的“预测”永远没有意义
&lt;ul&gt;
&lt;li&gt;例如在层次聚类中&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;在层次聚类中，目标是通过将大的簇分裂成较小的簇，&lt;br /&gt;
或将较小的簇合并成较大的簇，&lt;br /&gt;
来构建一个嵌套簇的层次结构
&lt;ul&gt;
&lt;li&gt;最终结果是一棵树或树形图，&lt;br /&gt;
如果添加新的数据点，&lt;br /&gt;
该树或树形图可能会发生变化&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;为保持一致性，&lt;code&gt;mlr3cluster&lt;/code&gt; 为层次聚类提供了&lt;br /&gt;
一个 &lt;code&gt;predict&lt;/code&gt; 方法，但会给出一个警告：&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;lrn_hclust &amp;lt;- lrn(&apos;clust.hclust&apos;, k = 2)
lrn_hclust$
 train(tsk_ruspini)$
 predict(tsk_ruspini)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;Warning message in warn_prediction_useless(self$id): &quot;Learner &apos;clust.hclust&apos; doesn&apos;t predict on new data and predictions may not make sense on new data.&quot;

[36m--[39m [1m[34m&amp;lt;PredictionClust&amp;gt;[39m for [34m75[39m observations:[22m [36m--------------------------------------[39m
 row_ids partition
       1         1
       2         1
       3         1
     ---       ---
      73         1
      74         1
      75         1
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;查看聚类结果图
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ruspini&lt;/code&gt;数据集层次聚类的树形图&lt;/li&gt;
&lt;li&gt;y轴是点的相似度&lt;/li&gt;
&lt;li&gt;x轴上相连的观测值越低，&lt;br /&gt;
它们的相似度就越高&lt;/li&gt;
&lt;li&gt;顶部的划分代表两个簇的分离&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;autoplot(lrn_hclust) + 
 theme(axis.text = element_text(size = 5.5))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./image_8.png&quot; alt=&quot;image_8&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;&lt;code&gt;MeasureClust&lt;/code&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;无监督任务在模型评估中没有可用于对比的真实数据&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;仍然可以通过量化同一簇内对象的相关程度（簇内聚性）&lt;br /&gt;
以及不同簇之间的差异程度（簇分离性）来衡量簇分配的质量&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;两种常见的度量指标&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;组内平方和（WSS）度量（&lt;code&gt;msr(&quot;clust.wss&quot;)&lt;/code&gt;）
&lt;ul&gt;
&lt;li&gt;计算观测值与质心之间的平方差之和，&lt;br /&gt;
这是对聚类凝聚性的一种量化（值越小表明聚类越紧密）&lt;/li&gt;
&lt;li&gt;轮廓系数量化了每个点属于其分配的聚类相对于相邻聚类的程度，&lt;br /&gt;
得分越接近 &lt;strong&gt;1 表明聚类效果良好&lt;/strong&gt;，得分越接近 &lt;strong&gt;-1 表明聚类效果不佳&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;轮廓系数（&lt;code&gt;msr(&quot;clust.silhouette&quot;)&lt;/code&gt;）
&lt;ul&gt;
&lt;li&gt;返回所有观测值的平均轮廓得分&lt;/li&gt;
&lt;li&gt;当只有单个聚类时，该度量简单地输出0&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;下面是对聚类结果的评估&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;极高的加权平方和（WSS）以及中等的平均轮廓系数表明，&lt;br /&gt;
聚类还有更多工作要做&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;measures &amp;lt;- msrs(c(&apos;clust.wss&apos;, &apos;clust.silhouette&apos;))

prediction$score(measures, task = tsk_ruspini)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;       clust.wss clust.silhouette 
    5.115541e+04     6.413923e-01 
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;通常将无监督任务简化为定量指标可能&lt;strong&gt;并无益处&lt;/strong&gt;（因为不存在真实值）&lt;/li&gt;
&lt;li&gt;可视化可能是评估聚类质量更有效的工具&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;可视化&lt;/h3&gt;
&lt;h4&gt;聚类可视化&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;由于聚类是一项无监督任务，&lt;br /&gt;
可视化不仅对于评估模型至关重要，&lt;br /&gt;
对于确定学习器是否按预期完成任务也必不可少&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;很容易依赖聚类度量来评估聚类的质量，&lt;br /&gt;
但应该保持谨慎&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;因为在模型之间进行选择可能取决于其他因素，&lt;br /&gt;
比如聚类是如何形成的&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;下例中用 &lt;code&gt;mlbench.spirals&lt;/code&gt; 生成两条相互缠绕的螺旋线的数据&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 生成数据
spirals &amp;lt;- mlbench::mlbench.spirals(
 n = 300, 
 sd = 0.01
)
# 构建任务
tsk_spirals &amp;lt;- as_task_clust(
 as.data.frame(spirals$x)
)
# 可视化数据
autoplot(tsk_spirals)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./image_9.png&quot; alt=&quot;image_9&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;拟合模型并查看结果
&lt;ul&gt;
&lt;li&gt;K均值聚类给出了更高的平均轮廓系数，&lt;br /&gt;
因此我们可以得出结论，&lt;br /&gt;
具有两个质心的K均值学习器比DBSCAN方法是更好的选择&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 学习器
learners &amp;lt;- list(
  lrn(&apos;clust.kmeans&apos;),
  lrn(&apos;clust.dbscan&apos;, eps = 0.1)
)

# benchmark比较
bmr &amp;lt;- benchmark(
 benchmark_grid(
  tsk_spirals, 
  learners, 
  rsmp(&apos;insample&apos;)
 )
)

# 整合结果
bmr$aggregate(msr(&apos;clust.silhouette&apos;))[, c(4, 7)]
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;  learner_id   clust.silhouette
1 clust.kmeans 0.37244247      
2 clust.dbscan 0.02929844      
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;通过对聚类结果的可视化，可以看到两种聚类的差别
&lt;ul&gt;
&lt;li&gt;K均值聚类像对图像切了一半&lt;/li&gt;
&lt;li&gt;DBSCAN则按曲线进行了区分&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;应该根据任务的需求结合可视化选择合适的聚类方法，&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;而并单纯非依赖于评估器给出的结果&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 加载R包
# library(patchwork)

# 提取K均值聚类和DBSCAN两种聚类的结果
# 转换成因子
pred_kmeans &amp;lt;- as.factor(
 bmr$
  resample_result(1)$
  prediction()$
  partition
 )
pred_dbscan &amp;lt;- as.factor(
 bmr$
  resample_result(2)$
  prediction()$
  partition
)
# 绘图
df_kmeans &amp;lt;- cbind(
 tsk_spirals$data(), 
 clust = pred_kmeans
)
df_dbscan &amp;lt;- cbind(
 tsk_spirals$data(), 
 clust = pred_dbscan
)
map &amp;lt;- aes(x = V1, y = V2, color = clust)
p_kmeans &amp;lt;- ggplot(df_kmeans, map) + 
 ggtitle(&apos;K-means&apos;)
p_dbscan &amp;lt;- ggplot(df_dbscan, map) + 
 ggtitle(&apos;DBSCAN&apos;)

p_kmeans + 
 p_dbscan + 
 plot_layout(guides = &apos;collect&apos;) &amp;amp; 
 geom_point() &amp;amp;
 theme_minimal() &amp;amp; 
 ggplot2::scale_colour_viridis_d(end = 0.8)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./image_10.png&quot; alt=&quot;image_10&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;主成分分析与轮廓系数图（Silhouette Plot）&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;在&lt;code&gt;mlr3viz&lt;/code&gt;中实现的用于支持聚类学习器评估的两个最重要的图&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;主成分分析（PCA）图
&lt;ul&gt;
&lt;li&gt;机器学习中常用的一种降维方法&lt;/li&gt;
&lt;li&gt;用于减少数据集中的变量数量，&lt;br /&gt;
或可视化最重要的&lt;strong&gt;成分&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;成分是数据集特征的线性变换&lt;/li&gt;
&lt;li&gt;方差越大（因此预测能力越强）的成分被认为越重要&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;在聚类的背景下，通过将观测值相对于前两个成分进行绘图，&lt;br /&gt;
然后按聚类进行着色，可以可视化高维数据集，&lt;br /&gt;
并且预期会看到观测值分属于不同的组&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;轮廓系数图
&lt;ul&gt;
&lt;li&gt;通过可视化一个簇中的观测值在个体和群体层面上是否分布合理，&lt;br /&gt;
从而直观地评估估计簇的质量&lt;/li&gt;
&lt;li&gt;这些图包含一条虚线
&lt;ul&gt;
&lt;li&gt;该虚线表示所有数据点的平均轮廓系数，&lt;br /&gt;
每个数据点的轮廓值由一个按其分配簇着色的条形表示&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;如果给定簇的平均轮廓值低于平均轮廓系数线，&lt;br /&gt;
则意味着该簇定义不明确&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;下例的可视化结果中&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;PCA图
&lt;ul&gt;
&lt;li&gt;模型通过前两个主成分将观测数据很好地分成了两个簇&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;轮廓系数图
&lt;ul&gt;
&lt;li&gt;很多观测值都在平均线以下且接近零，&lt;br /&gt;
说明聚类分配质量不是很好，&lt;br /&gt;
这意味着许多观测值很可能被分配到了错误的聚类中&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 任务
tsk_usarrests &amp;lt;- tsk(&apos;usarrests&apos;)
# 学习器
prediction &amp;lt;- lrn(&apos;clust.kmeans&apos;)$
 train(tsk_usarrests)$
 predict(tsk_usarrests)

# PCA
autoplot(
 prediction, 
 tsk_usarrests, 
 type = &apos;pca&apos;
)

# 轮廓系数
autoplot(
 prediction, 
 tsk_usarrests, 
 type = &apos;sil&apos;
)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./image_11.png&quot; alt=&quot;image_11&quot; /&gt;
&lt;img src=&quot;./image_12.png&quot; alt=&quot;image_12&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;总揽上述流程&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;下面结果中
&lt;ul&gt;
&lt;li&gt;C均值算法和K均值算法都明显优于无特征的基线算法，&lt;br /&gt;
但若要确定这两种算法中哪一种更适合，&lt;br /&gt;
还需要结合可视化的进一步分析&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 任务
tsk_usarrests &amp;lt;- tsk(&apos;usarrests&apos;)
# 学习器
learners &amp;lt;- list(
  lrn(&apos;clust.featureless&apos;),
  lrn(&apos;clust.kmeans&apos;, centers = 4L),
  lrn(&apos;clust.cmeans&apos;, centers = 3L)
)
# 评估器
measures &amp;lt;- list(
 msr(&apos;clust.wss&apos;), 
 msr(&apos;clust.silhouette&apos;)
)
# benchmark比较
bmr &amp;lt;- benchmark(
 benchmark_grid(
  tsk_usarrests, 
  learners,
  rsmp(&apos;insample&apos;)
 )
)
# 结果整合
bmr$aggregate(measures)[, c(4, 7, 8)]
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;Superclass MeasureClust has cloneable=FALSE, but subclass MeasureClustFPC has cloneable=TRUE. A subclass cannot be cloneable when its superclass is not cloneable, so cloning will be disabled for MeasureClustFPC.

Superclass MeasureClust has cloneable=FALSE, but subclass MeasureClustSil has cloneable=TRUE. A subclass cannot be cloneable when its superclass is not cloneable, so cloning will be disabled for MeasureClustSil.

INFO  [23:38:54.167] [mlr3] Running benchmark with 3 resampling iterations
INFO  [23:38:54.220] [mlr3] Applying learner &apos;clust.featureless&apos; on task &apos;usarrests&apos; (iter 1/1)
INFO  [23:38:54.254] [mlr3] Applying learner &apos;clust.kmeans&apos; on task &apos;usarrests&apos; (iter 1/1)
INFO  [23:38:54.289] [mlr3] Applying learner &apos;clust.cmeans&apos; on task &apos;usarrests&apos; (iter 1/1)
INFO  [23:38:54.331] [mlr3] Finished benchmark
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&quot;dataframe&quot;&amp;gt;
&amp;lt;caption&amp;gt;A bmr_aggregate: 3 x 3&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;learner_id&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;clust.wss&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;clust.silhouette&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;clust.featureless&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;355807.82&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.0000000&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;clust.kmeans     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 34728.63&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.5012332&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;clust.cmeans     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 47964.27&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.5319024&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;h2&gt;空间分析（Spatial Analysis）&lt;/h2&gt;
&lt;h3&gt;简介&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;空间分析
&lt;ul&gt;
&lt;li&gt;可以是任何其他机器学习任务（例如，回归或分类）的一个子集&lt;/li&gt;
&lt;li&gt;其定义是数据集中存在空间信息
&lt;ul&gt;
&lt;li&gt;这些信息通常存储为坐标&lt;/li&gt;
&lt;li&gt;通常命名为&lt;code&gt;&apos;x&apos;&lt;/code&gt;和&lt;code&gt;&apos;y&apos;&lt;/code&gt;，&lt;br /&gt;
或者&lt;code&gt;&apos;lat&apos;&lt;/code&gt;和&lt;code&gt;&apos;lon&apos;&lt;/code&gt;&lt;br /&gt;
（分别代表“纬度”和“经度”）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;空间分析是一项独特的任务
&lt;ul&gt;
&lt;li&gt;由于 &lt;strong&gt;自相关性&lt;/strong&gt; 的复杂性，空间数据必须谨慎处理&lt;/li&gt;
&lt;li&gt;自相关存在于空间数据中，&lt;br /&gt;
因为坐标中编码了隐含信息
&lt;ul&gt;
&lt;li&gt;例如两个观测值（如城市、国家、大洲）是相距较近还是较远&lt;/li&gt;
&lt;li&gt;例如，假设要预测德国疾病爆发两个月后的病例数
&lt;ul&gt;
&lt;li&gt;疫情从震中向外辐射，因此离德国较近的国家病例数会较多，&lt;br /&gt;
而较远的国家病例数会较少&lt;/li&gt;
&lt;li&gt;从空间角度查看数据，&lt;br /&gt;
可以清楚地看到附近观测值之间存在自相关的迹象&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;在这个例子中自相关是呈辐射状的，&lt;br /&gt;
但在实际情况中&lt;strong&gt;并非总是如此&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./image_13.png&quot; alt=&quot;image_13&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;mlr3spatiotempcv&lt;/code&gt; 中提供了额外的重采样方法，&lt;br /&gt;
以解决由于时空自相关导致的重采样过程中训练集和测试集的相似性问题&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;code&gt;TaskClassifST&lt;/code&gt; 和 &lt;code&gt;TaskRegrST&lt;/code&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;TaskClassifST&lt;/code&gt; 和 &lt;code&gt;TaskRegrST&lt;/code&gt;为&lt;br /&gt;
时空任务的分类与回归任务
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;coordinate_names&lt;/code&gt;：坐标的特征名&lt;/li&gt;
&lt;li&gt;&lt;code&gt;crs&lt;/code&gt;：Coordinate Reference System&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 加载R包
# library(mlr3spatial)
# library(mlr3spatiotempcv)

# 从`data.frame`创建任务对象
tsk_ecuador &amp;lt;- as_task_classif_st(
 ecuador, 
 id = &apos;ecuador_task&apos;,
 target = &apos;slides&apos;, 
 positive = &apos;TRUE&apos;,
 coordinate_names = c(&apos;x&apos;, &apos;y&apos;), 
 crs = &apos;32717&apos;
)

# 从`sf`创建任务对象
data_sf &amp;lt;- sf::st_as_sf(
 ecuador, 
 coords = c(&apos;x&apos;, &apos;y&apos;), 
 crs = &apos;32717&apos;
)
tsk_ecuador &amp;lt;- as_task_classif_st(
 data_sf, 
 target = &apos;slides&apos;,
 positive = &apos;TRUE&apos;
)

tsk_ecuador
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[36m--[39m [1m[34m&amp;lt;TaskClassifST&amp;gt;[39m (751x11)[22m [36m----------------------------------------------------[39m
* Target: slides
* Properties: twoclass
* Features (10):
  * dbl (10): carea, cslope, dem, distdeforest, distroad, distslidespast,
  hcurv, log.carea, slope, vcurv
* Coordinates:
            X       Y
        &amp;lt;num&amp;gt;   &amp;lt;num&amp;gt;
  1: 712882.5 9560002
  2: 715232.5 9559582
  3: 715392.5 9560172
  4: 715042.5 9559312
  5: 715382.5 9560142
 ---                 
747: 714472.5 9558482
748: 713142.5 9560992
749: 713322.5 9560562
750: 715392.5 9557932
751: 713802.5 9560862
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;可以用正常的学习器进行建模分析&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;lrn(&apos;classif.rpart&apos;)$
 train(tsk_ecuador)$
 predict(tsk_ecuador)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[36m--[39m [1m[34m&amp;lt;PredictionClassif&amp;gt;[39m for [34m751[39m observations:[22m [36m-----------------------------------[39m
 row_ids truth response
       1  TRUE     TRUE
       2  TRUE     TRUE
       3  TRUE     TRUE
     ---   ---      ---
     749 FALSE    FALSE
     750 FALSE    FALSE
     751 FALSE     TRUE
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;时空交叉验证（Spatiotemporal Cross-Validation）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;如果将非空间重采样方法用于空间数据可能会出现什么问题，本例中：
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&apos;NSpCV&apos;&lt;/code&gt;（非空间交叉验证）
&lt;ul&gt;
&lt;li&gt;是来自&lt;code&gt;mlr3&lt;/code&gt;的非空间重采样方法&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&apos;SpCV&apos;&lt;/code&gt;（空间交叉验证）
&lt;ul&gt;
&lt;li&gt;来自&lt;code&gt;mlr3spatiotempcv&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;针对空间数据进行优化的&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;结果展示&lt;code&gt;&apos;NSpCV&apos;&lt;/code&gt;使决策树看起来比实际表现更好，其估计性能明显更高
&lt;ul&gt;
&lt;li&gt;然而，这是由于数据中的自相关性导致的过度自信预测&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 学习器
lrn_rpart &amp;lt;- lrn(
 &apos;classif.rpart&apos;, 
 predict_type = &apos;prob&apos;
)
# 普通的重采样
rsmp_nsp &amp;lt;- rsmp(
 &apos;repeated_cv&apos;, 
 folds = 3, 
 repeats = 2, 
 id = &apos;NSpCV&apos;
)
# 空间交叉验证重采样
rsmp_sp &amp;lt;- rsmp(
 &apos;repeated_spcv_coords&apos;, 
 folds = 3, 
 repeats = 2,
 id = &apos;SpCV&apos;
)

# benchmark比较
design &amp;lt;- benchmark_grid(
 tsk_ecuador, 
 lrn_rpart, 
 c(rsmp_nsp, rsmp_sp)
)
bmr &amp;lt;- benchmark(design)

# 结果整合
bmr$aggregate(msr(&apos;classif.acc&apos;))[, c(5, 7)]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&quot;dataframe&quot;&amp;gt;
&amp;lt;caption&amp;gt;A bmr_aggregate: 2 x 2&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;resampling_id&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;classif.acc&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;NSpCV&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.676409&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;SpCV &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.584237&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;由于潜在的空间自相关性，&lt;br /&gt;
应用非空间重采样&lt;strong&gt;会导致训练集和测试集非常相似&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;因此，在模型训练所用的相同数据上进行测试，结果不会有太大差异&lt;/li&gt;
&lt;li&gt;为了得到真实的性能结果，应避免这种情况&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;空间方法考虑了自相关性，&lt;br /&gt;
测试数据与训练数据的相关性较低（尽管仍会存在一些关联）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;下图中，通过 &lt;code&gt;autoplot()&lt;/code&gt; 方法可以直观地看到：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;空间重采样方法，左图
&lt;ul&gt;
&lt;li&gt;各个分区在空间上有明显的分隔&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;非空间重采样方法，右图
&lt;ul&gt;
&lt;li&gt;训练集和测试集的划分重叠较多（因此相关性更强）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 加载R包
# library(patchwork)

# 对重采样结果可视化
(autoplot(rsmp_sp, tsk_ecuador, fold_id = 1, size = 0.7) +
  ggtitle(&apos;Spatial Resampling&apos;) +
  autoplot(rsmp_nsp, tsk_ecuador, fold_id = 1, size = 0.7) +
  ggtitle(&apos;Non-spatial Resampling&apos;)) +
  plot_layout(guides = &apos;collect&apos;) &amp;amp;
  theme_minimal() &amp;amp;
  theme(axis.text = element_text(size = 4), legend.position = &apos;bottom&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./image_14.png&quot; alt=&quot;image_14&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;&lt;code&gt;mlr3spatiotempcv&lt;/code&gt;中其他重采样方法&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Blocking&lt;/strong&gt;：&lt;br /&gt;
在二维或三维空间中创建矩形块&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Buffering&lt;/strong&gt;：&lt;br /&gt;
创建缓冲区，去除训练集和测试集之间的观测数据&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Spatiotemporal clustering&lt;/strong&gt;：&lt;br /&gt;
时空聚类 - 基于坐标（和/或时间点）的聚类&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Feature space clustering&lt;/strong&gt;：&lt;br /&gt;
基于特征空间进行聚类，不一定基于时空。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Custom (partitioning)&lt;/strong&gt;：&lt;br /&gt;
按因子变量分组&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;mlr3spatiotempcv&lt;/code&gt;也可以讨论&lt;strong&gt;时空问题&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;空间预测（Spatial Prediction）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;进行时空预测，目标是在像素级别进行分类或回归预测，&lt;br /&gt;
即对由栅格图像的几何分辨率定义的一个区域进行预测&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;使用 &lt;code&gt;predict_spatial()&lt;/code&gt;
可以对以下任何空间数据类进行空间预测：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;stars&lt;/code&gt;（来自 &lt;code&gt;stars&lt;/code&gt; 包）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SpatRaster&lt;/code&gt;（来自 &lt;code&gt;terra&lt;/code&gt; 包）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RasterLayer&lt;/code&gt;（来自 &lt;code&gt;raster&lt;/code&gt; 包）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RasterStack&lt;/code&gt;（来自 &lt;code&gt;raster&lt;/code&gt; 包）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;下例中&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;加载 &lt;code&gt;leipzig_points&lt;/code&gt; 数据集进行训练，&lt;/li&gt;
&lt;li&gt;并使用 &lt;code&gt;as_task_classif_st()&lt;/code&gt; 将其转换为时空任务，&lt;/li&gt;
&lt;li&gt;同时加载 &lt;code&gt;leipzig_raster&lt;/code&gt; 栅格数据&lt;/li&gt;
&lt;li&gt;这两个文件均作为示例数据包含在 &lt;code&gt;mlr3spatial&lt;/code&gt; 中&lt;/li&gt;
&lt;li&gt;指定创建一个 &lt;code&gt;terra&lt;/code&gt; 对象，&lt;br /&gt;
该对象可以使用内置绘图方法进行可视化&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# library(mlr3spatial)
# library(sf)
# library(terra, exclude = &apos;resample&apos;)

# 读取需要分析的示例数据
leipzig_vector &amp;lt;- sf::read_sf(
 system.file(
  &apos;extdata&apos;,
  &apos;leipzig_points.gpkg&apos;, 
  package = &apos;mlr3spatial&apos;
 ),
 stringsAsFactors = TRUE
)

# 构建任务
tsk_leipzig &amp;lt;- as_task_classif_st(
 leipzig_vector, 
 target = &apos;land_cover&apos;
)

# 读取示例的栅格数据
leipzig_raster &amp;lt;- terra::rast(
 system.file(
  &apos;extdata&apos;, 
  &apos;leipzig_raster.tif&apos;,
  package = &apos;mlr3spatial&apos;
 )
)

# 构建学习器
lrn_ranger &amp;lt;- lrn(&apos;classif.ranger&apos;)$
 train(tsk_leipzig)

# 预测，但是使用`predict_spatial()`
prediction &amp;lt;- predict_spatial(
 leipzig_raster, 
 lrn_ranger,
 format = &apos;terra&apos;
)

# 查看预测结果
prediction
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;class       : SpatRaster 
size        : 206, 154, 1  (nrow, ncol, nlyr)
resolution  : 10, 10  (x, y)
extent      : 731810, 733350, 5692030, 5694090  (xmin, xmax, ymin, ymax)
coord. ref. : WGS 84 / UTM zone 32N (EPSG:32632) 
source      : file48064a40f583.tif 
categories  : categories 
name        : land_cover 
min value   :     forest 
max value   :      water 
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;可视化预测的结果
&lt;ul&gt;
&lt;li&gt;森林（紫色）、牧场（蓝色）、城市（绿色）和水域（黄色）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;plot(
 prediction, 
 col = c(
 &apos;#440154FF&apos;, 
 &apos;#443A83FF&apos;, 
 &apos;#31688EFF&apos;,
 &apos;#21908CFF&apos;, 
 &apos;#35B779FF&apos;, 
 &apos;#8FD744FF&apos;, 
 &apos;#FDE725FF&apos;
 )
)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./image_15.png&quot; alt=&quot;image_15&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>【mlr3】7.算法公平性</title><link>https://nab-iak.github.io/posts/p16/p16/</link><guid isPermaLink="true">https://nab-iak.github.io/posts/p16/p16/</guid><description>mlr3算法公平性</description><pubDate>Wed, 16 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Cover Pic by &lt;a href=&quot;https://www.pixiv.net/artworks/130732257&quot;&gt;@スコッティ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://mlr3book.mlr-org.com/&quot;&gt;Applied Machine Learning Using mlr3 in R&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;简介&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;基于数据驱动模型的自动化决策系统正变得越来越普遍，但如果没有适当的审计，&lt;br /&gt;
这些模型可能会给个人，尤其是弱势群体带来负面后果&lt;/li&gt;
&lt;li&gt;举一个现实世界的例子
&lt;ul&gt;
&lt;li&gt;与其他种族群体相比，&lt;br /&gt;
历史和抽样偏差导致白人种族患者的医疗数据质量更高&lt;/li&gt;
&lt;li&gt;如果一个模型主要基于白人患者的数据进行训练，&lt;br /&gt;
那么该模型在给定的性能指标（例如分类错误）方面可能看起来 “很好”&lt;/li&gt;
&lt;li&gt;但实际上该模型可能在对白种人患者做出良好预测的同时，&lt;br /&gt;
却对其他患者做出错误甚至有害的预测&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;由于机器学习驱动的系统被用于具有重大影响力的决策，&lt;br /&gt;
因此不仅要从模型的稳健性和预测性能，还要从&lt;br /&gt;
潜在偏差方面，开发分析和评估这些模型的能力&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;示例数据&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# 加载R包
# library(mlr3fairness)

# 任务
tsk_adult_train &amp;lt;- tsk(&apos;adult_train&apos;)
tsk_adult_train
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[36m--[39m [1m[34m&amp;lt;TaskClassif&amp;gt;[39m (30718x13)[22m [36m----------------------------------------------------[39m
* Target: target
* Target classes: &amp;lt;=50K (positive class, 75%), &amp;gt;50K (25%)
* Properties: twoclass
* Features (12):
  * fct (7): education, marital_status, occupation, race, relationship, sex,
  workclass
  * int (5): age, capital_gain, capital_loss, education_num, hours_per_week
* Protected attribute: sex
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;偏差与公平性（Bias and Fairness）&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;在公平性的背景下，&lt;br /&gt;
&lt;strong&gt;偏差&lt;/strong&gt;是指模型对待个体或群体方式上的差异&lt;/li&gt;
&lt;li&gt;在成人数据集中，&lt;br /&gt;
与女性群体相比，&lt;br /&gt;
男性群体中的成年人年收入超过 5 万美元的可能性要大得多&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;sex_salary &amp;lt;- table(
 tsk_adult_train$
  data(cols = c(&apos;sex&apos;, &apos;target&apos;)
 )
)
round(proportions(sex_salary), 2)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;        target
sex      &amp;lt;=50K &amp;gt;50K
  Female  0.29 0.04
  Male    0.46 0.21
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;卡方检验进一步验证了上述的结论
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;p-value &amp;lt; 2.2e-16&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;chisq.test(sex_salary)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;Pearson&apos;s Chi-squared test with Yates&apos; continuity correction

data:  sex_salary
X-squared = 1440.4, df = 1, p-value &amp;lt; 2.2e-16
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;本例子中，性别变量称为&lt;strong&gt;敏感属性&lt;/strong&gt;（sensitive attribute）&lt;/li&gt;
&lt;li&gt;群体公平性
&lt;ul&gt;
&lt;li&gt;目标是确定在由敏感属性定义的各个群体之间，&lt;br /&gt;
决策是否公平&lt;/li&gt;
&lt;li&gt;任务中的敏感属性是通过&lt;code&gt;&apos;pta&apos;&lt;/code&gt;&lt;br /&gt;
（protected attribute，受保护属性）来设置的&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;tsk_adult_train$
 set_col_roles(&apos;sex&apos;, add_to = &apos;pta&apos;)

tsk_adult_train
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[36m--[39m [1m[34m&amp;lt;TaskClassif&amp;gt;[39m (30718x13)[22m [36m----------------------------------------------------[39m
* Target: target
* Target classes: &amp;lt;=50K (positive class, 75%), &amp;gt;50K (25%)
* Properties: twoclass
* Features (12):
  * fct (7): education, marital_status, occupation, race, relationship, sex,
  workclass
  * int (5): age, capital_gain, capital_loss, education_num, hours_per_week
* Protected attribute: sex
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;群体公平性概念（Group Fairness Notions）&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;如果模型做出的预测与敏感属性无关，&lt;br /&gt;
则称模型预测是&lt;strong&gt;偏差转换的&lt;/strong&gt;（bias-transforming），&lt;br /&gt;
或者满足&lt;strong&gt;独立性&lt;/strong&gt;（independence）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;偏差转换方法&lt;strong&gt;不依赖&lt;/strong&gt;于标签，&lt;br /&gt;
有助于检测因不同总体基础比率而产生的偏差&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果模型所做的预测在&lt;strong&gt;给定真实标签&lt;/strong&gt;的情况下与敏感属性无关，&lt;br /&gt;
则称该模型是&lt;strong&gt;偏差保持的&lt;/strong&gt;（bias-preserving），&lt;br /&gt;
或满足&lt;strong&gt;分离性&lt;/strong&gt;（separation）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;换句话说，该模型在每个组中做出的正确/错误预测数量应大致相同&lt;/li&gt;
&lt;li&gt;有几个指标属于这一类
&lt;ul&gt;
&lt;li&gt;均衡几率（equalized odds）
&lt;ul&gt;
&lt;li&gt;测试不同组之间的真阳性率（TPR）和假阳性率（FPR）是否相等&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;偏差保持指标（用于测试分离性）
&lt;ul&gt;
&lt;li&gt;测试模型在不同组中产生的错误是否相等，&lt;br /&gt;
但可能未考虑标签中的偏差
&lt;ul&gt;
&lt;li&gt;例如，如果现实世界中的结果可能存在偏差，&lt;br /&gt;
比如不同种族群体的人被捕率不同&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;选择何种公平性概念将取决于模型的用途及其社会背景&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;例如，如果一个模型用于预测某人是否有罪，&lt;br /&gt;
那么可能会更关注误报率或错误发现率，而非真阳性率&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;无论选择哪种指标，本质上都是将系统性偏差和偏见浓缩为几个数字，&lt;br /&gt;
而且所有指标都有局限性，&lt;br /&gt;
没有一个指标能够识别数据中可能存在的所有偏差&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;例如，如果社会偏见导致&lt;br /&gt;
具有相同潜在能力的个体&lt;br /&gt;
在某个可观测数量（如学校考试成绩）上出现差异，&lt;br /&gt;
这些指标可能无法识别出存在的偏差&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;为了在实践中理解这些概念&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;设 $A$ 为一个二元敏感群体，取值为 $0$ 和 $1$&lt;/li&gt;
&lt;li&gt;设 $M$ 为一个公平性度量指标&lt;/li&gt;
&lt;li&gt;为了衡量独立性，&lt;br /&gt;
只需计算这些值之间的差异，&lt;br /&gt;
并测试结果是否小于某个阈值 $ϵ$&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;$$
|\Delta_{M}| = |M_{A=0} - M_{A=1}| &amp;lt; \epsilon
$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;如果使用真实阳性率（TPR）作为指标 $M$，&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;那么如果 $|\Delta_{M}| &amp;gt; \epsilon$ （例如 $\epsilon = 0.05$）&lt;/li&gt;
&lt;li&gt;可得出结论：&lt;br /&gt;
模型的预测违反了机会均等指标，&lt;br /&gt;
并且不满足分离性&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果选择准确率或阳性预测值（PPV）作为指标 $M$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;可得出结论：模型预测不满足独立性&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在 &lt;code&gt;mlr3fairness&lt;/code&gt; 中，&lt;br /&gt;
可以通过构建 &lt;code&gt;msr(&quot;fairness&quot;, base_measure, range)&lt;/code&gt;，&lt;br /&gt;
从任何 Measure 构建一个公平性指标&lt;br /&gt;
选择的指标传递给 &lt;code&gt;base_measure&lt;/code&gt;，
以及该指标可能采用的范围（即基于基本指标的可能差异范围）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在&lt;code&gt;mlr3fairness&lt;/code&gt;中实现了几个 &lt;code&gt;Measure&lt;/code&gt;，简化了这一步骤&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;这些度量标准名为 &lt;code&gt;fairness.&amp;lt;base_measure&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;例如，真阳性率（TPR）：&lt;code&gt;msr(&quot;fairness.tpr&quot;)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;fair_tpr &amp;lt;- msr(
 &apos;fairness&apos;, 
 base_measure = msr(&apos;classif.tpr&apos;),
 range = c(0, 1)
)
fair_tpr
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[36m--[39m [1m[34m&amp;lt;MeasureFairness&amp;gt;[39m (fairness.tpr)[22m [36m--------------------------------------------[39m
* Packages: [34mmlr3[39m and [34mmlr3fairness[39m
* Range: [0, 1]
* Minimize: [34mTRUE[39m
* Average: macro
* Parameters: list()
* Properties: requires_task
* Predict type: response
* Predict sets: test
* Aggregator: mean()
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;针对偏差审核模型（Auditing a Model For Bias）&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;有了敏感属性集和选定的公平性指标，&lt;br /&gt;
现在可以训练一个&lt;code&gt;Learner&lt;/code&gt;并测试偏差&lt;/li&gt;
&lt;li&gt;下例使用随机森林，&lt;br /&gt;
评估男性和女性两组之间的真阳性率绝对差异&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;tsk_adult_test &amp;lt;- tsk(&apos;adult_test&apos;)
lrn_rpart &amp;lt;- lrn(
 &apos;classif.rpart&apos;, 
 predict_type = &apos;prob&apos;
)
prediction &amp;lt;- lrn_rpart$
 train(tsk_adult_train)$
 predict(tsk_adult_test)
prediction$
 score(fair_tpr, tsk_adult_test)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;fairness.tpr: 0.0603449540669074
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;当$ϵ$值为0.05时，可以得出模型存在偏差的结论&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;然而，这个ϵ值是任意设定的，&lt;br /&gt;
应该根据具体情况来决定&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;除了使用公平性指标评估单个模型外，&lt;br /&gt;
这些指标还可用于更大规模的benchmark实验，&lt;br /&gt;
以比较多个模型之间的偏差&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;可视化可以帮助更好地理解组间差异或模型间差异&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;fairness_prediction_density()&lt;/code&gt;：绘制各子组在不同组级别上的密度&lt;/li&gt;
&lt;li&gt;&lt;code&gt;compare_metrics()&lt;/code&gt;：通过多个指标对预测进行评分&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本例中，&lt;br /&gt;
该模型更倾向于预测女性观察对象的薪资较低&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;这可能是由于数据中存在系统性偏见，&lt;br /&gt;
即由于社会偏见，女性更有可能薪资较低，&lt;br /&gt;
也可能是由于算法引入的偏差&lt;/li&gt;
&lt;li&gt;如右图所示，所有公平性指标都超过了0.05，&lt;br /&gt;
这支持了一种观点，&lt;br /&gt;
即算法可能引入了更多偏差&lt;br /&gt;
（同样要注意0.05这个阈值）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 加载R包
# library(patchwork)
# library(ggplot2)

p1 &amp;lt;- fairness_prediction_density(
 prediction, 
 task = tsk_adult_test
)
p2 &amp;lt;- compare_metrics(
 prediction,
 msrs(
  c(
   &apos;fairness.fpr&apos;, 
   &apos;fairness.tpr&apos;, 
   &apos;fairness.eod&apos;
  )
 ),
 task = tsk_adult_test
)

(p1 + p2) *
 theme_minimal() *
 scale_fill_viridis_d(end = 0.8, alpha = 0.8) *
 theme(
  axis.text.x = element_text(angle = 15, hjust = .7),
  legend.position = &apos;bottom&apos;
  )
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./image_1.png&quot; alt=&quot;image_1&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;公平机器学习（Fair Machine Learning）&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;mlr3fairness&lt;/code&gt; 提供了多种解决模型偏差的方法&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;预处理数据：&lt;br /&gt;
在将基础数据传递给&lt;code&gt;Learner&lt;/code&gt;之前，&lt;br /&gt;
会以某种方式对其进行预处理，&lt;br /&gt;
以解决数据中的偏差问题&lt;/li&gt;
&lt;li&gt;采用公平模型：&lt;br /&gt;
一些算法可以直接纳入公平性考量，&lt;br /&gt;
例如带有公平性约束的广义线性模型&lt;br /&gt;
（&lt;code&gt;lrn(&quot;classif.fairzlrm&quot;)&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;后处理模型预测结果：&lt;br /&gt;
对预测应用启发式方法/算法，&lt;br /&gt;
以减轻预测中存在的偏差&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;可以使用&lt;code&gt;mlr3pipelines&lt;/code&gt;集成预处理和后处理方案&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在下面示例中&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第一个是使用&lt;code&gt;po(&quot;reweighing_wts&quot;)&lt;/code&gt;进行预处理以平衡观测权重，&lt;br /&gt;
第二个是使用&lt;code&gt;po(&quot;EOd&quot;)&lt;/code&gt;对预测结果进行后处理
&lt;ul&gt;
&lt;li&gt;通过随机翻转特定预测来执行均衡优势公平性定义&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;还将&lt;code&gt;lrn(&quot;classif.fairzlrm&quot;)&lt;/code&gt;与其他方法进行benchmark比较&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 方法0:用来被比较的基线学习器
lrn_rpart &amp;lt;- lrn(&apos;classif.rpart&apos;, predict_type = &apos;prob&apos;)
lrn_rpart$id &amp;lt;- &apos;rpart&apos;
# 方法1
l1 &amp;lt;- as_learner(
 po(&apos;reweighing_wts&apos;) %&amp;gt;&amp;gt;% 
  lrn(&apos;classif.rpart&apos;)
)
l1$id &amp;lt;- &apos;reweight&apos;
# 方法2
l2 &amp;lt;- as_learner(
 po(&apos;learner_cv&apos;, lrn(&apos;classif.rpart&apos;)) %&amp;gt;&amp;gt;%
  po(&apos;EOd&apos;)
)
l2$id &amp;lt;- &apos;EOd&apos;
# 方法3
l3 &amp;lt;- as_learner(
 po(&apos;collapsefactors&apos;) %&amp;gt;&amp;gt;% 
  lrn(&apos;classif.fairzlrm&apos;)
)
l3$id &amp;lt;- &apos;fairzlrm&apos;

# 构建任务
task &amp;lt;- tsk(&apos;adult_train&apos;)
# 设置敏感属性
task$set_col_roles(&apos;sex&apos;, &apos;pta&apos;)$
 filter(sample(task$nrow, 500))$
 select(setdiff(task$feature_names, &apos;education_num&apos;))

# benchmark比较试验
lrns &amp;lt;- list(lrn_rpart, l1, l2, l3)
bmr &amp;lt;- benchmark(
 benchmark_grid(
  task, 
  lrns, 
  rsmp(&apos;cv&apos;, folds = 5)
 )
)
meas &amp;lt;- msrs(c(&apos;classif.acc&apos;, &apos;fairness.eod&apos;))
# 整合结果
bmr$aggregate(meas)[,
  .(learner_id, classif.acc, fairness.equalized_odds)]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&quot;dataframe&quot;&amp;gt;
&amp;lt;caption&amp;gt;A bmr_aggregate: 4 x 3&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;learner_id&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;classif.acc&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;fairness.equalized_odds&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;rpart   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.776&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2264140&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;reweight&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.790&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.1553630&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;EOd     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.740&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.2337308&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;fairzlrm&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.768&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.1888915&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;可视化结果
&lt;ul&gt;
&lt;li&gt;各折叠（圆点）以及跨折叠聚合（叉号）的学习器&lt;br /&gt;
在分类准确率（x轴）和均衡几率（y轴）方面的比较&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;重新加权方法似乎比其他方法产生的公平性指标略好，&lt;br /&gt;
尽管这种差异不太可能具有显著性
&lt;ul&gt;
&lt;li&gt;在这种情况下，可以得出结论：&lt;br /&gt;
引入偏差缓解措施并没有提高算法公平性&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;fairness_accuracy_tradeoff(
 bmr, 
 fairness_measure = msr(&apos;fairness.eod&apos;),
 accuracy_measure = msr(&apos;classif.ce&apos;)
) +
 ggplot2::scale_color_viridis_d(&apos;Learner&apos;) +
 ggplot2::theme_minimal()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./image_2.png&quot; alt=&quot;image_2&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>【mlr3】8.预测集，验证及内部调优(+)</title><link>https://nab-iak.github.io/posts/p17/p17/</link><guid isPermaLink="true">https://nab-iak.github.io/posts/p17/p17/</guid><description>mlr3预测集，验证及内部调优(+)</description><pubDate>Tue, 15 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Cover Pic by &lt;a href=&quot;https://www.pixiv.net/artworks/131467447&quot;&gt;@灰色灰烬GREYASH&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://mlr3book.mlr-org.com/&quot;&gt;Applied Machine Learning Using mlr3 in R&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;预测集与训练误差估计&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;评估一个完全训练好的模型通常需要对未见过的测试样本进行预测&lt;/li&gt;
&lt;li&gt;当直接使用训练好的学习器进行预测时，&lt;br /&gt;
我们可以明确控制使用哪些样本&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 任务
tsk_sonar &amp;lt;- tsk(&apos;sonar&apos;)
# 学习器
lrn_rf &amp;lt;- lrn(&apos;classif.ranger&apos;)
# 训练模型
lrn_rf$train(tsk_sonar, row_ids = 4:208)

# 预测(两种方法)
pred1 &amp;lt;- lrn_rf$predict(tsk_sonar, row_ids = 1:3)
pred2 &amp;lt;- lrn_rf$predict_newdata(tsk_sonar$data(1:3))
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;但是，当使用&lt;code&gt;resample()&lt;/code&gt; 或 &lt;code&gt;benchmark()&lt;/code&gt; 时，&lt;br /&gt;
默认行为是对重采样的&lt;strong&gt;测试集&lt;/strong&gt;进行预测&lt;/li&gt;
&lt;li&gt;也可以通过配置学习器的 &lt;code&gt;$predict_sets&lt;/code&gt;，&lt;br /&gt;
对任务和数据的其他特定子集（即 &lt;strong&gt;训练&lt;/strong&gt; 和 &lt;strong&gt;内部验证&lt;/strong&gt; 数据）进行预测&lt;/li&gt;
&lt;li&gt;接下来看看更复杂的 &lt;strong&gt;内部验证&lt;/strong&gt; 选项&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 默认的用于预测的数据集
lrn_rf$predict_sets
# 设置为训练测试都给用上
lrn_rf$predict_sets &amp;lt;- c(&apos;train&apos;, &apos;test&apos;)
# 再看看当前用于预测的数据集
lrn_rf$predict_sets

# 执行重采样
rr &amp;lt;- resample(tsk_sonar, lrn_rf, rsmp(&apos;cv&apos;, folds = 3))
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&apos;test&apos;
&apos;train&apos;&apos;test&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;在重采样过程中，学习器在完成当前迭代的训练后，&lt;br /&gt;
将对所有请求的数据集生成预测
&lt;ul&gt;
&lt;li&gt;为了获取这些预测
&lt;ul&gt;
&lt;li&gt;既可以请求一个包含3个预测对象的列表（每个交叉验证折对应一个对象）&lt;/li&gt;
&lt;li&gt;也可以请求一个针对整个交叉验证的组合预测对象——&lt;br /&gt;
在这种情况下，该对象包含的预测行数与任务中的观测值数量相同&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 请求列表
str(rr$predictions(&apos;test&apos;))
str(rr$predictions(&apos;train&apos;))

# 获取
rr$prediction(&apos;test&apos;) 
rr$prediction(&apos;train&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;List of 3
 $ :Classes &apos;PredictionClassif&apos;, &apos;Prediction&apos;, &apos;R6&apos; &amp;lt;PredictionClassif&amp;gt; 
 $ :Classes &apos;PredictionClassif&apos;, &apos;Prediction&apos;, &apos;R6&apos; &amp;lt;PredictionClassif&amp;gt; 
 $ :Classes &apos;PredictionClassif&apos;, &apos;Prediction&apos;, &apos;R6&apos; &amp;lt;PredictionClassif&amp;gt; 

List of 3
 $ :Classes &apos;PredictionClassif&apos;, &apos;Prediction&apos;, &apos;R6&apos; &amp;lt;PredictionClassif&amp;gt; 
 $ :Classes &apos;PredictionClassif&apos;, &apos;Prediction&apos;, &apos;R6&apos; &amp;lt;PredictionClassif&amp;gt; 
 $ :Classes &apos;PredictionClassif&apos;, &apos;Prediction&apos;, &apos;R6&apos; &amp;lt;PredictionClassif&amp;gt; 

[36m--[39m [1m[34m&amp;lt;PredictionClassif&amp;gt;[39m for [34m208[39m observations:[22m [36m-----------------------------------[39m
 row_ids truth response
       3     R        M
       4     R        R
       6     R        R
     ---   ---      ---
     200     M        M
     206     M        M
     207     M        M

[36m--[39m [1m[34m&amp;lt;PredictionClassif&amp;gt;[39m for [34m416[39m observations:[22m [36m-----------------------------------[39m
 row_ids truth response
       1     R        R
       2     R        R
      10     R        R
     ---   ---      ---
     202     M        M
     204     M        M
     205     M        M
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;还可以将性能度量应用于重采样结果的特定数据集&lt;/li&gt;
&lt;li&gt;对于一项指标，默认的预测数据集通常是测试集，&lt;br /&gt;
但也可以在此请求其他数据集
&lt;ul&gt;
&lt;li&gt;如果为该指标请求了多个预测数据集，&lt;br /&gt;
那么在将其传入该指标之前，会先将这些数据集的预测结果合并，&lt;br /&gt;
然后该指标通常会对数据集中所有预测行计算一个聚合分数&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;在本例中，不出所料训练误差低于测试误差&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;rr$aggregate(list(
  msr(&apos;classif.ce&apos;, predict_sets = &apos;train&apos;, id = &apos;ce_train&apos;),
  msr(&apos;classif.ce&apos;, predict_sets = &apos;test&apos;, id = &apos;ce_test&apos;)
))
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt; ce_train   ce_test 
0.0000000 0.2020014 
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;如果我们只想获取训练期间计算出的信息，&lt;br /&gt;
甚至可以将学习器配置为完全不进行任何预测
&lt;ul&gt;
&lt;li&gt;例如对于那些已经（在其底层实现中）在训练期间产生泛化误差估计的学习器很有用
&lt;ul&gt;
&lt;li&gt;比如使用袋外误差估计或验证分数
&lt;ul&gt;
&lt;li&gt;前者仅适用于具有&lt;code&gt;&apos;oob_error&apos;&lt;/code&gt;属性的学习器，&lt;br /&gt;
可以通过 &lt;code&gt;MeasureOOBError&lt;/code&gt; 来访问&lt;/li&gt;
&lt;li&gt;后者适用于具有&lt;code&gt;&apos;validation&apos;&lt;/code&gt;属性的学习器，&lt;br /&gt;
并实现为 &lt;code&gt;MeasureInternalValidScore&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;下面使用随机森林的袋外误差对其进行评估
&lt;ul&gt;
&lt;li&gt;由于不需要任何预测集，&lt;br /&gt;
因此可以使用 &lt;code&gt;ResamplingInsample&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;它将使用整个数据集进行训练&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;lrn_rf$predict_sets &amp;lt;- NULL
rsmp_in &amp;lt;- rsmp(&apos;insample&apos;)
rr &amp;lt;- resample(
 tsk_sonar, 
 lrn_rf, 
 rsmp_in, 
 store_models = TRUE
)
msr_oob &amp;lt;- msr(&apos;oob_error&apos;)
rr$aggregate(msr_oob)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;oob_error 
0.1586538 
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;所有这些对于benchmark测试，调优，嵌套重采样，&lt;br /&gt;
以及任何其他内部涉及重采样的过程都以完全相同的方式工作，&lt;br /&gt;
并且要么生成预测结果，要么评估应用性能指标&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;下面通过调优随机森林的 &lt;code&gt;mtry.ratio&lt;/code&gt; 参数&lt;br /&gt;
（使用简单的网格搜索）来说明这一点&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;不是在某些测试数据上显式地进行预测并评估它们，&lt;br /&gt;
而是使用袋外（OOB）误差来评估 &lt;code&gt;mtry.ratio&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;这可以显著加快调优过程，&lt;br /&gt;
因为在这种情况下只拟合一个随机森林（仅进行训练），&lt;br /&gt;
并且我们可以从这个单一模型中获取袋外误差，&lt;br /&gt;
而无需拟合多个模型&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;由于在集成中每棵树的训练过程中，&lt;br /&gt;
袋外观测值未被触及，&lt;br /&gt;
所以仍然能产生有效的性能估计&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 设置带调优的超参数
lrn_rf$
 param_set$
 set_values(
  mtry.ratio = to_tune(0.1, 1)
)

# 进行实例调优
ti &amp;lt;- tune(
  task = tsk_sonar,
  tuner = tnr(&apos;grid_search&apos;),
  learner = lrn_rf,
  resampling = rsmp_in,
  measure = msr_oob,
  term_evals = 10,
  store_models = TRUE
)

# 查看结果
ti$result
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 1 x 4&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;mtry.ratio&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;learner_param_vals&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;x_domain&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;oob_error&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0.3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.0, 0.3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.1442308&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;h2&gt;验证&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;对于迭代训练，在训练过程中跟踪模型在验证数据上的性能表现可能很有意义&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;可以将其用于简单的记录或事后分析，&lt;br /&gt;
但主要的应用场景是提前停止训练&lt;/li&gt;
&lt;li&gt;如果模型在训练数据上的性能持续提升，&lt;br /&gt;
但在验证数据上的性能趋于平稳或下降，&lt;br /&gt;
这就表明出现了过拟合
&lt;ul&gt;
&lt;li&gt;此时我们应该停止迭代训练&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;在训练过程中以在线方式处理这个问题，&lt;br /&gt;
要比通过传统的离线超参数调整从外部配置迭代次数高效得多&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在传统方法中，需要反复使用不同的迭代次数来拟合模型&lt;br /&gt;
（并且无法利用有关连续进展的任何信息）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在&lt;code&gt;mlr3&lt;/code&gt;中，&lt;br /&gt;
学习器可以具有&lt;br /&gt;
&lt;code&gt;&apos;validation&apos;&lt;/code&gt;（验证）和&lt;br /&gt;
&lt;code&gt;&apos;internal_tuning&apos;&lt;/code&gt;（内部调优）属性，&lt;br /&gt;
以表明它们是否可以使用验证集，&lt;br /&gt;
以及是否可以在内部优化超参数，例如通过提前停止&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;要检查给定的学习器是否支持此功能，&lt;br /&gt;
只需访问其&lt;code&gt;$properties&lt;/code&gt;字段。&lt;/li&gt;
&lt;li&gt;这类学习器的包括XGBoost，LightGBM或CatBoost等提升算法，&lt;br /&gt;
以及来自&lt;code&gt;mlr3torch&lt;/code&gt;的深度学习模型&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本节中在声纳数据集上训练XGBoost，&lt;br /&gt;
并跟踪其在验证集上的性能&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;为启用验证，需要配置验证数据的构建方式&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;XGBoost有一个特殊的&lt;code&gt;watchlist&lt;/code&gt;参数&lt;/li&gt;
&lt;li&gt;但&lt;code&gt;mlr3&lt;/code&gt;也通过学习器的&lt;code&gt;$validate&lt;/code&gt;字段&lt;br /&gt;
提供了一个标准化的接口，该字段可以设置为：
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;NULL&lt;/code&gt;：&lt;br /&gt;
不使用验证数据（默认设置）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&apos;predefined&apos;&lt;/code&gt;：&lt;br /&gt;
用于使用任务中指定的验证数据&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&apos;test&apos;&lt;/code&gt;：&lt;br /&gt;
将测试集用作验证数据，&lt;br /&gt;
这仅在与重采样和调优结合使用时有效&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;如果将&lt;code&gt;$validate&lt;/code&gt;字段设置为&lt;code&gt;&apos;test&apos;&lt;/code&gt;，&lt;br /&gt;
将在训练期间泄露重采样测试集
&lt;ul&gt;
&lt;li&gt;如果使用验证分数进行提前停止，这将导致有偏差的性能估计&lt;/li&gt;
&lt;li&gt;是否可取取决于具体情况：
&lt;ul&gt;
&lt;li&gt;如果测试集用于在超参数优化期间评估参数配置（即它充当验证集），&lt;br /&gt;
那么这通常是可以的
如果测试集的目的是提供无偏差的性能估计，&lt;br /&gt;
例如比较不同的学习器，那么这是不可取的&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;tsk_sonar &amp;lt;- tsk(&apos;sonar&apos;)
lrn_xgb &amp;lt;- lrn(&apos;classif.xgboost&apos;)
lrn_xgb
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[36m--[39m [1m[34m&amp;lt;LearnerClassifXgboost&amp;gt;[39m (classif.xgboost): Extreme Gradient Boosting[22m [36m--------[39m
* Model: -
* Parameters: nrounds=1000, nthread=1, verbose=0
* Validate: NULL
* Packages: [34mmlr3[39m, [34mmlr3learners[39m, and [34mxgboost[39m
* Predict Types: [response] and prob
* Feature Types: logical, integer, and numeric
* Encapsulation: none (fallback: -)
* Properties: hotstart_forward, importance, internal_tuning, missings,
multiclass, offset, twoclass, validation, and weights
* Other settings: use_weights = &apos;use&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;下面将XGBoost学习器配置为使用其训练数据的1/3进行验证&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;lrn_xgb$validate &amp;lt;- 1/3
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;接下来设置迭代次数（&lt;code&gt;nrounds&lt;/code&gt;）和要跟踪的指标（&lt;code&gt;eval_metric&lt;/code&gt;），并训练学习器
&lt;ul&gt;
&lt;li&gt;训练任务中 1/3 的观测值将仅用于验证，&lt;br /&gt;
其余 2/3 用于训练&lt;/li&gt;
&lt;li&gt;如果在任务中启用了分层或分组，也会被继承&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;lrn_xgb$param_set$set_values(
  nrounds = 100,
  eval_metric = &apos;logloss&apos;
)
lrn_xgb$train(tsk_sonar)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;XGBoost学习器能够记录验证性能日志
&lt;ul&gt;
&lt;li&gt;可以通过&lt;code&gt;$model&lt;/code&gt;插槽访问该日志&lt;/li&gt;
&lt;li&gt;此信息在模型中的具体存储位置取决于特定的学习算法
&lt;ul&gt;
&lt;li&gt;对于XGBoost，&lt;br /&gt;
该历史记录存储在&lt;code&gt;$evaluation_log&lt;/code&gt;中&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;tail(lrn_xgb$model$evaluation_log)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A data.table: 6 x 2&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;iter&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;test_logloss&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; 95&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4774655&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; 96&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4785149&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; 97&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4804244&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; 98&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4785063&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; 99&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4797440&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;100&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.4802833&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;对迭代次数及验证对数损失可视化&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;lrn_xgb$model$evaluation_log %&amp;gt;%
    ggplot(aes(x = iter, y = test_logloss)) + 
    geom_line() +
    theme_minimal()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./image_1.png&quot; alt=&quot;image_1&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;可以通过 &lt;code&gt;$internal_valid_scores&lt;/code&gt; 字段访问此性能
&lt;ul&gt;
&lt;li&gt;该字段是一个命名列表，可包含多个验证指标&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;lrn_xgb$internal_valid_scores
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;$logloss = 0.480283279483969
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;将 &lt;code&gt;validate&lt;/code&gt; 字段设置为 &lt;code&gt;&apos;predefined&apos;&lt;/code&gt;，&lt;br /&gt;
可以对验证数据进行如此精细的控制&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;lrn_xgb$validate = &apos;predefined&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;这使我们能够使用训练任务中定义的 &lt;code&gt;$internal_valid_task&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;下面将验证任务设置为使用60个随机采样的ID，&lt;br /&gt;
并将它们从主要任务中移除&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 随机采样60个
valid_ids &amp;lt;- sample(tsk_sonar$nrow, 60)
# 新建移除过这60个样本的验证任务
tsk_valid &amp;lt;- tsk_sonar$clone(deep = TRUE)
tsk_valid$filter(valid_ids)
tsk_sonar$filter(setdiff(tsk_sonar$row_ids, valid_ids))
# 定义用于内部验证的样本
tsk_sonar$internal_valid_task &amp;lt;- tsk_valid
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;可以查看用于内部验证的样本和训练用样本的个数&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;c(tsk_sonar$internal_valid_task$nrow, tsk_sonar$nrow)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[1]  60 148
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;训练模型
&lt;ul&gt;
&lt;li&gt;学习器将在指定的额外任务上进行自我验证&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$internal_valid_task&lt;/code&gt; 插槽始终在内部使用，&lt;br /&gt;
即使在 &lt;code&gt;learner$validate&lt;/code&gt; 中设置了一个比率值，&lt;br /&gt;
它也只是自动构建（然后传递下去）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;lrn_xgb$train(tsk_sonar)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;验证也能在&lt;code&gt;GraphLearner&lt;/code&gt;中进行，&lt;br /&gt;
因为预处理&lt;code&gt;PipeOp&lt;/code&gt;也处理验证任务&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;虽然&lt;code&gt;PipeOp&lt;/code&gt;的训练逻辑应用于主要任务，&lt;br /&gt;
但预测逻辑应用于验证数据&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;这确保了在XGBoost学习器在验证数据上&lt;br /&gt;
评估其性能时不会出现数据泄露&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;下例中构建&lt;code&gt;PipeOpPCA&lt;/code&gt;并将其应用于带有验证任务的&lt;code&gt;tsk(&apos;sonar&apos;)&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;po_pca &amp;lt;- po(&apos;pca&apos;)
taskout &amp;lt;- po_pca$train(list(tsk_sonar))[[1]]
taskout$internal_valid_task
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[36m--[39m [1m[34m&amp;lt;TaskClassif&amp;gt;[39m (60x61): Sonar: Mines vs. Rocks[22m [36m-------------------------------[39m
* Target: Class
* Target classes: M (positive class, 60%), R (40%)
* Properties: twoclass
* Features (60):
  * dbl (60): PC1, PC10, PC11, PC12, PC13, PC14, PC15, PC16, PC17, PC18, PC19,
  PC2, PC20, PC21, PC22, PC23, PC24, PC25, PC26, PC27, PC28, PC29, PC3, PC30,
  PC31, PC32, PC33, PC34, PC35, PC36, PC37, PC38, PC39, PC4, PC40, PC41, PC42,
  PC43, PC44, PC45, PC46, PC47, PC48, PC49, PC5, PC50, PC51, PC52, PC53, PC54,
  PC55, PC56, PC57, PC58, PC59, PC6, PC60, PC7, PC8, PC9
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;在&lt;code&gt;$train()&lt;/code&gt;期间应用于&lt;code&gt;$internal_valid_task&lt;/code&gt;的预处理，&lt;br /&gt;
等同于对其进行预测&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;po_pca$predict(list(tsk_sonar$internal_valid_task))[[1L]]
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[36m--[39m [1m[34m&amp;lt;TaskClassif&amp;gt;[39m (60x61): Sonar: Mines vs. Rocks[22m [36m-------------------------------[39m
* Target: Class
* Target classes: M (positive class, 60%), R (40%)
* Properties: twoclass
* Features (60):
  * dbl (60): PC1, PC10, PC11, PC12, PC13, PC14, PC15, PC16, PC17, PC18, PC19,
  PC2, PC20, PC21, PC22, PC23, PC24, PC25, PC26, PC27, PC28, PC29, PC3, PC30,
  PC31, PC32, PC33, PC34, PC35, PC36, PC37, PC38, PC39, PC4, PC40, PC41, PC42,
  PC43, PC44, PC45, PC46, PC47, PC48, PC49, PC5, PC50, PC51, PC52, PC53, PC54,
  PC55, PC56, PC57, PC58, PC59, PC6, PC60, PC7, PC8, PC9
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;这意味着，即使在复杂的图学习器中，跟踪验证性能也能发挥作用，&lt;br /&gt;
而如果只是简单设置XGBoost的&lt;code&gt;watchlist&lt;/code&gt;参数是不可能实现的&lt;/li&gt;
&lt;li&gt;下面将PCA算子与XGBoost衔接起来，&lt;br /&gt;
并将其转换为一个&lt;code&gt;GraphLearner&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;glrn &amp;lt;- as_learner(po_pca %&amp;gt;&amp;gt;% lrn_xgb)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;虽然这样几乎就能奏效，但现在需要在两个层面上指定 $validate 字段：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;对于&lt;code&gt;GraphLearner&lt;/code&gt;本身，&lt;br /&gt;
即在&lt;code&gt;Task&lt;/code&gt;进入&lt;code&gt;Graph&lt;/code&gt;之前，验证数据是如何创建的&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;哪些具有&lt;code&gt;“validation”&lt;/code&gt;属性的&lt;code&gt;PipeOp&lt;/code&gt;实际上应该使用它&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;通过使用 &lt;code&gt;set_validate()&lt;/code&gt; 可以简化此配置。当应用于 &lt;code&gt;GraphLearner&lt;/code&gt; 时，我们可以指定参数 &lt;code&gt;validate&lt;/code&gt;，它决定了&lt;strong&gt;如何&lt;/strong&gt;创建验证数据，还可以选择性地指定参数 &lt;code&gt;ids&lt;/code&gt;，它指定了&lt;strong&gt;哪些&lt;/strong&gt; &lt;code&gt;PipeOp&lt;/code&gt; 应该使用该数据&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;默认情况下，后者设置为&lt;br /&gt;
&lt;code&gt;Graph&lt;/code&gt; 的 &lt;code&gt;$base_learner()&lt;/code&gt;，&lt;br /&gt;
即最后一个学习器&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;这意味着以下两个调用是等效的：&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;set_validate(glrn, validate = &apos;predefined&apos;)
set_validate(glrn, validate = &apos;predefined&apos;, ids = &apos;classif.xgboost&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;现在可以像之前一样训练&lt;code&gt;GraphLearner&lt;/code&gt;，&lt;br /&gt;
并检查最终的验证指标
&lt;ul&gt;
&lt;li&gt;该指标现在会加上相应&lt;code&gt;PipeOp&lt;/code&gt;的ID作为前缀&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;glrn$validate = &apos;predefined&apos;
glrn$train(tsk_sonar)
glrn$internal_valid_scores
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;$classif.xgboost.logloss = 0.427817946910121
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;注意&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;由于单个&lt;code&gt;PipeOp&lt;/code&gt;无法控制验证数据的生成方式，&lt;br /&gt;
只能控制是否使用验证数据，&lt;br /&gt;
因此其&lt;code&gt;$validate&lt;/code&gt;字段只能设置为&lt;code&gt;NULL&lt;/code&gt;或&lt;code&gt;&apos;predefined&apos;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;这就是为什么在运行&lt;br /&gt;
&lt;code&gt;as_pipeop(lrn(&apos;classif.xgboost&apos;, validate = 0.3))&lt;/code&gt;时会出错&lt;/li&gt;
&lt;li&gt;在&lt;code&gt;GraphLearner&lt;/code&gt;中使用验证时，&lt;br /&gt;
&lt;strong&gt;最好先构建不指定验证数据的学习器&lt;/strong&gt;，&lt;br /&gt;
然后使用&lt;code&gt;set_validate()&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;内部调优&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;XGBoost不仅可以记录其验证性能，还可以对其进行监控，&lt;br /&gt;
以便提前停止训练
&lt;ul&gt;
&lt;li&gt;即在训练期间对&lt;code&gt;nrounds&lt;/code&gt;超参数进行内部调整&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;这由&lt;code&gt;&apos;internal_tuning&apos;&lt;/code&gt;属性标记：&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&apos;internal_tuning&apos; %in% lrn_xgb$properties
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;TRUE
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;XGBoost可以通过指定&lt;code&gt;early_stopping_rounds&lt;/code&gt;参数来&lt;br /&gt;
启用提前停止
&lt;ul&gt;
&lt;li&gt;这也被称为&lt;strong&gt;耐心值&lt;/strong&gt;，&lt;br /&gt;
它指定了在训练终止前，&lt;br /&gt;
验证损失在多少轮迭代中没有改善&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;用于提前停止的指标是传递给&lt;code&gt;eval_metric&lt;/code&gt;的第一个值，&lt;br /&gt;
即对数损失&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;lrn_xgb$param_set$set_values(
  early_stopping_rounds = 10,
  nrounds = 100
)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;当训练学习器时，&lt;br /&gt;
可通过 &lt;code&gt;$internal_tuned_values&lt;/code&gt; 字段&lt;br /&gt;
访问内部优化的 &lt;code&gt;nrounds&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;lrn_xgb$train(tsk_sonar)
lrn_xgb$internal_tuned_values
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;$nrounds = 17
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;通过使用提前停止策略，在20次迭代后就能够终止训练&lt;/li&gt;
&lt;li&gt;将验证损失随时间的变化进行可视化，最优的轮数用红色标记
&lt;ul&gt;
&lt;li&gt;由于耐心值的设置，训练在之后仍持续了一段时间&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;lrn_xgb$model$evaluation_log %&amp;gt;%
    ggplot(aes(x = iter, y = test_logloss)) + 
    geom_line() +
    # lrn_xgb$model$evaluation_log[17]
    geom_point(
     aes(x = 17, y = 0.3503711), 
     color = &apos;red&apos;
 ) + 
    theme_minimal()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./image_2.png&quot; alt=&quot;image_2&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;目前为止仅使用了XGBoost的提前停止实现来优化&lt;code&gt;nrounds&lt;/code&gt;，&lt;br /&gt;
尚未调整任何其他超参数
&lt;ul&gt;
&lt;li&gt;这就是&lt;code&gt;mlr3&lt;/code&gt;发挥作用的地方，&lt;br /&gt;
因为它允许我们将学习器的内部调整与&lt;br /&gt;
通过&lt;code&gt;mlr3tuning&lt;/code&gt;进行的（非内部）超参数调整相结合&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;将两个参数都标记为&lt;code&gt;to_tune()&lt;/code&gt;，&lt;br /&gt;
但将&lt;code&gt;nrounds&lt;/code&gt;标记为进行内部调整&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;lrn_xgb$
 param_set$
 set_values(
  eta = to_tune(0.001, 0.1, logscale = TRUE),
  nrounds = to_tune(upper = 500, internal = TRUE)
)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;通常可能希望使用相同的验证数据来优化&lt;code&gt;eta&lt;/code&gt;和&lt;code&gt;nrounds&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;通过指定&lt;code&gt;validate&lt;/code&gt;字段为&lt;code&gt;&apos;test&apos;&lt;/code&gt;选项可以实现&lt;/li&gt;
&lt;li&gt;这意味着在每次重采样迭代中，&lt;br /&gt;
验证数据将设置为测试集，&lt;br /&gt;
同样也将用于评估参数配置（以调整&lt;code&gt;eta&lt;/code&gt;）的数据&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;lrn_xgb$validate = &apos;test&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;将继续使用简单的网格搜索来调整XGBoost，&lt;br /&gt;
进行10次评估，并采用3折交叉验证进行内部重采样&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在内部，这将使用10个不同的 &lt;code&gt;eta&lt;/code&gt; 值来训练XGBoost，&lt;br /&gt;
同时将 &lt;code&gt;nrounds&lt;/code&gt; 参数固定为500，即上述的上限&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;对于每个 &lt;code&gt;eta&lt;/code&gt; 值，将执行带有早停法的3折交叉验证，&lt;br /&gt;
从而为每个 &lt;code&gt;eta&lt;/code&gt; 值生成3个（可能不同的）早停的 &lt;code&gt;nrounds&lt;/code&gt; 值&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;这些值会根据聚合规则合并为单个值&lt;/li&gt;
&lt;li&gt;默认情况下设置为取平均值，&lt;br /&gt;
但在创建内部调优令牌时可以覆盖该规则&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;当通过&lt;code&gt;mlr3tuning&lt;/code&gt;将内部调优与超参数优化相结合时，&lt;br /&gt;
需要指定两个性能指标：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一个用于内部调优&lt;/li&gt;
&lt;li&gt;另一个用于&lt;code&gt;Tuner&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;因此，即使存在默认值，&lt;br /&gt;
&lt;code&gt;mlr3&lt;/code&gt;要求显式设置内部调优指标&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;有两种方法可以在两种类型的超参数优化中使用相同的指标：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;msr(&apos;internal_valid_scores&apos;, select = &amp;lt;id&amp;gt;)&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;最终验证分数&lt;/li&gt;
&lt;li&gt;由于一个学习器可能有多个内部验证分数，&lt;br /&gt;
该指标允许通过指定&lt;code&gt;select&lt;/code&gt;参数来选择其中一个&lt;/li&gt;
&lt;li&gt;如果未指定此参数，将使用第一个验证指标&lt;/li&gt;
&lt;li&gt;我们还需要指定该指标是否应最小化&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;将&lt;code&gt;eval_metric&lt;/code&gt;和调优度量都设置为同一指标
&lt;ul&gt;
&lt;li&gt;例如，&lt;code&gt;eval_metric = &apos;error&apos;&lt;/code&gt;且&lt;br /&gt;
&lt;code&gt;measure = msr(&apos;classif.ce&apos;)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;有些学习器甚至允许将&lt;br /&gt;
验证指标设置为一个&lt;code&gt;mlr3::Measure&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;可以通过查看相应的文档来了解哪些学习器支持此功能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;使用第一个选项的优势在于可以跳过预测步骤，&lt;br /&gt;
因为内部验证分数在训练过程中已经计算好了&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用 &lt;code&gt;GraphLearner&lt;/code&gt; 时，&lt;br /&gt;
内部验证分数的名称会以相应 &lt;code&gt;PipeOp&lt;/code&gt; 的 ID 为前缀&lt;/li&gt;
&lt;li&gt;因此 &lt;code&gt;select&lt;/code&gt; 参数需要设置为&lt;br /&gt;
 &lt;code&gt;&apos;&amp;lt;pipeop id&amp;gt;.&amp;lt;measure id&amp;gt;&apos;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;tsk_sonar &amp;lt;- tsk(&apos;sonar&apos;)
lrn_xgb$predict_sets = NULL

ti &amp;lt;- tune(
 tuner = tnr(&apos;grid_search&apos;),
 learner = lrn_xgb,
 task = tsk_sonar,
 resampling = rsmp(&apos;cv&apos;, folds = 3),
 measure = msr(&apos;internal_valid_score&apos;,
    select = &apos;logloss&apos;, minimize = TRUE),
 term_evals = 10L
)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;调优结果包含为 &lt;code&gt;eta&lt;/code&gt; 和 &lt;code&gt;nrounds&lt;/code&gt; 找到的最佳配置&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;ti$result_learner_param_vals[c(&apos;eta&apos;, &apos;nrounds&apos;)]
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;$eta
[1] 0.1

$nrounds
[1] 66
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;下面展示如何从调优存档中提取不同的参数配置
&lt;ul&gt;
&lt;li&gt;所有内部调优的参数都可以通过&lt;br /&gt;
 &lt;code&gt;$internal_tuned_values&lt;/code&gt; 访问&lt;/li&gt;
&lt;li&gt;这是一个列表列，&lt;br /&gt;
因为在内部有可能对多个参数进行调优
&lt;ul&gt;
&lt;li&gt;例如在 &lt;code&gt;GraphLearner&lt;/code&gt; 中&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;提取 &lt;code&gt;eta&lt;/code&gt; 的值（从对数尺度转换回原值）、&lt;code&gt;nrounds&lt;/code&gt;（内部调优）和对数损失&lt;/li&gt;
&lt;li&gt;后者是在内部验证任务上评估的，&lt;br /&gt;
正如指定 &lt;code&gt;validate = &quot;test&quot;&lt;/code&gt; 时，&lt;br /&gt;
这些任务对应于 &lt;code&gt;Resampling&lt;/code&gt; 的测试集&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;通过可视化结果，可以看到两个调优参数之间的反比关系：&lt;br /&gt;
较小的步长（&lt;code&gt;eta&lt;/code&gt;）需要更多的提升迭代次数（&lt;code&gt;nrounds&lt;/code&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;d &amp;lt;- ti$archive$data

d &amp;lt;- data.table(
  eta = exp(d$eta),
  nrounds = unlist(d$internal_tuned_values),
  logloss = d$logloss
)

ggplot(data = d, aes(x = eta, y = nrounds, color = logloss)) +
  geom_point() + theme_minimal()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./image_3.png&quot; alt=&quot;image_3&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;这同样适用于 &lt;code&gt;AutoTuner&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;它将在最终模型拟合时使用内部优化的&lt;code&gt;nrounds&lt;/code&gt;以及&lt;br /&gt;
离线调优的&lt;code&gt;eta&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;这意味着在训练最终模型时&lt;br /&gt;
不进行验证或提前停止，会使用所有可用的数据&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;at &amp;lt;- auto_tuner(
 tuner = tnr(&apos;grid_search&apos;),
 learner = lrn_xgb,
 resampling = rsmp(&apos;cv&apos;, folds = 3),
 measure = msr(&apos;internal_valid_score&apos;,
 select = &apos;logloss&apos;, minimize = TRUE),
 term_evals = 10L
)

at$train(tsk_sonar)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;在使用重采样的测试集进行验证时必须谨慎
&lt;ul&gt;
&lt;li&gt;这样做是否可行取决于重采样的背景和目的&lt;/li&gt;
&lt;li&gt;如果重采样的目的是为了获得算法的无偏性能估计，&lt;br /&gt;
而其中一些算法会提前停止，另一些则不会，&lt;br /&gt;
&lt;strong&gt;那么这样做是不行的&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;在这种情况下，前者相对于后者会有不公平的优势&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;下面的例子说明了这样一种情况，&lt;br /&gt;
即两个学习器之间的比较并不公平。&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;lrn_xgb$
 param_set$
 set_values(
  eta = 0.1, 
  nrounds = 500, 
  early_stopping_rounds = 10
)
lrn_xgb$predict_sets = &apos;test&apos;

design &amp;lt;- benchmark_grid(
 tsk_sonar, 
 list(lrn_xgb, lrn(&apos;classif.rpart&apos;)), 
 rsmp(&apos;cv&apos;, folds = 3)
)
bmr &amp;lt;- benchmark(design)

bmr$aggregate(msr(&apos;classif.ce&apos;))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&apos;dataframe&apos;&amp;gt;
&amp;lt;caption&amp;gt;A bmr_aggregate: 2 x 7&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;nr&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;resample_result&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;task_id&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;learner_id&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;resampling_id&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;iters&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;classif.ce&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x30f88fee8&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;classif.xgboost&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.1828847&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x30f86d388&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;sonar&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span style=white-space:pre-wrap&amp;gt;classif.rpart  &amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cv&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.3124224&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用 &lt;code&gt;to_tune()&lt;/code&gt; 虽然更方便，&lt;br /&gt;
但手动定义搜索空间在参数转换方面能提供更大的灵活性
&lt;ul&gt;
&lt;li&gt;使用 &lt;code&gt;ps()&lt;/code&gt; 函数手动指定搜索空间时启用内部调优&lt;/li&gt;
&lt;li&gt;将内部调优参数包含在 &lt;code&gt;search_space&lt;/code&gt; 中，&lt;br /&gt;
但需要指定一个聚合函数并用&lt;br /&gt;
 &lt;code&gt;&apos;internal_tuning&apos;&lt;/code&gt; 标记它们&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;search_space &amp;lt;- ps(
 eta = p_dbl(0.001, 0.1, logscale = TRUE),
 nrounds = p_int(
  upper = 500, 
  tags = &apos;internal_tuning&apos;,
  aggr = function(x) as.integer(mean(unlist(x)))
 )
)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;这个搜索空间可以传递给&lt;code&gt;AutoTuner&lt;/code&gt;，&lt;br /&gt;
然后优化将像以前一样继续进行&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;at &amp;lt;- auto_tuner(
 tuner = tnr(&apos;grid_search&apos;),
 learner = lrn_xgb,
 resampling = rsmp(&apos;cv&apos;, folds = 3),
 measure = msr(&apos;internal_valid_score&apos;,
 select = &apos;logloss&apos;, minimize = TRUE),
 search_space = search_space,
 term_evals = 10L
)

at$train(tsk_sonar)
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>【mlr3】9.不均衡样本</title><link>https://nab-iak.github.io/posts/p18/p18/</link><guid isPermaLink="true">https://nab-iak.github.io/posts/p18/p18/</guid><description>mlr3不均衡样本</description><pubDate>Mon, 14 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Cover Pic by &lt;a href=&quot;https://www.pixiv.net/artworks/131466322&quot;&gt;@Rafa&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://mlr3book.mlr-org.com/&quot;&gt;Applied Machine Learning Using mlr3 in R&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;准备工作&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;使用网上的公开数据集&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;library(mlr3verse)
library(mlr3learners)
library(OpenML)
set.seed(7832)
lgr::get_logger(&quot;mlr3&quot;)$set_threshold(&quot;warn&quot;)

ds &amp;lt;- listOMLDataSets(
 number.of.classes = 2,
 number.of.features = c(1, 100),
 number.of.instances = c(5000, 10000)
)
# select imbalanced data sets (without categorical features as SMOTE cannot handle them)
ds &amp;lt;- subset(
 ds, minority.class.size / number.of.instances &amp;lt; 0.2 &amp;amp;
 number.of.symbolic.features == 1
)

# pick one data set from list above
d &amp;lt;- getOMLDataSet(980)


data(&quot;optdigits&quot;, package = &quot;mlr3data&quot;)
task &amp;lt;- as_task_classif(optdigits, target = &quot;binaryclass&quot;, positive = &quot;P&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;数据轮廓&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;pastecs::stat.desc(task$data())
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&quot;dataframe&quot;&amp;gt;
&amp;lt;caption&amp;gt;A data.frame: 14 x 65&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;binaryclass&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;input1&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;input10&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;input11&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;input12&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;input13&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;input14&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;input15&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;input16&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;input17&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;...&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;input59&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;input6&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;input60&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;input61&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;input62&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;input63&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;input64&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;input7&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;input8&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;input9&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;lgl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;...&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;nbr.val&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5620&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5.620000e+03&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5.620000e+03&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5.620000e+03&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5.620000e+03&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5.620000e+03&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5.620000e+03&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5.620000e+03&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5.620000e+03&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5.620000e+03&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5.620000e+03&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5.620000e+03&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5.620000e+03&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5.620000e+03&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5.620000e+03&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5.620000e+03&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5.620000e+03&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5.620000e+03&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5.620000e+03&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;nbr.null&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5620&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.228000e+03&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5.020000e+02&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5.300000e+01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2.170000e+02&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.111000e+03&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.652000e+03&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5.429000e+03&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5.607000e+03&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.288000e+03&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.611000e+03&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2.250000e+02&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.940000e+02&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.494000e+03&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.714000e+03&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5.303000e+03&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;4.277000e+03&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5.458000e+03&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5.610000e+03&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;nbr.na&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;   0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.000000e+00&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;min&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;   0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.000000e+00&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;max&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;   0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.600000e+01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.600000e+01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.600000e+01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.600000e+01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.600000e+01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.600000e+01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.500000e+01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.600000e+01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.600000e+01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.600000e+01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.600000e+01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.600000e+01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.600000e+01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.600000e+01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.600000e+01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.600000e+01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5.000000e+00&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;range&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;   0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.600000e+01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.600000e+01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.600000e+01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.600000e+01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.600000e+01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.600000e+01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.500000e+01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.600000e+01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.600000e+01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.600000e+01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.600000e+01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.600000e+01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.600000e+01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.600000e+01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.600000e+01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.600000e+01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5.000000e+00&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;sum&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;   0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.107800e+04&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5.909400e+04&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;6.631500e+04&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5.909100e+04&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;4.640600e+04&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.172900e+04&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;7.750000e+02&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2.400000e+01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.237400e+04&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.143700e+04&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;6.738200e+04&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;6.503700e+04&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.777100e+04&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.176600e+04&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.428000e+03&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;7.752000e+03&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;7.770000e+02&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.800000e+01&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;median&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;   0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.200000e+01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.300000e+01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.100000e+01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;9.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;4.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.300000e+01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.300000e+01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;6.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.000000e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.000000e+00&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;mean&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;   0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.971174e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.051495e+01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.179982e+01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.051441e+01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;8.257295e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2.087011e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.379004e-01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;4.270463e-03&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5.760498e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5.593772e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.198968e+01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.157242e+01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;6.720819e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2.093594e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2.540925e-01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.379359e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.382562e-01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.202847e-03&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;SE.mean&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;   0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;4.133591e-02&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;7.244927e-02&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5.339259e-02&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;6.387746e-02&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;7.967630e-02&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5.228284e-02&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.254545e-02&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.400035e-03&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;6.697837e-02&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;7.511538e-02&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5.799301e-02&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;6.637184e-02&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;7.757533e-02&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5.399679e-02&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.892252e-02&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;4.477502e-02&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.396618e-02&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.206171e-03&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;CI.mean&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;   0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;8.103436e-02&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.420285e-01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.046701e-01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.252245e-01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.561963e-01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.024946e-01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2.459392e-02&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2.744609e-03&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.313035e-01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.472552e-01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.136887e-01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.301145e-01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.520776e-01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.058546e-01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.709545e-02&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;8.777633e-02&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2.737911e-02&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2.364561e-03&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;var&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;   0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;9.602657e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2.949880e+01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.602132e+01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2.293145e+01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.567751e+01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.536224e+01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;8.845217e-01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.101575e-02&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2.521189e+01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.170984e+01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.890112e+01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2.475735e+01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.382078e+01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.638597e+01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2.012308e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.126699e+01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.096205e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;8.176250e-03&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;std.dev&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;   0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.098815e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5.431280e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;4.002664e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;4.788680e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5.973066e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.919470e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;9.404901e-01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.049560e-01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5.021145e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5.631149e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;4.347542e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;4.975675e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5.815564e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;4.047959e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.418558e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.356633e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.046998e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;9.042262e-02&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;coef.var&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;NA&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; NaN&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.572066e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5.165294e-01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.392139e-01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;4.554396e-01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;7.233683e-01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.878031e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;6.820070e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2.457719e+01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;8.716511e-01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.006682e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.626070e-01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;4.299598e-01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;8.653059e-01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.933497e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5.582841e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2.433473e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;7.572881e+00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2.823195e+01&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;table(task$truth())
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;P    N 
 572 5048
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;不均衡数据的重采样&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;在&lt;code&gt;mlr3pipelines&lt;/code&gt;中，有一个&lt;code&gt;class balancing&lt;/code&gt;和一个&lt;code&gt;smote&lt;/code&gt;管道操作符，&lt;/li&gt;
&lt;li&gt;可以与任何学习器结合使用&lt;/li&gt;
&lt;li&gt;下面使用欠采样，过采样和SMOTE的&lt;code&gt;PipeOp&lt;/code&gt;/&lt;code&gt;Graph&lt;/code&gt;来控制类别不平衡的程度&lt;/li&gt;
&lt;li&gt;将&lt;code&gt;PipeOp&lt;/code&gt;/&lt;code&gt;Graph&lt;/code&gt;应用于当前具有特定超参数值的&lt;code&gt;Task&lt;/code&gt;，以观察类别平衡如何变化：&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;欠采样（undersampling）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;对多类样本中重采样，减少多类样本数量&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 欠采样
po_under &amp;lt;- po(
 # 管道类型
 &quot;classbalancing&quot;,
 # 识别id
 id = &quot;undersample&quot;, 
 # 调整类呗：结果保存在这里
 adjust = &quot;major&quot;,
 # 参考类别：从这里抽
 reference = &quot;major&quot;, 
 # 不对生成的任务中的行进行随机排列
 shuffle = FALSE, 
 # 减少比例
 ratio = 1 / 6
)
# reduce majority class by factor &apos;1/ratio&apos;
table(
 po_under$
  train(list(task))$
  output$
  truth()
)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;  P   N 
572 841 
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;过采样（oversampling）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;对少类样本重采样，增加少类样本数量&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# oversample majority class (relative to majority class)
po_over &amp;lt;- po(
 &quot;classbalancing&quot;,
 id = &quot;oversample&quot;, 
 adjust = &quot;minor&quot;,
 reference = &quot;minor&quot;, 
 shuffle = FALSE, 
 ratio = 6
)
# enrich minority class by factor &apos;ratio&apos;
table(
 po_over$
  train(list(task))$
  output$
  truth()
)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;   P    N 
3432 5048 
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;SMOTE&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;分析数量较少类别的样本数据，&lt;br /&gt;
基于插值来为少数类合成新样本，并添加到数据集&lt;/li&gt;
&lt;li&gt;原始的SMOTE算法只接受数值型特征
&lt;ul&gt;
&lt;li&gt;因此在运行 SMOTE 之前需要对数据进行预处理，&lt;br /&gt;
将整数转换为数值型，之后再进行逆向转换&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# SMOTE enriches the minority class with synthetic data
gr_smote &amp;lt;- po(
 &quot;colapply&quot;, 
 id = &quot;int_to_num&quot;,
 applicator = as.numeric, 
 affect_columns = selector_type(&quot;integer&quot;)) %&amp;gt;&amp;gt;%
  po(&quot;smote&quot;, dup_size = 6) %&amp;gt;&amp;gt;%
  po(
   &quot;colapply&quot;, 
   id = &quot;num_to_int&quot;,
   applicator = function(x){
    as.integer(round(x, 0L))
   },
   affect_columns = selector_type(&quot;numeric&quot;)
)
# enrich minority class by factor (dup_size + 1)
table(
 gr_smote$
  train(task)[[1L]]$
  truth()
)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;   P    N 
4004 5048 
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;构建 &lt;code&gt;AutoTuner&lt;/code&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;构建管道&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 随机森林基础学习器
learner &amp;lt;- lrn(&quot;classif.ranger&quot;, num.trees = 50)

# 将3种不均衡重采样方法连接随机森林学习器
# 欠采样
learner_under &amp;lt;- as_learner(po_under %&amp;gt;&amp;gt;% learner)
learner_under$id &amp;lt;- &quot;undersample.ranger&quot;
# 过采样
learner_over &amp;lt;- as_learner(po_over %&amp;gt;&amp;gt;% learner)
learner_over$id &amp;lt;- &quot;oversample.ranger&quot;
# SMOTE
learner_smote &amp;lt;- as_learner(gr_smote %&amp;gt;&amp;gt;% learner)
learner_smote$id &amp;lt;- &quot;smote.ranger&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;定义搜索空间，以便调整类别不平衡方法的超参数&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 对
search_space_under &amp;lt;- ps(undersample.ratio = p_dbl(1 / 6, 1))
search_space_over &amp;lt;- ps(oversample.ratio = p_dbl(1, 6))
search_space_smote &amp;lt;- ps(
 smote.dup_size = p_int(1, 6),
 smote.K = p_int(1, 6),
  # makes sure we use numbers to the power of two to better explore the parameter space
 .extra_trafo = function(x, param_set) {
  x$smote.K = round(2^(x$smote.K))
  x
 }
)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;使用&lt;code&gt;auto_tuner()&lt;/code&gt;构建&lt;code&gt;AutoTuner&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;以基于3折交叉验证，使用&lt;code&gt;F-beta Score&lt;/code&gt;作为性能指标来调整图
&lt;ul&gt;
&lt;li&gt;为了降低运行时间，仅为不平衡校正方法定义搜索空间&lt;/li&gt;
&lt;li&gt;也可以通过使用学习器的超参数扩展搜索空间，&lt;br /&gt;
来联合调整学习器的超参数以及不平衡校正方法&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;SMOTE有两个超参数&lt;code&gt;K&lt;/code&gt;和&lt;code&gt;dup_size&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;K&lt;/code&gt;会改变SMOTE算法的行为&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dup_size&lt;/code&gt;将影响过采样率&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;为了关注过采样率对性能的影响，&lt;br /&gt;
本例中将把&lt;code&gt;K = 2&lt;/code&gt;的SMOTE与&lt;code&gt;K = 4&lt;/code&gt;的SMOTE视为不同的不平衡校正方法&lt;/li&gt;
&lt;li&gt;因此，本例中对欠采样，过采样以及每种SMOTE变体使用&lt;br /&gt;
具有5种不同超参数配置的网格搜索进行调优&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;inner_cv3 &amp;lt;- rsmp(&quot;cv&quot;, folds = 3)
measure &amp;lt;- msr(&quot;classif.fbeta&quot;)

learns &amp;lt;- list(
 auto_tuner(
  tuner = tnr(&quot;grid_search&quot;, resolution = 6),
  learner = learner_under,
  resampling = inner_cv3,
  measure = measure,
  search_space = search_space_under
 ),
 auto_tuner(
     tuner = tnr(&quot;grid_search&quot;, resolution = 6),
     learner = learner_over,
     resampling = inner_cv3,
     measure = measure,
     search_space = search_space_over
 ),
 auto_tuner(
     tuner = tnr(&quot;grid_search&quot;, resolution = 6),
     learner = learner_smote,
     resampling = inner_cv3,
     measure = measure,
     search_space = search_space_smote
 )
)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Benchmark测试&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;AutoTuner&lt;/code&gt; 是一个经过完全调优的 &lt;code&gt;Graph&lt;/code&gt;，其行为类似于普通的学习器&lt;/li&gt;
&lt;li&gt;本例调优时使用3折CV&lt;/li&gt;
&lt;li&gt;我们使用 &lt;code&gt;benchmark()&lt;/code&gt; 函数，&lt;br /&gt;
基于留出法进行外部评估，来比较经过调优的类别不平衡流水线图：&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;outer_holdout &amp;lt;- rsmp(&quot;holdout&quot;)
design &amp;lt;- benchmark_grid(
 tasks = task,
 learners = learns,
 resamplings = outer_holdout
)
print(design)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;        task                  learner resampling
      &amp;lt;char&amp;gt;                   &amp;lt;char&amp;gt;     &amp;lt;char&amp;gt;
1: optdigits undersample.ranger.tuned    holdout
2: optdigits  oversample.ranger.tuned    holdout
3: optdigits       smote.ranger.tuned    holdout
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;lgr::get_logger(&quot;bbotk&quot;)$
 set_threshold(&quot;warn&quot;)
bmr &amp;lt;- benchmark(design, store_models = TRUE)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;可视化benchmark测试结果&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;bmr$aggregate(measure)
autoplot(bmr, measure = measure)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&quot;dataframe&quot;&amp;gt;
&amp;lt;caption&amp;gt;A bmr_aggregate: 3 x 7&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;nr&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;resample_result&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;task_id&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;learner_id&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;resampling_id&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;iters&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;classif.fbeta&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;list&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;int&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x171203760&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;optdigits&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;undersample.ranger.tuned&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;holdout&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.9602122&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x1711e4030&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;optdigits&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;oversample.ranger.tuned &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;holdout&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.9459459&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;environment: 0x1711c8298&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;optdigits&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;span style=white-space:pre-wrap&amp;gt;smote.ranger.tuned      &amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;holdout&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.9465241&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image_1.png&quot; alt=&quot;image_1&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;可视化调优路径&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;当&lt;code&gt;store_models = TRUE&lt;/code&gt;时，&lt;br /&gt;
允许 &lt;code&gt;benchmark()&lt;/code&gt; 函数存储调优过程中计算出的每个模型&lt;/li&gt;
&lt;li&gt;因此可以绘制子采样迭代中最优学习器的调优路径：&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 加载绘图R包
library(ggplot2)

# 提取所有的模型
bmr_data_learners &amp;lt;- as.data.table(bmr)$learner

# 欠采样
utune_path &amp;lt;- bmr_data_learners[[1]]$
 model$
 tuning_instance$
 archive$
 data
utune_gg &amp;lt;- ggplot(
 utune_path, 
 aes(
  x = undersample.ratio, 
  y = classif.fbeta
 )
) +
  geom_point(size = 3) +
  geom_line() + ylim(0.9, 1)

# 过采样
otune_path &amp;lt;- bmr_data_learners[[2]]$
 model$
 tuning_instance$
 archive$
 data
otune_gg &amp;lt;- ggplot(
 otune_path, 
 aes(
  x = oversample.ratio, 
  y = classif.fbeta
 )
) +
  geom_point(size = 3) +
  geom_line() + ylim(0.9, 1)

# SMOTE
stune_path &amp;lt;- bmr_data_learners[[3]]$
 model$
 tuning_instance$
 archive$
 data
stune_gg &amp;lt;- ggplot(
 stune_path, 
 aes(
  x = smote.dup_size,
  y = classif.fbeta, 
  col = factor(smote.K)
 )
) +
  geom_point(size = 3) +
  geom_line() + ylim(0.9, 1)

# 合并图像
library(ggpubr)
ggarrange(utune_gg, otune_gg, stune_gg, common.legend = TRUE, nrow = 1)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./image_2.png&quot; alt=&quot;image_2&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>随机密码生成器</title><link>https://nab-iak.github.io/posts/p20/p20/</link><guid isPermaLink="true">https://nab-iak.github.io/posts/p20/p20/</guid><description>水一篇水一篇</description><pubDate>Thu, 26 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Cover Pic by &lt;a href=&quot;https://www.pixiv.net/artworks/131595880&quot;&gt;@Ray&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;passwordGenerate &amp;lt;- function(
    # 密码长度
    length = 16, 
    # 是否包含大写字母
    upper = TRUE, 
    # 大写字母出现倍率
    upper_factor = 1, 
    # 是否包含小写字母
    lower = TRUE, 
    # 小写字母出现倍率
    lower_factor = 1,
    # 是否包含数字
    number = TRUE, 
    # 数字出现倍率
    number_factor = 1, 
    # 是否包含特殊字符
    special = TRUE,
    # 特殊字符出现倍率
    special_factor = 1
) {
    
    # 设定字符集
    upperChr &amp;lt;- &apos;ABCDEFGHIJKLMNOPQRSTUVWXYZ&apos;
    lowerChr &amp;lt;- &apos;abcdefghijklmnopqrstuvwxyz&apos;
    numChr &amp;lt;- &apos;0123456789&apos;
    spcChr &amp;lt;- &apos;!@#$%^&amp;amp;*()-_=+~`[]{}|;:\&quot;\&apos;,.&amp;lt;&amp;gt;/?&apos;

    # 初始化字符池
    chars &amp;lt;- &apos;&apos;

    # 根据参数选择字符集
    if (upper) for(i in 1:upper_factor) chars &amp;lt;- paste0(chars, upperChr)
    if (lower) for(i in 1:lower_factor) chars &amp;lt;- paste0(chars, lowerChr)
    if (number) for(i in 1:number_factor) chars &amp;lt;- paste0(chars, numChr)
    if (special) for(i in 1:special_factor) chars &amp;lt;- paste0(chars, spcChr)

    # 检查字符池是否为空
    if (nchar(chars) == 0) {
    stop(&apos;Please choose one type of chars at least &amp;lt;3&apos;)
    }

    # 生成密码
    password &amp;lt;- sample(strsplit(chars, &apos;&apos;)[[1]], length, replace = TRUE)
    cat(paste0(password, collapse = &apos;&apos;))
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;set.seed(42)
passwordGenerate(special_factor = 3)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;w#&amp;gt;_;&amp;gt;w$uX(&amp;amp;.[T/
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>R语言的良好书写规范</title><link>https://nab-iak.github.io/posts/p19/p19/</link><guid isPermaLink="true">https://nab-iak.github.io/posts/p19/p19/</guid><description>你是不是还在写一些看得恶心的代码？</description><pubDate>Fri, 20 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Cover Pic by &lt;a href=&quot;https://www.pixiv.net/artworks/130745804&quot;&gt;@iJac Ray&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;lt;h1&amp;gt;&amp;lt;center&amp;gt;～～～占位占位～～～&amp;lt;/center&amp;gt;&amp;lt;/h1&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;规范代码书写&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>单细胞RNA-seq分析</title><link>https://nab-iak.github.io/posts/p9/p9/</link><guid isPermaLink="true">https://nab-iak.github.io/posts/p9/p9/</guid><description>使用Seurat包进行scRNA-seq分析</description><pubDate>Sun, 18 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Cover Pic by &lt;a href=&quot;https://www.pixiv.net/artworks/128293940&quot;&gt;@void_0&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://satijalab.org/seurat/articles/get_started_v5_new&quot;&gt;Getting Started with Seurat&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://www.bilibili.com/video/BV1Ct421j7X3/?share_source=copy_web&amp;amp;vd_source=fbb2b05d6e2142f9abfeb1ed8be0304d&quot;&gt;【bilibili】单细胞数据分析/入门必看/标准分析流程/实战为主/保姆级教程/生物信息学/R语言/生信分析/单细胞/转录组/单细胞测序&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://youtu.be/xbX49h7BiUU?si=eJQeIcHCc5-xIkz9&quot;&gt;Introduction to single-cell RNA-Seq and Seurat | Bioinformatics for beginners&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;-----理论部分-----&lt;/h2&gt;
&lt;h2&gt;简介&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;传统的转录组是在多细胞基础上进行，&lt;br /&gt;
仅计算了均值，丢失了细胞间异质性的信息&lt;/li&gt;
&lt;li&gt;单细胞转录组&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://www.bilibili.com/video/BV1Ct421j7X3/?share_source=copy_web&amp;amp;vd_source=fbb2b05d6e2142f9abfeb1ed8be0304d&quot;&gt;【bilibili】单细胞数据分析/入门必看/标准分析流程/实战为主/保姆级教程/生物信息学/R语言/生信分析/单细胞/转录组/单细胞测序&lt;/a&gt;
&lt;img src=&quot;./image_1.png&quot; alt=&quot;image_1&quot; /&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;10X Genomics 10X的基本技术原理:1个油滴=1个凝胶支微珠=1个RNA-Seq&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://www.aksomics.com/services/scrna-seq/scrnaseq.html&quot;&gt;Aksomics-单细胞测序&lt;/a&gt;
&lt;img src=&quot;./image_2.png&quot; alt=&quot;image_2&quot; /&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;BD RhapsodyBD的基本技术原理:1个微孔=1个单细胞=1个磁珠=1个RNA-Seq&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://www.aksomics.com/services/scrna-seq/scrnaseq.html&quot;&gt;Aksomics-单细胞测序&lt;/a&gt;
&lt;img src=&quot;./image_3.png&quot; alt=&quot;image_3&quot; /&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;双细胞&lt;/h2&gt;
&lt;h3&gt;简介&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;双细胞&lt;/strong&gt;：一个液滴或一个微孔中包含了2个或多个细胞
&lt;ul&gt;
&lt;li&gt;同源双细胞：转录相同的细胞（&lt;strong&gt;不&lt;/strong&gt;容易检测）&lt;/li&gt;
&lt;li&gt;异源双细胞：转率不同的细胞（容易检测）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;DoubletFinder&lt;/code&gt;原理&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;从现有单细胞数据中&lt;strong&gt;人为产生双细胞&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;将人工产生的doublets与真实细胞&lt;strong&gt;混合&lt;/strong&gt;在一起&lt;/li&gt;
&lt;li&gt;用&lt;strong&gt;PCA距离矩阵&lt;/strong&gt;寻找每个单元的artificial k最近邻（nearest neighbors, NN）的比例&lt;/li&gt;
&lt;li&gt;根据预期的双细胞数量进行排序和计算pANN阈值&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;DoubletFinder&lt;/code&gt;参数&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;参数&lt;/th&gt;
&lt;th&gt;作用&lt;/th&gt;
&lt;th&gt;调参技巧&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;pCs&lt;/td&gt;
&lt;td&gt;选择用于计算的主成分数&lt;/td&gt;
&lt;td&gt;通常与下游分析保持一致，一般取10 - 30&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pK&lt;/td&gt;
&lt;td&gt;控制双细胞识别灵敏度&lt;/td&gt;
&lt;td&gt;通过paramSweep自动寻找最佳值，BCmetric峰值即为最优&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pN&lt;/td&gt;
&lt;td&gt;生成伪双细胞的比例&lt;/td&gt;
&lt;td&gt;默认0.25即可，过高会引入噪声&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;nExp&lt;/td&gt;
&lt;td&gt;预期双细胞数量&lt;/td&gt;
&lt;td&gt;根据实验细胞数计算，调整同源双细胞比例后更准确&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/NqvAS4HgmrE?si=laoseA5ByhXfuTYX&quot;&gt;DoubletFinder: Detect doublets in single-cell RNA-Seq data in R | Detailed workflow tutorial&lt;/a&gt;
&lt;img src=&quot;./image_4.png&quot; alt=&quot;image_4&quot; /&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;10x官网提供的Exp&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://kb.10xgenomics.com/hc/en-us/articles/360001378811-What-is-the-maximum-number-of-cells-that-can-be-profiled&quot;&gt;What is the maximum number of cells that can be profiled?&lt;/a&gt;
&lt;img src=&quot;./image_5.png&quot; alt=&quot;image_5&quot; /&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;建议&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;DoubletFinder&lt;strong&gt;不适用于聚合&lt;/strong&gt;的单细胞RNA测序数据&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;不建议在合并数据上&lt;/strong&gt;运行（不同样本的细胞类型比例可能不同，且合并后的对象可能体积较大）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;应分别在&lt;strong&gt;不同样本&lt;/strong&gt;上运行&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;输入数据应&lt;strong&gt;清除低质量&lt;/strong&gt;细胞&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;去除&lt;strong&gt;低&lt;/strong&gt;RNA UMIs、&lt;strong&gt;高&lt;/strong&gt;线粒体读取百分比以及标记基因&lt;strong&gt;无信息&lt;/strong&gt;的细胞簇&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;预测的双细胞不一定都是双细胞,不同的算法得出的结果也会有有差异&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;因此,要考虑是否真的需要去除双细胞&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;也可以不移除双细胞&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;具体可以通过预测为双细胞的点是否在聚类结果的图中是否特别离群来判断要不要移除双细胞&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;术语&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;UMI&lt;/strong&gt;&lt;br /&gt;
独特分子标识符，即分子标签，可用于检测和量化独特的转录本。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Features&lt;/strong&gt;&lt;br /&gt;
基因&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Barcodes&lt;/strong&gt;&lt;br /&gt;
单细胞测序实验使用短DNA条形码“标签”来识别源自同一细胞的读数。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Count Matrix/Feature-Barcode Matrix/Gene-Barcode Matrix&lt;/strong&gt;&lt;br /&gt;
一个计数矩阵，代表每个细胞条形码内每个特征的独特观测数量。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Doublets&lt;/strong&gt;&lt;br /&gt;
两个细胞被包裹在一个反应体积中时的情况。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Seurat层级结构&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=FgPPXLxZAwM&quot;&gt;Seurat v5: structure and main workflow easily explained!&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;assays
&lt;ul&gt;
&lt;li&gt;在&lt;code&gt;Layer&lt;/code&gt;中能够储存多种测序的结果
&lt;ul&gt;
&lt;li&gt;RNA：原始数据及处理后的数据&lt;/li&gt;
&lt;li&gt;SCT：SCTransform转换后的数据&lt;/li&gt;
&lt;li&gt;integrated：合并的数据&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;除了RNA，还有能有ATAC assay，ADT assay（CITE-seq）等&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;meta.data
&lt;ul&gt;
&lt;li&gt;元数据，可以将各种细胞样本信息输入进去，同时在后续的分析中也有部分结果会保存在meta.data当中&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;reductions
&lt;ul&gt;
&lt;li&gt;应用过的降维方法的列表
&lt;ul&gt;
&lt;li&gt;pca&lt;/li&gt;
&lt;li&gt;tsne&lt;/li&gt;
&lt;li&gt;umap&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;graphs
&lt;ul&gt;
&lt;li&gt;用于聚类和其他分析的图列表&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;clusters
&lt;ul&gt;
&lt;li&gt;聚类的结果&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;commands
&lt;ul&gt;
&lt;li&gt;用于生成该对象的命令记录&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;misc
&lt;ul&gt;
&lt;li&gt;存储不适合其他插槽的任意信息&lt;/li&gt;
&lt;li&gt;可用于存储额外的分析结果或自定义注释&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;细胞注释&lt;/h2&gt;
&lt;h3&gt;基于标记的注释&lt;/h3&gt;
&lt;h4&gt;简介&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;根据已知标记基因的特征表达对细胞或细胞簇进行标记&lt;/li&gt;
&lt;li&gt;标记基因与细胞类型之间的已知关系可从以下数据库中获取，例如：
&lt;ul&gt;
&lt;li&gt;MSigDB&lt;/li&gt;
&lt;li&gt;PanglaoDB&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CellMarker&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;文献中手动获取&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;优势
&lt;ul&gt;
&lt;li&gt;这些方法只会将标签分配给与已知标记物相关的细胞，而其他细胞将保持未标记状态。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;缺点
&lt;ul&gt;
&lt;li&gt;并非所有细胞类型都容易获取标记物&lt;/li&gt;
&lt;li&gt;标记基因或基因集（一组标记基因）应在特定细胞或细胞簇中特异性且持续表达&lt;/li&gt;
&lt;li&gt;一旦收集到相关且足够多的标记基因集，这些方法就能很好地发挥作用&lt;/li&gt;
&lt;li&gt;这些方法在注释主要细胞类型方面效果更好，但可能无法有效区分亚型&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;工具&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;AUCell
&lt;ul&gt;
&lt;li&gt;用于估计曲线下面积&lt;/li&gt;
&lt;li&gt;单细胞&lt;/li&gt;
&lt;li&gt;由于在单细胞水平上检测率较低，因此每种细胞类型都需要多种标记物来进行标记基因集富集分析&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;SCINA
&lt;ul&gt;
&lt;li&gt;期望最大化、高斯混合模型&lt;/li&gt;
&lt;li&gt;单细胞&lt;/li&gt;
&lt;li&gt;同时对细胞进行聚类和注释；对错误标记基因的纳入具有稳健性&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;GSEA/GSVA
&lt;ul&gt;
&lt;li&gt;富集检验&lt;/li&gt;
&lt;li&gt;细胞簇&lt;/li&gt;
&lt;li&gt;标记基因列表必须重新格式化为GMT格式
标记物在聚类中必须都在同一方向上差异表达&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;基于参考的注释&lt;/h3&gt;
&lt;h4&gt;简介&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;将标签从一个参考细胞或细胞簇（来自专家注释的单细胞RNA测序数据）转移到查询数据（待注释数据）中足够相似的细胞或细胞簇上&lt;/li&gt;
&lt;li&gt;参考单细胞数据来源于诸如
&lt;ul&gt;
&lt;li&gt;基因表达综合数据库（GEO）&lt;/li&gt;
&lt;li&gt;单细胞表达图谱&lt;/li&gt;
&lt;li&gt;细胞图谱项目&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;优势
&lt;ul&gt;
&lt;li&gt;已分配标签的准确性以及避免对新细胞类型进行错误标记&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;缺陷
&lt;ul&gt;
&lt;li&gt;只有在高质量且相关的带注释参考单细胞数据可用的情况下，该方法才可行&lt;/li&gt;
&lt;li&gt;如果参考数据不完整或匹配度不佳，一些工具的准确性会较低&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;工具&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;singleCell Net
&lt;ul&gt;
&lt;li&gt;相对表达基因对 + 随机森林&lt;/li&gt;
&lt;li&gt;单细胞&lt;/li&gt;
&lt;li&gt;比其他方法慢10到100倍；准确率高&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;scmap-cluster
&lt;ul&gt;
&lt;li&gt;一致相关性&lt;/li&gt;
&lt;li&gt;单细胞&lt;/li&gt;
&lt;li&gt;现有最快的方法；平衡误报和漏报；包含网络界面，可用于大型预构建参考集或自定义参考集&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;scmap-cell
&lt;ul&gt;
&lt;li&gt;近似最近邻&lt;/li&gt;
&lt;li&gt;单细胞&lt;/li&gt;
&lt;li&gt;将单个细胞分配给参考中最近邻的细胞；可绘制细胞轨迹；快速且可扩展&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;singleR
&lt;ul&gt;
&lt;li&gt;层次聚类 + 斯皮尔曼相关性&lt;/li&gt;
&lt;li&gt;单细胞&lt;/li&gt;
&lt;li&gt;包含大型标记参考；无法扩展到≥10000个细胞的数据集；包含带有标记数据库的网络界面&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Scikit-learn
&lt;ul&gt;
&lt;li&gt;k近邻、支持向量机、随机森林、最近均值分类器和线性判别分析&lt;/li&gt;
&lt;li&gt;多种对象&lt;/li&gt;
&lt;li&gt;需要专业知识来正确设计和适当地训练分类器，同时避免过度训练&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;code&gt;SingleR&lt;/code&gt;包&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://bioconductor.org/packages/release/data/experiment/vignettes/celldex/inst/doc/userguide.html&quot;&gt;Pokédex for Cell Types&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;安装&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;if (!require(&quot;BiocManager&quot;, quietly = TRUE))
    install.packages(&quot;BiocManager&quot;)

BiocManager::install(&quot;SingleR&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;工作原理&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;将每个细胞的RNA表达与参考数据的不同细胞种类进行spearman相关性检测&lt;/li&gt;
&lt;li&gt;根据检测结果打出分数&lt;/li&gt;
&lt;li&gt;根据最高分选出最相关的细胞种类&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;三种注释策略&lt;/h3&gt;
&lt;h4&gt;策略1：使用参考特定标签&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;未处理批次效应&lt;/li&gt;
&lt;li&gt;在每个参考中计算分数时，由于噪声导致精度损失&lt;/li&gt;
&lt;li&gt;分类存在技术性的差异导致错误的风险&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;策略2：跨参考比较分数&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;不同参考文献中标签缺乏一致性，使得解读变得复杂&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;策略3：使用协同标签&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;假设存在协同了的标签&lt;/li&gt;
&lt;li&gt;映射过程也存在丢失有关生物学状态（例如激活状态、疾病状况）的相关信息的风险，&lt;br /&gt;
如果在本体中该状态没有明显的对应项&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;-----R中的基本操作-----&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;考虑到实际情况，操作以多样本为主&lt;/li&gt;
&lt;li&gt;单样本无非就是没有数据融合和整合而已&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;安装官方推荐的包&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Seurat&lt;/code&gt;包&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;install.packages(&apos;Seurat&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Seurat-wrappers&lt;/code&gt;包
&lt;ul&gt;
&lt;li&gt;提供&lt;code&gt;Seurat&lt;/code&gt;包的补充功能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;options(timeout=300); remotes::install_github(&apos;satijalab/seurat-wrappers&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Signac&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;单细胞染色质数据分析&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;install.packages(&apos;Signac&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;SeuratData&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;自动加载预先打包为 Seurat 对象的数据集&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;remotes::install_github(&quot;satijalab/seurat-data&quot;, quiet = TRUE)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Azimuth&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;跨多个器官和组织的scRNA-seq和scATAC-seq查询的局部注释&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# Note: you may need to update some packages prior to installing Azimuth; from a fresh R session run:
update.packages(oldPkgs = c(&quot;withr&quot;, &quot;rlang&quot;))
# 这之前补个包
if (!require(&quot;BiocManager&quot;, quietly = TRUE)){
 install.packages(&quot;BiocManager&quot;)
}
BiocManager::install(&quot;glmGamPoi&quot;)
# You can install Azimuth from GitHub with:
if (!requireNamespace(&apos;remotes&apos;, quietly = TRUE) {
  install.packages(&apos;remotes&apos;)
}
remotes::install_github(&apos;satijalab/azimuth&apos;, ref = &apos;master&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;数据&lt;/h2&gt;
&lt;h3&gt;种类&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;一般在ncbi上的GEO database搜索关键词就能获取数据&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;数据格式&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;X10
&lt;ul&gt;
&lt;li&gt;10X Genomics的标准文件格式&lt;/li&gt;
&lt;li&gt;3个文件
&lt;ul&gt;
&lt;li&gt;barcodes.tsv.gz&lt;/li&gt;
&lt;li&gt;features.tsv.gz / genes.tsv.gz&lt;/li&gt;
&lt;li&gt;matrix.mtx.gz&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;不可解压&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;H5
&lt;ul&gt;
&lt;li&gt;存储大规模数据的二进制文件格式&lt;/li&gt;
&lt;li&gt;可以保存矩阵，表格，图像等&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;RDS
&lt;ul&gt;
&lt;li&gt;R的数据文件格式存储表达矩阵&lt;/li&gt;
&lt;li&gt;包含信息
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;assays&lt;/strong&gt;&lt;br /&gt;
表达矩阵
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;counts&lt;/strong&gt;&lt;br /&gt;
原始数据&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;data&lt;/strong&gt;&lt;br /&gt;
&lt;code&gt;Normalize()&lt;/code&gt; 规范化后的数据&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;scale.data&lt;/strong&gt;&lt;br /&gt;
&lt;code&gt;Scale()&lt;/code&gt; 缩放后的数据&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SCT&lt;/strong&gt;&lt;br /&gt;
&lt;code&gt;SCT&lt;/code&gt;方式标准化后的数据&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;meta.data&lt;/strong&gt;&lt;br /&gt;
细胞的样本注释信息（对照，给药等）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;active.assay&lt;/strong&gt;&lt;br /&gt;
默认的矩阵名&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;active.ident&lt;/strong&gt;&lt;br /&gt;
默认的细胞来源信息&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;CSV / TXT
&lt;ul&gt;
&lt;li&gt;存取单细胞测序的表达矩阵或元数据&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果数据不止scRNA-seq的结果，并且存在处理其他seq的数据的情况时，&lt;br /&gt;
应该经常确认是否默认调用的是&lt;code&gt;RNA&lt;/code&gt;的数据&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;DefaultAssay(ifnb_harmony)
# 如果不是`RNA`，应该修改
# DefaultAssay(ifnb_harmony) &amp;lt;- &apos;RNA&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;读取&lt;/h3&gt;
&lt;h4&gt;X10&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;网上的教程会说需要给每个样本单独创建文件夹，然后拖进去再去掉前缀
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;其实不用&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;dt_x10 &amp;lt;- ReadMtx(
 mtx = &apos;matrix.mtx.gz&apos;,
 features = &apos;features.tsv.gz&apos;,
 cells = &apos;barcodes.tsv.gz&apos;
)
dt &amp;lt;- CreateSeuratObject(counts = dt_x10)
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;H5&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;dt_h5 &amp;lt;- Read10X_h5(
 filename = &apos;H5file.h5&apos;, 
 use.names = T, 
 unique.features = T
)
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;RDS&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;读取数据&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;dt &amp;lt;- readRDS(&apos;RDSfile.rds&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;获取内部信息&lt;code&gt;GetAssayData()&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;当不指定&lt;code&gt;@assays$RNA&lt;/code&gt;的时候，默认使用&lt;code&gt;@assays$SCT, layer = &apos;counts&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 简单提取
GetAssayData(object = dt@assays$RNA, layer = &apos;counts&apos;)
GetAssayData(object = dt@assays$SCT, layer = &apos;data&apos;)
GetAssayData(object = dt@assays$RNA, layer = &apos;data&apos;)

# 转换为矩阵
as.matrix(GetAssayData(object = dt@assays$RNA, layer = &apos;counts&apos;))[1:20,1:20]
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;修改默认提取信息&lt;code&gt;DefaultAssay()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 提取RNA而不是默认的SCT
DefaultAssay(dt) &amp;lt;- &apos;RNA&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;修改默认的细胞来源信息&lt;code&gt;Idents()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;Idents(dt) &amp;lt;- &quot;WhereIFrom&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;CSV / TXT&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;dt_txt &amp;lt;- fread(&apos;TXTfile.txt&apos;)
dt &amp;lt;- CreateSeuratObject(counts = dt_txt)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;创建SeuratObject&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;SeuratObject&lt;/code&gt;作为一个容器，里面可以保存所有的数据，分析结果以及分析流程记录&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;dt &amp;lt;- CreateSeuratObject(counts = dt)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;如果读取的数据是以&lt;strong&gt;Seurat v5&lt;/strong&gt;之前的版本创建的，可以用这个转换成v5版本&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;dt &amp;lt;- SeuratObject::UpdateSeuratObject(dt)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;数据融合（多样本）&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;注意融合（merge）与整合（integrate）的&lt;strong&gt;区别&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;单样本无需融合&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# sampleList id 就是样本分组名
dt &amp;lt;- merge(dt[1], y = dt[-1], add.cell.ids = sampleList)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;最好排个序&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;dt$orig.ident &amp;lt;- factor(dt$orig.ident, levels = YourOrder)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;质量控制&lt;/h2&gt;
&lt;h3&gt;影响因素&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;在创建&lt;code&gt;Seurat&lt;/code&gt;对象以后，会自动计算
&lt;ul&gt;
&lt;li&gt;独特基因数量&lt;code&gt;nFeature_RNA&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;基因表达计数&lt;code&gt;nCount_RNA&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;对&lt;code&gt;nFeature_RNA&lt;/code&gt;和&lt;code&gt;nCount_RNA&lt;/code&gt;进行过滤
&lt;ul&gt;
&lt;li&gt;过高代表了双细胞的存在&lt;/li&gt;
&lt;li&gt;过低表示空液滴或者低质量细胞&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;除此以外，也可以计算线粒体基因，核糖体基因的表达比例
&lt;ul&gt;
&lt;li&gt;这些代表了细胞正处于异常状态
&lt;ul&gt;
&lt;li&gt;低质量或者濒死细胞中表现的细胞膜破损导致的细胞质mRNA流出&lt;/li&gt;
&lt;li&gt;线粒体或核糖体本身被破坏导致的内部mRNA污染&lt;/li&gt;
&lt;li&gt;细胞处于应激受损状态，所以导致过量表达&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;一些样本可能会有红细胞的污染，可以计算红细胞基因比例来去除&lt;/li&gt;
&lt;li&gt;也可以自定义管家基因来判断&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 线粒体RNA比例
dt[[&quot;percent.mt&quot;]] &amp;lt;- PercentageFeatureSet(dt, pattern = &apos;^MT-&apos;)

# 核糖体RNA比例
dt[[&apos;percent.rb&apos;]] &amp;lt;- PercentageFeatureSet(dt, pattern = &apos;^RP[SL]&apos;)

# 筛选红细胞比例
HB.genes &amp;lt;- c(&quot;HBA1&quot;,&quot;HBA2&quot;,&quot;HBB&quot;,&quot;HBD&quot;,&quot;HBE1&quot;,&quot;HBG1&quot;,&quot;HBG2&quot;,&quot;HBM&quot;,&quot;HBQ1&quot;,&quot;HBZ&quot;)
HB.genes &amp;lt;- CaseMatch(HB.genes, rownames(dt))
dt[[&apos;percent.genes&apos;]] &amp;lt;- PercentageFeatureSet(dt, features = HB.genes)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;可以通过查看两个变量的相关性查看样本细胞是否正常&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 期待不相关
FeatureScatter(dt, &quot;nCount_RNA&quot;, &quot;percent.mt&quot;, group.by = &quot;orig.ident&quot;)
# 期待强相关
FeatureScatter(dt, &quot;nCount_RNA&quot;, &quot;nFeature_RNA&quot;, group.by = &quot;orig.ident&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;筛选&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;使用&lt;code&gt;subset()&lt;/code&gt;函数可以过滤出合适的细胞
&lt;ul&gt;
&lt;li&gt;过滤的阈值没有具体规定，可以说全凭感觉和喜好了哈&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;这里的是官方教程对&lt;code&gt;pmbc&lt;/code&gt;测序的时候用的&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;dt &amp;lt;- subset(
 dt, 
 subset = nFeature_RNA &amp;gt; 200 &amp;amp; 
  nFeature_RNA &amp;lt; 2500 &amp;amp; 
  percent.mt &amp;lt; 5
)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;如果用&lt;code&gt;DoubletFinder&lt;/code&gt;包去除双细胞的话，&lt;br /&gt;
可以不用在这里设置&lt;code&gt;nFeature_RNA&lt;/code&gt;或&lt;code&gt;nCount_RNA&lt;/code&gt;的上限值&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;归一化&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;对于机器学习而言，使用归一化是基本中的基本&lt;/li&gt;
&lt;li&gt;后面的降维和聚类都需要归一化过的数据&lt;/li&gt;
&lt;li&gt;默认的方法是&lt;code&gt;logNormalize&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;$X&apos; = log(count \times 10000)$&lt;/li&gt;
&lt;li&gt;这里的&lt;strong&gt;10,000&lt;/strong&gt;是默认的比例因子，可以在&lt;code&gt;scale.factor&lt;/code&gt;参数更换&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;dt &amp;lt;- NormalizeData(
 dt，
 normalization.method = &quot;LogNormalize&quot;, 
 scale.factor = 10000
)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;寻找高变基因&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;高变基因，即在细胞间表达差异很大的基因&lt;/li&gt;
&lt;li&gt;聚焦于高变基因可以凸显数据中的生物学信号，并且减少噪声干扰&lt;/li&gt;
&lt;li&gt;默认方法就是&lt;code&gt;vst&lt;/code&gt;，通过固有的均值-方差建模找出高变基因&lt;/li&gt;
&lt;li&gt;从这里开始，后续分析中都默认输入高变基因来计算&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;pbmc &amp;lt;- FindVariableFeatures(
 pbmc, 
 selection.method = &quot;vst&quot;, 
 nfeatures = 2000
)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;可以提取最高变的基因&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 选择差异最大的10个高变基因
top10 &amp;lt;- head(FindVariableFeatures(dt), 10)
# 生成显示top10高变基因的散点图，其中高变的用默认的红色标记
LabelPoints(
 # VariableFeaturePlot(dt)是不带label的散点图
 plot = VariableFeaturePlot(dt), 
 points = top10,
 repel = TRUE
)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;缩放&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;缩放也是机器学习重要的步骤&lt;/li&gt;
&lt;li&gt;后续的降维和聚类都需要用到缩放的数据&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 仅缩放高变基因
dt &amp;lt;- ScaleData(
 dt,
 features = VariableFeatures(dt) # 默认是仅对高变基因进行缩放
)
# 缩放全部基因
dt &amp;lt;- ScaleData(
 dt,
 features = rownames(dt) # 默认是仅对高变基因进行缩放
)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;PCA降维&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;使用PCA的目的是给后续的分析选择合适的维度
&lt;ul&gt;
&lt;li&gt;UMAP或者T-SNE的维度确定都依赖PCA降维的结果&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;PCA分析&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;dt &amp;lt;- RunPCA(
 dt,
 features = VariableFeatures(dt)
)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;PCA结果可视化&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# [[&apos;索引&apos;]]可以越过层级
dt[[&quot;pca&quot;]]
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;确定拐点
&lt;ul&gt;
&lt;li&gt;我的差不多是以20为拐点&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;ElbowPlot(dt, ndims = 50)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;# 打印前5个维度，前5个基因
print(dt[[&quot;pca&quot;]], dims = 1:5, nfeatures = 5)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;结果图&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 维度散点分布图
DimPlot(dt, reduction = &apos;pca&apos;, dims = c(1,2))
# 维度mark基因气泡图
VizDimLoadings(dt, dims = 1:4, reduction =  &apos;pca&apos;, nfeatures = 20)
# 热图
DimHeatmap(dt, dims = 1:4, cells = 500, balanced = T, nfeatures = 30, ncol = 2)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;聚类&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;方法是KNN&lt;/li&gt;
&lt;li&gt;刚刚确定拐点是20，所以这里 &lt;code&gt;dims = 1:20&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;dt &amp;lt;- FindNeighbors(dt, dims = 1:20)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;确定细胞簇&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;@ 这部分方法很多&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://juejin.cn/post/7171079516092596231&quot;&gt;Findclusters-resolution怎么选&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;分别作图查看法&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;创建不同分辨率的情况来筛选，我这里创造了 0.1–1 的 10个分辨率&lt;/li&gt;
&lt;li&gt;分辨率越高，生成的细胞簇就越多&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;dt &amp;lt;- FindClusters(dt, resolution = seq(0.1, 1, by=0.1))
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;for (i in seq(0.1, 1, by = 0.1) %&amp;gt;% as.character()){
 DimPlot(dt, group.by = paste(&apos;RNA_snn_res.&apos;,i,sep=&apos;&apos;), label = T)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;使用&lt;code&gt;clustree&lt;/code&gt;包&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;通过&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;clustree(dt, prefix = &apos;RNA_snn_res.&apos;) + coord_flip()
DimPlot(dt, group.by = &apos;RNA_snn_res.0.6&apos;, label = T)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;分配簇&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 分配
dt$seurat_clusters &amp;lt;- &apos;RNA_snn_res.0.6&apos;
Idents(dt) &amp;lt;- &apos;seurat_clusters&apos;

# 直接这样也行
# dt$seurat_clusters &amp;lt;- &apos;RNA_snn_res.0.6&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;非线性降维&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;非线性降维的目的和PCA降维的&lt;strong&gt;目的&lt;/strong&gt;是不同的&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;非线性降维用于可视化来探索结果，&lt;br /&gt;
是将多维的细胞数据降维成二维数据以便可视化&lt;/li&gt;
&lt;li&gt;PCA降维的目的是为了对细胞聚类，确定细胞簇&lt;/li&gt;
&lt;li&gt;基于PCA降维的结果，可以给非线性降维提供合适的维度&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;所以我们知道了什么？&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;PCA对于聚类和非线性降维是&lt;strong&gt;必须&lt;/strong&gt;的&lt;/li&gt;
&lt;li&gt;PCA和聚类是&lt;strong&gt;必须&lt;/strong&gt;的，用来划分单细胞种类&lt;/li&gt;
&lt;li&gt;非线性降维不是必须的，但是&lt;strong&gt;通常都会做&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;聚类和非线性降维是&lt;strong&gt;没有关系&lt;/strong&gt;的&lt;/li&gt;
&lt;li&gt;在非线性降维的平面图上标注各个细胞簇可以更好查看&lt;strong&gt;聚类结果的合理性&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;提供UMAP和t-SNE两种方法，&lt;strong&gt;UMAP&lt;/strong&gt;比t-SNE更优&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;两种可以都做了，因为结果保存在&lt;code&gt;SeuratObject&lt;/code&gt;的不同位置&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# dims = 1:20 是默认值
dt &amp;lt;- RunUMAP(dt, dims = 1:20)
dt &amp;lt;- RunTSNE(dt, dims = 1:20)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;如何选择&lt;code&gt;dims&lt;/code&gt;?
&lt;ul&gt;
&lt;li&gt;这里的&lt;code&gt;dims&lt;/code&gt;和PCA的&lt;code&gt;dims&lt;/code&gt;是没有关系的，&lt;br /&gt;
不需要一样，但肯定是小于PCA的&lt;code&gt;dims&lt;/code&gt;的&lt;/li&gt;
&lt;li&gt;根据PCA的&lt;code&gt;ElbowPlot()&lt;/code&gt;结果，选择肘部左右的维度就行&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;去除双细胞&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;多样本数据需要分割数据成&lt;code&gt;list&lt;/code&gt;，&lt;br /&gt;
并且接下来的步骤中要用&lt;code&gt;lapply()&lt;/code&gt;进行列表操作&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;dt &amp;lt;- SplitObject(dt)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;寻找最佳pK值&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;sweep.res &amp;lt;- paramSweep(dt, PCs = 1:20, sct = FALSE)
sweep.stats &amp;lt;- summarizeSweep(sweep.res, GT = FALSE)
sweep.bcmvn &amp;lt;- find.pK(sweep.stats)

pK &amp;lt;- bcmvn_pbmc %&amp;gt;% 
  filter(BCmetric == max(BCmetric)) %&amp;gt;% # 要找BCmetric时的最大的pK
  select(pK) %&amp;gt;%
pK &amp;lt;- as.numeric(as.character(pK[[1]]))
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;查看生成的pK与BCmetric的曲线图
&lt;ul&gt;
&lt;li&gt;上面代码运行的时候会自动生成，&lt;br /&gt;
所以不需要特地去做这个图，除非想改造一下&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;ggplot(sweep.bcmvn, aes(pK, BCmetric, group = 1)) +
  geom_point() +
  geom_line()
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;# 设定推测的双细胞占比，这里是8%，也有7.5%，7.6%的
dblpct &amp;lt;- 0.008 
# 另一种算法：按每增加1000个细胞，双细胞比率增加千分之8来计算
# dblpct &amp;lt;- ncol(dt) * 8 * 1e-6 

homotypic.prop &amp;lt;- modelHomotypic(dt@meta.data$seurat_clusters)
nExp_poi &amp;lt;- round(dblpct * nrow(dt@meta.data))
nExp_poi.adj &amp;lt;- round(nExp_poi*(1-homotypic.prop))
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;得运算两次，第一次是&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;dt &amp;lt;- doubletFinder(
 dt, 
 PCs = 1:20, 
 pN = 0.25, 
 pK = pK, 
 nExp = nExp_poi,
 reuse.pANN = NULL, 
 sct = FALSE
)

dt &amp;lt;- doubletFinder(
 dt, 
 PCs = 1:20, 
 pN = 0.25, 
 pK = pK, 
 nExp = nExp_poi.adj,
 reuse.pANN = {dt@meta.data}[length(dt@meta.data), 
 sct = FALSE
)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;筛选数据&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;dt &amp;lt;- subset(dt, subset = {dt@meta.data}[length(dt@meta.data)] == &quot;Singlet&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;数据整合（多样本）&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;对于多样本数据而言，需要对多个样本进行整合&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;整合integrate而不是融合merge&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;对于融合的数据而言，&lt;br /&gt;
只是列表变成了一个单独的&lt;code&gt;seuratObject&lt;/code&gt;，&lt;br /&gt;
但是所有的操作都是按样本（一般是Layer，分层）分开来运算的&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;整合就是混合成一个矩阵一起分析吗？&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;答案是&lt;strong&gt;NO&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;整合应该理解为使用一种&lt;strong&gt;去除批次效应的算法后&lt;/strong&gt;的数据
&lt;ul&gt;
&lt;li&gt;简单而言，模拟一种情况：&lt;br /&gt;
这些不同的样本测定的条件是一样的，&lt;br /&gt;
基因表达的不同仅仅来自于生物体的内部因素或者有人为控制的刺激干预&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;混合成一个矩阵，称之为&lt;strong&gt;混层&lt;/strong&gt;（Join Layers）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;dt &amp;lt;- IntegrateLayers(
  object = dt, 
  method = HarmonyIntegration,
  orig.reduction = &quot;pca&quot;, 
  new.reduction = &quot;harmony&quot;,
  verbose = FALSE
)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;什么时候混层？&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;在&lt;code&gt;IntegrateLayers()&lt;/code&gt;后如果没有其他操作就可以混层&lt;/li&gt;
&lt;li&gt;形象点就是：
&lt;ul&gt;
&lt;li&gt;不混层，分析就是每个层各自做各自的事情，&lt;br /&gt;
类似于&lt;code&gt;lapply()&lt;/code&gt;对列表中的多个dataframe进行相同操作，&lt;br /&gt;
结果也是分别保存&lt;/li&gt;
&lt;li&gt;混层，就是把列表中矩阵融合成一个大的dataframe，&lt;br /&gt;
然后用&lt;code&gt;dplyr&lt;/code&gt;包整列整行，或者分组地批量操作，&lt;br /&gt;
但终究所有的操作都是针对一个大的dataframe&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;这个时候需要使用&lt;code&gt;JoinLayers()&lt;/code&gt;进行对混层&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 仅对RNA数据的混合
dt[[&apos;RNA&apos;]] &amp;lt;- JoinLayers(dt[[&apos;RNA&apos;]])

# 确认目前使用的是否是RNA数据，如果是可以直接混层，如果不是也可以指定为RNA后再操作
DefaultAssay(dt) # 当有多种数据的时候，最好先确认下assay
DefaultAssay(dt) &amp;lt;- &apos;RNA&apos; # 修改当前的assay
dt &amp;lt;- JoinLayers(dt) # 直接混层
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;重新分层的方法&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;dt &amp;lt;- split(dt, f = &apos;orig.ident&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;注意不要用成&lt;code&gt;SplitObject()&lt;/code&gt;了，这个是切分成&lt;code&gt;list&lt;/code&gt;的
&lt;ul&gt;
&lt;li&gt;切了再用&lt;code&gt;merge()&lt;/code&gt;弄回来也行，不过何必呢？&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# ！！！注意不是这个！！！
dt &amp;lt;- splitObject(dt, split.by = &apos;orig.ident&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;寻找差异性表达基因&lt;/h2&gt;
&lt;h4&gt;混合层&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;dt[[&apos;RNA&apos;]] &amp;lt;- JoinLayers(dt[[&apos;RNA&apos;]])
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;FindAllMarkers()&lt;/code&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://satijalab.org/seurat/reference/findallmarkers&quot;&gt;Gene expression markers for all identity classes&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;迭代地将每个集群与所有其他集群进行比较，为每个集群单独生成标记基因列表&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;FindAllMarkers(
 dt,
 # 制定分类的群组，一般不需要，因为会按照聚类的结果去比较
 # group.by = &apos;orig.ident&apos;,
 # 测试限制在那些平均而言在两组细胞之间显示出至少X倍差异（对数尺度）的基因
 logfc.threshold = 0.25, 
 # 仅测试在两个群体中任一群体内至少有min.pct比例的细胞中检测到的基因
 min.pct = 0.1, 
 # 仅返回阳性标记
 only.pos = FALSE,
 # 检验方法
 test.use = &apos;wilcox&apos;,
 slot = &apos;data&apos;
)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;一般默认的&lt;code&gt;slot&lt;/code&gt;是&lt;code&gt;data&lt;/code&gt;，但有的测定方法&lt;code&gt;test.use&lt;/code&gt;是要用到&lt;code&gt;counts&lt;/code&gt;的&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;code&gt;FindConservedMarkers()&lt;/code&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;寻找不受条件影响的（干预/对照）保守的差异基因&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ident.1&lt;/code&gt;和&lt;code&gt;ident.2&lt;/code&gt;填写聚类的编号，可以多对多，例如&lt;br /&gt;
&lt;code&gt;ident.1 = c(1,2,3), ident.2 = c(4,5,6,7,8)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ident.2 = NULL&lt;/code&gt;（默认）表示将&lt;code&gt;ident.1&lt;/code&gt;与之以外的样本进行对比&lt;/li&gt;
&lt;li&gt;&lt;code&gt;grouping.var = &apos;orig.ident&apos;&lt;/code&gt;可以使比较在每个组中进行&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;clust2_mkr &amp;lt;- FindConservedMarkers(
    dt,
    ident.1 = 2,
    # ident.2 = NULL的情况下是用ident.1和剩余所有簇进行比较（把其他簇当成1个簇）
    ident.2 = NULL, 
    grouping.var = &apos;orig.ident&apos;
)

head(clust2_mkr)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;下面可以看到每组中的结果，前缀是&lt;code&gt;orig.ident&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;p_val&lt;/code&gt;：比较结果的p值&lt;/li&gt;
&lt;li&gt;&lt;code&gt;avg_log2FC&lt;/code&gt;：平均log2 fold change&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pct.1&lt;/code&gt;： 在&lt;code&gt;ident.1&lt;/code&gt;样本中的占比&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pct.2&lt;/code&gt;：在&lt;code&gt;ident.2&lt;/code&gt;样本中的占比&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;lt;table class=&quot;dataframe&quot;&amp;gt;
&amp;lt;caption&amp;gt;A data.frame: 6 x 22&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;3dpi_p_val&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;3dpi_avg_log2FC&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;3dpi_pct.1&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;3dpi_pct.2&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;3dpi_p_val_adj&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;6dpi_p_val&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;6dpi_avg_log2FC&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;6dpi_pct.1&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;6dpi_pct.2&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;6dpi_p_val_adj&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;...&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;1dpi_pct.1&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;1dpi_pct.2&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;1dpi_p_val_adj&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;MOCK_p_val&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;MOCK_avg_log2FC&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;MOCK_pct.1&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;MOCK_pct.2&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;MOCK_p_val_adj&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;max_pval&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;minimump_p_val&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;...&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;C1orf194&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;3.656848e-169&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5.582241&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.818&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.049&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.338443e-164&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2.867431e-234&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5.778323&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.926&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.064&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.049509e-229&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.927&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.194&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.462696e-198&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;4.405871e-239&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;4.471342&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.968&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.180&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.612593e-234&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.656848e-169&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.762348e-238&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;OMG&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;5.807800e-158&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5.997568&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.756&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.041&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2.125713e-153&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;7.773242e-222&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5.832163&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.857&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.048&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2.845084e-217&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.390&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.031&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 2.023912e-78&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.312786e-226&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;4.724586&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.820&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.059&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;4.804927e-222&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 5.529663e-83&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5.251143e-226&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;C9orf24&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;2.431279e-160&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5.367758&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.812&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.056&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;8.898725e-156&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.055259e-207&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5.072022&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.931&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.096&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.862354e-203&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.880&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.142&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.120115e-198&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;9.418606e-226&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;4.209846&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.928&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.151&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.447304e-221&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2.431279e-160&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.767442e-225&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;FAM183A&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;5.815296e-140&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;4.987162&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.710&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.043&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2.128456e-135&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.509409e-216&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5.463419&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.883&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.063&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5.524586e-212&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.833&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.141&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.790443e-171&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.856198e-190&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.870463&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.846&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.134&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.411407e-185&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5.815296e-140&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;6.037634e-216&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;C20orf85&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;2.866906e-161&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5.505593&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.835&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.065&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.049316e-156&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5.231875e-204&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5.392041&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.957&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.121&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.914919e-199&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.944&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.246&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;7.929550e-195&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;6.860743e-185&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.769995&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.920&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.253&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2.511100e-180&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2.866906e-161&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2.092750e-203&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=row&amp;gt;DYNLRB2&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;4.212733e-164&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5.389558&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.767&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.036&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.541902e-159&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;4.912858e-195&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;5.488527&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.736&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.030&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.798155e-190&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.817&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.095&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1.238847e-185&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;6.966579e-202&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;3.902018&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.854&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0.114&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2.549838e-197&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;4.212733e-164&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2.786632e-201&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;h3&gt;&lt;code&gt;FindMarkers()&lt;/code&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://satijalab.org/seurat/reference/findmarkers&quot;&gt;Gene expression markers of identity classes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;比较 &lt;strong&gt;特定的两个集群&lt;/strong&gt;（或一个集群与其他集群的组合），找出在目标集群中差异表达的基因
&lt;ul&gt;
&lt;li&gt;其实&lt;code&gt;FindAllMarkers()&lt;/code&gt;可以做到一样的事情，这个不是很常用&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;mkr_clust2v3 &amp;lt;- FindMarkers(
 ifnb_harmony, 
 ident.1 = 2, 
 ident.2 = 3
)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;组合样本及细胞簇&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;在注释了细胞簇以后（&lt;strong&gt;确定细胞簇&lt;/strong&gt;），可以进行样本+细胞簇的比较&lt;/li&gt;
&lt;li&gt;首先组合成一个新的列&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 组合
dt$TypeCondi &amp;lt;- paste0(ifnb_harmony$type,&apos;_&apos;, ifnb_harmony$condition)

# 有必要的话可以因子化并排序
dt$TypeCondi &amp;lt;- factor(dt$TypeCondi, levels = YourOrder)

# 可在meta.data查看
# dt$meta.data

# 定义默认的Idents
Idents(dt) &amp;lt;- dt$TypeCondi
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;之后用&lt;code&gt;FindAllMarkers()&lt;/code&gt;还是&lt;code&gt;FindMarkers()&lt;/code&gt;都随意&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;查看标记某基因的表达量的聚类结果图&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;FeaturePlot()&lt;/code&gt;中制定&lt;code&gt;features&lt;/code&gt;即可&lt;/li&gt;
&lt;li&gt;因为&lt;code&gt;features&lt;/code&gt;是复数，提示了可以按需输入多个感兴趣的 基因&lt;/li&gt;
&lt;li&gt;&lt;code&gt;min.cutoff = &apos;q10&apos;&lt;/code&gt;：表达量小于q10的基因不给颜色；只能填入分位数&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 就看一个
FeaturePlot(dt, features = c(&apos;C1orf194&apos;), min.cutoff = &apos;q10&apos;)
# 看两个以上
FeaturePlot(dt, features = c(&apos;C1orf194&apos;,&apos;OMG&apos;), min.cutoff = &apos;q10&apos;)
FeaturePlot(dt, features = c(&apos;NDRG1&apos;,&apos;OMG&apos;), min.cutoff = &apos;q10&apos;,label = TRUE, ncol = 1)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;确定细胞簇&lt;/h2&gt;
&lt;h3&gt;细胞Markers已知&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;如果已知包含哪些细胞以及它们的Marker基因，&lt;br /&gt;
可以结合上述的用&lt;code&gt;FeaturePlot()&lt;/code&gt;生成的聚类结果图来看各个细胞簇属于哪种细胞&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;首先需要将细胞的聚类结果&lt;code&gt;Ident&lt;/code&gt;替换名称&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;（这里&lt;code&gt;DataFromIFNB&lt;/code&gt;就是dt，由于是特定的数据集的东西所以区分一下）&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;DataFromIFNB &amp;lt;- RenameIdents(DataFromIFNB, `3` = &apos;CD16 Mono&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;如果meta数据里面已经有注释了（实际上一手数据根本不会有哈）&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;Idents(dt) &amp;lt;- dt@meta.data$aColOfAnnotations
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;细胞Markers未知&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;如果不用现有一些结论提供的细胞Markers的话，需要先找出差异基因再来注释
&lt;ul&gt;
&lt;li&gt;这也是我把【确定细胞簇】放到【寻找差异性表达基因】后面的原因&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;单注释数据集注释&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;hpca &amp;lt;- HumanPrimaryCellAtlasData()
pred &amp;lt;- SingleR(test = dt,
        ref = hpca,
        labels = hpca$label.main)
dt$singleR.labels &amp;lt;- pred$labels[match(rownames(dt@meta.data), rownames(pred))]
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;多注释数据集注释&lt;/h4&gt;
&lt;h5&gt;策略1：使用参考特定标签&lt;/h5&gt;
&lt;pre&gt;&lt;code&gt;# 调取参考数据集
hpca &amp;lt;- celldex::HumanPrimaryCellAtlasData()
dice &amp;lt;- celldex::DatabaseImmuneCellExpressionData()

# 给基因名按数据集添加前缀以做区分
hpca$label.main &amp;lt;- paste0(&apos;HPCA.&apos;, hpca$label.main)
dice$label.main &amp;lt;- paste0(&apos;DICE.&apos;, dice$label.main)

# 注意：intersect只能两个数据，x和y
# 3个数据的时候要两两intersect
shared &amp;lt;- GenomicRanges::intersect(rownames(hpca), rownames(dice))
# shared &amp;lt;- GenomicRanges::intersect(rownames(shared), rownames(set3))

# 合并参考数据集
combined &amp;lt;- cbind(hpca[shared,], dice[shared,])

# 检查一下combined中是否存在基因，有的数据库基因不相同，导致空基因会报错的
combined 

# 注释
pred &amp;lt;- SingleR(
        test = GetAssayData(dt, slot = &apos;counts&apos;),
        ref = combined,
        labels = combined$label.main)

dt$singleR.labels &amp;lt;- pred$labels[match(rownames(dt@meta.data), rownames(pred))]
&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;策略2：跨参考比较分数&lt;/h5&gt;
&lt;pre&gt;&lt;code&gt;# 调取参考数据集
hpca &amp;lt;- celldex::HumanPrimaryCellAtlasData()
dice &amp;lt;- celldex::DatabaseImmuneCellExpressionData()

# 如果直接调用策略1中的hpca和dice的话，记得去掉前缀
# hpca$label.main &amp;lt;- gsub(&apos;HPCA\\.&apos;,&apos;&apos;, hpca$label.main)
# dice$label.main &amp;lt;- gsub(&apos;DICE\\.&apos;,&apos;&apos;, dice$label.main)

# 注释
pred &amp;lt;- SingleR(test = GetAssayData(dt, slot = &apos;counts&apos;),
        ref = list(HPCA = hpca, DICE = dice),
        labels = list(hpca$label.main, dice$label.main))

dt$singleR.labels &amp;lt;- pred$labels[match(rownames(dt@meta.data), rownames(pred))]
&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;策略3：使用统一标签&lt;/h5&gt;
&lt;pre&gt;&lt;code&gt;# 调取参考数据集
# cell.ont 字符串，指定是否将细胞本体术语包含在 colData 中。若为 &quot;nonna&quot;，所有没有有效术语的样本将被丢弃；若为 &quot;all&quot;，所有样本将返回（可能带有 NA）术语；若为 &quot;none&quot;，则不添加术语。
hpca.ont &amp;lt;- celldex::HumanPrimaryCellAtlasData(cell.ont = &apos;nonna&apos;)
dice.ont &amp;lt;- celldex::DatabaseImmuneCellExpressionData(cell.ont = &apos;nonna&apos;)

# 筛选相同项目基因
shared &amp;lt;- GenomicRanges::intersect(rownames(hpca.ont), rownames(dice.ont))

# 不同于策略1，这里是分别保存而不是cbind
hpca.ont &amp;lt;- hpca.ont[shared,]
dice.ont &amp;lt;- dice.ont[shared,]

# 注释
pred &amp;lt;- SingleR(test = GetAssayData(dt, slot = &apos;counts&apos;),
        ref = list(HPCA = hpca.ont, DICE = dice.ont),
        labels = list(hpca.ont$label.ont, dice.ont$label.ont))

dt$singleR.labels &amp;lt;- pred$labels[match(rownames(dt@meta.data), rownames(pred))]
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;运行这部分我会报错
&lt;ul&gt;
&lt;li&gt;应该是&lt;code&gt;dice.ont &amp;lt;- celldex::DatabaseImmuneCellExpressionData(cell.ont = &apos;nonna&apos;)&lt;/code&gt;有connection问题&lt;/li&gt;
&lt;li&gt;不过也懒得管了哈&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;...
cacheError: failed to load resource  
name: EH3488  
title: DICE RNA-seq
...
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;使用ATC注释&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;ATC是一个在线细胞簇注释工具&lt;/li&gt;
&lt;li&gt;将&lt;code&gt;FindAllMarkers()&lt;/code&gt;的结果输出出来，复制到&lt;a href=&quot;http://xteam.xbio.top/ACT/index.jsp&quot;&gt;ATC&lt;/a&gt;的&lt;strong&gt;Ordered up-regulated genes&lt;/strong&gt;中&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;res_allmkr &amp;lt;- list()
for (i in unique(res_allmkr$cluster)){
    res_allmkr[[i]] &amp;lt;- paste(i,&apos;:&apos;,{res_allmkr %&amp;gt;% filter(cluster == i)}$gene %&amp;gt;% paste(collapse=&quot;,&quot;), sep = &quot;&quot;)
}
res_allmkr %&amp;gt;%  paste(collapse = &apos;\n&apos;) %&amp;gt;% cat()
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;下载注释结果，重命名为&lt;code&gt;clust.txt&lt;/code&gt;（随便啥名）然后读取，合并&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;clust &amp;lt;- read_delim(&quot;Clusters/clust.txt&quot;) %&amp;gt;% 
 mutate(across(3, ~ifelse(is.na(.), &apos;Unknown&apos;, .)))
dt@meta.data &amp;lt;- left_join(dt@meta.data, clust_roc[,2:3], by = c(&apos;seurat_clusters&apos; = &apos;Cluster&apos;))
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;弄到meta数据里然后把&lt;code&gt;Ident&lt;/code&gt;改成&lt;code&gt;&apos;Cell.Type&apos;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;Ident(dt) &amp;lt;- &apos;Cell.Type&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;查看注释结果&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;得分热图&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;plotScoreHeatmap(pred)
plotDeltaDistribution(pred)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;总结分类结果的列联表&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;table(Assigned=pred$labels, Clusters=dt$seurat_clusters)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;查看细胞注释得分&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;grouping &amp;lt;- paste0(pred$labels,&apos;.&apos;, pred$reference)
best_ref &amp;lt;- as.data.frame(split(pred, grouping))
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;查看参考数据集中marker种类&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;metadata(pred$orig.results$HPCA)$de.genes
metadata(pred$orig.results$DICE)$de.genes
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;colData(hpca.ont)
colData(dice.ont)

hpca.fle &amp;lt;- system.file(&quot;mapping&quot;,&quot;hpca.tsv&quot;, package = &quot;celldex&quot;)
hpca.mapping &amp;lt;- read.delim(hpca.fle, header = F)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;数据来源&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;样本取自成年人类肺外气道组织
&lt;ul&gt;
&lt;li&gt;GSM8162955_MOCK：未播种COVID-9病毒的细胞样本&lt;/li&gt;
&lt;li&gt;GSM8162956_1dpi：播种COVID-9病毒的细胞样本后感染1天的细胞样本&lt;/li&gt;
&lt;li&gt;GSM8162957_3dpi：播种COVID-9病毒的细胞样本后感染3天的细胞样本&lt;/li&gt;
&lt;li&gt;GSM8162958_6dpi：播种COVID-9病毒的细胞样本后感染6天的细胞样本&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Functions&lt;/h2&gt;
&lt;h3&gt;Check Packages&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;checkPack &amp;lt;- function(){

    options(timeout=300)

    if(!require(devtools)){
        install.packages(&apos;devtools&apos;)
    }else{
        library(devtools)
    }

    if(!require(patchwork)){
        install.packages(&apos;patchwork&apos;)
    }else{
        library(patchwork)
    }
    
    if(!require(Seurat)){
        install.packages(&apos;Seurat&apos;)
    }else{
        library(Seurat)
    }

    if(!require(SeuratWrappers)){
        remotes::install_github(&apos;satijalab/seurat-wrappers&apos;)
    }else{
        library(SeuratWrappers)
    }

    if(!require(tidyverse)){
        install.packages(&apos;tidyverse&apos;)
    }else{
        library(tidyverse)
    }

    if(!require(patchwork)){
        install.packages(&apos;patchwork&apos;)
    }else{
        library(patchwork)
    }

    if(!require(DoubletFinder)){
        remotes::install_github(&apos;chris-mcginnis-ucsf/DoubletFinder&apos;, force = TRUE)
    }else{
        library(DoubletFinder)
    }

    if(!require(harmony)){
        install.packages(&apos;harmony&apos;)
    }else{
        library(harmony)
    }

    if (!require(&apos;BiocManager&apos;, quietly = TRUE)){
        install.packages(&apos;BiocManager&apos;)
    }
        
    if(!require(SingleR)){
        BiocManager::install(&apos;SingleR&apos;)
    }else{
        library(SingleR)
    }
    
    if(!require(multtest)){
        BiocManager::install(&apos;multtest&apos;)
    }else{
        library(multtest)
    }

    if(!require(clustree)){
        install.packages(&apos;clustree&apos;)
    }else{
        library(clustree)
    }

    if(!require(metap)){
        install.packages(&apos;metap&apos;)
    }else{
        library(metap)
    }

    if(!require(SingleR)){
        BiocManager::install(&apos;SingleR&apos;)
    }else{
        library(SingleR)
    }

    if(!require(celldex)){
        BiocManager::install(&apos;celldex&apos;)
    }else{
        library(celldex)
    }

    if(!require(pheatmap)){
        install.packages(&apos;pheatmap&apos;)
    }else{
        library(pheatmap)
    }

    if(!require(DESeq2)){
        BiocManager::install(&apos;DESeq2&apos;)
    }else{
        library(DESeq2)
    }

if(!require(monocle3)){
        BiocManager::install(c(&apos;BiocGenerics&apos;, &apos;DelayedArray&apos;, &apos;DelayedMatrixStats&apos;,
                       &apos;limma&apos;, &apos;lme4&apos;, &apos;S4Vectors&apos;, &apos;SingleCellExperiment&apos;,
                       &apos;SummarizedExperiment&apos;, &apos;batchelor&apos;, &apos;HDF5Array&apos;,
                       &apos;terra&apos;, &apos;ggrastr&apos;))
        devtools::install_github(&apos;cole-trapnell-lab/monocle3&apos;)
    }else{
        library(monocle3)
    }

    if(!require(hdWGCNA)){
        BiocManager::install(c(&apos;WGCNA&apos;, &apos;UCell&apos;, &apos;GenomicRanges&apos;, &apos;GeneOverlap&apos;))
        devtools::install_github(&apos;smorabit/hdWGCNA&apos;, ref=&apos;dev&apos;)
    }else{
        library(hdWGCNA)
        library(WGCNA)
    }

}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;10X data to SeuratObject&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;rdMtx &amp;lt;- function(
    sample, 
    path = &apos;Data&apos;,
    project = NULL,
    min.features = 200, 
    min.cells = 3
){

    args &amp;lt;- list(
        mtx = paste(path,&apos;/&apos;,sample,&apos;_matrix.mtx.gz&apos;,sep=&apos;&apos;),
        features = paste(path,&apos;/&apos;,sample,&apos;_features.tsv.gz&apos;,sep=&apos;&apos;),
        cells = paste(path,&apos;/&apos;,sample,&apos;_barcodes.tsv.gz&apos;,sep=&apos;&apos;)
    )

    matrix &amp;lt;- do.call(ReadMtx, args)

    matrix &amp;lt;- CreateAssay5Object(
        counts = matrix
    )

    args2 &amp;lt;- list(
        matrix,
        min.features = min.features, 
        min.cells = min.cells
    )

    if (!is.null(project)) args2$project &amp;lt;- project
    
    matrix &amp;lt;- do.call(CreateSeuratObject, args2)

    return(matrix)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Get Samples and Names&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;getSampleList &amp;lt;- function(path = &apos;Data&apos;){
    sampleList &amp;lt;- lapply(
    list.files(
        path = paste(path, &apos;/&apos;, sep=&apos;&apos;), 
        pattern = &apos;_features.tsv.gz&apos;
    ),
    function(x) {
        regmatches(x, regexpr(&apos;^[^_]+_[^_]+&apos;, x))
    }
) %&amp;gt;%
    unlist()
}

getNameList &amp;lt;- function(path = &apos;Data&apos;){
    nameList &amp;lt;- lapply(
    list.files(
        paste(path, &apos;/&apos;, sep=&apos;&apos;), 
        pattern = &apos;_features.tsv.gz&apos;
    ),
    function(x) {
        regmatches(x, regexpr(&apos;(?&amp;lt;=_)[^_]+(?=_)&apos;, x, perl = TRUE))
    }
) %&amp;gt;% 
    unlist()
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Combine local 10X data into one SeuratObject&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;get10xData &amp;lt;- function(
    path = &apos;Data&apos;,
    min.features = 200, 
    min.cells = 3,
    merge = TRUE,
    JoinLayers = FALSE
){
    sampleList &amp;lt;- getSampleList()
    nameList &amp;lt;- getNameList()

    Sample_list &amp;lt;- list()
    for (i in sampleList){
        Sample_list &amp;lt;- append(
            Sample_list,
            rdMtx(
                i, 
                project = nameList[which(i == sampleList)], 
                min.features = min.features,
                min.cells = min.cells
            )
        )
    }

    if (merge == TRUE) Sample_list &amp;lt;- merge(Sample_list[[1]], y = Sample_list[-1], add.cell.ids = sampleList)

    if (JoinLayers == TRUE) Sample_list &amp;lt;- JoinLayers(Sample_list)

    return(Sample_list)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Quality Control&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;QuaCtr &amp;lt;- function(
    data,
    filter = TRUE,
    min.nFeature = NULL,
    max.nFeature = NULL,
    min.nCount = NULL,
    max.nCount = NULL,
    pct.mt = NULL,
    pct.hb = NULL,
    pct.rb = NULL
){
    # mitochondrial genes
    data[[&apos;percent.mt&apos;]] &amp;lt;- PercentageFeatureSet(data, pattern = &apos;^MT-&apos;)
    # ribosomal genes
    data[[&apos;percent.rb&apos;]] &amp;lt;- PercentageFeatureSet(data, pattern = &apos;^RP[SL]&apos;)
    # hemoglobin genes
    data[[&apos;percent.hb&apos;]] &amp;lt;- PercentageFeatureSet(
        data, 
        features = CaseMatch(
            c(&apos;HBA1&apos;,&apos;HBA2&apos;,&apos;HBB&apos;,&apos;HBD&apos;,&apos;HBE1&apos;,&apos;HBG1&apos;,&apos;HBG2&apos;,&apos;HBM&apos;,&apos;HBQ1&apos;,&apos;HBZ&apos;), 
            rownames(data)
        )
    )

    if (filter == TRUE){
        if(!is.null(min.nFeature)) data &amp;lt;- subset(data, subset = nFeature_RNA &amp;gt; min.nFeature)
        if(!is.null(max.nFeature)) data &amp;lt;- subset(data, subset = nFeature_RNA &amp;lt; max.nFeature)
        if(!is.null(min.nCount)) data &amp;lt;- subset(data, subset = nCount_RNA &amp;gt; min.nCount)
        if(!is.null(max.nCount)) data &amp;lt;- subset(data, subset = nCount_RNA &amp;lt; max.nCount)
        if(!is.null(pct.mt)) data &amp;lt;- subset(data, subset = percent.mt &amp;lt; pct.mt) 
        if(!is.null(pct.hb)) data &amp;lt;- subset(data, subset = percent.hb &amp;lt; pct.hb) 
        if(!is.null(pct.rb)) data &amp;lt;- subset(data, subset = percent.rb &amp;lt; pct.rb)
    }

    return(data)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;ccDetect &amp;lt;- function(data){

    data &amp;lt;- CellCycleScoring(
        data,
        g2m.features = CaseMatch(
            search = cc.genes$g2m.genes, 
            match = rownames(data)
        ),
        s.features = CaseMatch(
            search = cc.genes$s.genes,
            match = rownames(data)
        )
    )

    data$CC.Difference &amp;lt;- data$S.Score - data$G2M.Score

    return(data)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;QuaCtrPlot &amp;lt;- function(
    data = data,
    group.by = &apos;orig.ident&apos;,
    plot.featrures = c(&apos;nFeature_RNA&apos;, &apos;nCount_RNA&apos;, &apos;percent.mt&apos;, &apos;percent.hb&apos;, &apos;percent.rb&apos;)
    ){

    plots &amp;lt;- list()

    for(i in 1:length(plot.featrures)){
        plots[[i]] = VlnPlot(
            data, 
            group.by= group.by, 
            pt.size = 0,
            features = plot.featrures[i]
        ) + 
        theme(axis.title.x = element_blank()) + 
        NoLegend()
    }

    violin &amp;lt;- wrap_plots(plots = plots, ncol = 2)
    
    print(violin)
    
    {FeatureScatter(data, &apos;nCount_RNA&apos;, &apos;nFeature_RNA&apos;, group.by = group.by) + geom_smooth( method=&apos;lm&apos;, color = &apos;pink&apos;)} /
        {FeatureScatter(data, &apos;nCount_RNA&apos;, &apos;percent.mt&apos;, group.by = group.by) + geom_smooth( method=&apos;lm&apos;, color = &apos;pink&apos;)}  / 
        {FeatureScatter(data, &apos;nCount_RNA&apos;, &apos;percent.hb&apos;, group.by = group.by) + geom_smooth( method=&apos;lm&apos;, color = &apos;pink&apos;)}  /
        {FeatureScatter(data, &apos;nCount_RNA&apos;, &apos;percent.rb&apos;, group.by = group.by) + geom_smooth( method=&apos;lm&apos;, color = &apos;pink&apos;)}  /
        {FeatureScatter(data, &apos;nCount_RNA&apos;, &apos;CC.Difference&apos;, group.by = group.by) + geom_smooth( method=&apos;lm&apos;, color = &apos;pink&apos;)}  

}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Normalization, Find Variable Features, Scale data and PCA&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;prepc &amp;lt;- function(
  data,
  normalization.method = &apos;LogNormalize&apos;,
  scale.factor = 10000,
  selection.method = &apos;vst&apos;,
  nfeatures = 2000,
  vars.to.regress = c(&apos;nCount_RNA&apos;, &apos;nFeature_RNA&apos;, &apos;percent.mt&apos;, &apos;percent.rb&apos;, &apos;percent.hb&apos;, &apos;CC.Difference&apos;),
  scale.features = NULL,
  pca.plts = TRUE,
  VFplt = TRUE,
  VDLplt = TRUE,
  DPplt = TRUE,
  DHplt = TRUE,
  EPplot = TRUE,
  VFplt.n = 10,
  VizDimLoadings.dims = 1:2,
  ElbowPlot.ndims = 50,
  DimHeatmap.dims = 1:15,
  DimHeatmap.cells = 500
){

  data &amp;lt;- data %&amp;gt;%
    NormalizeData(
        normalization.method = normalization.method,
        scale.factor = scale.factor,
    ) %&amp;gt;%
    FindVariableFeatures(
        selection.method = selection.method,
        nfeatures = nfeatures
    ) %&amp;gt;% 
    ScaleData(
        vars.to.regress = vars.to.regress,
        features = scale.features
    ) %&amp;gt;%
    RunPCA()
  
  if (pca.plts == TRUE) {
    if(VFplt ==TRUE) print(VariableFeaturePlot(data) %&amp;gt;% LabelPoints(points = head(VariableFeatures(data), VFplt.n), repel = TRUE))
    if(VDLplt ==TRUE) print(VizDimLoadings(data, dims = 1:2, reduction = &quot;pca&quot;))
    if(DPplt ==TRUE) print(DimPlot(data, reduction = &quot;pca&quot;))
    if(DHplt ==TRUE) print(DimHeatmap(data, dims = DimHeatmap.dims, cells = DimHeatmap.cells, balanced = TRUE,ncol = 3))
    if(EPplot ==TRUE) print((ElbowPlot(data, ndims = ElbowPlot.ndims)))
  }

  return(data)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Clustering and Find Clusters&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;clustR &amp;lt;- function(
    data,
    reduction = &apos;pca&apos;,
    resolution = seq(0.1, 1, by = 0.1),
    reso.select.plt = TRUE,
    NLdim.final.plt = TRUE,
    clustreePlot = TRUE,
    multiDim = TRUE,
    Nldim.dims = 1:20,
    pca.plt = FALSE,
    tsne.plt = FALSE,
    umap.plt = TRUE,
    group.by = NULL,
    split.by = NULL,
    plt.dims = c(1:2),
    plt.label.size = 4,
    plt.repel = TRUE,
    plt.label = TRUE
    ){
    

    data &amp;lt;- data %&amp;gt;% 
        FindNeighbors(dims = Nldim.dims, reduction = reduction) %&amp;gt;%
        FindClusters(resolution = resolution) %&amp;gt;%
        RunTSNE(dims = Nldim.dims, reduction = reduction) %&amp;gt;%
        RunUMAP(dims = Nldim.dims, reduction = reduction) 

    if (reso.select.plt == TRUE){
        if(clustreePlot==TRUE) print(clustree(data, prefix = &apos;RNA_snn_res.&apos;) + coord_flip())
        if(multiDim==TRUE){
            snnresPlot &amp;lt;- list()
            for (i in resolution %&amp;gt;% as.character()){
                snnresPlot[[i]] &amp;lt;- DimPlot(data, group.by = paste(&apos;RNA_snn_res.&apos;,i,sep=&apos;&apos;), label = T)
            }
            if (length(resolution) == 1) {
                print(snnresPlot[[1]])
            }else{
                print(wrap_plots(plots = snnresPlot, ncol = 2))
            }
        }
    }

    if (NLdim.final.plt == TRUE){
        args &amp;lt;- list(
            object = data,
            dims = plt.dims,
            label.size = plt.label.size,
            repel = plt.repel,
            label = plt.label
        )

        if(!is.null(group.by)) args$group.by &amp;lt;- group.by
        if(!is.null(split.by)) args$split.by &amp;lt;- split.by
        
        if(pca.plt){
            args$reduction &amp;lt;- &apos;pca&apos;
            do.call(DimPlot, args) %&amp;gt;% print()
        } 

        if(tsne.plt){
            args$reduction &amp;lt;- &apos;tsne&apos;
            do.call(DimPlot, args) %&amp;gt;% print()
        } 

        if(umap.plt){
            args$reduction &amp;lt;- &apos;umap&apos;
            do.call(DimPlot, args) %&amp;gt;% print()
        } 
    }
    
    return(data)

}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;clustPlot &amp;lt;- function(
    data,
    pca = FALSE,
    tsne = FALSE,
    umap = TRUE,
    group.by = NULL,
    split.by = NULL,
    dims = c(1:2),
    label.size = 4,
    repel = TRUE,
    label = TRUE
){
    args &amp;lt;- list(
        object = data,
        dims = dims,
        label.size = label.size,
        repel = repel,
        label = label       
    )

    if(!is.null(group.by)) args$group.by &amp;lt;- group.by
    if(!is.null(split.by)) args$split.by &amp;lt;- split.by
    
    if(pca){
        args$reduction &amp;lt;- &apos;pca&apos;
        do.call(DimPlot, args) %&amp;gt;% print()
    } 

    if(tsne){
        args$reduction &amp;lt;- &apos;tsne&apos;
        do.call(DimPlot, args) %&amp;gt;% print()
    } 

    if(umap){
        args$reduction &amp;lt;- &apos;umap&apos;
        do.call(DimPlot, args) %&amp;gt;% print()
    } 

}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Non-linear dimensional reduction&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;NLdimReduce &amp;lt;- function(
    data,
    Nldim.dims = 1:20,
    reduction = &apos;pca&apos;,
    pca.plt = FALSE,
    tsne.plt = TRUE,
    umap.plt = TRUE,
    group.by = NULL,
    split.by = NULL,
    plt.dims = c(1:2),
    plt.label.size = 4,
    plt.repel = TRUE,
    plt.label = TRUE
    ){
    

    data &amp;lt;- data %&amp;gt;% 
        RunTSNE(dims = Nldim.dims, reduction = reduction, reduction.name = paste(&apos;tsne.&apos;,reduction, sep = &apos;&apos;)) %&amp;gt;%
        RunUMAP(dims = Nldim.dims, reduction = reduction, reduction.name = paste(&apos;umap.&apos;,reduction, sep = &apos;&apos;)) 

    args &amp;lt;- list(
        object = data,
        dims = Nldim.dims,
        label.size = plt.label.size,
        repel = plt.repel,
        label = plt.label
    )

    if(!is.null(group.by)) args$group.by &amp;lt;- group.by
    if(!is.null(split.by)) args$split.by &amp;lt;- split.by
    
    if(pca){
        args$reduction &amp;lt;- &apos;pca&apos;
        do.call(DimPlot, args) %&amp;gt;% print()
    } 

    if(tsne){
        args$reduction &amp;lt;- &apos;tsne&apos;
        do.call(DimPlot, args) %&amp;gt;% print()
    } 

    if(umap){
        args$reduction &amp;lt;- &apos;umap&apos;
        do.call(DimPlot, args) %&amp;gt;% print()
    } 


    return(data)

}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Find doublets&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;findDbl &amp;lt;- function(
    data,
    PCs = 1:20,
    sct = FALSE,
    num.cores = 1,
    GT = FALSE,
    pN = 0.25,
    dblpct = 0.008
){
    if (GT == TRUE){
        sweep.res &amp;lt;- paramSweep(data, PCs = PCs, sct = sct)
        gt.calls &amp;lt;- data@meta.data[rownames(sweep.res[[1]]), &apos;GT&apos;]
        sweep.stats &amp;lt;- summarizeSweep(sweep.res, GT = gt.calls)
        sweep.bcmvn &amp;lt;- find.pK(sweep.stats)
    }
    
    if (GT == FALSE){
        sweep.res &amp;lt;- paramSweep(data, PCs = PCs, sct = sct)
        sweep.stats &amp;lt;- summarizeSweep(sweep.res, GT = FALSE)
        sweep.bcmvn &amp;lt;- find.pK(sweep.stats)
    }

    pK &amp;lt;- sweep.bcmvn %&amp;gt;% 
    filter(BCmetric == max(BCmetric)) %&amp;gt;% 
    select(pK)
    pK &amp;lt;- as.numeric(as.character(pK[[1]]))

    homotypic.prop &amp;lt;- modelHomotypic(data@meta.data$seurat_clusters)
    nExp_poi &amp;lt;- round(dblpct * nrow(data@meta.data))
    nExp_poi.adj &amp;lt;- round(nExp_poi*(1-homotypic.prop))

    data &amp;lt;- doubletFinder(
        data, 
        PCs = PCs, 
        pN = pN, 
        pK = pK, 
        nExp = nExp_poi,
        reuse.pANN = NULL, 
        sct = sct
    )

    data &amp;lt;- doubletFinder(
        data, 
        PCs = PCs, 
        pN = pN, 
        pK = pK, 
        nExp = nExp_poi.adj,
        reuse.pANN = {data@meta.data %&amp;gt;% colnames()}[length(data@meta.data)-2], 
        sct = sct
    )

    return(data)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Harmony&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;hmny &amp;lt;- function(
    data
){
    data &amp;lt;- data %&amp;gt;% 
        IntegrateLayers(
            method = HarmonyIntegration,
            orig.reduction = &apos;pca&apos;, 
            new.reduction = &apos;harmony&apos;,
            verbose = FALSE
        ) 
    return(data)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Find All Markers&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;ClusterNSelect &amp;lt;- function(
    data,
    Nldim.dims = 1:20,
    resolution = 0.1,
    reso.select.plt = FALSE,
    min.pct = 0.1,
    only.pos = TRUE,
    test.use = &apos;roc&apos;,
    slot = &apos;data&apos;,
    avg_log2FC.threshold = 1
){
    data &amp;lt;- data %&amp;gt;% clustR(Nldim.dims = Nldim.dims, resolution = resolution, reso.select.plt = FALSE, NLdim.final.plt = FALSE)
    allMkr_roc &amp;lt;- FindAllMarkers(
        data,
        min.pct = min.pct,
        only.pos = only.pos,
        test.use = test.use,
        slot = slot
    ) 

    allMkr_roc %&amp;gt;% write_csv(paste0(&apos;Table/allMkr_roc_res&apos;, resolution, &apos;.csv&apos;))

    allMkr_roc.list &amp;lt;- list()
    for (i in unique(allMkr_roc$cluster)){
        allMkr_roc.list[[i]] &amp;lt;- paste(i,&apos;:&apos;,{allMkr_roc %&amp;gt;% filter(cluster == i, avg_log2FC &amp;gt; avg_log2FC.threshold)}$gene %&amp;gt;% paste(collapse=&apos;,&apos;), sep = &apos;&apos;)
    }

    allMkr_roc.list %&amp;gt;%  paste(collapse = &apos;\n&apos;) %&amp;gt;% writeLines(paste0(&apos;Table/allMkr_roc.list_res&apos;, resolution,&apos;.txt&apos;))

    cellClusters &amp;lt;- cellTable %&amp;gt;%
        left_join(allMkr_roc %&amp;gt;% filter(avg_log2FC &amp;gt; avg_log2FC.threshold), by =c(&apos;marker&apos; = &apos;gene&apos;)) %&amp;gt;%
        filter(!is.na(myAUC)) %&amp;gt;%
        group_by(tissue_class, tissue_type, cell_name, cluster) %&amp;gt;%
        summarize(Markers = paste0(marker, collapse=&apos;,&apos;), marker_n = n())

    write_csv(cellClusters, paste0(&apos;Table/cellClusters_res&apos;, resolution, &apos;.csv&apos;))
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Library Packages&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;checkPack()
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Load data&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;dt.prep &amp;lt;- get10xData(path = &apos;Data&apos;, merge = TRUE, JoinLayers = FALSE)
sampleList &amp;lt;- getSampleList()
nameList &amp;lt;- getNameList()
dt.prep$orig.ident &amp;lt;- factor(dt.prep$orig.ident, levels = c(&apos;MOCK&apos;, &apos;1dpi&apos;, &apos;3dpi&apos;, &apos;6dpi&apos;))
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Quality Control&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;dt.prep &amp;lt;- dt.prep %&amp;gt;% QuaCtr(filter = F)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Normalization, Find Feature Variables, Scaling and PCA&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;dt.prep &amp;lt;- dt.prep %&amp;gt;% prepc(vars.to.regress = NULL, pca.plts = FALSE) %&amp;gt;% ccDetect() %&amp;gt;% prepc(vars.to.regress = NULL)
QuaCtrPlot(dt.prep)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Dim reduction&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;dt.prep %&amp;gt;% clustR(
 Nldim.dims = 1:20, 
 resolution = seq(0.1, 1, by = 0.1), 
 NLdim.final.plt = FALSE
)
dt.prep &amp;lt;- dt.prep %&amp;gt;% 
 clustR(
  Nldim.dims = 1:20, 
  resolution = 0.7, 
  reso.select.plt = FALSE
 )
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Find Doublets&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;dt.dbl &amp;lt;- SplitObject(dt.prep, split.by = &apos;orig.ident&apos;)
for (i in 1:length(dt)) {
    dt.dbl[[i]] &amp;lt;- findDbl(dt.dbl[[i]], PCs = 1:20)
    dt.dbl[[i]] &amp;lt;- subset(dt.dbl[[i]], !!sym(colnames(dt.dbl[[i]]@meta.data)[ncol(dt.dbl[[i]]@meta.data)]) == &apos;Singlet&apos;)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Merge&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;dt &amp;lt;- merge(dt.dbl[[1]], y = dt.dbl[-1], add.cell.ids = sampleList)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Normalization, Find Feature Variables, Scaling and PCA&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;dt &amp;lt;- dt %&amp;gt;% 
 prepc(vars.to.regress = NULL) %&amp;gt;% 
 ccDetect() %&amp;gt;% 
 prepc(vars.to.regress = NULL)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Dim reduction&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;dt %&amp;gt;% 
 clustR(
  Nldim.dims = 1:15, 
  resolution = seq(0.1, 1, by = 0.1), 
  NLdim.final.plt = FALSE
 )

dt &amp;lt;- dt %&amp;gt;% 
 clustR(
  Nldim.dims = 1:15, 
  resolution = 0.6, 
  reso.select.plt = FALSE
 )
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Harmony&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;dt.hmy &amp;lt;- dt %&amp;gt;% hmny()
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Join Layers&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;dt.hmy &amp;lt;- dt %&amp;gt;% JoinLayers()
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Dim reduction&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;dt.hmy %&amp;gt;% clustR(reduction = &apos;harmony&apos;, Nldim.dims = 1:15, resolution = seq(0.1, 1, by = 0.1), NLdim.final.plt = FALSE)
dt.hmy &amp;lt;- dt.hmy %&amp;gt;% clustR(reduction = &apos;harmony&apos;, Nldim.dims = 1:15, resolution = 0.7, reso.select.plt = FALSE)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Find Markers and cluster Identification&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;allMkr_roc &amp;lt;- FindAllMarkers(
    dt.hmy,
    min.pct = 0.1,
    only.pos = TRUE,
    test.use = &apos;roc&apos;,
    slot = &apos;data&apos;
)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;consMkr_roc &amp;lt;- lapply(X = dt$seurat_clusters %&amp;gt;% unique(), function(x){
    FindConservedMarkers(
        dt.hmy,
        ident.1 = x,
        test.use = &apos;roc&apos;,
        grouping.var = &apos;orig.ident&apos;
    )
})
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;allMkr_roc.list &amp;lt;- list()
for (i in unique(allMkr_roc$cluster)){
    allMkr_roc.list[[i]] &amp;lt;- paste(i,&apos;:&apos;,{allMkr_roc %&amp;gt;% filter(cluster == i)}$gene %&amp;gt;% paste(collapse=&apos;,&apos;), sep = &apos;&apos;)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;allMkr_roc.list %&amp;gt;%  paste(collapse = &apos;\n&apos;) %&amp;gt;% cat()
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;consMkr_roc.list &amp;lt;- list()
for (i in dt.hmy$seurat_clusters %&amp;gt;% unique() %&amp;gt;% sort() %&amp;gt;% as.numeric()){
    consMkr_roc.list[[i]] &amp;lt;- paste(i,&apos;:&apos;,consMkr_roc[[i]] %&amp;gt;% rownames() %&amp;gt;% paste(collapse=&apos;,&apos;), sep = &apos;&apos;)
    print(consMkr_roc.list[[i]])
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;{DimPlot(
    dt.hmy,
    group.by = &apos;seurat_clusters&apos;,
    label.size = 10,
    repel = TRUE,
    label = TRUE,
    
) + labs(color = &apos;Clusters&apos;,title = &apos;Clusters&apos;)} &amp;amp; 
{DimPlot(
    dt.hmy,
    group.by = &apos;orig.ident&apos;,
    label.size = 8,
    repel = TRUE,
    label = TRUE
) + labs(color = &apos;Samples&apos;,title = &apos;Samples&apos;)} 
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Cell Markers&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;cellTable &amp;lt;- read_csv(&apos;Clusters/Table.csv&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;for (i in 1:length(consMkr_roc)){
 left_join(cellTable, consMkr_roc[[i]] %&amp;gt;% 
  rownames_to_column(var = &apos;gene&apos;) %&amp;gt;% 
  filter(
   MOCK_avg_log2FC &amp;gt;0, 
   `1dpi_avg_log2FC` &amp;gt;0, 
   `6dpi_avg_log2FC` &amp;gt;0, 
   `6dpi_avg_log2FC` &amp;gt;0), 
   by =c(&apos;Cell marker&apos; = &apos;gene&apos;)
  ) %&amp;gt;% 
  filter(!is.na(MOCK_myAUC)) %&amp;gt;% 
  group_by(`Cell name`) %&amp;gt;%
  summarize(
   Markers = paste0(`Cell marker`, collapse=&apos;,&apos;),
   n = n()
  ) %&amp;gt;%
  ungroup() %&amp;gt;%
  arrange(desc(n)) %&amp;gt;%
  mutate(cluster = i) %&amp;gt;%
  print()
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;Cell.Type &amp;lt;- tibble(
    clust = dt.hmy$seurat_clusters %&amp;gt;% unique() %&amp;gt;% sort() ,
    Cell.Type = c(
        &apos;Epithelial cell&apos;, #1
        &apos;Early secretory cell&apos;, #2
        &apos;Epithelial cell&apos;, #3
        &apos;Basal cell&apos;, #4
        &apos;Early secretory cell&apos;, #5
        &apos;Basal cell&apos;, #6
        &apos;Early secretory cell&apos;, #7
        &apos;Basal cell&apos;, #8
        &apos;Basal cell&apos;, #9
        &apos;Epithelial cell&apos;, #10
        &apos;Basal cell&apos;, #11
        &apos;Epithelial cell&apos; #12
    )
)

dt$Cell.Type &amp;lt;- left_join(
 dt[[&apos;seurat_clusters&apos;]], 
 Cell.Type, 
 by = c(&apos;seurat_clusters&apos; = &apos;clust&apos;)
)$Cell.Type
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;DimPlot(dt.hmy, reduction = &apos;umap&apos;, group.by = &apos;Cell.Type&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Pseudo-bulk RNA-seq Analysis&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;dt.hmy$my.group &amp;lt;- ifelse(dt.hmy$orig.ident %in% c(&apos;MOCK&apos;,&apos;1dpi&apos;), &apos;CondiA&apos;, &apos;CondiB&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;dt.hmy$ind &amp;lt;- 1:nrow(dt.hmy@meta.data)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;dt.hmy$samp &amp;lt;- paste0(dt.hmy$my.group,&apos;-&apos;,dt.hmy$ind)

dt.agg &amp;lt;- AggregateExpression(
    dt.hmy,
    group.by = c(&apos;Cell.Type&apos;, &apos;samp&apos;),
    assays = &apos;RNA&apos;,
    slot = &apos;counts&apos;
)
dt.pse &amp;lt;- t(dt.agg$RNA) %&amp;gt;% as.data.frame()
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;rn.cellType &amp;lt;- gsub(&apos;_.*&apos;,&apos;&apos;,rownames(dt.pse))
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;dt.split &amp;lt;- split.data.frame(
    dt.pse,
    f = gsub(&apos;_.*&apos;,&apos;&apos;,rownames(dt.pse)) %&amp;gt;% factor()
)

dt.split &amp;lt;- lapply(dt.split, function(x){
  rownames(x) &amp;lt;- gsub(&apos;.*_(.*)&apos;, &apos;\\1&apos;, rownames(x))
  t(x)
})
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;counts_bc &amp;lt;- dt.split$`Basal cell` + 1
meta_bc &amp;lt;- data.frame(samples = colnames(counts_bc)) %&amp;gt;%
    mutate(condition = ifelse(
        grepl(&apos;CondiA&apos;, samples), &apos;A&apos;,&apos;B&apos;)
    ) %&amp;gt;%
    column_to_rownames(&apos;samples&apos;)
dds &amp;lt;- DESeqDataSetFromMatrix(countData = counts_bc,
                       colData = meta_bc,
                       design = ~ condition)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;dds[rowSums(counts(dds)) &amp;gt;= 10,]
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Run DESeq2&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;dds &amp;lt;- DESeq(dds)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Generate results object&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;res &amp;lt;- results(dds)
res
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Trajectory Analysis&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;cds &amp;lt;- as.cell_data_set(dt.hmy)
cds &amp;lt;- cluster_cells(cds)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;plot_cells(cds,
           color_cells_by = &apos;Cell.Type&apos;,
           label_groups_by_cluster = FALSE,
           group_label_size = 10) +
  theme(legend.position = &apos;right&apos;) |
plot_cells(cds,
           color_cells_by = &apos;partition&apos;,
           label_groups_by_cluster = FALSE,
           group_label_size = 10) +
  theme(legend.position = &apos;right&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;cds &amp;lt;- learn_graph(cds, use_partition = FALSE)
plot_cells(cds,
           color_cells_by = &apos;Cell.Type&apos;,
           label_groups_by_cluster = FALSE,
           group_label_size = 10) +
  theme(legend.position = &apos;right&apos;)
cds &amp;lt;- order_cells(
 cds, reduction_method = &apos;UMAP&apos;, 
 root_cells = cds[,pData(cds)$Cell.Type == &apos;Basal cell&apos;] %&amp;gt;% colnames()
)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;Idents(dt) &amp;lt;- dt$Cell.Type
dt$pseudotime &amp;lt;- pseudotime(cds)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;plot_cells(cds,
           color_cells_by = &apos;pseudotime&apos;,
           label_groups_by_cluster = FALSE,
           group_label_size = 10) +
  theme(legend.position = &apos;right&apos;) | 
plot_cells(cds,
           color_cells_by = &apos;Cell.Type&apos;,
           label_groups_by_cluster = FALSE,
           group_label_size = 10) +
  theme(legend.position = &apos;right&apos;)
as.data.frame(colData(cds)) %&amp;gt;%
    mutate(pseudotime = pseudotime(cds)) %&amp;gt;%
    ggplot(aes(pseudotime, reorder(Cell.Type, pseudotime, median), fill = Cell.Type)) +
  geom_boxplot() + 
  labs(x = &apos;Pseudotime&apos;, y = &apos;Cell Type&apos;) +
  theme(legend.position = &apos;none&apos;) +
  theme_bw() 
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;cds_gt &amp;lt;- graph_test(cds, neighbor_graph = &apos;principal_graph&apos;, cores = 4)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;cds_gt %&amp;gt;% 
    filter(status == &apos;OK&apos;) %&amp;gt;%
    arrange(q_value) %&amp;gt;%
    head(10)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;FeaturePlot(
    dt.hmy, 
    features = cds_gt %&amp;gt;% 
        filter(status == &apos;OK&apos;) %&amp;gt;%
        arrange(q_value) %&amp;gt;%
        head(10) %&amp;gt;%
        rownames(),
    label = T   
) /
FeaturePlot(
    dt.hmy, 
    features = &apos;pseudotime&apos;,
    label = T   
)
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>元分析（Meta-analysis）</title><link>https://nab-iak.github.io/posts/p8/p8/</link><guid isPermaLink="true">https://nab-iak.github.io/posts/p8/p8/</guid><description>使用R进行元分析</description><pubDate>Tue, 13 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Cover Pic by &lt;a href=&quot;https://www.pixiv.net/artworks/130128385&quot;&gt;@笠木梨Ceey&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;lt;center&amp;gt;&amp;lt;h1&amp;gt;-占坑，不咕-&amp;lt;/h1&amp;gt;&amp;lt;/center&amp;gt;
天坑系列&lt;/p&gt;
</content:encoded></item><item><title>孟德尔随机化</title><link>https://nab-iak.github.io/posts/p7/p7/</link><guid isPermaLink="true">https://nab-iak.github.io/posts/p7/p7/</guid><description>使用R进行双样本，多变量和中介孟德尔随机化分析</description><pubDate>Mon, 12 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Cover Pic by &lt;a href=&quot;https://www.pixiv.net/artworks/129969798&quot;&gt;@笠木梨Ceey&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h2&gt;参考&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://mrcieu.github.io/TwoSampleMR/index.html&quot;&gt;Mendelian randomization with GWAS summary data&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://andrewslabucsf.github.io/MR-tutorial/&quot;&gt;Mendelian Randomization Tutorial&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://www.bilibili.com/video/BV1LV4y1b7v5/?spm_id_from=333.337.search-card.all.click&amp;amp;vd_source=81a4751dfe3d7ad0a41ae3e1e47211cf&quot;&gt;【bilibili】2022.05孟德尔随机化操作&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://www.bilibili.com/video/BV1bUHVePE3K/?spm_id_from=333.337.search-card.all.click&amp;amp;vd_source=81a4751dfe3d7ad0a41ae3e1e47211cf&quot;&gt;【bilibili】孟德尔随机化傻瓜教程之概念介绍&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://www.bilibili.com/video/BV1Xm411k7ug/?spm_id_from=333.337.search-card.all.click&amp;amp;vd_source=81a4751dfe3d7ad0a41ae3e1e47211cf&quot;&gt;【bilibili】孟德尔随机化 - 从入门到实践 | 自学 | 小白 | 代码 | 原理&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://zhuanlan.zhihu.com/c_1230814311636668416&quot;&gt;知乎专栏-孟德尔随机化研究&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://gwaslab.org/2021/06/24/mr/&quot;&gt;孟德尔随机化系列之一：基础概念 Mendelian randomization I&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://gwaslab.org/2021/11/14/twosamplemr/&quot;&gt;孟德尔随机化系列之二：两样本MR – TwoSampleMR&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;------ 理论部分 ------&lt;/h2&gt;
&lt;h2&gt;孟德尔随机化的原理基础&lt;/h2&gt;
&lt;h3&gt;简介&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;排除内生性因素的干扰，确定暴露（等位基因有无）与结局是否存在因果关系
&lt;img src=&quot;./image_1.png&quot; alt=&quot;image_1&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://www.bilibili.com/video/BV1bUHVePE3K/?spm_id_from=333.337.search-card.all.click&amp;amp;vd_source=81a4751dfe3d7ad0a41ae3e1e47211cf&quot;&gt;【bilibili】孟德尔随机化傻瓜教程之概念介绍&lt;/a&gt;
&lt;img src=&quot;./image_2.png&quot; alt=&quot;image_2&quot; /&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;暴露因素&lt;/strong&gt;&lt;br /&gt;
影响结局的任何因素或特征,可以是内部因素的的也可以是外部因素的,内部因素比如外貌、体型等生物学特征,外部因素比如饮酒、吸烟等生生活方式或一些环境因素等&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;结局变量&lt;/strong&gt;&lt;br /&gt;
结局是与研究的问题相关的一个定量或定性的拍旨标,如肾小球滤过率水平、糖尿病等&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;混杂因素&lt;/strong&gt;&lt;br /&gt;
同时影响着暴露与结局的其他因素。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;反向因果&lt;/strong&gt;&lt;br /&gt;
当暴露与结果之间的关联不是由于暴露导致结果果变化,而是由于结果导致暴露变化时,则发生反向因果关系。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;GWAS&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;./image_3.png&quot; alt=&quot;image_3&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;工具变量&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;调节 &lt;strong&gt;工具变量（instrumental variables, IV）&lt;/strong&gt; 的影响
&lt;ul&gt;
&lt;li&gt;定义
&lt;ul&gt;
&lt;li&gt;与X相关&lt;/li&gt;
&lt;li&gt;与被忽略的混淆因素无关&lt;/li&gt;
&lt;li&gt;与Y无关&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;变异基因Z
&lt;ul&gt;
&lt;li&gt;与暴露因素X相关&lt;/li&gt;
&lt;li&gt;与Y没有直接因果关系&lt;/li&gt;
&lt;li&gt;变异基因Z与结果Y相关，只能通过X对Y的因果关系被观察到&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;工具变量的假设&lt;/h3&gt;
&lt;h4&gt;假设&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;相关性假设：工具变量与暴露密切相关&lt;/li&gt;
&lt;li&gt;独立性假设：工具变量与任何影响暴露-结局关联的混杂因素均不相关&lt;/li&gt;
&lt;li&gt;排他性假设：除非借助与暴露的关联，否则工具变量不会影响结局&lt;/li&gt;
&lt;li&gt;MR：工具变量（基因位点）之间是相互独立的&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;违反假设的机制&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;生物学机制
&lt;ul&gt;
&lt;li&gt;多效性（pleiotropy）&lt;/li&gt;
&lt;li&gt;渠化（canalization）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;非孟德尔式遗传
&lt;ul&gt;
&lt;li&gt;连锁不平衡（linkage disequilibrium, LD）
&lt;ul&gt;
&lt;li&gt;指分属两个或两个以上基因座位的等位基因同时出现在一条染色体上的几率，&lt;br /&gt;
高于随机出现的频率&lt;/li&gt;
&lt;li&gt;只要两个基因不是完全独立地遗传，就会表现出某种程度的连锁&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;效应修正（effect modification）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;群体效应（population effects）
&lt;ul&gt;
&lt;li&gt;人群分层（population stratification）&lt;/li&gt;
&lt;li&gt;确定性效应（ascertainment effect）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;工具变量的挑选&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;首先确定和暴露有相关性的工具变量&lt;/li&gt;
&lt;li&gt;再确定挑选的工具变量与结局是不相关的，相关的工具变量需要剔除（假设3）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;二阶最小二乘法（two-stage least squares，2SLS）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;第一阶段回归：遗传IV对暴露的回归
&lt;ul&gt;
&lt;li&gt;计算暴露在IV上的拟合值&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;第二阶段回归：第一阶段暴露的拟合值对结局的回归
&lt;ul&gt;
&lt;li&gt;因果估计的效应量就是是该第二阶段的回归系数，&lt;br /&gt;
用于反映由于暴露量单位变化而导致的结局变化&lt;/li&gt;
&lt;li&gt;对于单个IV：&lt;br /&gt;
2SLS估计与比率估计（Wald ratio estimation）相同&lt;/li&gt;
&lt;li&gt;对于多个IV：&lt;br /&gt;
2SLS估计量可以看作是单个工具变量计算出的比率估计值的加权平均值，&lt;br /&gt;
其中权重由第一阶段回归中工具变量的相对强度确定&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;假设
&lt;ul&gt;
&lt;li&gt;$k$个工具变量，下标 $i = 1,2,...$&lt;/li&gt;
&lt;li&gt;总人数$N$，下标 $k = 1,2,...$&lt;/li&gt;
&lt;li&gt;每个个体暴露值 $X_i$ ，结局 $Y_i$&lt;/li&gt;
&lt;li&gt;假定每个工具变量遵循加性模型，$g_{ik}$ 为第 $i$ 个个体在第 $k$ 个工具变量上的基因型&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;第一阶段回归
&lt;ul&gt;
&lt;li&gt;构建工具变量对X的线性回归模型&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;$$
x_{i}= \alpha_{0}+ \sum\limits_k\alpha_kg_{ik} + \epsilon_{X_{i}}
$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;因此拟合值 $\hat{x}_i$ 有
&lt;ul&gt;
&lt;li&gt;其实无非就是用工具变量对变量X进行调整而已&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;$$
\hat{x}&lt;em&gt;{i}= \hat{\alpha}&lt;/em&gt;{0}+ \sum\limits_k\hat{\alpha}&lt;em&gt;kg&lt;/em&gt;{ik}
$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第二阶段回归&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;$$
y_{i}= \beta_{0}+ \beta_1\hat{x}_{i}+ \epsilon
_{Y_i}
$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在等式中的误差项的方差齐性下&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;$$
y_{i}= \beta_{0}+ \beta_1x_{i}+ \epsilon^{&apos;}_{Y_i}
$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2SLS估计量的渐近方程&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;$$
\hat{\sigma}^2(X^TG(G^TG)^{-1}G^TX)^{-1}=\hat{\sigma}^2(\hat{X}^T\hat{x})
^{-1}
$$&lt;/p&gt;
&lt;h2&gt;孟德尔随机化种类&lt;/h2&gt;
&lt;h3&gt;双样本孟德尔随机化&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;最基础的孟德尔随机化方法&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;双向孟德尔随机化&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;将双样本孟德尔随机化的暴露-结局颠倒，重新做一次&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;多变量孟德尔随机化&lt;/h3&gt;
&lt;h4&gt;基本概念&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;多种暴露相关的遗传变异来估计没中暴露和单一结局之间的因果关系&lt;/li&gt;
&lt;li&gt;使用条件
&lt;ul&gt;
&lt;li&gt;很难找到SNP只与一种暴露因素相关，但可以找到SNP与一些相互关联的暴露因素相关&lt;/li&gt;
&lt;li&gt;与暴露相关的SNP中有很多斗鱼某个或者某几个混杂因素相关&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;工具变量的SNP至少与一种暴露因素相关&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://www.bilibili.com/video/BV1NM4JeWEmf/&quot;&gt;【bilibili】一个视频让你学会多变量孟德尔随机化实操！&lt;/a&gt;
&lt;img src=&quot;./image_4.png&quot; alt=&quot;image_4&quot; /&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;多效性&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;一个SNP与多种表型相关
&lt;ul&gt;
&lt;li&gt;垂直多效性：SNP与一种表型相关，继而影响另一种表型&lt;/li&gt;
&lt;li&gt;水平多效性：SNP与两种或多种表型独立相关&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;在双样本孟德尔随机化（单变量）分析中，出现SNP具有潜在的水平多效性时，&lt;br /&gt;
多变量孟德尔随机化可以对其进行调整，并将该表型作为额外暴露进行分析&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;中介孟德尔随机化&lt;/h3&gt;
&lt;h4&gt;基本概念&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;评估一个中介变量在暴露因素和结局之间的中介作用&lt;/li&gt;
&lt;li&gt;成立假设
&lt;ul&gt;
&lt;li&gt;每个变量之间没有混杂因素&lt;/li&gt;
&lt;li&gt;暴露不会造成额外的混杂因素&lt;/li&gt;
&lt;li&gt;暴露和中介之间没有相互作用&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;多变量中介孟德尔随机化&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;计算&lt;strong&gt;暴露与结局&lt;/strong&gt;双样本孟德尔随机化，得到总效应$\beta_{XY}$&lt;/li&gt;
&lt;li&gt;计算&lt;strong&gt;暴露与中介&lt;/strong&gt;双样本孟德尔随机化，得到总效应$\beta_{XM}$&lt;/li&gt;
&lt;li&gt;计算&lt;strong&gt;暴露+中介与结局&lt;/strong&gt;双样本孟德尔随机化，得到调整后的$\beta_{XY}&apos;$和$\beta_{MY}$&lt;/li&gt;
&lt;li&gt;计算&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;中介效应：$a = \beta_{XM} \beta_{MY}$&lt;/li&gt;
&lt;li&gt;中介占比：$b = \frac{a}{\beta_{XY}}$&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://www.bilibili.com/video/BV1vYtTerEd6&quot;&gt;【bilibili】一节课学会中介孟德尔随机化实操!生信小白快来!!!&lt;/a&gt;
&lt;img src=&quot;./image_5.png&quot; alt=&quot;image_5&quot; /&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;分步双样本孟德尔随机化&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;适用于暴露到结局的直接效应是不知道的情况&lt;/li&gt;
&lt;li&gt;多变量中介孟德尔随机化的结果中中介效应不显著可以用这个&lt;/li&gt;
&lt;li&gt;多变量中介孟德尔随机化中，&lt;strong&gt;暴露和中介没有相同的工具变量时&lt;/strong&gt;只能用这个&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;分别进行3次孟德尔随机化&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;计算&lt;strong&gt;暴露与结局&lt;/strong&gt;双样本孟德尔随机化，得到总效应$\beta_{XY}$&lt;/li&gt;
&lt;li&gt;计算&lt;strong&gt;暴露与中介&lt;/strong&gt;双样本孟德尔随机化，得到总效应$\beta_{XM}$&lt;/li&gt;
&lt;li&gt;计算&lt;strong&gt;中介与结局&lt;/strong&gt;双样本孟德尔随机化，得到总效应$\beta_{MY}$&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;计算&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;中介效应：$a = \beta_{XM} \beta_{MY}$&lt;/li&gt;
&lt;li&gt;直接效应：$\beta_{XY}&apos; = \beta_{XY} - \beta_{XM} \beta_{MY}$&lt;/li&gt;
&lt;li&gt;中介占比：$b = \frac{a}{\beta_{XY}}$&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://www.bilibili.com/video/BV1vYtTerEd6&quot;&gt;【bilibili】一节课学会中介孟德尔随机化实操!生信小白快来!!!&lt;/a&gt;
&lt;img src=&quot;./image_6.png&quot; alt=&quot;image_6&quot; /&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;系数乘积检验法&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;检验 $a = \beta_{XM} \beta_{MY}$ 是否具有显著性
&lt;ul&gt;
&lt;li&gt;通过查看 $a$ 的95%置信区间是否跨0确定&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;计算标准误差：$S_{M}= \sqrt{\beta_{SM}^{2} S_{XM}^{2}+\beta_{MY}^{2} S_{MY}^{2}}$&lt;/li&gt;
&lt;li&gt;用$S_M$计算95%置信区间&lt;/li&gt;
&lt;li&gt;计算统计量Z：$Z = \frac{a}{S_{M}}$&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;数据&lt;/h2&gt;
&lt;h3&gt;GWAS数据库&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;PGC (&lt;a href=&quot;https://www.med.unc.edu/pgc/&quot;&gt;https://www.med.unc.edu/pgc/&lt;/a&gt;)：精神病学的基因组学&lt;/li&gt;
&lt;li&gt;SSGAC (&lt;a href=&quot;https://www.thessgac.org/&quot;&gt;https://www.thessgac.org/&lt;/a&gt;)：社会科学的基因组学&lt;/li&gt;
&lt;li&gt;CTG (&lt;a href=&quot;https://ctg.cncr.nl/software/summary_statistics&quot;&gt;https://ctg.cncr.nl/software/summary_statistics&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;IEU (&lt;a href=&quot;https://gwas.mrcieu.ac.uk/&quot;&gt;https://gwas.mrcieu.ac.uk/&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;GWAS Catalog (&lt;a href=&quot;https://www.ebi.ac.uk/gwas/&quot;&gt;https://www.ebi.ac.uk/gwas/&lt;/a&gt;)&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;IEU OpenGWAS project API&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;使用前需要在&lt;a href=&quot;https://api.opengwas.io/profile/&quot;&gt;IEU OpenGWAS project&lt;/a&gt;注册API &lt;code&gt;&amp;lt;token&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;将获取到的API写在&lt;code&gt;.RENVIRON&lt;/code&gt;文件中，位置一般在&lt;code&gt;home&lt;/code&gt;(~)下，没有就vim创建&lt;/li&gt;
&lt;li&gt;添加&lt;code&gt;OPENGWAS_JWT=&amp;lt;token&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;初始的Trial等级：100 per 10 minutes，&lt;br /&gt;
填写完个人信息后可以变成Standard等级：100000 per 10 minutes&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;注意点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;大部分GWAS数据来源于欧洲样本&lt;/li&gt;
&lt;li&gt;暴露和结局的样本群体至少为&lt;strong&gt;同一人种&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;双样本MR的暴露于结局数据不存在或存在少量可接受范围内的样本重叠（&lt;strong&gt;样本独立性&lt;/strong&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;数据构成&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;不同的数据的标签是不一样的
&lt;ul&gt;
&lt;li&gt;SNP id (rs...)：单核苷酸多态性id&lt;/li&gt;
&lt;li&gt;Effect allele; Alternative allele：效应位点&lt;/li&gt;
&lt;li&gt;Other allele; Reference allele：非效应位点&lt;/li&gt;
&lt;li&gt;Effect，Beta，b，OR（对于二分类变量，$\beta = \text{ln}(OR)$）：&lt;br /&gt;
回归系数，表示效应位点对结局的正负影响&lt;/li&gt;
&lt;li&gt;Se：标准误差&lt;/li&gt;
&lt;li&gt;EAF：效应等位基因频率&lt;/li&gt;
&lt;li&gt;P：关联性的p值&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;工具变量的获取&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;GWAS原文&lt;/li&gt;
&lt;li&gt;已经发表的MR文章中获取&lt;/li&gt;
&lt;li&gt;R program提取&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;分析流程&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;获取暴露与结局的GWAS数据&lt;/li&gt;
&lt;li&gt;选择工具变量&lt;/li&gt;
&lt;li&gt;去除连锁不平衡&lt;/li&gt;
&lt;li&gt;数据协同&lt;/li&gt;
&lt;li&gt;MR分析&lt;/li&gt;
&lt;li&gt;敏感性分析：评价分析结果的稳健性&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;异质性检验
&lt;ul&gt;
&lt;li&gt;检验暴露和结局的样本是否存在异质性&lt;/li&gt;
&lt;li&gt;当存在异质性时，应该剔除导致偏移的SNP&lt;/li&gt;
&lt;li&gt;但是对于IVW的MR主要检验方法而言是可以接受的&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;多效性检验
&lt;ul&gt;
&lt;li&gt;检验SNP是否对多种遗传性状产生影响&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;结果可视化&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;------ 实操部分 ------&lt;/h2&gt;
&lt;h2&gt;数据来源及分析流程&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;随便找的3个GWAS数据
&lt;ul&gt;
&lt;li&gt;暴露X：1型糖尿病，GCST90475661&lt;/li&gt;
&lt;li&gt;中介M：CKD，GCST90478532&lt;/li&gt;
&lt;li&gt;结局Y：FGF23，GCST90469223&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;导入包&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;library(MendelianRandomization)
library(TwoSampleMR)
library(readr)
library(tidyverse)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;读取数据&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;TwoSampleMR&lt;/code&gt;包只有IEU的API，实际上下载到本地的情况肯定会更多&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# DM1: x
x &amp;lt;- read_tsv(&apos;Data/DM1/GCST90475661.tsv&apos;)
# FGF23: m
m &amp;lt;- read_tsv(&apos;Data/FGF23/GCST90469223.tsv&apos;)
# CKD: y
y &amp;lt;- read_tsv(&apos;Data/CKD/GCST90478532.tsv&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;随便看看&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;head(x,3); head(m, 3); head(y, 3)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;预处理&lt;/h2&gt;
&lt;h3&gt;Odds Ratio转换beta&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;calcuBeta &amp;lt;- function(x){
    x &amp;lt;- x %&amp;gt;%
        mutate(
            beta = log(odds_ratio),
            standard_error = (ci_upper - ci_lower)/(qnorm(0.95)*2)
        ) %&amp;gt;%
    return(x)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;x &amp;lt;- calcuBeta(x)
y &amp;lt;- calcuBeta(y)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;格式整理&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;编一个函数，后面看的清楚&lt;/li&gt;
&lt;li&gt;也可以跳过直接调用&lt;code&gt;format_data()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;fmt_data &amp;lt;- function(
        x, 
        type = &apos;exposure&apos;,
        snp_col = &apos;rsid&apos;
    ){

    args &amp;lt;- list(
        dat = x,
        beta_col = &apos;beta&apos;,
        pval_col = &apos;p_value&apos;,
        se_col = &apos;standard_error&apos;,
        eaf_col = &apos;effect_allele_frequency&apos;,
        effect_allele_col = &apos;effect_allele&apos;,
        other_allele_col = &apos;other_allele&apos;,
        type = type,
        snp_col = snp_col
    )
    
    formatted &amp;lt;- do.call(format_data, args)
    return(formatted)

}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;格式整理&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;x_fmt &amp;lt;- fmt_data(
    x,
 type = &apos;exposure&apos;
)

m.exp_fmt &amp;lt;- fmt_data(
    m,
    type = &apos;exposure&apos;,
    snp_col = &quot;rs_id&quot;
)

m.oc_fmt &amp;lt;- fmt_data(
    m,
    type = &apos;outcome&apos;,
    snp_col = &quot;rs_id&quot;
)

y_fmt &amp;lt;- fmt_data(
    y,
 type = &apos;outcome&apos;
)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;简单查看结果&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;head(x_fmt); head(m.exp_fmt); head(m.oc_fmt); head(y_fmt)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;ID重命名便于区分&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;x_fmt$exposure &amp;lt;- &apos;x&apos;
m.exp_fmt$exposure &amp;lt;- &apos;m&apos;
m.oc_fmt$outcome &amp;lt;- &apos;m&apos;
y_fmt$outcome &amp;lt;- &apos;y&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;筛选SNP&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;如果GWAS只用一次的话，&lt;strong&gt;筛选SNP&lt;/strong&gt;可以放在&lt;strong&gt;格式整理&lt;/strong&gt;之前&lt;/li&gt;
&lt;li&gt;如果以后可能作为结局数据使用的话，可以先&lt;strong&gt;格式整理&lt;/strong&gt;好，&lt;br /&gt;
因为结局是&lt;strong&gt;不可以筛选&lt;/strong&gt;SNP的&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;x_filted &amp;lt;- subset(x_fmt, pval.exposure  &amp;lt; 5e-06)
m.exp_filted &amp;lt;- subset(m.exp_fmt, pval.exposure  &amp;lt; 5e-06)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;去除连锁不平衡&lt;/h2&gt;
&lt;h3&gt;去除部分&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;编一个函数，也可以直接调用&lt;code&gt;ieugwasr::ld_clump()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;这里是本地去除连锁不平衡的方法&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;ldClump &amp;lt;- function(
        x,
        clump_kb = 10000,
        clump_r2 = 0.001,
        clump_p = 1,
        pop = &apos;EUR&apos;,
        bfile = &apos;Data/1kg.v3/EUR&apos;, 
        plink_bin = plinkbinr::get_plink_exe()
    ){
    clumped &amp;lt;- ieugwasr::ld_clump(
        dplyr::tibble(
            rsid = x$SNP,
            pval = x$pval.exposure
        ),
        clump_kb = clump_kb,
        clump_r2 = clump_r2,
        clump_p = clump_p,
        pop = pop,
        bfile = bfile, 
        plink_bin = plink_bin
    )
    return(clumped)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;x_clumped &amp;lt;- ldClump(x_filted)
m.exp_clumped &amp;lt;- ldClump(m.exp_filted)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;保留去除后的结果&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;x_pick &amp;lt;- semi_join(x_filted, x_clumped, by = c(&quot;SNP&quot; = &quot;rsid&quot;))
m.exp_pick &amp;lt;- semi_join(m.exp_filted, m.exp_clumped, by = c(&quot;SNP&quot; = &quot;rsid&quot;))
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;双样本孟德尔随机化&lt;/h2&gt;
&lt;h3&gt;X to Y&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;y4x_pick &amp;lt;- semi_join(y_fmt, x_clumped, by = c(&quot;SNP&quot; = &quot;rsid&quot;))
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;harmo_x2y &amp;lt;- harmonise_data(x_pick, y4x_pick)
res_mr_x2y &amp;lt;- mr(harmo_x2y)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;res_mr_x2y
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;X to M&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;m4x_pick &amp;lt;- semi_join(m.oc_fmt, x_clumped, by = c(&quot;SNP&quot; = &quot;rsid&quot;))
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;harmo_x2m &amp;lt;- harmonise_data(x_pick, m4x_pick)
res_mr_x2m &amp;lt;- mr(harmo_x2m)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;res_mr_x2m
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;M to Y&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;y4m_pick &amp;lt;- semi_join(y_fmt, m.exp_clumped, by = c(&quot;SNP&quot; = &quot;rsid&quot;))
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;harmo_m2y &amp;lt;- harmonise_data(m.exp_pick, y4m_pick)
res_mr_m2y &amp;lt;- mr(harmo_m2y)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;res_mr_m2y
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;多变量孟德尔随机化&lt;/h2&gt;
&lt;h3&gt;去除合并X和M的连锁不平衡&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;合并&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;xm_pick &amp;lt;- bind_rows(x_pick, m.exp_pick)
xm_pick &amp;lt;- subset(xm_pick, SNP %in% unique(xm_pick$SNP))
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;去除连锁不平衡&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;xm_pick_clumped &amp;lt;- ldClump(xm_pick)
xm_pick_clumped
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;将去除连锁不平衡的筛选结果初步保存&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;y4xm_pick &amp;lt;- semi_join(y_fmt, xm_pick_clumped, by = c(&quot;SNP&quot; = &quot;rsid&quot;)) %&amp;gt;% 
    distinct(SNP, .keep_all = T)
x4xm_pick &amp;lt;- semi_join(x_fmt, xm_pick_clumped, by = c(&quot;SNP&quot; = &quot;rsid&quot;)) %&amp;gt;% 
    distinct(SNP, .keep_all = T) 
m.exp4xm_pick &amp;lt;- semi_join(m.exp_fmt, xm_pick_clumped, by = c(&quot;SNP&quot; = &quot;rsid&quot;)) %&amp;gt;% 
    distinct(SNP, .keep_all = T)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;为了确保选择的SNP一样，取一个交集重新筛选一遍&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;common_snp &amp;lt;- y4xm_pick %&amp;gt;%
    inner_join(x4xm_pick, by = &apos;SNP&apos;) %&amp;gt;%
    inner_join(m.exp4xm_pick, by = &apos;SNP&apos;) %&amp;gt;%
    select(SNP)

y4xm_pick &amp;lt;- semi_join(y_fmt, common_snp, by = &apos;SNP&apos;) %&amp;gt;% 
    distinct(SNP, .keep_all = T)
x4xm_pick &amp;lt;- semi_join(x_fmt, common_snp, by = &apos;SNP&apos;) %&amp;gt;% 
    distinct(SNP, .keep_all = T) 
m.exp4xm_pick &amp;lt;- semi_join(m.exp4xm_pick, common_snp, by = &apos;SNP&apos;) %&amp;gt;% 
    distinct(SNP, .keep_all = T)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;协同数据&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;harmo_x4xm &amp;lt;- harmonise_data(x4xm_pick, y4xm_pick)
harmo_m.exp4xm &amp;lt;- harmonise_data(m.exp4xm_pick, y4xm_pick)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;转换成MendelianRandomization包的输入格式&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;转换输入的数据&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;xm2y_input &amp;lt;- mr_mvinput(
    bx = cbind(harmo_x4xm$beta.exposure, harmo_m.exp4xm$beta.exposure),
    bxse = cbind(harmo_x4xm$se.exposure, harmo_m.exp4xm$se.exposure),
    by = y4xm_pick$beta.outcome,
    byse = y4xm_pick$se.outcome
)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;确保数据长度一致，不然后续分析会报错&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;glimpse(xm2y_input)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Multivariable MR-Egger method&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;res_xm2y_egger &amp;lt;- mr_mvegger(xm2y_input)
res_xm2y_egger
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Multivariable inverse-variance weighted method&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;res_xm2y_ivwme &amp;lt;- mr_mvivwme(xm2y_input)
res_xm2y_ivwme
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Multivariable median-based method&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;res_xm2y_median &amp;lt;- mr_mvmedian(xm2y_input)
res_xm2y_median
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Multivariable inverse-variance weighted method with measurement error&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;res_xm2y_median &amp;lt;- mr_mvmedian(xm2y_input)
res_xm2y_median
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Mediation Mendelian Randomization&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;简单回顾上系数计算及检验的方法&lt;/li&gt;
&lt;li&gt;多变量法&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;计算&lt;strong&gt;暴露与结局&lt;/strong&gt;双样本孟德尔随机化，得到总效应$\beta_{XY}$&lt;/li&gt;
&lt;li&gt;计算&lt;strong&gt;暴露与中介&lt;/strong&gt;双样本孟德尔随机化，得到总效应$\beta_{XM}$&lt;/li&gt;
&lt;li&gt;计算&lt;strong&gt;暴露+中介与结局&lt;/strong&gt;双样本孟德尔随机化，得到调整后的$\beta_{XY}&apos;$和$\beta_{MY}$&lt;/li&gt;
&lt;li&gt;计算&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;中介效应：$a = \beta_{XM} \beta_{MY}$&lt;/li&gt;
&lt;li&gt;中介占比：$b = \frac{a}{\beta_{XY}}$&lt;/li&gt;
&lt;li&gt;分步法&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;分别进行3次孟德尔随机化&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;计算&lt;strong&gt;暴露与结局&lt;/strong&gt;双样本孟德尔随机化，得到总效应$\beta_{XY}$&lt;/li&gt;
&lt;li&gt;计算&lt;strong&gt;暴露与中介&lt;/strong&gt;双样本孟德尔随机化，得到总效应$\beta_{XM}$&lt;/li&gt;
&lt;li&gt;计算&lt;strong&gt;中介与结局&lt;/strong&gt;双样本孟德尔随机化，得到总效应$\beta_{MY}$&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;计算&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;中介效应：$a = \beta_{XM} \beta_{MY}$&lt;/li&gt;
&lt;li&gt;直接效应：$\beta_{XY}&apos; = \beta_{XY} - \beta_{XM} \beta_{MY}$&lt;/li&gt;
&lt;li&gt;中介占比：$b = \frac{a}{\beta_{XY}}$&lt;/li&gt;
&lt;li&gt;系数检验
&lt;ul&gt;
&lt;li&gt;检验 $a = \beta_{XM} \beta_{MY}$ 是否具有显著性
&lt;ul&gt;
&lt;li&gt;通过查看 $a$ 的95%置信区间是否跨0确定&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;计算标准误差：$S_{M}= \sqrt{\beta_{SM}^{2} S_{XM}^{2}+\beta_{MY}^{2} S_{MY}^{2}}$&lt;/li&gt;
&lt;li&gt;用$S_M$计算95%置信区间&lt;/li&gt;
&lt;li&gt;计算统计量Z：$Z = \frac{a}{S_{M}}$&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;多变量法&lt;/h3&gt;
&lt;h4&gt;Beta&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;(betaXY_mvm &amp;lt;- res_mr_x2y[3,7])
(betaXM_mvm &amp;lt;- res_mr_x2m[3,7])
# 唯一的区别就在这里：是否用多变量调整过的中介-结局
(betaMY_mvm &amp;lt;- res_xm2y_ivwme@Estimate[2]) 
(a_mvm &amp;lt;- betaXM_mvm * betaMY_mvm)
(b_mvm &amp;lt;- a_mvm / betaXY_mvm)
(direct_mvm &amp;lt;- 1 - b_mvm)
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;SE&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;(seXM_mvm = res_mr_x2m[3,8])
(seMY_mvm = res_xm2y_ivwme@StdError[2])
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;P value&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;(S_mvm = sqrt(betaXM_mvm^2*seXM_mvm^2+betaMY_mvm^2*seMY_mvm^2))
(Z_mvm = a_mvm / S_mvm)
(P_mvm = 2 * pnorm(q = abs(Z_mvm), lower.tail = F))
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;CI&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;(a_mvm_lower &amp;lt;- a_mvm - S_mvm)
(a_mvm_upper = a_mvm + S_mvm)
(b_mvm_lower = a_mvm_lower/betaXY_mvm) 
(b_mvm_upper = a_mvm_upper/betaXY_mvm) 
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;分步法&lt;/h3&gt;
&lt;h4&gt;Beta&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;(betaXY_2step &amp;lt;- res_mr_x2y[3,7])
(betaXM_2step &amp;lt;- res_mr_x2m[3,7])
# 唯一的区别就在这里：是否用多变量调整过的中介-结局
(betaMY_2step &amp;lt;- res_mr_m2y[3,7])
(a_2step &amp;lt;- betaXM_2step * betaMY_2step)
(b_2step &amp;lt;- a_2step / betaXY_2step)
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;SE&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;(seXM_2step = res_mr_x2m[3,8])
(seMY_2step = res_mr_m2y[3,8])
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;P value&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;(S_2step = sqrt(betaXM_2step^2*seXM_2step^2+betaMY_2step^2*seMY_2step^2))
(Z_2step = a_2step / S_2step)
(P_2step = 2 * pnorm(q = abs(Z_2step), lower.tail = F))
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;CI&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;(a_2step_lower &amp;lt;- a_2step - S_2step)
(a_2step_upper = a_2step + S_2step)
(b_2step_lower = a_2step_lower/betaXY_2step) 
(b_2step_upper = a_2step_upper/betaXY_2step) 
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>Jupyter中使用R</title><link>https://nab-iak.github.io/posts/p6/p6/</link><guid isPermaLink="true">https://nab-iak.github.io/posts/p6/p6/</guid><description>简单水一文</description><pubDate>Fri, 02 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Cover Pic by &lt;a href=&quot;https://www.pixiv.net/artworks/128931897&quot;&gt;@リョンsan&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h2&gt;简介&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Rstudio固然不错，但不可能只用R吧&lt;/li&gt;
&lt;li&gt;虽然Rstudio也支持Python了，但正经人谁会用Rstudio写Python呢&lt;/li&gt;
&lt;li&gt;习惯以后还是随手点开VScode然后新建.ipynb切R内核写代码爽哈，一点都不比RMarkdown差&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;安装&lt;/h2&gt;
&lt;h3&gt;Jupyter&lt;/h3&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;安装Jupyter参考：&lt;a href=&quot;https://jupyter.org/install&quot;&gt;Installing Jupyter&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;JupyterLab（Web版IDE）&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 安装
pip install jupyterlab
# 打开
jupyter lab
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Jupyter Notebook（纯Notebook）&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 安装
pip install notebook
# 打开
jupyter notebook
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;R kernel&lt;/h3&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;安装R内核参考：&lt;a href=&quot;https://github.com/IRkernel/IRkernel&quot;&gt;IRkernel/IRkernel&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;打开R终端，输入以下代码即可&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;install.packages(&apos;IRkernel&apos;)
IRkernel::installspec()  
jupyter labextension install @techrah/text-shortcuts  
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;快捷键&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;个人设置的快捷键&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;[
    {
        &quot;key&quot;: &quot;ctrl+cmd+[Minus]&quot;,
        &quot;command&quot;: &quot;editor.action.insertSnippet&quot;,
        &quot;when&quot;: &quot;editorTextFocus &amp;amp;&amp;amp; editorLangId == &apos;r&apos;|&apos;Rmd&apos;|&apos;ipynb&apos;&quot;,
        &quot;args&quot;: {
            &quot;snippet&quot;: &quot; &amp;lt;- &quot;
        }
    },
    {
        &quot;key&quot;: &quot;ctrl+cmd+[Equal]&quot;,
        &quot;command&quot;: &quot;editor.action.insertSnippet&quot;,
        &quot;when&quot;: &quot;editorTextFocus &amp;amp;&amp;amp; editorLangId == &apos;r&apos;|&apos;Rmd&apos;|&apos;ipynb&apos;&quot;,
        &quot;args&quot;: {
            &quot;snippet&quot;: &quot; %&amp;gt;% &quot;
        }
    },
    {
        &quot;key&quot;: &quot;ctrl+cmd+[IntlYen]&quot;,
        &quot;command&quot;: &quot;editor.action.insertSnippet&quot;,
        &quot;when&quot;: &quot;editorTextFocus &amp;amp;&amp;amp; editorLangId == &apos;r&apos;|&apos;Rmd&apos;|&apos;ipynb&apos;&quot;,
        &quot;args&quot;: {
            &quot;snippet&quot;: &quot; |&amp;gt; &quot;
        }
    },
    {
        &quot;key&quot;: &quot;ctrl+cmd+5&quot;,
        &quot;command&quot;: &quot;type&quot;,
        &quot;args&quot;: {
            &quot;text&quot;: &quot; %in% &quot;
        }
]
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>通路分析</title><link>https://nab-iak.github.io/posts/p5/p5/</link><guid isPermaLink="true">https://nab-iak.github.io/posts/p5/p5/</guid><description>GO,KEGG,GSEA,GSVA的通路分析与作图</description><pubDate>Thu, 01 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Cover Pic by &lt;a href=&quot;https://www.pixiv.net/artworks/129415764&quot;&gt;@超凶の狄璐卡&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;lt;center&amp;gt;&amp;lt;h1&amp;gt;-占坑，不咕-&amp;lt;/h1&amp;gt;&amp;lt;/center&amp;gt;&lt;/p&gt;
</content:encoded></item><item><title>用DESeq2进行差异性分析</title><link>https://nab-iak.github.io/posts/p4/p4/</link><guid isPermaLink="true">https://nab-iak.github.io/posts/p4/p4/</guid><description>DESeq2的简明教程</description><pubDate>Mon, 28 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Cover Pic by &lt;a href=&quot;https://www.pixiv.net/artworks/129087864&quot;&gt;@saturn_illus&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h2&gt;教程&lt;/h2&gt;
&lt;h3&gt;官方教程&lt;/h3&gt;
&lt;h4&gt;Analyzing RNA-seq data with DESeq2&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;介绍了一般的分析方法&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;https://bioconductor.org/packages/devel/bioc/vignettes/DESeq2/inst/doc/DESeq2.html#interactions
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;RNA-seq workflow: gene-level exploratory analysis and differential expression&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;介绍了更加丰富的用法，用于第一个教程的补充&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# install the package
if (!requireNamespace(&quot;BiocManager&quot;, quietly = TRUE))
    install.packages(&quot;BiocManager&quot;)
BiocManager::install(&quot;rnaseqGene&quot;)

# view the vignettes
browseVignettes(&quot;rnaseqGene&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;其他参考&lt;/h3&gt;
&lt;h4&gt;108-如何利用DESeq2分析转录组数据？&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;https://www.jieandze1314.com/post/cnposts/108/
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;RNA-seq分析（微信公众号文章）&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzkwMzQwNjYyNg==&amp;amp;action=getalbum&amp;amp;album_id=2673613335581474816#wechat_redirect
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Jwindler/Ice_story（Github仓库）&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;https://github.com/Jwindler/Ice_story?tab=readme-ov-file
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;使用DESeq2分析RNA-seq数据&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;http://xuchunhui.top/2020/03/28/%E4%BD%BF%E7%94%A8DEseq2%E5%88%86%E6%9E%90RNA-seq%E6%95%B0%E6%8D%AE/
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;并行运算&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;初始设置&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;library(&quot;BiocParallel&quot;) # 载入R包
register(MulticoreParam(4)) # 设置并行内核为4
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;后续的分析中，如果有&lt;code&gt;parallel&lt;/code&gt;参数都可以设置&lt;code&gt;TRUE&lt;/code&gt;来使用&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;DESeq(..., parallel = TRUE)
lfcShrink(..., parallel = TRUE)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;数据导入&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;DESeq2必须输入计数矩阵（counts matrix）&lt;/li&gt;
&lt;li&gt;对于计数矩阵，一般用&lt;code&gt;DESeqDataSetFromMatrix()&lt;/code&gt;即可&lt;/li&gt;
&lt;li&gt;用下列函数能创造一个&lt;code&gt;DEseqDataSet&lt;/code&gt;对象（一般略称为&lt;strong&gt;dds&lt;/strong&gt;），需要声明：&lt;/li&gt;
&lt;li&gt;colData：包含样本信息的meta data&lt;/li&gt;
&lt;li&gt;desgin：实验设计，用formula类型表示&lt;code&gt;~ Condition&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;dds &amp;lt;- DESeqDataSetFromMatrix(
         countData = countsMatrix,
         colData = metaData,
         design = ~ Condition
         )
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;function&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;package&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;framework&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;output&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;DESeq2 input function&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;tximport&lt;/td&gt;
&lt;td&gt;tximport&lt;/td&gt;
&lt;td&gt;R/Bioconductor&lt;/td&gt;
&lt;td&gt;list of matrices&lt;/td&gt;
&lt;td&gt;DESeqDataSetFromTximport&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;tximeta&lt;/td&gt;
&lt;td&gt;tximeta&lt;/td&gt;
&lt;td&gt;R/Bioconductor&lt;/td&gt;
&lt;td&gt;SummarizedExperiment&lt;/td&gt;
&lt;td&gt;DESeqDataSet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;htseq-count&lt;/td&gt;
&lt;td&gt;HTSeq&lt;/td&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;files&lt;/td&gt;
&lt;td&gt;DESeqDataSetFromHTSeq&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;featureCounts&lt;/td&gt;
&lt;td&gt;Rsubread&lt;/td&gt;
&lt;td&gt;R/Bioconductor&lt;/td&gt;
&lt;td&gt;matrix&lt;/td&gt;
&lt;td&gt;DESeqDataSetFromMatrix&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;summarizeOverlaps&lt;/td&gt;
&lt;td&gt;GenomicAlignments&lt;/td&gt;
&lt;td&gt;R/Bioconductor&lt;/td&gt;
&lt;td&gt;SummarizedExperiment&lt;/td&gt;
&lt;td&gt;DESeqDataSet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;查看&lt;code&gt;DEseqDataSet&lt;/code&gt;对象内容
&lt;ul&gt;
&lt;li&gt;计数：&lt;code&gt;assay(dds)&lt;/code&gt;，&lt;code&gt;counts(dds)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;基因信息：&lt;code&gt;rowRanges(dds)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;样本信息，即meta data：&lt;code&gt;colData(dds)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;$查看：meta data中包含的分组&lt;/li&gt;
&lt;li&gt;@查看：
&lt;ul&gt;
&lt;li&gt;design&lt;/li&gt;
&lt;li&gt;dispersionFunction&lt;/li&gt;
&lt;li&gt;rowRanges&lt;/li&gt;
&lt;li&gt;colData&lt;/li&gt;
&lt;li&gt;assays&lt;/li&gt;
&lt;li&gt;NAMES&lt;/li&gt;
&lt;li&gt;elementMetadata&lt;/li&gt;
&lt;li&gt;metadata&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;基因预过滤&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;为了提高运算性能，可以删除表达量约等于0的基因&lt;/li&gt;
&lt;li&gt;如果配置不太吃力，一般可以&lt;strong&gt;不用预过滤，避免产生偏差&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;smallestGroupSize &amp;lt;- 3
# 设定满足筛选要求的样本最小数量
keep &amp;lt;-rowSums(dds %&amp;gt;% counts() &amp;gt;= 10) &amp;gt;= smallestGroupSize
# dds %&amp;gt;% counts() &amp;gt;= 10：计算每个样本的每个基因表达量是否大于等于10，结果返回为布尔值
# rowSums(.)：按基因（行）统计结果为TRUE的样本数量
# rowSums(.) &amp;gt;= smallestGroupSize：满足筛选要求的样本最小数量（10）的基因被保留
dds_filtered &amp;lt;- dds[keep, ]
# 基本筛选语法
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;比较级别&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;对meta data的列进行因子化&lt;/li&gt;
&lt;li&gt;&lt;code&gt;levels&lt;/code&gt;的第一个级别为对照组&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 对dds对象进行因子化
dds$condition &amp;lt;- factor(dds$condition, levels = c(&quot;untreated&quot;,&quot;treated&quot;))
# 在创建dds对象前对meta data因子化
metaData$condition &amp;lt;- factor(metaData$condition, levels = c(&quot;untreated&quot;,&quot;treated&quot;))
dds &amp;lt;- DESeqDataSetFromMatrix(countData = countsMatrix,
         colData = metaData,
         design = ~ Condition)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;只指定参考级别&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;dds$condition &amp;lt;- relevel(dds$condition, ref = &quot;untreated&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;删除子集中没有样本的级别&lt;/li&gt;
&lt;li&gt;例如有三种Condition A，B，C&lt;br /&gt;
只选择子集A和B进行分析，数据中不包含C，但因子级别中包含，&lt;br /&gt;
用&lt;code&gt;droplevels()&lt;/code&gt;去除空白的因子级别&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;dds$condition &amp;lt;- droplevels(dds$condition)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;基因注释&lt;/h2&gt;
&lt;p&gt;本节参考：&lt;a href=&quot;https://zenn.dev/rchiji/articles/99bf231c92aad9#%E3%80%90-biomart%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8-%E3%80%91&quot;&gt;【R】 遺伝子ID/遺伝子名の変換方法&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;biomaRt&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;需要用到R包&lt;code&gt;biomaRt&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 安装
if (!require(&quot;BiocManager&quot;, quietly = TRUE))
    install.packages(&quot;BiocManager&quot;)
BiocManager::install(&quot;biomaRt&quot;)

# 加载

library(biomaRt)

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;罗列可以选择的Marts&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;listMarts()
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;选择要用的Marts&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;db &amp;lt;- useMart(biomart = &quot;ENSEMBL_MART_ENSEMBL&quot;) 
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;以小鼠为例，在&lt;code&gt;ENSEMBL_MART_ENSEMBL&lt;/code&gt;的&lt;code&gt;description&lt;/code&gt;中查看包含小鼠&lt;code&gt;&quot;Mouse&quot;&lt;/code&gt;的行&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;listDatasets(db) %&amp;gt;% filter(grepl(&quot;Mouse&quot;,description))
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;把注释信息提取出来&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;Mm &amp;lt;- useDataset(&quot;mmusculus_gene_ensembl&quot;, mart = db)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;查看&lt;code&gt;mmusculus_gene_ensembl&lt;/code&gt;包含的所有小鼠基因信息&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;listAttributes(Mm)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;创建一个所有基因名字的列表&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 提取需要的注释信息
gene_annotation &amp;lt;- getBM(
# 这里的attributes就是listAttributes(Mm)中选的
    attributes = c(&quot;ensembl_gene_id&quot;,
                   # &quot;ensembl_transcript_id&quot;,
                   &quot;hgnc_symbol&quot;, 
                   &quot;external_gene_name&quot;,
                   &quot;entrezgene_id&quot;, 
                   &quot;description&quot;), 
 mart = Mm
    )
gene_annotation &amp;lt;- gene_annotation %&amp;gt;%
# 创建一个GENE的列：
# 如果有external_gene_name就用external_gene_name
# 如果没有就保留ensembl_gene_id
    mutate(GENE = ifelse(external_gene_name == &quot;&quot;,
          ensembl_gene_id, 
          external_gene_name)) %&amp;gt;%
# 一个ensembl_gene_id可能有多个entrezgene_id，我们只选择第一个即可
# 在KEGG通路分析中只能用entrezgene_id，所以事先提取出来更方便
# 事实上，mapIds()抓取genome wide annotation包的时候对于一对多也可以设置multiVals=&quot;first&quot;来只提取第一个对应的
 group_by(ensembl_gene_id) %&amp;gt;%
    slice(1) %&amp;gt;%
    ungroup() %&amp;gt;%
    mutate(GENE = ifelse(external_gene_name == &quot;&quot;, 
     ensembl_gene_id, external_gene_name)) 
# 由于存在相同基因名称的基因，并且变成rownames的时候是不可以有重复的
# 给重复的基因名后面加个小尾巴 .1 .2 这种
 group_by(GENE) %&amp;gt;%
    mutate(
        count = n(),
        GENE = if_else(count == 1, GENE, paste0(GENE, &quot;.&quot;, row_number()))
    ) %&amp;gt;%
    ungroup() %&amp;gt;%
    select(-count)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;添加基因名称的时候只用&lt;code&gt;left_join()&lt;/code&gt;就行了&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;resultDataFrame %&amp;gt;% 
 left_join(genes_annotation, by = &quot;gene&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Genome wide annotation包&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;这个比较简单，很容易上手&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;这个包是一个系列，都是org.XX.eg.db这种类型的&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;但是没有预测基因，会出现很多NA的基因名&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;ensembldb::select&lt;/code&gt;（dplyr的select更常用，建议library的时候把dplyr往下方放）&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;gene_annotation &amp;lt;- ensembldb::select(x = org.Mm.eg.db, # 注释基因包
   # 这里keys(org.Mm.eg.db,&quot;ENSEMBL&quot;)提取了包里的全部基因的ENSEMBL
            keys = keys(org.Mm.eg.db,&quot;ENSEMBL&quot;), # 需要注释的基因
            keytype = &quot;ENSEMBL&quot;, # 匹配ENSEMBL ID
            # 抽取匹配到基因的&quot;SYMBOL&quot;,&quot;ALIAS&quot;,&quot;GENENAME&quot;,&quot;GENETYPE&quot;
            columns = c(&quot;SYMBOL&quot;,&quot;ALIAS&quot;,&quot;GENENAME&quot;,&quot;GENETYPE&quot;))

resultDataFrame %&amp;gt;% 
 left_join(genes_annotation, 
     by = c(&quot;ENSEMBL&quot;,&quot;SYMBOL&quot;,&quot;ALIAS&quot;,&quot;GENENAME&quot;,&quot;GENETYPE&quot;))
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ensembldb::mapIds&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;gene_annotation &amp;lt;- mapIds(x = org.Mm.eg.db,
    keys = keys(org.Mm.eg.db,&quot;ENSEMBL&quot;),
    keytype = &quot;ENSEMBL&quot;,
    column = &quot;ENTREZID&quot;, # mapIds只能提取一列，注意column不是复数
    multiVals = &quot;first&quot;)

resultDataFrame %&amp;gt;% 
 left_join(genes_annotation, 
     by = c(&quot;ENSEMBL&quot;,&quot;SYMBOL&quot;,&quot;ALIAS&quot;,&quot;GENENAME&quot;,&quot;GENETYPE&quot;))
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;差异性表达分析&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;DESeq()&lt;/code&gt;，可以执行Wald检验和LRT检验，作用对象为&lt;strong&gt;dds&lt;/strong&gt;对象&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Wald检验&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;默认的选项，约等于双样本t检验&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 下面两个一样
dds &amp;lt;- DESeq(dds)
dds &amp;lt;- DESeq(dds, test = &quot;Wald&quot;)

# 可以加入并行运算

dds &amp;lt;- DESeq(dds, parallel = TRUE)

&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;似然比检验（LRT检验）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;比较多样本的选项，约等于ANOVA&lt;/li&gt;
&lt;li&gt;&lt;code&gt;reduced&lt;/code&gt;选项表示从原有的实验设计（完整模型）&lt;strong&gt;剔除&lt;/strong&gt;需要比较的项&lt;strong&gt;后&lt;/strong&gt;的模型（简化模型）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;results()&lt;/code&gt;返回的结果中，&lt;code&gt;log2FoldChange&lt;/code&gt;和&lt;code&gt;lfcSE&lt;/code&gt;是&lt;strong&gt;没有任何实际意义&lt;/strong&gt;的内容&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;对于使用似然比检验的分析，p 值仅由完整模型公式和简化模型公式之间的偏差差异决定&lt;br /&gt;
单个 log2 倍变化打印在结果表中以与其他结果表输出保持一致，但与实际测试无关&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;简单的实验设计：&lt;code&gt;~ Condition&lt;/code&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;检验&lt;code&gt;Condition&lt;/code&gt;里不同水平是否存在差异&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 因为检验Condition，所以从实验设计的formula中剔除Condition
# 什么都没有的情况下填写~1
dds &amp;lt;- DESeq(dds, test = &quot;LRT&quot;, reduced = ~1)
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;复杂点的实验设计：&lt;code&gt;~ ConditionA + ConditionB&lt;/code&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;检验&lt;code&gt;ConditionB&lt;/code&gt;里不同水平是否存在差异&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 同理，检验ConditionB则剔除ConditionB，保留~ ConditionA
dds &amp;lt;- DESeq(dds, test = &quot;LRT&quot;, reduced = ~ ConditionA)
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;交互作用：&lt;code&gt;~ ConditionA + ConditionB + ConditionA:ConditionB&lt;/code&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;检验&lt;code&gt;ConditionB&lt;/code&gt;里不同水平是否存在差异&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 无论多么复杂的实验设计，检验什么就剔除什么
# 这里检验ConditionB，所以保留~ ConditionA + ConditionA:ConditionB
dds &amp;lt;- DESeq(dds, test = &quot;LRT&quot;,
    reduced = ~ ConditionA + ConditionA:ConditionB)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;查看结果&lt;/h3&gt;
&lt;h4&gt;查看比较元素&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;主要用于&lt;code&gt;results()&lt;/code&gt;中用&lt;code&gt;name&lt;/code&gt;或&lt;code&gt;contrast&lt;/code&gt;指定比较对象&lt;/li&gt;
&lt;li&gt;也可以用于&lt;code&gt;lfcShrink()&lt;/code&gt;的&lt;code&gt;coef&lt;/code&gt;和&lt;code&gt;contrast&lt;/code&gt;指定对象&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;resultsNames(dds)
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;选择比较的对象&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;对于简单的比较，&lt;code&gt;name&lt;/code&gt;和&lt;code&gt;contrast&lt;/code&gt;都可以&lt;/li&gt;
&lt;li&gt;&lt;code&gt;name&lt;/code&gt;的值不是随便起的，在用&lt;code&gt;resultsNames()&lt;/code&gt;确认后使用&lt;/li&gt;
&lt;li&gt;以下3个用法是等价的&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;res &amp;lt;- results(dds, name=&quot;condition_treated_vs_untreated&quot;)
res &amp;lt;- results(dds, contrast=c(&quot;condition&quot;,&quot;treated&quot;,&quot;untreated&quot;))
res &amp;lt;- results(dds, contrast=list(c(&quot;condition_treated_vs_untreated&quot;)))
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;对于复杂的比较，只能用&lt;code&gt;contrast&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;c(&quot;condition&quot;,&quot;treated&quot;,&quot;untreated&quot;)&lt;/code&gt;&lt;br /&gt;
是选择某一条件中两者进行对比，顺序为：
&lt;ul&gt;
&lt;li&gt;条件&lt;/li&gt;
&lt;li&gt;比对项目&lt;/li&gt;
&lt;li&gt;被比对（参考）项目&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;仅能包含一个向量，向量包含3个元素&lt;/li&gt;
&lt;li&gt;&lt;code&gt;list(c(&quot;..1..&quot;), c(&quot;..2..&quot;))&lt;/code&gt;&lt;br /&gt;
用于更加复杂的对比，&lt;code&gt;list()&lt;/code&gt;中包含2个向量，&lt;br /&gt;
如果只声明1个，那么另一个就是截距&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;整理，筛选，打印结果&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;可以直接在&lt;code&gt;results&lt;/code&gt;对象上操作&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 官方文档的方法
resOrdered &amp;lt;- res[order(res$pvalue),]
summary(res)
sum(res$padj &amp;lt; 0.1, na.rm=TRUE)
res05 &amp;lt;- results(dds, alpha=0.05)
summary(res05)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;个人喜欢转换成熟悉的&lt;code&gt;data.frame&lt;/code&gt;类型更方便&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;res_df &amp;lt;- res %&amp;gt;% as.data.frame()
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;不建议直接使用&lt;code&gt;results()&lt;/code&gt;去获取结果，&lt;br /&gt;
可以首先通过LFC收缩&lt;code&gt;lfcShrink()&lt;/code&gt;调整LFC后再获取结果
&lt;ul&gt;
&lt;li&gt;这个时候不用&lt;code&gt;results()&lt;/code&gt;了，直接将LFC收缩完的对象变换成&lt;code&gt;data.frame&lt;/code&gt;即可&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;p值调整&lt;/h4&gt;
&lt;h5&gt;传统调整方法&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;在&lt;code&gt;results()&lt;/code&gt;中可以设置p值调整的方法，默认为&lt;code&gt;&quot;BH&quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;使用&lt;code&gt;?p.adjust&lt;/code&gt;可以获取所有的调整方法：
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&quot;holm&quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&quot;hochberg&quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&quot;hommel&quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&quot;bonferroni&quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&quot;BH&quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&quot;BY&quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&quot;fdr&quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&quot;none&quot;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# BH
results(dds)
results(dds, pAdjustMethod = &quot;BH&quot;)
# Bonferroni
results(dds, pAdjustMethod = &quot;bonferroni&quot;)
# 其他类似
&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;独立假设加权&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;一种给每个检验的结果分配权重增加统计效果的方法&lt;/li&gt;
&lt;li&gt;增加更多的原假设拒绝以更好筛选那些显出差异明显的基因&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 使用R包IHW
library(&quot;IHW&quot;)
# 设置filterFun为ihw
resIHW &amp;lt;- results(dds, filterFun=ihw)
#
summary(resIHW)
sum(resIHW$padj &amp;lt; 0.1, na.rm=TRUE)
metadata(resIHW)$ihwResult
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;LFC收缩&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;目的是为了解决低计数基因或者高离散度的数据在计算LFC时引起的误差&lt;/li&gt;
&lt;li&gt;官方文档对于3种LFC估计器的介绍&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;方法:&lt;/th&gt;
&lt;th&gt;&lt;code&gt;apeglm&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;&lt;code&gt;ashr&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;&lt;code&gt;normal&lt;/code&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;适合LFC排名&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;保存大LFC的尺寸&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;可以计算s值&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;允许使用&lt;code&gt;coef&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;允许使用&lt;code&gt;lfcThreshold&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;允许使用&lt;code&gt;contrast&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;可以收缩交互术语&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;基本用法&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;lfcShrink(dds, coef = Comparison, type = LFCShrinkAlgorithm)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;对于简单的实验设计，&lt;code&gt;apeglm&lt;/code&gt;是最推荐的方法
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;coef&lt;/code&gt;等同于&lt;code&gt;results()&lt;/code&gt;中的&lt;code&gt;name&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;lfcShrink(dds, coef = &quot;Condition_B_vs_A&quot;, type = LFCShrinkAlgorithm)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;对于复杂的实验设计，由于需要指定&lt;code&gt;contrast&lt;/code&gt;，所以只有&lt;code&gt;ashr&lt;/code&gt;才行&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;lfcShrink(
 dds, 
 contrast = list(c(&quot;..1..&quot;),c(&quot;..2..&quot;)), 
 type = LFCShrinkAlgorithm
 )
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;打印的结果的s值：检验收缩后的LFC是否与制定的阈值&lt;code&gt;lfcThreshold&lt;/code&gt;相等
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;lfcThreshold&lt;/code&gt;默认为0&lt;/li&gt;
&lt;li&gt;可以通过设置不同的&lt;code&gt;lfcThreshold&lt;/code&gt;来检查s值的变化&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;lfcShrink(
 dds, 
 coef = Comparison, 
 type = LFCShrinkAlgorithm, 
 lfcThreshold = 1
 )
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;目前不支持IHW与LFC收缩的混用&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;数据可视化&lt;/h2&gt;
&lt;h3&gt;数据转换&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;数据转换&lt;strong&gt;不用于&lt;/strong&gt;差异性表达分析，而是用于各种可视化
&lt;ul&gt;
&lt;li&gt;之后需要用到数据转换的数据用&lt;code&gt;rld&lt;/code&gt;表示&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;对数化&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;ntd &amp;lt;- normTransform(dds)
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;vsd，适合&amp;gt;=30的大数据&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;vsd &amp;lt;- vst(dds, blind = FALSE)
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;rlog，适合&amp;lt;30样本的小数据&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;rld &amp;lt;- rlog(dds, blind = FALSE)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;检查每个样本的计数&lt;/h3&gt;
&lt;h4&gt;分开检查每个样本的计数分布&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;dt[,1:ncol(dt)] %&amp;gt;%
    map2(.x=., .y=names(.),
        ~dt_GE %&amp;gt;%
        ggplot(aes(x=.x)) +  
        geom_histogram(stat=&apos;bin&apos;, bins=20) +
        geom_freqpoly(binwidth = 1000) +
        labs(x=&apos;Raw expression count&apos;,
            y=&apos;Number of genes&apos;,
            title=.y) +
        theme_bw()
    )
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;检查所有样本计数总数&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;colSum_df &amp;lt;- colSums(dt) %&amp;gt;%
 as.data.frame() %&amp;gt;%
 rownames_to_column()
colnames(colSum_df) &amp;lt;- c(&apos;Sample&apos;, &apos;Counts&apos;)
colSum_df %&amp;gt;%
  ggplot(aes(x = Sample, y = Counts / 1e6, fill = Sample)) +
         geom_bar(stat = &quot;identity&quot;) + theme_bw() +
         labs(x = &quot;Sample&quot;, y = &quot;Total count in millions&quot;) +
         theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1))
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;样本关联性热图&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;rld_mat &amp;lt;- assay(rld)
rld_cor &amp;lt;- cor(rld_mat)
pheatmap(
 rld_cor_GE,
 annotation = dplyr::select(meta_dt, c(&apos;ConditionA&apos;, &apos;ConditionB&apos;))
 )
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;PCA plot&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;rld_PCA &amp;lt;- plotPCA(
 rld,
 intgroup = c(&quot;ConditionA&quot;, &quot;ConditionB&quot;),
 returnData = TRUE
 )

rld_PCA_pv &amp;lt;- round(100 * attr(rld_PCA, &quot;percentVar&quot;))

rld_PCA %&amp;gt;%
 ggplot(aes(PC1,
      PC2,
      color=ConditionA,
      shape=ConditionB,
      linetype=Time)
     ) +
    geom_point(size = 3) +
    xlab(paste0(&quot;PC1: &quot;,rld_GE_PCA_pv[1],&quot;% variance&quot;)) +
    ylab(paste0(&quot;PC2: &quot;,rld_GE_PCA_pv[2],&quot;% variance&quot;)) +
    stat_ellipse() +
    theme_bw()

&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;变换-方差图&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;{vsn::meanSdPlot(assay(rld), ranks = FALSE)}$gg + theme_bw()
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;分散估计图&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;检查模型拟合的情况，对象为&lt;code&gt;DESeq()&lt;/code&gt;处理过的&lt;code&gt;dds&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;plotDispEsts(dds)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;MA图&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;res_lfcShrink&lt;/code&gt;是&lt;code&gt;lfcShrink(dds, ...)&lt;/code&gt;之后的结果&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;plotMA(res_lfcShrink, ylim=c(-2,2))
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;火山图&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;res_lfcShrink&lt;/code&gt;是&lt;code&gt;lfcShrink(dds, ...)&lt;/code&gt;之后的结果&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;res_lfcShrink_volc &amp;lt;- res_lfcShrink %&amp;gt;%
            as.data.frame() %&amp;gt;%
            rownames_to_column(var = &quot;gene&quot;) %&amp;gt;%
            left_join(all_genes, by = &quot;gene&quot;) %&amp;gt;%
            mutate(diffexpressed = case_when(
              {padj &amp;lt; 0.05} &amp;amp; {log2FoldChange &amp;gt; 1} ~ &quot;UP&quot;,
              {padj &amp;lt; 0.05} &amp;amp; {log2FoldChange &amp;lt; -1} ~ &quot;DOWN&quot;,
              TRUE ~ &quot;NO&quot;
              ))

res_lfcShrink_volc$diffexpressed &amp;lt;- factor(res_8h_vs_4h_volc$diffexpressed,levels = c(&quot;DOWN&quot;, &quot;NO&quot;, &quot;UP&quot;))

res_lfcShrink_volc %&amp;gt;%
ggplot(aes(log2FoldChange, -log10(padj), color = diffexpressed))+
  geom_hline(yintercept = -log10(0.05), linetype = &quot;dashed&quot;, color = &quot;black&quot;)+
  geom_vline(xintercept = c(-1,1), linetype = &quot;dashed&quot;, color = &quot;black&quot;)+
  geom_point(size = 0.8)+
  scale_color_manual(values = c(&quot;#989ad6&quot;, &quot;#e4e4e4&quot;, &quot;#e27e9a&quot;),
                     labels = c(&quot;DOWN&quot;, &quot;NO&quot;, &quot;UP&quot;))  +
  theme_bw(base_size = 12)+
  theme(legend.position = &apos;right&apos;,
        legend.justification = c(0,1))+

# 添加标签

  geom_text_repel(data = filter(res_lfcShrink_volc, padj &amp;lt; 0.05 &amp;amp; abs(log2FoldChange) &amp;gt; 1),
                  max.overlaps = getOption(&quot;ggrepel.max.overlaps&quot;, default = 20),
                  # 这里的filter很关键，筛选你想要标记的基因
                  aes(label = GENE), # 这里的GENE就是注释部分生成的基因名称
                  size = 3,
                  color = &apos;black&apos;) +
  xlab(&quot;Log2FC&quot;)+
  ylab(&quot;-Log10(FDR q-value)&quot;)

&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;基因表达热图&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;使用R包&lt;code&gt;ComplexHeatmap&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;这个包的功能很强大，本文仅限于简单出图&lt;/li&gt;
&lt;li&gt;具体说明见&lt;a href=&quot;https://pengpengyang94.github.io/2020/05/complexheatmap%E4%B8%AD%E6%96%87%E7%89%88%E8%AF%B4%E6%98%8E/&quot;&gt;ComplexHeatmap中文版说明&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 两种安装方式
install.packages(&quot;ComplexHeatmap&quot;)
devtools::install_github(&quot;jokergoo/ComplexHeatmap&quot;)

# 加载
library(ComplexHeatmap)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;首先提取归一化处理，并将行名换成基因名&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;counts_dds &amp;lt;- counts(dds, normalized = T) %&amp;gt;%
    as.data.frame() %&amp;gt;%
    rownames_to_column(&quot;gene&quot;) %&amp;gt;%
    left_join(gene_annotation, by = &quot;gene&quot;) %&amp;gt;%
    select(-gene) %&amp;gt;%
    column_to_rownames(&quot;name&quot;)
counts_dds &amp;lt;- t(scale(t(counts_dds))) # 需要对每行进行归一化，所以得转置2次
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;绘制热图
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;SigGenes&lt;/code&gt;为筛选出来的基因名&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;Heatmap(counts_dds[SigGenes,])
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>DESeq2中多因子设计</title><link>https://nab-iak.github.io/posts/p3/p3/</link><guid isPermaLink="true">https://nab-iak.github.io/posts/p3/p3/</guid><description>复杂实验设计时DESeq2中的实验设计写法及含义</description><pubDate>Sat, 19 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Cover Pic by &lt;a href=&quot;https://www.pixiv.net/artworks/129206493&quot;&gt;@Rvoid_0&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;内容来自&lt;a href=&quot;https://www.youtube.com/watch?v=X6p3E-QTcUc&quot;&gt;DnA lab short read sequencing workshop-Multifactor Designs in DESeq2&lt;/a&gt;以及个人的额外补充&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;交互作用&lt;/h2&gt;
&lt;h3&gt;2X2设计&lt;/h3&gt;
&lt;h4&gt;设计矩阵&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;这里的实验设计， &lt;code&gt;~ Genotype + Treatment + Genotype:Treatment&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;其中
&lt;ul&gt;
&lt;li&gt;Genotype：1，2&lt;/li&gt;
&lt;li&gt;Treatment：Control，Treatment&lt;/li&gt;
&lt;li&gt;原视频中首字母都是小写，为了看的更清晰我改成了首字母大写&lt;/li&gt;
&lt;li&gt;在读取meta data之后，要factor一下，并且按照对比的顺序设定levels&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;查看研究设计矩阵的代码&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;model.matrix(~ Genotype + Treatment + Genotype:Treatment, data = meta_dt)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./image_1.png&quot; alt=&quot;image_1&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;图形直观查看设计矩阵
&lt;ul&gt;
&lt;li&gt;输出的是图片，内容大致如下&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;vd &amp;lt;- ExploreModelMatrix::VisualizeDesign(sampleData = colData(dds), 
                      designFormula = ~ Genotype + Treatment + Genotype:Treatment)
vd$plot
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;table class=&quot;dataframe&quot;&amp;gt;
&amp;lt;caption&amp;gt;A tibble: 2 x 3&amp;lt;/caption&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;Genotype&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;Con&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;Treatment&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;dbl&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th scope=col&amp;gt;&amp;lt;chr&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;(Intercept) +
Time8h&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;(Intercept) +
TreatmentTreatment +
Genotype2.TreatmentTreatment&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;(Intercept)           &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;(Intercept) +
TreatmentTreatment                                  &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image_2.png&quot; alt=&quot;image_2&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;解释
&lt;ul&gt;
&lt;li&gt;Genotype 1 Control：对照&lt;/li&gt;
&lt;li&gt;Genotype 2 Treatment：Genotype 1接受处理；
&lt;ul&gt;
&lt;li&gt;与Genotype 1 Control的差值，为蓝色箭头
&lt;ul&gt;
&lt;li&gt;表示在经过处理后，与Genotype 1 Control的差值&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Genotype 2 Control：Genotype 2型的对照；
&lt;ul&gt;
&lt;li&gt;与Genotype 1 Control的差值，为红色箭头
&lt;ul&gt;
&lt;li&gt;表示在未经过任何处理，单纯由于genotype影响的情况&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Genotype 2 Treatment：Genotype 2型接受处理；
&lt;ul&gt;
&lt;li&gt;与Genotype 2 Control的差值，为深蓝色箭头
&lt;ul&gt;
&lt;li&gt;表示在经过处理后，与Genotype 2 Control的差值&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;如果不存在交互作用，那么它和Genotype 2 Control的差值理应相同，
即差值为蓝色箭头&lt;/li&gt;
&lt;li&gt;交互作用，即&lt;strong&gt;实际的差值和理论的差值的差&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;检验交互作用，就是&lt;strong&gt;实际的差值和理论的差值的差是否为0&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;即，&lt;strong&gt;深蓝色箭头（实际）-蓝色箭头（理论）是否为0&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;contrast参数中的项名&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;contrast&lt;/code&gt;中的项名不是自定义的，而是根据矩阵生成的&lt;/li&gt;
&lt;li&gt;通过&lt;code&gt;resultsNames()&lt;/code&gt;查看所有的项名&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;resultsNames(dds)
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;对交互作用的检验&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;直接对交互项检验即可
&lt;ul&gt;
&lt;li&gt;这里是和&lt;code&gt;~1&lt;/code&gt;比的&lt;/li&gt;
&lt;li&gt;&lt;code&gt;~1&lt;/code&gt;就是截距项，&lt;br /&gt;
就是和Genotype 1 Control进行差值对比，&lt;br /&gt;
检验上述交互项代表的实际与理论差值是否为0&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;results(dds, contrast = c(&quot;Genotype2.TreatmentTreatment&quot;))
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;对Genotype 2实际效果的验证&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;交互项 = 实际 - 理论，&lt;br /&gt;
那么简单的等式移项就可以得到，实际 = 交互 + 理论&lt;/li&gt;
&lt;li&gt;对Genotype 2实际效果，即为深蓝色箭头&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;results(dds, contrast = list(c(&quot;Treatment_Treatment_vs_Control&quot;,&quot;Genotype2.TreatmentTreatment&quot;)))
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;这里最终可以看到
&lt;ul&gt;
&lt;li&gt;第一行中的公式中出现了加号&lt;/li&gt;
&lt;li&gt;即最终的取值是list中的向量包含的两个项的和&lt;/li&gt;
&lt;li&gt;list中最多包含两个向量
&lt;ul&gt;
&lt;li&gt;第一个向量是比较项&lt;/li&gt;
&lt;li&gt;第二个向量是被比较项&lt;/li&gt;
&lt;li&gt;当没有输入第二个向量的时候，即为与&lt;code&gt;~1&lt;/code&gt;截距项比较&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./image_3.png&quot; alt=&quot;image_3&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Con，A，B，A+B设计&lt;/h3&gt;
&lt;h4&gt;设计矩阵&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;meta data格式&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./image_4.png&quot; alt=&quot;image_4&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;实验设计， &lt;code&gt;~ Treatment1 + Treatment2 + Treatment1:Treatment2&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;更复杂的实验设计&lt;/h2&gt;
&lt;h3&gt;2组X多时间节点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;2种细胞（Control，Mutant） 在4个时间点（0，6，12，24h）的基因表达&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./image_5.png&quot; alt=&quot;image_5&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;分析思路
&lt;ul&gt;
&lt;li&gt;时间点两两比较
&lt;ul&gt;
&lt;li&gt;6h vs 0h&lt;/li&gt;
&lt;li&gt;12h vs 0h&lt;/li&gt;
&lt;li&gt;24h vs 0h&lt;/li&gt;
&lt;li&gt;12h vs 6h&lt;/li&gt;
&lt;li&gt;24h vs 12h&lt;/li&gt;
&lt;li&gt;24h vs 12h&lt;/li&gt;
&lt;li&gt;问题
&lt;ul&gt;
&lt;li&gt;没有充分利用时间序列的信息，得到的结果不全面&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;充分利用时间序列的本质，跨越全部时间段进行多组比较
&lt;ul&gt;
&lt;li&gt;在本例中，2种&lt;strong&gt;对比设计&lt;/strong&gt;（用以区别实验设计）
&lt;ul&gt;
&lt;li&gt;简化版模型：不考虑细胞种类的影响&lt;/li&gt;
&lt;li&gt;全面版模型：考虑细胞种类的影响&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;对比设计&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;首先得判断是否有必要使用全面版模型，因此需要做一个简单对比&lt;/li&gt;
&lt;li&gt;在&lt;code&gt;DESeqDataSetFromMatrix()&lt;/code&gt;中还是要填写完整的实验设计
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;~ Batch + Genotype + Time + Genotype:Time&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;dds &amp;lt;- DESeqDataSetFromMatrix(
 countData = countMatrix,
 colData = metaData,
 design = ~ Batch + Genotype + Time + Genotype:Time)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;由于存在多levels的比较，&lt;br /&gt;
正如t检验用于双样本，ANOVA适用于多样本一样，&lt;br /&gt;
Wald检验用于双样本，而LRT用于多样本
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;test = &quot;wald&lt;/code&gt;是默认的，改用LRT需要声明一下&lt;/li&gt;
&lt;li&gt;要注意：&lt;code&gt;reduced&lt;/code&gt;中填写&lt;strong&gt;简化后&lt;/strong&gt;保留的变量，而并非要剔除的变量s&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;简化版模型&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;dds_full &amp;lt;- DESeq(dds, test = &quot;LRT&quot;, reduced = ~ Batch + Time)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./image_6.png&quot; alt=&quot;image_6&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;结果中的&lt;code&gt;baseMean&lt;/code&gt;，&lt;code&gt;log2FoldChange&lt;/code&gt;等结果均无实际意义&lt;/li&gt;
&lt;li&gt;这里主要关注的是统计量&lt;code&gt;stat&lt;/code&gt;以及p值&lt;code&gt;pval&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;原视频&lt;/h2&gt;
&lt;p&gt;&amp;lt;iframe width=&quot;100%&quot; height=&quot;468&quot; src=&quot;https://www.youtube.com/embed/X6p3E-QTcUc&quot; title=&quot;Multifactor Designs in DESeq2&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/p&gt;
</content:encoded></item><item><title>Blog创建完成</title><link>https://nab-iak.github.io/posts/p1/p1/</link><guid isPermaLink="true">https://nab-iak.github.io/posts/p1/p1/</guid><description>随便写点什么吧</description><pubDate>Thu, 17 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;Cover Pic by &lt;a href=&quot;https://www.pixiv.net/artworks/121353048&quot;&gt;@晕欧欧&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;开启我的blog&lt;/h2&gt;
&lt;p&gt;随便写写各种&lt;br /&gt;
以摸鱼为主&lt;br /&gt;
有什么想到的再追加&lt;/p&gt;
</content:encoded></item></channel></rss>