随机森林算法在单细胞数据中的应用

上次在分享一篇文献中(Single-Cell RNA-Seq Reveals AML Hierarchies
Relevant to Disease Progression and Immunity),用到一个机器学习算法----随机森林算法,我们稍微回顾一下文献中的用法:
1、对单细胞数据进行聚类(文献中采用的是KNN聚类,Seurat的聚类方法一般是用SNN,感兴趣的大家可以对聚类方法多研究一下,相似的细胞会聚类在一起,揭示了假定的分化轨迹,大家可以和monocle分析方法做个对比),如下图:


图片.png

Thus, scRNA-seq of normal BM reveals diverse hematopoietic cell types and implies differentiation trajectories consistent with current views of hematopoiesis.
后面的结果中,为了查看恶性细胞处于“轨迹”中的什么位置。随机森林的算法帮助作者映射恶性细胞到这幅图上,如下图:


图片.png

由此对恶性细胞进行很好的划分(虽然判断恶性细胞作者是通过基因组上的研究,但是单细胞转录组CNV也可以帮我们有一个初步的了解),由此我们就需要知道随机森林的用法,以及其扩展(比如整合,多样本整合用这种方法(类似于RCA,scanpy的整合方式),拟时轨迹的隐射(比如知道一个样本的你是轨迹,将肿瘤细胞通过该方法映射到轨迹上,判断肿瘤细胞处于的阶段),等等等等),这里我们要注意点对点的映射是基于细胞之间的相似度。

什么是随机森林算法?

了解随机森林首先我们要知道什么是决策树
在现实生活中,我们会遇到各种选择,不论是选择男女朋友,还是挑选水果,都是基于以往的经验来做判断。如果把判断背后的逻辑整理成一个结构图,你会发现它实际上是一个树状图,这就是我们今天要讲的决策树。

决策树的工作原理

决策树基本上就是把我们以前的经验总结出来。如果我们要出门打篮球,一般会根据“天气”、“温度”、“湿度”、“刮风”这几个条件来判断,最后得到结果:去打篮球?还是不去?

image

上面这个图就是一棵典型的决策树。我们在做决策树的时候,会经历两个阶段:构造剪枝

构造

构造就是生成一棵完整的决策树。简单来说,构造的过程就是选择什么属性作为节点的过程,那么在构造过程中,会存在三种节点:

  1. 根节点:就是树的最顶端,最开始的那个节点。在上图中,“天气”就是一个根节点;
  2. 内部节点:就是树中间的那些节点,比如说“温度”、“湿度”、“刮风”;
  3. 叶节点:就是树最底部的节点,也就是决策结果。
    节点之间存在父子关系。比如根节点会有子节点,子节点会有子子节点,但是到了叶节点就停止了,叶节点不存在子节点。那么在构造过程中,你要解决三个重要的问题:
  4. 选择哪个属性作为根节点;
  5. 选择哪些属性作为子节点;
  6. 什么时候停止并得到目标状态,即叶节点。
剪枝

剪枝就是给决策树瘦身,这一步想实现的目标就是,不需要太多的判断,同样可以得到不错的结果。之所以这么做,是为了防止“过拟合”(Overfitting)现象的发生。
过拟合:指的是模型的训练结果“太好了”,以至于在实际应用的过程中,会存在“死板”的情况,导致分类错误。
欠拟合:指的是模型的训练结果不理想。

image

造成过拟合的原因
一是因为训练集中样本量较小。如果决策树选择的属性过多,构造出来的决策树一定能够“完美”地把训练集中的样本分类,但是这样就会把训练集中一些数据的特点当成所有数据的特点,但这个特点不一定是全部数据的特点,这就使得这个决策树在真实的数据分类中出现错误,也就是模型的“泛化能力”差。
泛化能力:指的分类器是通过训练集抽象出来的分类能力,你也可以理解是举一反三的能力。如果我们太依赖于训练集的数据,那么得到的决策树容错率就会比较低,泛化能力差。因为训练集只是全部数据的抽样,并不能体现全部数据的特点。
剪枝的方法

  • 预剪枝:在决策树构造时就进行剪枝。方法是,在构造的过程中对节点进行评估,如果对某个节点进行划分,在验证集中不能带来准确性的提升,那么对这个节点进行划分就没有意义,这时就会把当前节点作为叶节点,不对其进行划分。
  • 后剪枝:在生成决策树之后再进行剪枝。通常会从决策树的叶节点开始,逐层向上对每个节点进行评估。如果剪掉这个节点子树,与保留该节点子树在分类准确性上差别不大,或者剪掉该节点子树,能在验证集中带来准确性的提升,那么就可以把该节点子树进行剪枝。方法是:用这个节点子树的叶子节点来替代该节点,类标记为这个节点子树中最频繁的那个类。
