【问题标题】:How can I classify data with the nearest-neighbor algorithm using Python?如何使用 Python 使用最近邻算法对数据进行分类?
【发布时间】:2011-11-11 17:18:14
【问题描述】:

我需要用(我希望)最近邻算法对一些数据进行分类。我用谷歌搜索了这个问题,发现了很多库(包括 PyML、mlPy 和 Orange),但我不确定从哪里开始。

我应该如何使用 Python 实现 k-NN?

【问题讨论】:

    标签: python machine-learning


    【解决方案1】:

    特别是考虑到您在 Q 中提到的技术(k-Nearest Neighbors),我强烈推荐 scikits.learn。 [注意:发布此答案后,该项目的首席开发人员通知我该项目的 new homepage。]

    我认为将这个库与其他库区分开来的一些特性(至少是我使用过的其他 Python ML 库,这是其中的大部分):

    • 一个广泛的诊断和测试库(包括绘图 模块,通过 Matplotlib)——包括特征选择算法, confusion matrix、ROC、precision-recall等;

    • 精选的“含电池”数据集(包括 手写数字、面部图像等)特别适合机器学习技术;

    • 广泛的文档(鉴于这个项目是 只有大约两岁)包括教程和一步一步 示例代码(使用提供的数据集);

    python ML 库无一例外(至少我现在能想到的)都是一流的。 (有关十几个最流行的 Python ML 库的列表,请参阅 PyMVPA homepage。)

    例如,在过去的 12 个月中,我使用过 ffnet(用于 MLP)、neurolab(也用于 MLP)、PyBrain( Q-Learning)、neurolab (MLP) 和 PyMVPA (SVM)(都可从 Python Package Index 获得)——它们之间存在显着差异成熟度、范围和提供的基础设施,但我发现它们都具有非常高的质量。

    不过,其中最好的可能是 scikits.learn;例如,我不知道任何 python ML 库——除了 scikits.learn——包括我上面提到的三个特性中的任何一个(尽管一些有可靠的示例代码和/或教程,我不知道集成这些带有研究级数据集和诊断算法的库)。

    其次,考虑到您打算使用的技术(k-最近邻),scikits.learn 是一个特别好的选择。 Scikits.learn 包含regression(返回分数)和classification(返回类标签)的 kNN 算法,以及每种算法的详细示例代码。

    使用 scikits.learn k-最近邻模块(字面意思)再简单不过了:

    >>> # import NumPy and the relevant scikits.learn module
    >>> import numpy as NP
    >>> from sklearn import neighbors as kNN
    
    >>> # load one of the sklearn-suppplied data sets
    >>> from sklearn import datasets
    >>> iris = datasets.load_iris()
    >>> # the call to load_iris() loaded both the data and the class labels, so
    >>> # bind each to its own variable
    >>> data = iris.data
    >>> class_labels = iris.target
    
    >>> # construct a classifier-builder by instantiating the kNN module's primary class
    >>> kNN1 = kNN.NeighborsClassifier()
    
    >>> # now construct ('train') the classifier by passing the data and class labels
    >>> # to the classifier-builder
    >>> kNN1.fit(data, class_labels)
          NeighborsClassifier(n_neighbors=5, leaf_size=20, algorithm='auto')
    

    更重要的是,与几乎所有其他 ML 技术不同,k-最近邻的关键不是编码一个工作的分类器构建器,而是构建生产级 k-最近邻分类器/回归器的困难步骤是持久层 - -即,存储和快速检索从中选择最近邻居的数据点。对于 kNN 数据存储层,scikits.learn 包含一个用于球树的算法(除了明显优于kd-之外,我几乎一无所知。树(k-NN 的传统数据结构),因为它的性能在高维特征空间中不会降低。

    此外,k-最近邻需要适当的相似性度量(欧几里得距离是通常的选择,尽管并不总是最好的选择)。 Scikits.learn 包含一个独立模块,该模块由各种距离指标以及用于选择合适距离指标的测试算法组成。

    最后,我也没有提到一些库,因为它们超出了范围(PyML、贝叶斯);它们主要不是开发人员的“库”,而是最终用户的应用程序(例如,Orange),或者它们具有不寻常或难以安装的依赖项(例如,mlpy,它需要 gsl,而后者又必须从源代码构建) 至少对于我的操作系统,即 Mac OS X。

    注意:我不是 scikits.learn 的开发者/提交者。)

    【讨论】:

    • 感谢您如此详细的回答。我现在可能会从 scikits.learn 开始。
    • 感谢道格的回答。作为 scikit-learn 的开发者,我感到非常荣幸。我有几点意见,从长远来看,人们可能会觉得有用。首先,从 0.10 版本开始,导入已从 scikits.learn 更改为 sklearn。二、scikit-learn 的网站移至scikit-learn.org
    • @GaelVaroquaux 这非常有用,盖尔——我会编辑我的答案以包含它。 (感谢您创建了一个世界级的 ML 库——从我上面的回答可以看出,我显然是一个粉丝。)
    猜你喜欢
    • 2016-03-06
    • 1970-01-01
    • 2016-09-26
    • 2011-05-21
    • 2015-05-12
    • 1970-01-01
    • 2018-05-09
    • 2011-02-14
    • 2018-07-10
    相关资源
    最近更新 更多