页面树结构

2017-11-09 ApacheCN 开源组织,第二期邀请成员活动,一起走的更远 : http://www.apachecn.org/member/209.html


MachineLearning 优酷地址 : http://i.youku.com/apachecn

转至元数据结尾
转至元数据起始

关于项目的常见问题和贡献。

在这里,我们尝试给出一些常规弹出邮件列表的问题的答案。

什么是项目名称(很多人错了)?

scikit学习,但不是scikit或SciKit或sci-kit学习。也不是scikits.learn或scikits-学习,以前使用过。

你如何发表项目名称?

sy-kit学习。科学代表科学!

为什么选择scikit?

有多个scikits,它们是围绕SciPy构建的科学工具箱。您可以在https://scikits.appspot.com/scikits找到列表。除了scikit学习,另一个受欢迎的是scikit-image

我如何贡献scikit学习?

贡献。在想要添加一个通常是一项重大而冗长的任务的新算法之前,建议先从已知问题开始。

获得scikit学习用法的最佳方式是什么?

对于一般的机器学习问题,请使用 交叉验证[machine-learning]标签。

对于scikit学习使用的问题,请使用堆栈溢出 与[scikit-learn][python]标签。您也可以使用邮件列表

请确保包含一个最小的复制代码片段(理想的是短于10行),突出显示玩具数据集上的问题(例如 使用固定随机种子的sklearn.datasets功能随机生成numpy.random)。请删除任何不需要重现您的问题的代码行。

该问题应该可以通过简单地复制粘贴您的代码片段在Python shell与scikit学习安装重现。不要忘记包含import语句。

编写好的复制代码片段的更多指导可以在以下网址找到:

http://stackoverflow.com/help/mcve

如果您的问题引起了您不明白的异常(即使在谷歌搜索之后),请确保包含运行复制脚本时获得的完整追溯。

有关错误报告或功能请求,请使用Github上的 问题跟踪器

还有一个Scikit学习Gitter频道,可能会找到一些用户和开发人员。

请不要直接向任何作者发送电子邮件,要求帮助,报告错误或与scikit-learn相关的任何其他问题。

我如何创建一个束对象?

不要做一堆对象!他们不是scikit学习API的一部分。Bunch对象只是打包一些numpy数组的一种方式。作为一个scikit学习用户,您只需要数字数组来为您的模型提供数据。

例如,为了训练分类器,您需要的是X输入变量的2D数组和y目标变量的1D数组。该数组X 将特征作为列和样本保存为行。该数组y包含用于对每个样本的类成员资格进行编码的整数值X

如何将我自己的数据集加载到scikit学习可用的格式?

一般来说,scikit-learn可以作为数字数据存储为numpy数组或scipy稀疏矩阵。可转换为数字数组的其他类型,如大熊猫DataFrame也是可以接受的。

有关将数据文件加载到这些可用数据结构中的更多信息,请参阅加载外部数据集

新算法的纳入标准是什么?

我们只考虑用于包容的已知算法。经验法则自发布至少3年,引用200多次,广泛使用和有用。对广泛使用的方法提供明确改进(例如增强型数据结构或更有效的近似技术)的技术也将被考虑纳入。

从满足上述标准的算法或技术,只有那些的当前API内合身scikit学习,这是一个fit, predict/transform接口和通常具有输入/输出,一个numpy的阵列或稀疏矩阵,被接受。

贡献者应该支持通过研究论文和/或其他类似软件包中的实现来提出增加的重要性,通过常见的用例/应用程序证明其有用性,并通过基准和/或图证实性能改进(如果有的话)。预计所提出的算法应该优于至少在某些领域已经在scikit中学习的方法。

还要注意,您的实现不需要在scikit学习中与scikit学习工具一起使用。您可以以scikit学习兼容的方式实现您最喜欢的算法,将其上传到github并让我们知道。我们将在相关项目下列出

 

为什么你对scikit学习中包含的算法有何选择?

代码是维护成本,我们需要平衡我们与团队规模的代码量(并增加复杂性与特征数量非线性关系的事实)。该软件包依赖于核心开发人员利用他们的空闲时间修复错误,维护代码和审查贡献。添加的任何算法都需要开发人员的关注,此时原作者可能长期以来一直失去兴趣。也可以在邮件列表中看到这个线程

为什么从scikit学习中删除HMM?

看到你会添加图形模型或序列预测scikit学习?

 

你会添加图形模型或序列预测scikit学习吗?

不可预见的未来。scikit-learn尝试为机器学习中的基本任务提供统一的API,使用管道和元算法(如网格搜索)将所有内容都集中在一起。结构化学习所需的概念,API,算法和专业知识与scikit学习所提供的不同。如果我们开始进行任意的结构化学习,那么我们需要重新设计整个软件包,这个项目可能在自身的重量下崩溃。

有两个API类似于scikit学习的项目,做结构化预测:

  • pystruct处理一般结构化学习(关注具有近似推理的任意图形结构上的SSVM;将样本的概念定义为图形结构的一个实例)
  • seqlearn仅处理序列(专注于精确推断;具有HMM,但主要是为了完整性;将特征向量作为样本,并对特征向量之间的依赖使用偏移编码)

你会添加GPU支持吗?

不,或至少不在不久的将来。主要原因是GPU支持将引入许多软件依赖关系并引入平台特定的问题。scikit-learning旨在轻松安装在各种平台上。在神经网络之外,GPU在当今的机器学习中不起重要作用,通常可以通过仔细选择算法来获得更大的速度增益。

你支持PyPy吗?

如果您不知道,PyPy是新的,快速,及时的编译Python实现。我们不支持 当 PyPy中的NumPy支持完成或接近完成,并且SciPy也被移植时,我们可以开始思考一个端口。我们使用太多的NumPy来处理部分实现。

