<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>数据处理之类别型数据 - Google 机器学习速成课程配套中文解读 on 跟我学机器学习</title><link>https://machinelearningwithme.com/course/google-machine-learning/data/categorical-data/</link><description>Recent content in 数据处理之类别型数据 - Google 机器学习速成课程配套中文解读 on 跟我学机器学习</description><generator>Hugo</generator><language>zh_CN</language><lastBuildDate>Thu, 22 Oct 2026 21:29:14 +0800</lastBuildDate><atom:link href="https://machinelearningwithme.com/course/google-machine-learning/data/categorical-data/index.xml" rel="self" type="application/rss+xml"/><item><title>类别型数据：简介 - Google 机器学习速成课程配套中文解读</title><link>https://machinelearningwithme.com/course/google-machine-learning/data/categorical-data/introduction/</link><pubDate>Tue, 20 Oct 2026 15:40:00 +0800</pubDate><guid>https://machinelearningwithme.com/course/google-machine-learning/data/categorical-data/introduction/</guid><description>&lt;h1 id="类别型数据简介"&gt;类别型数据：简介&lt;a class="anchor" href="#%e7%b1%bb%e5%88%ab%e5%9e%8b%e6%95%b0%e6%8d%ae%e7%ae%80%e4%bb%8b"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;blockquote class='book-hint note'&gt;
&lt;p&gt;&lt;strong&gt;预计整个模块学习时长：&lt;/strong&gt; 50 分钟&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote class='book-hint note'&gt;
&lt;p&gt;&lt;strong&gt;学习目标：&lt;/strong&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;用独热向量（one-hot vectors）表示类别型数据。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;处理类别型数据中的常见问题。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;创建特征交叉（feature crosses）。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/blockquote&gt;&lt;blockquote class='book-hint caution'&gt;
&lt;p&gt;&lt;strong&gt;先修要求：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;本模块假设你已经熟悉以下模块中介绍的概念：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://machinelearningwithme.com/ml/chapter04/generalization-basics/"&gt;机器学习简介&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://machinelearningwithme.com/course/google-machine-learning/data/numerical-data/"&gt;处理数值数据&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/blockquote&gt;&lt;hr&gt;
&lt;p&gt;先想一个问题：模型眼里的数据，凭什么分成两类？&lt;/p&gt;
&lt;p&gt;类别型数据（Categorical data有一个很鲜明的特点：&lt;strong&gt;它的取值集合是固定的&lt;/strong&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;/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;/li&gt;
&lt;li&gt;
&lt;p&gt;被分箱过的数字（在&lt;a href="https://machinelearningwithme.com/course/google-machine-learning/data/numerical-data/"&gt;「处理数值型数据」&lt;/a&gt;模块中介绍过）&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="数字也可以是类别型数据"&gt;数字也可以是类别型数据&lt;a class="anchor" href="#%e6%95%b0%e5%ad%97%e4%b9%9f%e5%8f%af%e4%bb%a5%e6%98%af%e7%b1%bb%e5%88%ab%e5%9e%8b%e6%95%b0%e6%8d%ae"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;判断一份数据是不是真的数值型数据，其实只有一条标准：&lt;strong&gt;乘法对它有没有意义。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;我们拿房价来举例。&lt;/p&gt;
&lt;p&gt;假设要训练一个模型，根据房屋面积来预测房价，请注意——一个真正有用的房价评估模型，通常要依赖&lt;strong&gt;成百上千个&lt;/strong&gt;特征。但在其他条件都相同的前提下，一套 200 平方米的房子，价值大约应当是一套同样户型的 100 平方米房子的两倍（该特征可乘）。&lt;/p&gt;
&lt;p&gt;反过来说，很多时候，取值是整数的特征，你反而应该按类别型数据来处理，而不是当成数值型数据。举个典型：邮编。邮编的值确实是整数，可如果你按数值型来喂给模型，就等于要求模型去发现不同邮编之间的数值关系——也就是告诉模型，邮编 20004 的信号强度是邮编 10002 的两倍（或一半）。而按类别型数据来表示邮编，模型才能给每一个邮编&lt;strong&gt;单独地&lt;/strong&gt;分配权重。&lt;/p&gt;
&lt;h2 id="编码"&gt;编码&lt;a class="anchor" href="#%e7%bc%96%e7%a0%81"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;编码（Encoding）&lt;/strong&gt;，指的就是把类别型数据（以及其他类型的数据）转换成模型可以训练的&lt;strong&gt;数值向量&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;这一步之所以必须做，是因为模型只认浮点数：它没法直接拿 &lt;code&gt;&amp;quot;dog&amp;quot;&lt;/code&gt;、&lt;code&gt;&amp;quot;maple&amp;quot;&lt;/code&gt; 这样的字符串去训练。所以这一模块接下来要介绍的，就是几种专门针对类别型数据的编码方法。&lt;/p&gt;
&lt;blockquote class='book-hint note'&gt;
&lt;p&gt;&lt;strong&gt;MLWM:&lt;/strong&gt; 例如对于文本特征来说，我们并不能够直接将其喂给模型进行训练，而是要通过某种方式将其编码成数值向量。更多关于文本转换成向量的内容，可以参见&lt;a href="https://machinelearningwithme.com/ml/chapter06/bag-of-words/"&gt;「词袋模型原理：文本特征表示与机器学习建模」&lt;/a&gt; 中的介绍。&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote class='book-hint important'&gt;
&lt;p&gt;&lt;strong&gt;关键术语：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;类别型数据（Categorical data）&lt;/li&gt;
&lt;li&gt;数值型数据（Numerical data）&lt;/li&gt;
&lt;/ul&gt;&lt;/blockquote&gt;</description></item><item><title>类别型数据：词表与独热编码 - Google 机器学习速成课程配套中文解读</title><link>https://machinelearningwithme.com/course/google-machine-learning/data/categorical-data/one-hot-encoding/</link><pubDate>Wed, 21 Oct 2026 14:55:00 +0800</pubDate><guid>https://machinelearningwithme.com/course/google-machine-learning/data/categorical-data/one-hot-encoding/</guid><description>&lt;h1 id="类别型数据词表与独热编码"&gt;类别型数据：词表与独热编码&lt;a class="anchor" href="#%e7%b1%bb%e5%88%ab%e5%9e%8b%e6%95%b0%e6%8d%ae%e8%af%8d%e8%a1%a8%e4%b8%8e%e7%8b%ac%e7%83%ad%e7%bc%96%e7%a0%81"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;维度（dimension），其实就是特征向量（feature vector）里元素个数的另一个说法。&lt;/p&gt;
&lt;p&gt;有些类别型特征的维度很低，低到你可以一眼看完它的全部取值：&lt;/p&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;snowed_today&lt;/td&gt;
					&lt;td&gt;2&lt;/td&gt;
					&lt;td&gt;True、False&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;skill_level&lt;/td&gt;
					&lt;td&gt;3&lt;/td&gt;
					&lt;td&gt;初学者、熟练者、专家&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;season&lt;/td&gt;
					&lt;td&gt;4&lt;/td&gt;
					&lt;td&gt;冬、春、夏、秋&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;day_of_week&lt;/td&gt;
					&lt;td&gt;7&lt;/td&gt;
					&lt;td&gt;星期一、星期二、星期三……&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;planet&lt;/td&gt;
					&lt;td&gt;8&lt;/td&gt;
					&lt;td&gt;水星、金星、地球……&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="词表"&gt;词表&lt;a class="anchor" href="#%e8%af%8d%e8%a1%a8"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;类别数量不多时，我们就可以把它编码成一份词表（vocabulary）。用词表编码之后，模型会把每一个可能的类别取值，当成一个独立特征来对待；在训练过程中，模型会为每个类别分别学到一组权重。&lt;/p&gt;
