【机器学习】【数据分析】KNN算法中,精确度(precision),准确率(accuracy)和召回率(recall)的理解

评价一个KNN模型的指标中,这三个有点不好理解,现在理一理。precision和accuracy这两个其实是近义词,只好通过具体的算法来区分。

最近在看《康熙王朝》,姑且就拿皇上对忠臣奸臣的判断做类比。

TP(True Positive)(真忠臣)实为忠臣,皇上也觉得他是忠臣的数量;FN(False Negative)(假奸臣)实际为忠臣,皇上确认为是奸臣的数量(这里False和Negative相当于负负得正,假奸臣就是忠臣);FP(False Positive)(假忠臣)实际是奸臣,皇上却认他是忠臣的数量;TN(True Negative)(真奸臣)实际是奸臣,皇上也认为是奸臣的数量。可以得出(TP + FN)是全部实际的忠臣数,而(TP + FP)是所有皇上认为是忠臣的数量。

  1. 精确率 precision
    1. 精确率(precision)= TP / (TP + FP),意思是皇上心中的忠臣里,是真正忠臣的比率。
  2. 准确率 accuracy
    1. 准确率(accuracy) =   (TP + TN) / (TP + FN + FP + TN) ,意思是所有大臣当中,没被冤枉的那些大臣的比率,也就是皇上心中判断正确的大臣比率。细分一下,其实是所有大臣中,皇上没冤枉的忠臣的比率加上皇上没冤枉的奸臣的比率。TP  / (TP + FN + FP + TN)   +   TN / (TP + FN + FP + TN)
  3. 召回率 recall
    1. 召回率(recall) = TP / (TP + FN),意思是所有真正的忠臣里,也被皇上认为是忠臣的比率。
    2. 那为什么会叫召回recall这个奇怪的名字呢,估计是被冤枉的那些忠臣会从刑场上召回吧哈哈哈哈哈。
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,让我来为您解答这个问题。 首先,我们需要准备数据。可以从UCI机器学习下载心脏病数据集。数据集包含13个输入特征和1个二元输出标签,其1表示患有心脏病,0表示没有。我们需要将数据集分为训练集和测试集。 接下来,我们需要定义距离度量函数。在KNN算法,我们需要计算测试数据点与每个训练数据点之间的距离。通常使用欧氏距离作为距离度量函数。 接着,我们需要实现KNN算法算法的核心思想是找到与测试数据点最近的K个训练数据点,并根据它们的标签进行投票,以确定测试数据点的标签。 在KNN算法,K的值是一个重要的超参数。我们需要通过尝试不同的K值来找到最佳的K值。为了评估模型的性能,我们可以使用准确率、精确率、召回率、F1值等指标。 最后,我们需要对模型进行评估。我们可以使用交叉验证等技术来评估模型的泛化能力。 代码实现如下: ```python import numpy as np # 数据处理 def load_data(): data = np.genfromtxt('heart.csv', delimiter=',', skip_header=1) X = data[:, :-1] y = data[:, -1].astype(int) return X, y def split_data(X, y, test_ratio=0.3): n_samples = X.shape[0] n_test = int(n_samples * test_ratio) indices = np.random.permutation(n_samples) X_train = X[indices[:-n_test]] y_train = y[indices[:-n_test]] X_test = X[indices[-n_test:]] y_test = y[indices[-n_test:]] return X_train, y_train, X_test, y_test # 距离度量函数 def euclidean_distance(x1, x2): return np.sqrt(np.sum((x1 - x2) ** 2)) # KNN算法 class KNN: def __init__(self, k=3): self.k = k def fit(self, X, y): self.X_train = X self.y_train = y def predict(self, X): y_pred = np.zeros(X.shape[0]) for i, x in enumerate(X): distances = [euclidean_distance(x, x_train) for x_train in self.X_train] k_indices = np.argsort(distances)[:self.k] k_nearest_labels = [self.y_train[i] for i in k_indices] y_pred[i] = max(set(k_nearest_labels), key=k_nearest_labels.count) return y_pred # 模型调参 def grid_search(X_train, y_train, X_val, y_val): best_acc = 0 best_k = None for k in range(1, 10): knn = KNN(k=k) knn.fit(X_train, y_train) y_val_pred = knn.predict(X_val) acc = np.mean(y_val_pred == y_val) if acc > best_acc: best_acc = acc best_k = k return best_k # 模型评估 def evaluate(y_true, y_pred): acc = np.mean(y_true == y_pred) tp = np.sum((y_true == 1) & (y_pred == 1)) tn = np.sum((y_true == 0) & (y_pred == 0)) fp = np.sum((y_true == 0) & (y_pred == 1)) fn = np.sum((y_true == 1) & (y_pred == 0)) precision = tp / (tp + fp) recall = tp / (tp + fn) f1 = 2 * precision * recall / (precision + recall) return {'accuracy': acc, 'precision': precision, 'recall': recall, 'f1': f1} # 主程序 X, y = load_data() X_train, y_train, X_test, y_test = split_data(X, y, test_ratio=0.3) best_k = grid_search(X_train, y_train, X_test, y_test) knn = KNN(k=best_k) knn.fit(X_train, y_train) y_test_pred = knn.predict(X_test) metrics = evaluate(y_test, y_test_pred) print(metrics) ``` 注意,由于KNN算法的计算复杂度较高,因此在处理大规模数据时可能会遇到性能问题。此外,KNN算法对输入数据的特征缩放敏感,因此在应用算法时应该进行特征缩放。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值