如何判断要不要去打篮球?

image

我们该如何构造一个判断是否去打篮球的决策树呢?再回顾一下决策树的构造原理,在决策过程中有三个重要的问题:将哪个属性作为根节点?选择哪些属性作为后继节点?什么时候停止并得到目标值?
显然将哪个属性(天气、温度、湿度、刮风)作为根节点是个关键问题,在这里我们先介绍两个指标:纯度信息熵

纯度:

你可以把决策树的构造过程理解成为寻找纯净划分的过程。数学上,我们可以用纯度来表示,纯度换一种方式来解释就是让目标变量的分歧最小
举个例子,假设有 3 个集合:

  • 集合 1:6 次都去打篮球;
  • 集合 2:4 次去打篮球,2 次不去打篮球;
  • 集合 3:3 次去打篮球,3 次不去打篮球。
    按照纯度指标来说,集合 1> 集合 2> 集合 3。因为集合1 的分歧最小,集合 3 的分歧最大。

信息熵:表示信息的不确定度

在信息论中,随机离散事件出现的概率存在着不确定性。为了衡量这种信息的不确定性,信息学之父香农引入了信息熵的概念,并给出了计算信息熵的数学公式:

image

p(i|t) 代表了节点 t 为分类 i 的概率,其中 log2 为取以 2 为底的对数。这里我们不是来介绍公式的,而是说存在一种度量,它能帮我们反映出来这个信息的不确定度。当不确定性越大时,它所包含的信息量也就越大,信息熵也就越高。
举个例子,假设有 2 个集合:

  • 集合 1:5 次去打篮球,1 次不去打篮球;
  • 集合 2:3 次去打篮球,3 次不去打篮球。
    在集合 1 中,有 6 次决策,其中打篮球是 5 次,不打篮球是 1 次。那么假设:类别 1 为“打篮球”,即次数为 5;类别 2 为“不打篮球”,即次数为 1。那么节点划分为类别1的概率是 5/6,为类别2的概率是1/6,带入上述信息熵公式可以计算得出:
    image

    同样,集合 2 中,也是一共 6 次决策,其中类别 1 中“打篮球”的次数是 3,类别 2“不打篮球”的次数也是 3,那么信息熵为多少呢?我们可以计算得出:
    image

    从上面的计算结果中可以看出,信息熵越大,纯度越低。当集合中的所有样本均匀混合时,信息熵最大,纯度最低。
    我们在构造决策树的时候,会基于纯度来构建。而经典的 “不纯度”的指标有三种,分别是信息增益(ID3 算法)、信息增益率(C4.5 算法)以及基尼指数(Cart 算法)

信息增益:

信息增益指的就是划分可以带来纯度的提高,信息熵的下降。它的计算公式,是父亲节点的信息熵减去所有子节点的信息熵。在计算的过程中,我们会计算每个子节点的归一化信息熵,即按照每个子节点在父节点中出现的概率,来计算这些子节点的信息熵。所以信息增益的公式可以表示为:

image

公式中 D 是父亲节点,Di 是子节点,Gain(D,a)中的 a 作为 D 节点的属性选择。
假设D 天气 = 晴的时候,会有 5 次去打篮球,5 次不打篮球。其中 D1 刮风 = 是,有 2 次打篮球,1 次不打篮球。D2 刮风 = 否,有 3 次打篮球,4 次不打篮球。那么a 代表节点的属性,即天气 = 晴。
image

针对图上这个例子,D 作为节点的信息增益为:
image