&lt;p&gt;举个例子。假设你要训练一个模型，根据车漆颜色 &lt;code&gt;car_color&lt;/code&gt; 来预测汽车的价格——说不定红色的车就是比绿色的贵。由于各家厂商能提供的车漆颜色是有限的，&lt;code&gt;car_color&lt;/code&gt; 就属于一个低维度的类别型特征。&lt;/p&gt;
&lt;p&gt;下面这张图给出了 &lt;code&gt;car_color&lt;/code&gt; 的一份词表（也就是所有可能的取值）：&lt;/p&gt;
&lt;div align=center&gt;&lt;img width="700" src="https://machinelearningwithme.com/images/course/categorical-netview.svg" alt="图 1. 一组车漆颜色的调色板：调色板里的每一种颜色各自对应特征向量中的一个独立特征位——红色是一个特征，橙色是另一个特征，以此类推。"/&gt; &lt;/div&gt;&lt;center&gt;图 1. 每个类别对应一个独一无二的特征&lt;/center&gt;
&lt;h2 id="索引编号"&gt;索引编号&lt;a class="anchor" href="#%e7%b4%a2%e5%bc%95%e7%bc%96%e5%8f%b7"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;模型只会处理浮点数。所以我们必须把每个字符串转换成一个独一无二的索引编号，就像下面这张图：&lt;/p&gt;
&lt;div align=center&gt;&lt;img width="700" src="https://machinelearningwithme.com/images/course/categorical-netview-indexed.svg" alt="图 2. 与图 1 相同的调色板，但现在每个颜色旁边标着一个整数索引：红色对应 0，橙色对应 1，以此类推。"/&gt; &lt;/div&gt;&lt;center&gt;图 2. 索引化后的特征&lt;/center&gt;
&lt;p&gt;不过，把字符串换成索引编号只是第一步。要真正让模型学到取值之间有意义的关系，还得再往下走一层。因为——如果类别型特征就这么以索引整数的形态被送进模型，模型会把这些编号当成连续的浮点数来看待。换个说法，它会认为 &lt;code&gt;&amp;quot;Purple&amp;quot;&lt;/code&gt; 的可能性是 &lt;code&gt;&amp;quot;Orange&amp;quot;&lt;/code&gt; 的六倍。&lt;/p&gt;
&lt;h2 id="独热编码"&gt;独热编码&lt;a class="anchor" href="#%e7%8b%ac%e7%83%ad%e7%bc%96%e7%a0%81"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;搭好词表之后的下一步，是把每个索引编号转换成它的独热编码（One-hot encoding。&lt;/p&gt;
&lt;p&gt;在独热编码里：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;每个类别都由一个长度为 N 的向量（数组）表示，N 就是类别的数量。比如 &lt;code&gt;car_color&lt;/code&gt; 一共有 8 个可能的类别，那么代表它的独热向量就有 8 个元素。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;一个独热向量里，有且仅有一个元素的值是 1，其余元素的值全是 0。&lt;/p&gt;</description></item><item><title>类别型数据：常见问题 - Google 机器学习速成课程配套中文解读</title><link>https://machinelearningwithme.com/course/google-machine-learning/data/categorical-data/common-issues/</link><pubDate>Wed, 21 Oct 2026 15:10:00 +0800</pubDate><guid>https://machinelearningwithme.com/course/google-machine-learning/data/categorical-data/common-issues/</guid><description>&lt;h1 id="类别型数据常见问题"&gt;类别型数据：常见问题&lt;a class="anchor" href="#%e7%b1%bb%e5%88%ab%e5%9e%8b%e6%95%b0%e6%8d%ae%e5%b8%b8%e8%a7%81%e9%97%ae%e9%a2%98"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;数值型数据通常由科学仪器或自动化测量采集而来；类别型数据则不一样——它们往往是由人，或者由机器学习模型分类出来的。于是有两个问题变得特别关键：谁决定了类别和标签、以及他们怎么做这个决定。这两点直接影响数据的可靠性与实用性。&lt;/p&gt;
&lt;h2 id="人工评分者"&gt;人工评分者&lt;a class="anchor" href="#%e4%ba%ba%e5%b7%a5%e8%af%84%e5%88%86%e8%80%85"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;由人手工标注的数据，通常被称为金标签（gold labels）。因为数据质量相对更好，它们在训练模型时往往比机器标注的数据更受欢迎。&lt;/p&gt;
&lt;p&gt;但这并不等于任何一份人工标注的数据都是高质量的。人为失误、偏见乃至恶意，都可能在数据采集的环节，或者在数据清洗与处理的过程中被引入。训练之前，先把它们查出来。&lt;/p&gt;
&lt;p&gt;同一份样本，两个人的标注结果可能就不一样。评分者之间这种判断上的差异，被称为评分者间一致性（inter-rater agreement）。想要摸清评分者意见的分歧有多大，可以给每份样本安排多个评分者，再测量他们之间的一致性。&lt;/p&gt;
&lt;p&gt;衡量评分者间一致性的常见方法有：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Cohen&amp;rsquo;s kappa 及其变体&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;组内相关系数（Intra-class correlation, ICC）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Krippendorff&amp;rsquo;s alpha&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;关于 Cohen&amp;rsquo;s kappa 与组内相关系数的细节，可以参考 &lt;a href="https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3402032/"&gt;Hallgren 2012&lt;/a&gt;；关于 Krippendorff&amp;rsquo;s alpha 的细节，可以参考 &lt;a href="https://www.asc.upenn.edu/sites/default/files/2021-03/Computing%20Krippendorff%27s%20Alpha-Reliability.pdf"&gt;Krippendorff 2011&lt;/a&gt;。&lt;/p&gt;
&lt;h2 id="机器评分者"&gt;机器评分者&lt;a class="anchor" href="#%e6%9c%ba%e5%99%a8%e8%af%84%e5%88%86%e8%80%85"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;机器标注的数据，也就是类别由一个或多个分类模型自动判定出来的数据——通常被称为银标签（silver labels）。&lt;/p&gt;
&lt;p&gt;银标签的质量可能相差极大。你要检查的，不只是它的准确率和偏见，还包括它有没有违背常识、现实与意图。举个例子：如果一个计算机视觉模型把一张「吉娃娃的照片」标成了「松饼」，或者反过来把「松饼」标成「吉娃娃」，那么在这份标注数据上训练出来的模型，质量必然要打折扣。&lt;/p&gt;
&lt;p&gt;再比如，一个情感分析器把中性词打分成 -0.25（而 0.0 才是中性值），那么它可能是在给所有词都加上一层数据里其实并不存在的负面倾向；一个过度敏感的毒性检测器，也可能把许多中性陈述误判成有毒。在拿去训练之前，先想办法摸清你数据里机器标签与机器标注的质量和偏见。&lt;/p&gt;
&lt;h2 id="高维度"&gt;高维度&lt;a class="anchor" href="#%e9%ab%98%e7%bb%b4%e5%ba%a6"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;类别型数据很容易产生高维度的特征向量，也就是元素个数很多的特征向量。而高维度会推高训练成本、让训练变得更困难。正因如此，机器学习专家常常会在训练之前，先想办法把维度降下来。&lt;/p&gt;
&lt;p&gt;对自然语言数据来说，主流的降维方法是把特征向量转换成嵌入向量。这一点会在本课程后面的&lt;a href="https://machinelearningwithme.com/course/google-machine-learning/embeddings/"&gt;嵌入模块&lt;/a&gt;中展开讨论。&lt;/p&gt;
&lt;blockquote class='book-hint important'&gt;
&lt;p&gt;关键术语：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;评分者间一致性（Inter-rater agreement）&lt;/li&gt;
&lt;/ul&gt;&lt;/blockquote&gt;</description></item><item><title>类别型数据：特征交叉 - Google 机器学习速成课程配套中文解读</title><link>https://machinelearningwithme.com/course/google-machine-learning/data/categorical-data/feature-crosses/</link><pubDate>Wed, 21 Oct 2026 15:21:00 +0800</pubDate><guid>https://machinelearningwithme.com/course/google-machine-learning/data/categorical-data/feature-crosses/</guid><description>&lt;h1 id="类别型数据特征交叉"&gt;类别型数据：特征交叉&lt;a class="anchor" href="#%e7%b1%bb%e5%88%ab%e5%9e%8b%e6%95%b0%e6%8d%ae%e7%89%b9%e5%be%81%e4%ba%a4%e5%8f%89"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;线性模型有个众所周知的短板：它只会画直线。这一节我们给它补上一块短板——特征交叉（Feature crosses）的做法，即把数据集中两个或更多类别型 / 分箱特征交叉起来（即取笛卡尔积）。&lt;/p&gt;
&lt;p&gt;和&lt;a href="https://machinelearningwithme.com/course/google-machine-learning/data/numerical-data/polynomial-transforms/"&gt;多项式变换&lt;/a&gt;一样，特征交叉能让线性模型处理非线性情况。除此之外，它还额外编码了特征之间的交互关系。&lt;/p&gt;
&lt;h2 id="推导一遍叶片数据集"&gt;推导一遍：叶片数据集&lt;a class="anchor" href="#%e6%8e%a8%e5%af%bc%e4%b8%80%e9%81%8d%e5%8f%b6%e7%89%87%e6%95%b0%e6%8d%ae%e9%9b%86"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;来看一个叶片数据集，它有两个类别型特征：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;edges&lt;/code&gt;（叶缘），取值有 &lt;code&gt;smooth&lt;/code&gt;、&lt;code&gt;toothed&lt;/code&gt;、&lt;code&gt;lobed&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;arrangement&lt;/code&gt;（叶序），取值有 &lt;code&gt;opposite&lt;/code&gt; 和 &lt;code&gt;alternate&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;假设上面这个顺序，就是独热表示中特征列的顺序。那么一片叶缘为 &lt;code&gt;smooth&lt;/code&gt;、叶序为 &lt;code&gt;opposite&lt;/code&gt; 的叶子，表示出来就是 &lt;code&gt;{(1, 0, 0), (1, 0)}&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;这两个特征的交叉（也就是笛卡尔积）结果是：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;{Smooth_Opposite, Smooth_Alternate, Toothed_Opposite, Toothed_Alternate, Lobed_Opposite, Lobed_Alternate}&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;每一项的值，都是两个基特征对应值的乘积，也就是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Smooth_Opposite = edges[0] arrangement[0]&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Smooth_Alternate = edges[0] arrangement[1]&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Toothed_Opposite = edges[1] arrangement[0]&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Toothed_Alternate = edges[1] arrangement[1]&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Lobed_Opposite = edges[2] arrangement[0]&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Lobed_Alternate = edges[2] arrangement[1]&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;举个例子。如果一片叶子叶缘是 &lt;code&gt;lobed&lt;/code&gt;、叶序是 &lt;code&gt;alternate&lt;/code&gt;，那么它的特征交叉向量在 &lt;code&gt;Lobed_Alternate&lt;/code&gt; 这个项上取值为 1，其余各项全是 0：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;{0, 0, 0, 0, 0, 1}&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;因为叶缘和叶序这些特征在同一树种内部是不变的，所以这份数据集可以用来按树种对叶片做分类。&lt;/p&gt;
&lt;h2 id="与多项式变换的对比"&gt;与多项式变换的对比&lt;a class="anchor" href="#%e4%b8%8e%e5%a4%9a%e9%a1%b9%e5%bc%8f%e5%8f%98%e6%8d%a2%e7%9a%84%e5%af%b9%e6%af%94"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;特征交叉与&lt;a href="https://machinelearningwithme.com/course/google-machine-learning/data/numerical-data/polynomial-transforms/"&gt;多项式变换&lt;/a&gt;多少有些相似：两者都是把多个特征合并成一个新的合成特征，让模型在它之上训练，从而学到非线性。区别在于——多项式变换处理的通常是数值型数据，而特征交叉处理的是类别型数据。&lt;/p&gt;</description></item><item><title>类别型数据：特征交叉练习 - Google 机器学习速成课程配套中文解读</title><link>https://machinelearningwithme.com/course/google-machine-learning/data/categorical-data/feature-cross-exercises/</link><pubDate>Thu, 22 Oct 2026 12:08:00 +0800</pubDate><guid>https://machinelearningwithme.com/course/google-machine-learning/data/categorical-data/feature-cross-exercises/</guid><description>&lt;h1 id="类别型数据特征交叉练习"&gt;类别型数据：特征交叉练习&lt;a class="anchor" href="#%e7%b1%bb%e5%88%ab%e5%9e%8b%e6%95%b0%e6%8d%ae%e7%89%b9%e5%be%81%e4%ba%a4%e5%8f%89%e7%bb%83%e4%b9%a0"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Playground&lt;/strong&gt; 是一个交互式应用，让你亲自动手调试训练与测试机器学习模型的各个环节。在 Playground 里，你可以挑选特征、调整超参数，然后观察这些选择对模型产生了什么影响。&lt;/p&gt;
&lt;p&gt;本节内容包含两个练习，都要用到下方嵌入的 Playground 组件。&lt;/p&gt;
&lt;h2 id="练习-1基础特征交叉"&gt;练习 1：基础特征交叉&lt;a class="anchor" href="#%e7%bb%83%e4%b9%a0-1%e5%9f%ba%e7%a1%80%e7%89%b9%e5%be%81%e4%ba%a4%e5%8f%89"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;这个练习，请把注意力放在 Playground 界面的以下几部分：&lt;/p&gt;
&lt;p&gt;在 FEATURES 下方，有三个候选模型特征：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;$x_1$&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;$x_2$&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;$x_1x_2$&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在 OUTPUT 下方，你会看到一个装满橙色和蓝色圆点的方块。想象你正俯瞰着一片方形森林：橙色点标记生病树木的位置，蓝色点标记健康树木的位置。&lt;/p&gt;
&lt;p&gt;在 FEATURES 与 OUTPUT 之间，如果看得非常仔细，你会发现3条若隐若现的虚线，各自连着一个特征与输出。&lt;strong&gt;虚线的粗细，就象征着该特征当前关联的权重。&lt;/strong&gt; 这些线之所以那么淡，是因为每个特征的初始权重都被设成了 0。权重增大或减小，虚线的粗细也随之变化。&lt;/p&gt;
&lt;div class="container lr-interactive-embed" data-interactive-embed&gt;
 &lt;iframe
 src="https://machinelearningwithme.com/course/playground_feature_cross_simple.html"
 title="特征交叉组合解决非线性分类"
 loading="lazy"
 style="display:block;width:100%;height:665px;border:0;background:#fff;zoom:0.83;"
 &gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;任务 1：&lt;/strong&gt; 按下面的步骤在 Playground 里探索：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;点击那条把特征 $x_1$ 与输出连起来的淡线，弹窗会随之出现。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在弹窗里，把权重填成 &lt;code&gt;1.0&lt;/code&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;按下回车。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;此时你会看到下面这些现象：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;随着权重从 0 变到到 1.0，$x_1$ 那条虚线变粗了。&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;/li&gt;
