jupyter报错 NameError: name 'labels' is not defined,如何解决?


import pandas as pd
import math
import numpy as np
from sklearn.preprocessing import LabelEncoder

data = {'形状': ['圆形', '圆形', '皱形', '皱形', '圆形', '皱形', '圆形', '皱形', '圆形'],
        '颜色': ['灰色', '白色', '白色', '灰色', '白色', '灰色', '白色', '灰色', '灰色'],
        '大小': ['饱满', '皱缩', '饱满', '饱满', '皱缩', '皱缩', '饱满', '皱缩', '皱缩'],
        '土壤': ['酸性', '碱性', '碱性', '酸性', '碱性', '酸性', '酸性', '碱性', '碱性'],
        '水分': ['多', '少', '多', '多', '少', '少', '少', '多', '少'],
        '日照': ['多', '多', '多', '少', '少', '多', '少', '少', '多'],
        '发芽': ['否', '是', '否', '是', '是', '是', '是', '否', '否']}
df = pd.DataFrame(data)
# 经验熵
def entropy(labels):
    n_labels = len(labels)
    if n_labels <= 1:
        return 0
    counts = np.bincount(labels.astype(int))
    probs = counts / n_labels
    n_classes = np.count_nonzero(probs)
    if n_classes <= 1:
        return 0
    ent = 0.
    for i in probs:
        ent -= i * math.log(i, 2)
    return ent
# 经验条件熵
def conditional_entropy(x, y):
    entropy_cond = 0.
    for i in set(x):
        p = float(len(x[x == i])) / len(x)
        entropy_cond += p * entropy(y[x == i])
    return entropy_cond
# 信息增益
def information_gain(x, y):
    return entropy(y) - conditional_entropy(x, y)
# 对类别特征进行标签编码
le = LabelEncoder()
categorical_cols = ['形状', '颜色', '大小', '土壤', '水分', '日照']
for col in categorical_cols:
    df[col] = le.fit_transform(df[col])
print('训练样本经验熵:', entropy(labels))
cond_ent = conditional_entropy(df["形状"].values.astype(int), labels)
info_gain = information_gain(df["形状"].values.astype(int), labels)
print('形状属性的经验条件熵:', cond_ent)
print('形状属性的信息增益:', info_gain)

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索得到结果及原因,是因为在代码中出现了一个 NameError,提示 labels 未定义。这是因为在打印训练样本经验熵、计算形状属性的经验条件熵和信息增益时,代码使用了未定义的变量 labels

这个问题可以通过将变量 labels 替换为 df["发芽"].values.astype(int) 来解决,因为它们代表的是同一个变量。具体来说,将如下代码:

print('训练样本经验熵:', entropy(labels))
cond_ent = conditional_entropy(df["形状"].values.astype(int), labels)
info_gain = information_gain(df["形状"].values.astype(int), labels)

替换为:

labels = df["发芽"].values.astype(int)
print('训练样本经验熵:', entropy(labels))
cond_ent = conditional_entropy(df["形状"].values.astype(int), labels)
info_gain = information_gain(df["形状"].values.astype(int), labels)

这样就可以解决这个问题了。

以下是修改后的完整代码:

import pandas as pd
import math
import numpy as np
from sklearn.preprocessing import LabelEncoder

data = {'形状': ['圆形', '圆形', '皱形', '皱形', '圆形', '皱形', '圆形', '皱形', '圆形'],
        '颜色': ['灰色', '白色', '白色', '灰色', '白色', '灰色', '白色', '灰色', '灰色'],
        '大小': ['饱满', '皱缩', '饱满', '饱满', '皱缩', '皱缩', '饱满', '皱缩', '皱缩'],
        '土壤': ['酸性', '碱性', '碱性', '酸性', '碱性', '酸性', '酸性', '碱性', '碱性'],
        '水分': ['多', '少', '多', '多', '少', '少', '少', '多', '少'],
        '日照': ['多', '多', '多', '少', '少', '多', '少', '少', '多'],
        '发芽': ['否', '是', '否', '是', '是', '是', '是', '否', '否']}
df = pd.DataFrame(data)

# 经验熵
def entropy(labels):
    n_labels = len(labels)
    if n_labels <= 1:
        return 0
    counts = np.bincount(labels)
    probs = counts / n_labels
    n_classes = np.count_nonzero(probs)
    if n_classes <= 1:
        return 0
    ent = 0.
    for i in probs:
        ent -= i * math.log(i, 2)
    return ent

# 经验条件熵
def conditional_entropy(x, y):
    entropy_cond = 0.
    for i in set(x):
        p = float(len(x[x == i])) / len(x)
        entropy_cond += p * entropy(y[x == i])
    return entropy_cond

# 信息增益
def information_gain(x, y):
    return entropy(y) - conditional_entropy(x, y)

# 对类别特征进行标签编码
le = LabelEncoder()
categorical_cols = ['形状', '颜色', '大小', '土壤', '水分', '日照']
for col in categorical_cols:
    df[col] = le.fit_transform(df[col])

labels = df["发芽"].values.astype(int)
print('训练样本经验熵:', entropy(labels))
cond_ent = conditional_entropy(df["形状"].values.astype(int), labels)
info_gain = information_gain(df["形状"].values.astype(int), labels)
print('形状属性的经验条件熵:', cond_ent)
print('形状属性的信息增益:', info_gain)

这个代码就可以正确运行并输出计算结果。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7490081
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:jupyter NameError: name ‘xxx‘ is not defined
  • 除此之外, 这篇博客: Jupyterlab安装中的 Jupyter的各种快捷键 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
    • 执行当前cell,执行后不自动调转到下一个cell:Ctrl-Enter
    • 是当前的cell进入编辑模式:Enter
    • 退出当前cell的编辑模式:Esc

    一下都是退出编辑模式的命令:

    • 删除当前的cell:双D
    • 为当前的cell加入line number:单L
    • 将当前的cell转化为具有一级标题的maskdown:单1
    • 将当前的cell转化为具有二级标题的maskdown:单2
    • 将当前的cell转化为具有三级标题的maskdown:单3
    • 撤销对某个cell的删除:z
    • 浏览器的各个Tab之间切换:Up和Dn