也就是 D 节点的信息熵 -2 个子节点的归一化信息熵。2个子节点归一化信息熵 =3/10 的 D1 信息熵 +7/10 的 D2 信息熵。
我们基于 ID3 的算法规则,完整地计算下我们的训练集,训练集中一共有 7 条数据,3 个打篮球,4 个不打篮球,所以根节点的信息熵是:
image

如果你将天气作为属性的划分,会有三个叶子节点 D1、D2 和D3,分别对应的是晴天、阴天和小雨。我们用 + 代表去打篮球,- 代表不去打篮球。那么第一条记录,晴天不去打篮球,可以记为 1-,于是我们可以用下面的方式来记录 D1,D2,D3:
D1(天气 = 晴天)={1-,2-,6+}
D2(天气 = 阴天)={3+,7-}
D3(天气 = 小雨)={4+,5-}
我们先分别计算三个叶子节点的信息熵:
image

因为 D1 有 3 个记录,D2 有 2 个记录,D3 有2 个记录,所以 D 中的记录一共是 3+2+2=7,即总数为 7。所以 D1 在 D(父节点)中的概率是 3/7,D2在父节点的概率是 2/7,D3 在父节点的概率是 2/7。那么作为子节点的归一化信息熵 = 3/70.918+2/71.0=0.965。
因为我们用 ID3 中的信息增益来构造决策树,所以要计算每个节点的信息增益。
天气作为属性节点的信息增益为,Gain(D , 天气)=0.985-0.965=0.020。
同理我们可以计算出其他属性作为根节点的信息增益,它们分别为:
Gain(D , 温度)=0.128
Gain(D , 湿度)=0.020
Gain(D , 刮风)=0.020
我们能看出来温度作为属性的信息增益最大。因为 ID3 就是要将信息增益最大的节点作为父节点,这样可以得到纯度高的决策树,所以我们将温度作为根节点。其决策树状图分裂为下图所示:
image

然后我们要将上图中第一个叶节点,也就是 D1={1-,2-,3+,4+}进一步进行分裂,往下划分,计算其不同属性(天气、湿度、刮风)作为节点的信息增益,可以得到:
Gain(D , 天气)=0
Gain(D , 湿度)=0
Gain(D , 刮风)=0.0615
我们能看到刮风为 D1 的节点都可以得到最大的信息增益,这里我们选取刮风作为节点。同理,我们可以按照上面的计算步骤得到完整的决策树,结果如下:
image

于是我们通过 ID3 算法得到了一棵决策树。ID3 的算法规则相对简单,可解释性强。同样也存在缺陷,比如我们会发现 ID3 算法倾向于选择取值比较多的属性。这样,如果我们把“编号”作为一个属性(一般情况下不会这么做,这里只是举个例子),那么“编号”将会被选为最优属性 。但实际上“编号”是无关属性的,它对“打篮球”的分类并没有太大作用。
所以 ID3 有一个缺陷就是,有些属性可能对分类任务没有太大作用,但是他们仍然可能会被选为最优属性。这种缺陷不是每次都会发生,只是存在一定的概率。在大部分情况下,ID3 都能生成不错的决策树分类。针对可能发生的缺陷,后人提出了新的算法进行改进。

在 ID3 算法上进行改进的 C4.5 算法

1. 采用信息增益率

因为 ID3 在计算的时候,倾向于选择取值多的属性。为了避免这个问题,C4.5 采用信息增益率的方式来选择属性。信息增益率 = 信息增益 / 属性熵
当属性有很多值的时候,相当于被划分成了许多份,虽然信息增益变大了,但是对于 C4.5 来说,属性熵也会变大,所以整体的信息增益率并不大。

2. 采用悲观剪枝

ID3 构造决策树的时候,容易产生过拟合的情况。在 C4.5中,会在决策树构造之后采用悲观剪枝(PEP),这样可以提升决策树的泛化能力。
悲观剪枝是后剪枝技术中的一种,通过递归估算每个内部节点的分类错误率,比较剪枝前后这个节点的分类错误率来决定是否对其进行剪枝。这种剪枝方法不再需要一个单独的测试数据集。

3. 离散化处理连续属性

C4.5 可以处理连续属性的情况,对连续的属性进行离散化的处理。比如打篮球存在的“湿度”属性,不按照“高、中”划分,而是按照湿度值进行计算,那么湿度取什么值都有可能。该怎么选择这个阈值呢,C4.5 选择具有最高信息增益的划分所对应的阈值