&lt;li&gt;
&lt;p&gt;蓝色背景是模型对健康树木位置的判断。模型效果很差，它大约有一半的猜测是错的。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;因为 $x_1$ 的权重是 1.0、另外两个特征是 0，模型实际上是在精确复现 $x_1$ 的取值。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;任务 2：&lt;/strong&gt; 调整这三个特征中任意一个或全部的权重，让模型（也就是那些背景颜色）成功区分出病树与健康树。&lt;/p&gt;

&lt;span class="subscription-widget subscription-widget--content"
 data-subscription-widget
 data-resource-id="kb2ce71edhb12f2n"
 data-resource-text="点击查看任务 2 答案"
 data-resource-plan="basic"
 data-resource-color="blue"
 data-resource-align="left"
 data-resource-type="content"&gt;
 &lt;button type="button" class="subscription-btn subscription-btn--content" data-subscription-trigger data-type="content" style="font-size: 0.9em;" aria-busy="false"&gt;
 &lt;span class="subscription-btn__text"&gt;点击查看任务 2 答案&lt;/span&gt;
 &lt;/button&gt;
 &lt;span class="subscription-result" data-subscription-result hidden role="status" aria-live="polite"&gt;&lt;/span&gt;
&lt;/span&gt;
&lt;script&gt;
(function () {
 var script = document.currentScript;
 var widget = script &amp;&amp; script.previousElementSibling;
 if (!widget || !widget.matches || !widget.matches('[data-subscription-widget]')) return;

 var trigger = widget.querySelector('[data-subscription-trigger]');
 var result = widget.querySelector('[data-subscription-result]');
 var icon = trigger.querySelector('.subscription-btn__icon');
 var textEl = trigger.querySelector('.subscription-btn__text');
 
 var originalIcon = icon ? icon.textContent : '';
 var originalText = textEl.textContent;
 var resourceId = widget.dataset.resourceId;
 var planHint = widget.dataset.resourcePlan || '';

 
 
 
 
 
 
 function applyContentStyle() {
 var S = window.MLWM_SUB_STYLE;
 if (S &amp;&amp; typeof S.apply === 'function') {
 S.apply(widget, widget.dataset.resourceColor, widget.dataset.resourceAlign);
 }
 }
 
 
 
 
 
 
 
 
 
 function notifyToggle(expanded) {
 document.dispatchEvent(new CustomEvent('mlwm:subscription-toggle', {
 detail: { resourceId: resourceId, expanded: !!expanded }
 }));
 }

 
 
 
 
 
 
 if (document.readyState === 'loading') {
 document.addEventListener('DOMContentLoaded', applyContentStyle, { once: true });
 } else {
 applyContentStyle();
 }

 
 
 var cached = null;
 var inflight = null;

 
 
 function resolveApiUrl(path) {
 if (window.__ML_API &amp;&amp; typeof window.__ML_API === 'function') return window.__ML_API(path);
 return path;
 }

 function isLoggedIn() {
 return document.documentElement.getAttribute('data-mlwm-auth') === 'in';
 }
 function getToken() {
 try { return localStorage.getItem('mlwm_auth_access') || ''; } catch (_) { return ''; }
 }
 function showLoginModal(opts) {
 if (window.MLWM_AUTH &amp;&amp; typeof window.MLWM_AUTH.openLoginModal === 'function') {
 window.MLWM_AUTH.openLoginModal(Object.assign({ mode: 'login' }, opts || {}));
 } else {
 window.location.assign('/login/');
 }
 }
 function showToast(msg, type) {
 if (window.MLWM_AUTH &amp;&amp; typeof window.MLWM_AUTH.showToast === 'function') {
 window.MLWM_AUTH.showToast(msg, type || 'warning');
 }
 }
 function setBusy(busy) {
 trigger.disabled = !!busy;
 trigger.setAttribute('aria-busy', busy ? 'true' : 'false');
 textEl.textContent = busy ? '加载中...' : originalText;
 }
 function clearResult() {
 result.hidden = true;
 result.innerHTML = '';
 delete result.dataset.kind;
 textEl.textContent = originalText;
 trigger.style.display = '';
 }
 function setResult(html, kind) {
 applyContentStyle();
 result.hidden = false;
 result.innerHTML = html;
 result.dataset.kind = kind || 'info';
 }
 function escapeHtml(s) {
 return String(s == null ? '' : s).replace(/[&amp;&lt;&gt;"']/g, function (c) {
 return { '&amp;': '&amp;amp;', '&lt;': '&amp;lt;', '&gt;': '&amp;gt;', '"': '&amp;quot;', "'": '&amp;#39;' }[c];
 });
 }

 
 
 
 
 
 
 
 function renderMarkdown(text) {
 var src = String(text == null ? '' : text);
 if (window.MLWM_MARKED_MD &amp;&amp; typeof window.MLWM_MARKED_MD.render === 'function') {
 var html = window.MLWM_MARKED_MD.render(src);
 if (typeof html === 'string') return html;
 }
 if (typeof marked !== 'undefined' &amp;&amp; typeof marked.parse === 'function') {
 return marked.parse(src);
 }
 return escapeHtml(src);
 }

 
 function isExpanded() { return widget.classList.contains('is-expanded'); }
 function isPinned() { return widget.classList.contains('is-pinned'); }
 function pin() { widget.classList.add('is-pinned'); }
 function unpin() { widget.classList.remove('is-pinned'); }

 function renderContentBox(data) {
 var html =
 '&lt;div class="subscription-content__title"&gt;' +
 '&lt;span class="subscription-content__chevron" aria-hidden="true"&gt;&lt;/span&gt;' +
 '&lt;span class="subscription-content__title-text"&gt;' + escapeHtml(originalText) + '&lt;/span&gt;' +
 '&lt;/div&gt;' +
 '&lt;div class="subscription-content__body"&gt;' + renderMarkdown(data.body) + '&lt;/div&gt;';
 trigger.style.display = 'none';
 setResult(html, 'content');
 widget.classList.add('is-expanded');
 notifyToggle(true);
 
 
 
 if (typeof window.renderMathInElement === 'function') {
 try {
 window.renderMathInElement(result, {
 throwOnError: false,
 delimiters: [
 { left: '$$', right: '$$', display: true },
 { left: '$', right: '$', display: false },
 { left: '\\(', right: '\\)', display: false },
 { left: '\\[', right: '\\]', display: true }
 ]
 });
 } catch (_) { }
 }
 }
 function hideContentBox() {
 trigger.style.display = '';
 clearResult();
 widget.classList.remove('is-expanded');
 unpin();
 notifyToggle(false);
 }

 function renderDenied(body) {
 var detail = body.detail || {};
 
 var requiredPlan = detail.required_plan || planHint || 'pro';
 
 var currentPlan = (detail.current_plan || '').toString().trim();
 var hasCurrent = !!currentPlan;
 
 var title = hasCurrent ? '订阅等级不足' : '尚未订阅';
 
 var bodyText = hasCurrent
 ? '当前订阅为 ' + escapeHtml(currentPlan) + '，获取该资源至少需订阅 ' + escapeHtml(requiredPlan) + ' 套餐。'
 : '当前未订阅，获取该资源至少需订阅 ' + escapeHtml(requiredPlan) + ' 套餐。';
 
 
 result.hidden = true;
 result.innerHTML = '';
 delete result.dataset.kind;
 trigger.style.display = '';
 if (window.MLWM_AUTH &amp;&amp; typeof window.MLWM_AUTH.openDeniedModal === 'function') {
 window.MLWM_AUTH.openDeniedModal({
 title: title,
 body: bodyText,
 ctaText: '订阅方案',
 ctaHref: '/pricing/'
 });
 } else {
 
 window.location.assign('/pricing/');
 }
 }
 function renderDownload(data) {
 
 
 showToast('已触发下载: ' + (data.title || data.url || ''), 'success');
 var a = document.createElement('a');
 a.href = data.url;
 a.rel = 'noopener noreferrer';
 a.download = '';
 a.style.display = 'none';
 document.body.appendChild(a);
 a.click();
 document.body.removeChild(a);
 }
 function renderError(msg) {
 setResult('&lt;div class="subscription-error"&gt;' + escapeHtml(msg || '请求失败,请稍后再试') + '&lt;/div&gt;', 'error');
 }

 
 
 
 
 
 
 
 
 
 
 function fetchResource() {
 if (cached) return Promise.resolve({ ok: true, data: cached });
 if (inflight) return inflight;

 if (!isLoggedIn()) {
 return Promise.resolve({ ok: false, reason: 'not-logged-in', status: 0, body: null });
 }
 var url = resolveApiUrl('/resource/' + encodeURIComponent(resourceId));
 inflight = fetch(url, {
 method: 'GET',
 headers: { 'Authorization': 'Bearer ' + getToken() }
 })
 .then(function (r) {
 return r.json().then(function (j) { return { status: r.status, body: j }; }).catch(function () { return { status: r.status, body: null }; });
 })
 .then(function (resp) {
 if (resp.status === 401) {
 return { ok: false, reason: 'unauthorized', status: 401, body: null };
 }
 var body = resp.body;
 if (!body || typeof body !== 'object') {
 return { ok: false, reason: 'bad-response', status: resp.status, body: body };
 }
 if (body.code === 2002) {
 return { ok: false, reason: 'denied', status: resp.status, body: body };
 }
 if (body.code === 0 &amp;&amp; body.data) {
 
 if (body.data.type === 'content') {
 cached = body.data;
 return { ok: true, data: cached };
 }
 if (body.data.type === 'download' &amp;&amp; body.data.url) {
 return { ok: true, data: body.data };
 }
 }
 return { ok: false, reason: 'api-error', status: resp.status, body: body };
 })
 .catch(function () {
 return { ok: false, reason: 'network', status: 0, body: null };
 });
 
 inflight.then(function () { inflight = null; }, function () { inflight = null; });
 return inflight;
 }

 
 
 function ensureContent() {
 setBusy(true);
 return fetchResource().then(function (result) {
 setBusy(false);
 if (result.ok) {
 if (result.data.type === 'content') {
 renderContentBox(result.data);
 pin();
 return result.data;
 }
 if (result.data.type === 'download') {
 renderDownload(result.data);
 return null;
 }
 return null;
 }
 if (result.reason === 'not-logged-in') {
 showLoginModal({ bannerMessage: '请先登录后再访问资源' });
 } else if (result.reason === 'unauthorized') {
 showLoginModal({ bannerMessage: '登录已过期,请重新登录' });
 } else if (result.reason === 'denied') {
 renderDenied(result.body);
 } else if (result.reason === 'bad-response') {
 renderError('响应异常');
 } else if (result.reason === 'api-error') {
 renderError((result.body &amp;&amp; result.body.msg) || ('请求失败 (code ' + ((result.body &amp;&amp; result.body.code) || '?') + ')'));
 } else if (result.reason === 'network') {
 renderError('网络异常,请稍后再试');
 }
 return null;
 });
 }

 
 
 
 
 trigger.addEventListener('click', function (e) {
 e.stopPropagation();
 if (isExpanded()) return;
 ensureContent();
 });

 
 result.addEventListener('click', function (e) {
 var titleEl = e.target.closest('.subscription-content__title');
 if (titleEl) hideContentBox();
 });

 
 
 
 

 
 
 
 
 
 
 widget.addEventListener('mlwm:subscription-prefetch', function () {
 
 
 
 
 widget._prefetchPromise = fetchResource().then(function () {}, function () {});
 });
})();
&lt;/script&gt;

