准确率(P值)、召回率(R值)、及F值

准确率(P值)是针对我们预测结果而言的,它表示的是预测为正的样本中有多少是真正的正样本。

召回率(R值)是针对我们原来的样本而言的,它表示的是样本中的正例有多少被预测正确了。

假如我此时想吃香蕉,实验室每天都会安排10个水果,分别是6个香蕉,3个橘子,1个菠萝。我在看不见的情况下从中选出5个水果,选出了2个香蕉,2个橘子,1个菠萝。

分别求出P值,R值,F值。

1、准确率(P值):

准确率是针对预测结果而言的,它表示的是预测为正的样本中有多少是真正的样本。这里的正样本就是我想吃的香蕉。

在预测结果中,有2个香蕉,总个数是选的5个,那么P值计算:P=2/5

2、召回率(R值):

召回率是针对我们原来的样本而来的,它表示的是样本中的正例有多少被预测正确了。

这里的正类是我想吃的香蕉,而在样本中的香蕉树是6个,召回率的召回也可以这么理解,代表了原始样本中的正类召回了多少。那么R值计算:R=2/6

3、F值:

我们在评价的时候,当然是希望检索结果Precision越高越好,同时Recall也越高越好,但事实上两者在某些情况下是有矛盾的。比如在极端情况下,在这个例子中,我们只搜索出了一个结果,且是香蕉,那么Precision就是100%,但是Recall为1/6就很低;而如果我们抽取10个水果,那么比如Recall是100%,但是Precision为6/10,相对来说就会比较低。

因此P和R指标有时候会出现的矛盾的情况,这样就需要综合考虑他们,最常见的方法是F-Measure,通过计算F值来评价一个指标。特殊情况F1=2PR/(P+R)

  • 4
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,以下是手写决策树算法的代码: ```python import pandas as pd import numpy as np def calc_entropy(x): """ 计算熵 """ unique, counts = np.unique(x, return_counts=True) p = counts / len(x) return -np.sum(p * np.log2(p)) def calc_info_gain(x, y): """ 计算信息增益 """ base_entropy = calc_entropy(y) unique, counts = np.unique(x, return_counts=True) p = counts / len(x) condition_entropy = np.sum(p * np.array([calc_entropy(y[x == v]) for v in unique])) return base_entropy - condition_entropy def build_tree(x, y, feature_names): """ 构建决策树 """ if len(set(y)) == 1: return y[0] if len(feature_names) == 0: return np.bincount(y).argmax() info_gains = np.array([calc_info_gain(x[:, i], y) for i in range(x.shape[1])]) best_feature_index = np.argmax(info_gains) best_feature_name = feature_names[best_feature_index] tree = {best_feature_name: {}} for v in np.unique(x[:, best_feature_index]): mask = x[:, best_feature_index] == v sub_x = x[mask, :] sub_y = y[mask] sub_feature_names = feature_names[:best_feature_index] + feature_names[best_feature_index + 1:] tree[best_feature_name][v] = build_tree(sub_x, sub_y, sub_feature_names) return tree def predict(x, tree): """ 预测 """ if isinstance(tree, np.int64): return tree feature_name = list(tree.keys())[0] feature_index = feature_names.index(feature_name) value = x[feature_index] if value not in tree[feature_name]: value = list(tree[feature_name].keys())[0] sub_tree = tree[feature_name][value] return predict(x, sub_tree) def accuracy(y_true, y_pred): """ 准确率 """ return np.mean(y_true == y_pred) def precision(y_true, y_pred): """ 精度 """ tp = np.sum((y_true == 1) & (y_pred == 1)) fp = np.sum((y_true == 0) & (y_pred == 1)) return tp / (tp + fp) def recall(y_true, y_pred): """ 召回率 """ tp = np.sum((y_true == 1) & (y_pred == 1)) fn = np.sum((y_true == 1) & (y_pred == 0)) return tp / (tp + fn) def f_measure(y_true, y_pred): """ F度量 """ p = precision(y_true, y_pred) r = recall(y_true, y_pred) return 2 * p * r / (p + r) # 示例数据 data = pd.DataFrame({ 'age': [18, 23, 25, 30, 35, 40, 50, 55, 60], 'income': [15000, 18000, 20000, 28000, 32000, 35000, 40000, 42000, 45000], 'student': [0, 1, 1, 0, 1, 0, 0, 1, 0], 'credit_rating': [0, 0, 1, 1, 0, 0, 1, 1, 0], 'buy': [0, 0, 1, 1, 1, 0, 1, 1, 1] }) x = data.iloc[:, :-1].values y = data.iloc[:, -1].values feature_names = list(data.columns[:-1]) tree = build_tree(x, y, feature_names) y_pred = np.array([predict(x[i], tree) for i in range(x.shape[0])]) y_true = y # 输出准确率、精度、召回率、F度量 print('准确率:', accuracy(y_true, y_pred)) print('精度:', precision(y_true, y_pred)) print('召回率:', recall(y_true, y_pred)) print('F度量:', f_measure(y_true, y_pred)) ``` 运行结果如下: ``` 准确率: 1.0 精度: 1.0 召回率: 1.0 F度量: 1.0 ``` 可以看到,准确率、精度、召回率和F度量都是1,说明手写的决策树算法在这个数据集上表现得很好。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值