03-分类准确度

引言

  上一篇博客中,我们使用 train_test_split 的方式(将原始数据集分为了训练数据集和测试数据集两部分,训练数据集用于训练模型,而测试数据集用于测试模型)对自己实现的 kNN 算法和 sklearn 中的 kNN 算法进行了算法性能的测试,其评测标准十分的简单,即分类的准确度(accuracy)

  在本文中,我们首先会再使用这样的思路用我们的 kNN 算法在另外一个更大一些的数据集上进行测试。与此同时,我们进一步来封装 accuracy,同时也学习 sklearn 中分类的准确度相应的调用方式。最后,我们真正使用我们的测试数据集测试出的模型的结果来看,所谓的模型选择是怎么回事?在这个过程中,我们将接触机器学习中一个非常重要的概念,就是超参数


分类准确度

下面我将以手写数字数据集为例,计算相应的分类准确度。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

我们知道每一个机器学习算法最后都需要预测一下准确率是有必要的,所以我们需要封装一下预测准确率的函数。

# metrics.py

import numpy as np

def accuracy_score(y_true, y_predict):
    """计算y_true和y_predict之间的准确率"""
    assert y_true.shape[0] == y_predict.shape[0], \
        "the size of y_true must be equal to the size of y_predict"
    return sum(y_true == y_predict) / len(y_true)

在这里插入图片描述

从上面的步骤可以看出,y_predict 中存储的是预测的数据,但是有时候我们不关心最后的预测数据,我们只关心预测正确率,所以我们在我们自己实现的 kNN 算法中在封装一个函数 score,可以直接算出准确率。

import numpy as np
from collections import Counter
from math import sqrt
from metrics import accuracy_score

class kNNClassifier:
    def __init__(self, k):
        """初始化kNN分类器"""
        assert k >= 1, "k must be valid"
        self.k = k
        self._X_tarin = None
        self._y_train = None
    def fit(self, X_train, y_train):
        """根据训练数据集X_train和y_train训练kNN分类器"""
        self._X_train = X_train
        self._y_train = y_train
        return self
    def predict(self, X_predict):
        """给定待预测数据集X_predict,返回表示X_predict的结果向量"""
        y_predict = [self._predict(x) for x in X_predict]
        return np.array(y_predict)
    def _predict(self, x):
        """给定单个待预测数据x,返回x_predict的预测结果值"""
        distances = [ sqrt(np.sum((x_train - x) ** 2)) for x_train in self._X_train ]
        nearest = np.argsort(distances)
        topK_y = [ self._y_train[i] for i in nearest[:self.k] ]
        votes = Counter(topK_y)

        return votes.most_common(1)[0][0]
    def score(self, X_test, y_test):
        """根据测试数据集 X_test 和 y_test 确定当前模型的准确度"""
        y_predict = self.predict(X_test)
        return accuracy_score(y_test, y_predict)
    def __repr__(self):
        return "KNN(k=%d)" % self.k

在这里插入图片描述


使用sklearn的accuracy_score

上面我们用自己的 kNN 算法计算了分类准确度,下面我们再使用 scikit-learn 中的 accuracy_score

在这里插入图片描述


具体代码见Machine-Learning

猜你喜欢

转载自blog.csdn.net/qq_41033011/article/details/108963032