&lt;p&gt;顺手玩一下：如果你给特征交叉 $x_1x_2$ 填一个负值，会发生什么？&lt;/p&gt;</description></item><item><title>类别型数据：测一测你掌握了多少 - Google 机器学习速成课程配套中文解读</title><link>https://machinelearningwithme.com/course/google-machine-learning/data/categorical-data/quiz/</link><pubDate>Wed, 21 Oct 2026 15:51:00 +0800</pubDate><guid>https://machinelearningwithme.com/course/google-machine-learning/data/categorical-data/quiz/</guid><description>&lt;h1 id="类别型数据随堂测验"&gt;类别型数据：随堂测验&lt;a class="anchor" href="#%e7%b1%bb%e5%88%ab%e5%9e%8b%e6%95%b0%e6%8d%ae%e9%9a%8f%e5%a0%82%e6%b5%8b%e9%aa%8c"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;blockquote class='book-hint note'&gt;
&lt;p&gt;随堂测验： 共 5 题，你必须至少答对 4 题才能通过。&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote class='book-hint caution'&gt;
&lt;p&gt;请勿作弊！等你确认已经掌握本模块的全部内容之后，再回来作答。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;下面正式进入 5 道测验题。题目结束后放了一个折叠的答案区，建议先把 5 题全部做完，再统一展开对照——一次只对一道题，很容易把「想得起来」误当成「真懂」。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="第-1-题哪些字段属于类别型数据"&gt;第 1 题：哪些字段属于类别型数据&lt;a class="anchor" href="#%e7%ac%ac-1-%e9%a2%98%e5%93%aa%e4%ba%9b%e5%ad%97%e6%ae%b5%e5%b1%9e%e4%ba%8e%e7%b1%bb%e5%88%ab%e5%9e%8b%e6%95%b0%e6%8d%ae"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;以下哪些是类别型数据的例子？（多选）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;A. 一本书的页数&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;B. 电话号码&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;C. 薯条的形状（弯条、褶皱切、牛排切、华夫格）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;D. 餐厅的星级评分（1 到 5 星，其中 1 星代表「差」，5 星代表「极好」）&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="第-2-题金标签还是银标签"&gt;第 2 题：金标签还是银标签&lt;a class="anchor" href="#%e7%ac%ac-2-%e9%a2%98%e9%87%91%e6%a0%87%e7%ad%be%e8%bf%98%e6%98%af%e9%93%b6%e6%a0%87%e7%ad%be"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;判断并说明：机器标签通常比人工评分者提供的标签更受欢迎。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;A. 正确（True）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;B. 错误（False）&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="第-3-题唯一合法的编码形式"&gt;第 3 题：唯一合法的编码形式&lt;a class="anchor" href="#%e7%ac%ac-3-%e9%a2%98%e5%94%af%e4%b8%80%e5%90%88%e6%b3%95%e7%9a%84%e7%bc%96%e7%a0%81%e5%bd%a2%e5%bc%8f"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;你正在一个训练数据集上训练模型，其中有一个特征 &lt;code&gt;eye_color&lt;/code&gt;，它的取值是以下六个之一：&lt;code&gt;amber&lt;/code&gt;、&lt;code&gt;blue&lt;/code&gt;、&lt;code&gt;brown&lt;/code&gt;、&lt;code&gt;gray&lt;/code&gt;、&lt;code&gt;green&lt;/code&gt;、&lt;code&gt;hazel&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;下列哪些是 &lt;code&gt;eye_color&lt;/code&gt; 取值为 &lt;code&gt;blue&lt;/code&gt; 时的合法编码？（多选）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;A. &lt;code&gt;[0, 1, 0, 0, 0, 0]&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;B. &lt;code&gt;[1]&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;C. &lt;code&gt;[1, 2, 3, 4, 5, 6]&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;D. &lt;code&gt;[0, 1]&lt;/code&gt;&lt;/p&gt;</description></item></channel></rss>