如何处理字符串数据(或树,图...)?

scikit学习估计器假设您将为他们提供实值特征向量。这个假设在几乎所有的图书馆都是硬编码的。但是,您可以通过多种方式将非数字输入馈送到估计器。

如果您有文本文档,可以使用术语频率特征; 请参阅 内置文本向量化器的文本特征提取。对于从任何类型的数据更一般的特征提取,请参阅 特征加载功能特征散列  

另一个常见的情况是当您对这些数据有非数字数据和自定义距离(或相似度)指标时。示例包括具有编辑距离的字符串(也称为Levenshtein距离;例如DNA或RNA序列)。这些可以编码为数字,但这样做是痛苦和容易出错的。使用任意数据的距离度量可以通过两种方式完成。

首先,许多估计器采用预计算的距离/相似矩阵,因此如果数据集不太大,可以计算所有输入对的距离。如果数据集很大,您可以使用仅具有一个“特征”的特征向量,该特征是单独数据结构的索引,并提供在该数据结构中查找实际数据的自定义度量函数。例如,使用DBSCAN与Levenshtein距离:

>>> from leven import levenshtein       
>>> import numpy as np
>>> from sklearn.cluster import dbscan
>>> data = ["ACCTCCTAGAAG", "ACCTACTAGAAGTT", "GAATATTAGGCCGA"]
>>> def lev_metric(x, y):
...     i, j = int(x[0]), int(y[0])     # extract indices
...     return levenshtein(data[i], data[j])
...
>>> X = np.arange(len(data)).reshape(-1, 1)
>>> X
array([[0],
       [1],
       [2]])
>>> dbscan(X, metric=lev_metric, eps=5, min_samples=2)  
([0, 1], array([ 0,  0, -1]))

 

(这使用第三方编辑距离包leven。)

可以使用类似的技巧,一些关心的内核,图形内核等。

为什么有时会在OSX或Linux下遇到n_jobs> 1崩溃/冻结?

几个scikit学习如工具GridSearchCVcross_val_score 内部依靠Python的在模块通过将并行执行到几个Python的过程作为参数。n_jobs > 1

问题是,由于性能原因,Python multiprocessing会执行fork系统调用而不用exec系统调用。许多图书馆(一些版本的)在OSX下的Accelerate / vecLib(某些版本的)MKL,GCC的OpenMP运行时,nvidia的Cuda(以及许多其他版本)都可以管理自己的内部线程池。在调用fork时,子进程中的线程池状态已损坏:线程池认为它有许多线程,而只有主线程状态已被分支。在这种情况下,可以更改库以使其检测到并重新初始化线程池:我们对OpenBLAS执行了此操作(从0.2.10开始在master中上游合并),并且我们向GCC的OpenMP运行时(而不是)提供了一个补丁但审查)。

但最终,真正的罪魁祸首是Python的multiprocessing,做 forkexec减少,并开始使用新的Python程序并行计算的开销。不幸的是,这违反了POSIX标准,因此像苹果这样的软件编辑器拒绝考虑在Accelerate / vecLib中缺乏叉安全作为一个bug。

在Python 3.4+中,现在可以配置multiprocessing使用'forkserver'或'spawn'启动方法(而不是默认的'fork')来管理进程池。要使用scikit-learn来解决此问题,可以将JOBLIB_START_METHOD环境变量设置为'forkserver'。但是用户应该意识到使用'forkserver'方法会阻止joblib.Parallel调用在shell会话中交互定义的函数。

如果您有multiprocessing直接使用自定义代码,而不是通过joblib使用它,您可以为您的程序全局启用'forkserver'模式:在主脚本中插入以下说明:

import multiprocessing

# other imports, custom code, load data, define model...

if __name__ == '__main__':
    multiprocessing.set_start_method('forkserver')

    # call scikit-learn utils with n_jobs > 1 here

您可以在多处理文档中的新启动方法上找到更多的默认值。

为什么不支持深入或强化学习/在scikit学习中是否支持深度或强化学习?

深度学习和强化学习需要丰富的词汇来定义一个架构,深入学习还需要GPU来进行有效的计算。然而,这些都不符合scikit学习的设计限制; 因此,深入学习和强化学习目前已经超出了scikit-learning寻求实现的范围。

为什么我的拉请求没有得到注意?

scikit学习审查过程需要大量的时间,不应该由于缺乏活动或对其提出请求进行审查而不鼓励贡献者。我们非常关心第一次正确的使用,因为维护和以后的更改是高成本的。我们很少发布任何“实验”代码,所以我们所有的贡献将立即受到高度的使用,最初可能是最高的质量。

除此之外,scikit-learning在审查带宽方面是有限的; 许多审稿人和核心开发人员都在自己的时间上进行scikit学习。如果您的拉动请求的检查缓慢,可能是因为审阅者很忙。我们要求您的理解,并要求您不要因为这个原因而关闭您的拉扯请求或停止您的工作。

如何random_state为整个执行设置一个?

对于测试和复制,通常重要的是让整个执行由具有随机组件的算法中使用的伪随机数生成器的单个种子进行控制。Scikit-learning不使用自己的全局随机状态; 每当RandomState实例或整数随机种子不作为参数提供时,它依赖于可以使用的numpy全局随机状态numpy.random.seed。例如,要将执行的numpy全局随机状态设置为42,可以在他或她的脚本中执行以下操作:

import numpy as np
np.random.seed(42) 

然而,全局随机状态在执行期间容易被其他代码修改。因此,确保可复制性的唯一方法是在RandomState 每个地方传递实例,并确保估算器和交叉验证分隔符都具有其random_state参数集。

  • 无标签