Menu
CoddyTech

独热编码

本课属于 Coddy Machine Learning 学习旅程的“机器学习统计学”单元。第 53 课,共 64 课。

乐器没有顺序:如果用 1、2、3 编号,钢琴就会被视为比鼓更大。独热编码会为每个类别单独创建一列,用 0/1 表示:

四名学生的乐器分别是钢琴'鼓'钢琴'大提琴,转换为名为大提琴、鼓和钢琴的三列:每行只有一个 1,位于对应乐器的列中,其他列为 0,而周数列保持不变

pd.get_dummies 可以完成这项操作,而 dtype=int 会要求使用 1 和 0,而不是 True 和 False:

pupils = pd.DataFrame({"instrument": ["piano", "drums", "piano", "cello"],
                       "weeks": [4, 3, 6, 10]})
encoded = pd.get_dummies(pupils, columns=["instrument"], dtype=int)
print(encoded)

这会打印:

   weeks  instrument_cello  instrument_drums  instrument_piano
0      4                 0                 0                 1
1      3                 0                 1                 0
2      6                 0                 0                 1
3     10                 1                 0                 0

新列会添加到末尾,每个值对应一列,并按字母顺序排列。代价是表格变宽:500 个不同的值会增加 500 列。

challenge icon

挑战

中等

一个度假网站列出了 cabins.csv 中的小屋。程序会读取列名 area 或 heat。起始代码会给它们编号,以便与价格进行相关性分析,但这两列都没有顺序:这个 r 是编造出来的。

  1. 替换其中的代码行:对该列进行独热编码(0 和 1)。
  2. 打印它变成了多少列,然后打印每个新列及其值为 1 的数量。

对于 5 间小屋和输入 heat:

heat became 2 columns:
heat_gas: 3 cabins
heat_wood: 2 cabins

亲手试试

import pandas as pd

cabins = pd.read_csv("cabins.csv")
column = input()

# 在下方编写你的代码
# 这些代码行给地区和供暖类型编了号,但它们本身没有顺序:请替换这些代码行
numbers = {"coast": 1, "hills": 2, "lake": 3, "woods": 4, "gas": 1, "solar": 2, "wood": 3}
cabins[column] = cabins[column].map(numbers)
print(f"{column} against price: r = {round(cabins[column].corr(cabins['price']), 2)}")
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

机器学习统计学中的所有课

自己练习: Python 在线编译器