4. 处理缺失值

针对数据集不完整的情况,C4.5 也可以进行处理。
假如我们得到的是如下的数据,你会发现这个数据中存在两点问题。第一个问题是,数据集中存在数值缺失的情况,如何进行属性选择?第二个问题是,假设已经做了属性划分,但是样本在这个属性上有缺失值,该如何对样本进行划分?

image

我们不考虑缺失的数值,可以得到温度 D={2-,3+,4+,5-,6+,7-}。温度 = 高:D1={2-,3+,4+};温度 = 中:D2={6+,7-};温度 = 低:D3={5-} 。这里 + 号代表打篮球,- 号代表不打篮球。比如ID=2 时,决策是不打篮球,我们可以记录为 2-。
所以三个叶节点的信息熵可以结算为:
image

这三个节点的归一化信息熵为 3/60.918+2/61.0+1/60=0.792。
针对将属性选择为温度的信息增益率为:
Gain(D′, 温度)=Ent(D′)-0.792=1.0-0.792=0.208
D′的样本个数为 6,而 D 的样本个数为 7,所以所占权重比例为 6/7,所以 Gain(D′,温度) 所占权重比例为6/7,所以:
Gain(D, 温度)=6/7
0.208=0.178
这样即使在温度属性的数值有缺失的情况下,我们依然可以计算信息增益,并对属性进行选择。
小结:
首先 ID3 算法的优点是方法简单,缺点是对噪声敏感。训练数据如果有少量错误,可能会产生决策树分类错误。C4.5 在 IID3 的基础上,用信息增益率代替了信息增益,解决了噪声敏感的问题,并且可以对构造树进行剪枝、处理连续数值以及数值缺失等情况,但是由于 C4.5 需要对数据集进行多次扫描,算法效率相对较低。
image

当然,数学的领域总是这么晦涩难懂,真正的了解需要我们深入的学习。
接下来我们来了解什么是随机森林。
定义:在机器学习中,随机森林是一个包含多个决策树的分类器, 并且其输出的类别是由个别树输出的类别的众数而定。 Leo Breiman和Adele Cutler发展出推论出随机森林的算法。 而 "Random Forests" 是他们的商标。 这个术语是1995年由贝尔实验室的Tin Kam Ho所提出的随机决策森林(random decision forests)而来的。这个方法则是结合 Breimans 的 "Bootstrap aggregating" 想法和 Ho 的"random subspace method"以建造决策树的集合。(百度百科)
对随机森林的介绍大家可以参考这篇文章随机森林算法及其实现,数学总是这么晦涩难懂。

overview

我们假设用户了解单个分类树的构造。 随机森林种植许多分类树。 要根据输入向量对新对象进行分类,请将输入向量放在森林中的每棵树上。 每棵树都有一个分类,我们说该树对该类“投票”。 森林选择投票最多的类别(在森林中的所有树木上)。
每棵树如下生长:
1、如果训练集中的病例数为N,则从原始数据中随机抽取N个病例,但要进行替换。该样本将成为树木生长的训练集
2、如果有M个输入变量,则指定数字m << M,以便在每个节点上,从M个变量中随机选择m个变量,并使用对这m个变量的最佳分割来分割节点。在森林生长过程中,m的值保持恒定。
3、每棵树都尽可能地生长。没有修剪。
在有关随机森林的原始论文中,表明森林错误率取决于两件事:
森林中任何两棵树之间的相关性。增加相关性会增加森林错误率。
森林中每棵树的强度。错误率低的树是强分类器。增加单个树木的强度会降低森林错误率。
减小m会降低相关性和强度。增加它会同时增加。介于两者之间的某个位置是m的“最佳”范围-通常相当宽。使用oob错误率,可以快速找到该范围内的m值。这是随机森林对其比较敏感的唯一可调参数。

随机森林的特征

