Menu
CoddyTech

多个类别

本课属于 Coddy Machine Learning 学习旅程的“监督学习”单元。第 19 课,共 58 课。

柠檬、青柠还是橙子?逻辑回归也能处理三个类别。现在,一个新水果落在柠檬和橙子之间:

左图:45 个水果按直径和重量分布,青柠较小,柠檬居中,橙子较大;一颗黑色星星表示一个位于柠檬和橙子之间的新水果。右图:它的概率以条形图显示,柠檬 0.61,青柠 0.00,橙子 0.39

model = LogisticRegression(max_iter=1000)
model.fit(X, kind)  # X:直径、重量;kind:柠檬、青柠或橙子
print(model.classes_)
print(np.round(model.predict_proba([[6.7, 144]]), 2))
print(model.predict([[6.7, 144]]))

这会打印:

['lemon' 'lime' 'orange']
[[0.61 0.   0.39]]
['lemon']

每一行按 classes_ 的顺序,包含每个类别对应的一个概率,并且这些概率相加为 1。predict 会选出最大的概率。

模型会告诉你它有多确定:61% 的柠檬是个难以判断的结果,值得再看一眼。

challenge icon

挑战

中等

播客应用会将新节目归入喜剧、新闻或真实犯罪类别。起始代码会在 episodes.csv 上拟合 LogisticRegression,使用时长、发言人数和每分钟笑声数作为特征,并将新节目读入 episode,这是一个只有一行的表。

完成 describe(episode):

  1. 按照 model.classes_ 中的顺序,打印每种节目类型的概率,并四舍五入为整数百分比。
  2. 返回最有可能的类型。

另一个应用中的节目输出如下:

comedy: 12%
news: 70%
true crime: 18%
Best guess: news

亲手试试

import pandas as pd
from sklearn.linear_model import LogisticRegression

episodes = pd.read_csv("episodes.csv")
features = ["length_min", "speakers", "laughs_per_min"]
model = LogisticRegression(max_iter=1000)
model.fit(episodes[features], episodes["show_type"])


# 输出一集节目属于各节目类型的概率(一个只有一行的表),然后返回概率最高的类型
def describe(episode):
    # 在这里编写你的代码
    return "unknown"


# 不要修改下面的代码:它根据输入创建一集新节目
length = float(input())
speakers = int(input())
laughs = float(input())
episode = pd.DataFrame({"length_min": [length], "speakers": [speakers], "laughs_per_min": [laughs]})
best = describe(episode)
print(f"Best guess: {best}")
quiz icon自我测试

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

监督学习中的所有课

自己练习: Python 在线编译器