返回

赤霞珠还是品丽珠:Sklearn 中的 KNN 带您鉴别红酒之谜

见解分享

在觥筹交错的酒会上,想成为一个优雅从容的红酒鉴赏家,透过酒杯,识得酒液中酝藏的奥秘,并且能如数家珍地娓娓道来吗?Sklearn 中的 KNN 算法,为您提供了一双慧眼,让您即使不是品酒专家,也能准确无误地鉴别出红酒的种类,在酒友面前侃侃而谈,指点江山。

KNN 算法(K 近邻算法)是机器学习中最简单、最容易理解的算法之一。它的基本思想是:如果一个样本在特征空间中的 k 个最近邻样本的大多数属于某一个类别,那么这个样本也属于这个类别。

在 Sklearn 中,已经封装好了 KNN 算法。我们只需几行简单的代码,就可以使用 KNN 算法来进行红酒鉴别。

from sklearn.neighbors import KNeighborsClassifier

# 导入红酒数据集
wine_data = pd.read_csv('wine.csv')

# 将数据集分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(wine_data.drop('class', axis=1), wine_data['class'], test_size=0.2)

# 创建一个 KNN 分类器
knn = KNeighborsClassifier(n_neighbors=5)

# 训练分类器
knn.fit(X_train, y_train)

# 预测测试集中的数据
y_pred = knn.predict(X_test)

# 评估分类器的性能
print('准确率:', accuracy_score(y_test, y_pred))

运行以上代码,即可输出 KNN 算法在红酒鉴别任务上的准确率。

除了使用 Sklearn 中的 KNN 算法包之外,我们还可以自己动手实现 KNN 算法。

def knn(X_train, y_train, X_test, k):
    """
    KNN算法

    参数:
        X_train:训练集特征矩阵
        y_train:训练集标签向量
        X_test:测试集特征矩阵
        k:最近邻样本数

    返回值:
        y_pred:测试集预测标签向量
    """

    # 计算训练集和测试集之间的距离矩阵
    dist_matrix = distance_matrix(X_train, X_test)

    # 找到每个测试样本的 k 个最近邻样本
    knn_indices = np.argsort(dist_matrix, axis=1)[:, :k]

    # 预测每个测试样本的标签
    y_pred = np.array([np.argmax(np.bincount(y_train[knn_indices[i]])) for i in range(X_test.shape[0])])

    return y_pred


# 导入红酒数据集
wine_data = pd.read_csv('wine.csv')

# 将数据集分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(wine_data.drop('class', axis=1), wine_data['class'], test_size=0.2)

# 使用 KNN 算法进行红酒鉴别
y_pred = knn(X_train, y_train, X_test, 5)

# 评估分类器的性能
print('准确率:', accuracy_score(y_test, y_pred))

运行以上代码,同样可以输出 KNN 算法在红酒鉴别任务上的准确率。

通过对比,我们可以发现,Sklearn 中的 KNN 算法包和我们自己实现的 KNN 算法在红酒鉴别任务上的准确率基本相同。这说明,Sklearn 中的 KNN 算法包封装得非常好,我们可以直接使用它来进行机器学习任务。

现在,您已经掌握了 KNN 算法的原理和使用方法,赶快动手,用 KNN 算法来鉴别一下您手中的那杯红酒吧!