在当前算法中,它的准确性无与伦比。
它可以在大型数据库上高效运行。
它可以处理数千个输入变量,而无需删除变量。
它可以估算出哪些变量在分类中很重要。
随着森林建设的进展,它会生成内部的概化误差的无偏估计。
它是一种估算丢失数据的有效方法,并在丢失大部分数据时保持准确性。
它具有用于平衡类总体不平衡数据集中的错误的方法。
可以将生成的林保存起来,以备将来在其他数据上使用。
计算得出的原型可以提供有关变量与分类之间关系的信息。
它计算可用于聚类,定位异常值或(通过缩放)给出有趣数据视图的成对案例之间的邻近度。
上面的功能可以扩展到未标记的数据,从而导致无监督的群集,数据视图和异常值检测。
它提供了一种检测变量相互作用的实验方法。

备注:
随机森林不会过度拟合。 您可以运行任意数量的树。运行速度很快,在具有50,000个案例和100个变量的数据集上运行,它在一台800Mhz的计算机上在11分钟内生成了100棵树。 对于大型数据集,主要的内存需求是数据本身的存储以及三个与数据尺寸相同的整数数组。 如果计算了接近程度,则存储需求将随着案例数乘以树木数而增长(内存的需求)。

理解算法总是很让人头疼,大家可以参考这篇文章(Random Forests

Leo Breiman and Adele Cutler)[https://www.stat.berkeley.edu/~breiman/RandomForests/cc_home.htm#intro]

我们主要来关注一下如何运用代码来实现我们一开始的目标。

randomForest 包提供了利用随机森林算法解决分类和回归问题的功能;我们这里只关注随机森林算法在分类问题中的应用。
首先安装这个R包

install.packages("randomForest")

安装成功后,首先运行一下example

library(randomForset)
?randomForset

通过查看函数的帮助文档,可以看到对应的example

data(iris)
set.seed(71)
iris.rf <- randomForest(Species ~ ., data=iris, importance=TRUE,
                             proximity=TRUE)
print(iris.rf)

代码很简单,全部的功能都封装在 randomForest 这个R包中,首先来看下用于分类的数据

 str(iris)
‘data.frame‘:   150 obs. of  5 variables:
 $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
 $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
 $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
 $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
 $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
> head(iris)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa

采用数据集iris 进行分类,iris 数据集共有150行,5列,其中第5列为分类变量,共有3种分类情况,这个数据集可以看做150个样本,根据4个指标进行分类,最终分成了3类
接下来调用randomForest 函数就行分类

iris.rf <- randomForest(Species ~ ., data=iris, importance=TRUE, proximity=TRUE)

调用该函数时,通过一个表达式指定分类变量 Species 和对应的数据集data 就可以了,后面的importance 和 proximity 是计算每个变量的重要性和样本之间的距离

分类器构建完毕之后,首先看一下这个分类器的准确性

 print(iris.rf)
Call:
 randomForest(formula = Species ~ ., data = iris, importance = TRUE,      proximity = TRUE) 
               Type of random forest: classification
                     Number of trees: 500
No. of variables tried at each split: 2

        OOB estimate of  error rate: 4%
Confusion matrix:
           setosa versicolor virginica class.error
setosa         50          0         0        0.00
versicolor      0         47         3        0.06
virginica       0          3        47        0.06

print 的结果中,OOB estimate of error rate 表明了分类器的错误率为4%, Confusion matrix 表明了每个分类的详细的分类情况;

对于setosa 这个group而言,基于随机森林算法的分类器,有50个样本分类到了setosa 这个group, 而且这50个样本和iris 中属于setosa 这个group的样本完全一致,所以对于setosa 这个group而言,分类器的错误率为0;

对于versicolor 这个group而言,基于随机森林算法的分类器,有47个样本分类到了versicolor 这个group, 3个样本分类到了virginica 这个group,有3个样本分类错误,在iris 中属于versicolor 这个group的样本有50个,所以对于versicolor 这个group而言,分类器的错误率为3/50 = 0.06 ;

对于virginica 这个group而言,基于随机森林算法的分类器,有3个样本分类到了versicolor 这个group, 47个样本分类到了virginica 这个group,有3个样本分类错误,在iris 中属于virginica 这个group的样本有50个,所以对于virginica这个group而言,分类器的错误率为3/50 = 0.06 ;

然后看一下样本之间的距离

iris.mds <- cmdscale(1 - iris.rf$proximity, eig=TRUE)

通过调用cmdscale 函数进行样本之间的距离,proximity 是样本之间的相似度矩阵,所以用1减去之后得到样本的类似距离矩阵的一个矩阵

iris.mds 的结果如下

str(iris.mds)
List of 5
 $ points: num [1:150, 1:2] -0.566 -0.566 -0.566 -0.565 -0.565 ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : chr [1:150] "1" "2" "3" "4" ...
  .. ..$ : NULL
 $ eig   : num [1:150] 23.87 20.89 2.32 1.67 1.23 ...
 $ x     : NULL
 $ ac    : num 0
 $ GOF   : num [1:2] 0.723 0.786
> head(iris.mds$points)
        [,1]       [,2]
1 -0.5656446 0.01611053
2 -0.5656904 0.01585927
3 -0.5656267 0.01654988
4 -0.5651292 0.01649026
5 -0.5653773 0.01576609
6 -0.5651923 0.01663060

在iris.mds 中points可以看做每个样本映射到2维空间中的坐标,每一维空间是一个分类特征,但是不是最原始的4个特征,而是由4个特征衍生得到的新的分类特征,根据这个坐标,可以画一张散点图,得到每个样本基于两个分类变量的分组情况

plot(iris.mds$points, col = rep(c("red", "blue", "green"), each = 50))

生成的图片如下:

技术分享

图中不同分类的样本用不同的颜色标注,可以看到基于两个新的分类特征,样本的分组效果还是很好的,不同组的样本明显区分开来

最后,在看一下4个特征,每个特征的重要性

 iris.rf$importance
                  setosa   versicolor  virginica MeanDecreaseAccuracy
Sepal.Length 0.027726158 0.0202591689 0.03688967          0.028920613
Sepal.Width  0.007300694 0.0006999737 0.01078650          0.006093858
Petal.Length 0.331994212 0.3171074926 0.31762366          0.319580655
Petal.Width  0.332417881 0.3004615039 0.26540155          0.296416932
             MeanDecreaseGini
Sepal.Length         9.013793
Sepal.Width          2.263645
Petal.Length        44.436189
Petal.Width         43.571706

之前调用randomForest 函数时,通过指定importance = TRUE 来计算每个特征的importance , 在 iris.rf$importance 矩阵中,有两个值是需要重点关注的MeanDecreaseAccuracy 和 MeanDecreaseGini

我们还可以利用

varImpPlot(iris.rf, main = "Top 30 - variable importance")

生成的图片如下:

技术分享

图中和坐标为importance 结果中的MeanDecreaseAccuracy 和 MeanDecreaseGini 指标的值,纵坐标为对应的每个分类特征,该函数默认画top30个特征,由于这个数据集只有4个分类特征,所以4个都出现了。

得到分类器之后,最后进行预测

labeled_input = result_forest.predict(input_data)

接下来是python实现随机森林的代码
数据集如下:


JH3KK$5LSO)()JB$RT%%JQH.png

