机器学习性能相关

Python性能测试

profile() 各函数执行次数时间

line_profiler() 逐行测试

memory_profiler() 逐行分析代码内存占用

PyCharm图形化性能测试工具

Python性能提升

多线程

一个程序至少有一个进程,一个进程至少有一个线程.

python3.x中通过threading模块创建新的线程有两种方法:一种是通过threading.Thread(Target=executable Method)-即传递给Thread对象一个可执行方法(或对象);第二种是继承threading.Thread定义子类并重写run()方法。如果想充分发挥多核CPU的计算能力需要使用multiprocessing模块

线程同步队列queue

python2.x中提供的Queue, Python3.x中提供的是queue

计算线程数设置的公式就是:
N核服务器,通过执行业务的单线程分析出本地计算时间为x,等待时间为y,则工作线程数(线程池线程数)设置为 N*(x+y)/x,能让CPU的利用率最大化。
由于有GIL的影响,python只能使用到1个核,所以这里设置N=1

计算时间占20%, 等待时间80%,那么为了利用率达到最高,可以开5个线程

协程

协程的本质就是在单线程下,由用户自己控制一个任务遇到io阻塞了就切换另外一个任务去执行,以此来提升效率。

协程是一种用户态的轻量级线程,由用户程序自己控制调度的。以前线程任务的切换是由操作系统控制的,遇到I/O自动切换,现在我们用协程的目的就是较少操作系统切换的开销,在我们自己的程序里面来控制任务的切换。

如果我们在单个线程内有20个任务,要想实现在多个任务之间切换,使用yield生成器的方式过于麻烦(需要先得到初始化一次的生成器,然后再调用send。。。非常麻烦),而使用greenlet模块可以非常简单地实现这20个任务直接的切换。

Spark性能测试

SparkBench的测试项目覆盖了Spark支持的四种最主流的应用类型,即机器学习、图计算、SQL查询和流数据计算。每种类型的应用又选择了最常用的几个算法或者应用进行比对测试,测试结果从系统资源消耗、时间消耗、数据流特点等各方面全面考察,总体而言是比较全面的测试。

spark-bench是一款spark的性能测试工具,可以用来生成数据以及训练数据,用生成的数据跑一套机器学习的算法,记录它每个环节消耗的时间。

Berkeley BigDataBench:随着Spark的推出,由AMPLab开发的一套大数据基准测试工具,官网介绍

算法空间复杂度

一个算法在计算机存储器上所占用的存储空间,包括程序代码所占用的空间,输入数据所占用的空间和辅助变量所占用的空间这三个方面。

1、有的算法只需要占用少量的临时工作单元,而且不随问题规模的大小而改变,我们称这种算法是“就地”进行的,是节省存储的算法,下面会介绍。

2、有的算法需要占用的临时工作单元数与解决问题的规模n有关,它随着n的增大而增大,当n较大时,将占用较多的存储单元,例如快速排序和归并排序算法就属于这种情况。

KNN

时间复杂度o(n*k):n为样本数量,k为单个样本特征的维度。如果不考虑特征维度的粒度为o(n)

空间复杂度o(n*k):n为样本数量,k为单个样本特征的维度。如果不考虑特征维度的粒度为o(n)

决策树 / 随机森林 

时间复杂度O(N*M*D):

O(N*M*D), N是sample的大小,M是feature的数量,D是树的深度。cart生长时,把所有feature内的值都作为分裂候选,并为其计算一个评价指标(信息增益、增益比率、gini系数等),所以每层是O(N*M),D层的树就是O(N*M*D)

空间复杂度o(N + M * Split * TreeNum ):N为样本数量,M为特征数量,Split为平均每个特征的切分点数量,TreeNum为如果为随机森林,随机森林的数目数量
逻辑回归 :耗时O(d),所需空间为O(d)

 SVM O(s * d) s =支持向量的数量,d =数据的维数 空间复杂度= O(s)

算法训练集测试集样本量选取

VC维的概念

解读机器学习基础概念:VC维的来龙去脉 - gkwang - 博客园

N个点,二分类为例,可能的输出向量总数为2的N次方,

H是假设空间,作用于N个点,若能有2的N次方个输出向量,则H能把N个点打散。

即N个点的所有可能情形(像碎片一样的)都被H产生了。

成长函数m_H(N)表示H作用于N个点能产生的所有输出向量,

m_H(N)=2的N次方,能打散;

m_H(N)<2的N次方,不能打散。

VC维就是H能打散的掉的最多点的数量,即使m_H(N)=2的N次方的最大的那个N。用dvc表示。

(个人理解:把以上所说的点想象为碎片,一个碎片里可以有无数个同一类的样本)

一般情况下,样本数量大约等于10dvc就可以了

你可能感兴趣的:(机器学习)