图中A,B,C,D,E,F列表示六个特征,G表示样本标签。每一行数据即为一个样本的六个特征和标签。

from sklearn.ensemble import RandomForestClassifier
import csv
from sklearn.cross_validation import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.metrics import confusion_matrix
from sklearn.metrics import classification_report
from sklearn.preprocessing import StandardScaler

这里我们看一下其中的函数
1、train_test_split,随机划分样本数据为训练集和测试集的
eg:train_X,test_X,train_y,test_y = train_test_split(train_data,train_target,test_size=0.3,random_state=5)
参数:
train_data:待划分样本数据
train_target:待划分样本数据的结果(标签)
test_size:测试数据占样本数据的比例,若整数则样本数量
random_state:设置随机数种子,保证每次都是同一个随机数。若为0或不填,则每次得到数据都不一样
2、accuracy_score,分类准确率分数是指所有分类正确的百分比。分类准确率这一衡量分类器的标准比较容易理解,但是它不能告诉你响应值的潜在分布,并且它也不能告诉你分类器犯错的类型。
eg:sklearn.metrics.accuracy_score(y_true, y_pred, normalize=True, sample_weight=None)
参数: normalize:默认值为True,返回正确分类的比例;如果为False,返回正确分类的样本数

最后,请保持愤怒,让王多鱼倾家荡产

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342