ML Basics: False Positives, False Negatives(ML Tidbits-4)

1. 真阳性/真阴性/假阳性/假阴性

度量指标:准确率

image.png

其他度量指标:假阴性率/假阳性率

image.png

假阴性率是指的事实上是阳性,你把它判断为阴性的比率

假阳性率是指的事实上是阴性,你把它判断为阳性的比例

参考文献

ML Tidbits
ML Basics: False Positives, False Negatives


深入探讨多分类模型Accuracy/Precision/Recall/F1-score

前言

众所周知,机器学习分类模型常用评价指标有Accuracy, Precision, Recall和F1-score,而回归模型最常用指标有MAE和RMSE。但是我们真正了解这些评价指标的意义吗?

在具体场景(如不均衡多分类)中到底应该以哪种指标为主要参考呢?多分类模型和二分类模型的评价指标有啥区别?多分类问题中,为什么Accuracy = micro precision = micro recall = micro F1-score? 什么时候用macro, weighted, micro precision/ recall/ F1-score?

这几天为了回复严谨(划去: 刁难)的reviewer,我查阅了一些文章,总算是梳理清楚啦。在这里分享给大家,权当做个总结。今天要讲的主要分为以下两点:

  • 二分类模型的常见指标快速回顾
  • 多分类模型的常见指标详细解析

在探讨这些问题前,让我们先回顾一下最常见的指标Accuracy到底有哪些不足。

Accuracy是分类问题中最常用的指标,它计算了分类正确的预测数与总预测数的比值。但是,对于不平衡数据集而言,Accuracy并不是一个好指标。为啥?

假设我们有100张图片,其中91张图片是「狗」,5张是「猫」,4张是「猪」,我们希望训练一个三分类器,能正确识别图片里动物的类别。其中,狗这个类别就是大多数类 (majority class)。当大多数类中样本(狗)的数量远超过其他类别(猫、猪)时,如果采用Accuracy来评估分类器的好坏,那么即便模型性能很差 (如无论输入什么图片,都预测为「狗」),也可以得到较高的Accuracy Score(如91%)。此时,虽然Accuracy Score很高,但是意义不大。当数据异常不平衡时,Accuracy评估方法的缺陷尤为显著。

因此,我们需要引入Precision (精准度),Recall (召回率)和F1-score评估指标。考虑到二分类和多分类模型中,评估指标的计算方法略有不同,我们将其分开讨论。

二分类模型的常见指标快速回顾

在二分类问题中,假设该样本一共有两种类别:Positive和Negative。当分类器预测结束,我们可以绘制出混淆矩阵(confusion matrix)。其中分类结果分为如下几种:

image
  • True Positive (TP): 把正样本成功预测为正。
  • True Negative (TN):把负样本成功预测为负。
  • False Positive (FP):把负样本错误地预测为正。
  • False Negative (FN):把正样本错误的预测为负。
image

在二分类模型中,Accuracy,Precision,Recall和F1 score的定义如下:

其中,Precision着重评估在预测为Positive的所有数据中,真实Positve的数据到底占多少?Recall着重评估:在所有的Positive数据中,到底有多少数据被成功预测为Positive?

举个例子,一个医院新开发了一套癌症AI诊断系统,想评估其性能好坏。我们把病人得了癌症定义为Positive,没得癌症定义为Negative。那么, 到底该用什么指标进行评估呢?

如用Precision对系统进行评估,那么其回答的问题就是:

<pre data-tool="mdnice编辑器" style="margin: 10px 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important;">

在诊断为癌症的一堆人中,到底有多少人真得了癌症?

</pre>

如用Recall对系统进行评估,那么其回答的问题就是:

<pre data-tool="mdnice编辑器" style="margin: 10px 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important;">

在一堆得了癌症的病人中,到底有多少人能被成功检测出癌症?

</pre>

如用Accuracy对系统进行评估,那么其回答的问题就是:

<pre data-tool="mdnice编辑器" style="margin: 10px 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important;">

在一堆癌症病人和正常人中,有多少人被系统给出了正确诊断结果(患癌或没患癌)?

</pre>

OK,那啥时候应该更注重Recall而不是Precision呢?

当False Negative (FN)的成本代价很高 (后果很严重),希望尽量避免产生FN时,应该着重考虑提高Recall指标。

在上述例子里,False Negative是得了癌症的病人没有被诊断出癌症,这种情况是最应该避免的。我们宁可把健康人误诊为癌症 (FP),也不能让真正患病的人检测不出癌症 (FN) 而耽误治疗离世。在这里,癌症诊断系统的目标是:尽可能提高Recall值,哪怕牺牲一部分Precision。

那啥时候应该更注重Precision而不是Recall呢?

当False Positive (FP)的成本代价很高 (后果很严重)时,即期望尽量避免产生FP时,应该着重考虑提高Precision指标。

以垃圾邮件屏蔽系统为例,垃圾邮件为Positive,正常邮件为Negative,False Positive是把正常邮件识别为垃圾邮件,这种情况是最应该避免的(你能容忍一封重要工作邮件直接进了垃圾箱,被不知不觉删除吗?)。我们宁可把垃圾邮件标记为正常邮件 (FN),也不能让正常邮件直接进垃圾箱 (FP)。在这里,垃圾邮件屏蔽系统的目标是:尽可能提高Precision值,哪怕牺牲一部分recall。

而F1-score是Precision和Recall两者的综合。

举个更有意思的例子(我拍脑袋想出来的,绝对原创哈),假设检察机关想将罪犯捉拿归案,需要对所有人群进行分析,以判断某人犯了罪(Positive),还是没犯罪(Negative)。显然,检察机关希望不漏掉一个罪人(提高recall),也不错怪一个好人(提高precision),所以就需要同时权衡recall和precision两个指标。

尤其在上个世纪,中国司法体制会更偏向Recall,即「天网恢恢,疏而不漏,任何罪犯都插翅难飞」。而西方司法系统会更偏向Precision,即「绝不冤枉一个好人,但是难免有罪犯成为漏网之鱼,逍遥法外」。到底是哪种更好呢?显然,极端并不可取。Precision和Recall都应该越高越好,也就是F1应该越高越好。

呼,二分类问题的常见指标和试用场景终于讲完了。咦,说好的快速回顾呢?

多分类模型的常见指标解析

在多分类(大于两个类)问题中,假设我们要开发一个动物识别系统,来区分输入图片是猫,狗还是猪。给定分类器一堆动物图片,产生了如下结果混淆矩阵。

image

在混淆矩阵中,正确的分类样本(Actual label = Predicted label)分布在左上到右下的对角线上。其中,Accuracy的定义为分类正确(对角线上)的样本数与总样本数的比值。Accuracy度量的是全局样本预测情况。而对于Precision和Recall而言,每个类都需要单独计算其Precision和Recall

image

比如,对类别「猪」而言,其Precision和Recall分别为:

也就是,

(P代表Precision)

(R代表Recall)

如果想评估该识别系统的总体功能,必须考虑猫、狗、猪三个类别的综合预测性能。那么,到底要怎么综合这三个类别的Precision呢?是简单加起来做平均吗?通常来说, 我们有如下几种解决方案(也可参考scikit-learn官网):

1. Macro-average方法

该方法最简单,直接将不同类别的评估指标(Precision/ Recall/ F1-score)加起来求平均,给所有类别相同的权重。该方法能够平等看待每个类别,但是它的值会受稀有类别影响。

2. Weighted-average方法

该方法给不同类别不同权重(权重根据该类别的真实分布比例确定),每个类别乘权重后再进行相加。该方法考虑了类别不平衡情况,它的值更容易受到常见类(majority class)的影响

(W代表权重,N代表样本在该类别下的真实数目)

3. Micro-average方法

该方法把每个类别的TP, FP, FN先相加之后,在根据二分类的公式进行计算。

其中,特别有意思的是,Micro-precision和Micro-recall竟然始终相同! 这是为啥呢?

这是因为在某一类中的False Positive样本,一定是其他某类别的False Negative样本。听起来有点抽象?举个例子,比如说系统错把「狗」预测成「猫」,那么对于狗而言,其错误类型就是False Negative,对于猫而言,其错误类型就是False Positive。于此同时,Micro-precision和Micro-recall的数值都等于Accuracy,因为它们计算了对角线样本数和总样本数的比值,总结就是:

最后,我们运行一下代码,检验手动计算结果是否和Sklearn包结果一致:

<pre data-tool="mdnice编辑器" style="margin: 10px 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important;">

import numpy as np

</pre>

image

<pre data-tool="mdnice编辑器" style="margin: 10px 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important;">

print('------Weighted------')

</pre>

image

运算结果完全一致,OK,机器学习多分类模型的常见评估指标已经基本介绍完毕,大家如果有疑问尽情在评论区留言哈,我争取尽快回复大家 :)


一、前言

最近分类问题搞的有点多,但对一些指标依旧有模糊的地方(虽然做了笔记), 事实证明, 笔记笔记,没有进到脑子里呀。因此,我想着肯定有跟我一样半生半熟的小伙伴在分类指标这块依旧有迷惑,毕竟常用的几个大多数情况下就够用了, 这篇文章就主要讲一讲分类的评估指标。

二、几个定义:混淆矩阵

  • TP:True Positives, 表示实际为正例且被分类器判定为正例的样本数

  • FP:False Positives, 表示实际为负例且被分类器判定为正例的样本数

  • FN:False Negatives, 表示实际为正例但被分类器判定为负例的样本数

  • TN:True Negatives, 表示实际为负例且被分类器判定为负例的样本数

一个小技巧, 第一个字母表示划分正确与否, T 表示判定正确(判定正确), F表示判定错误(False);第二个字母表示分类器判定结果, P表示判定为正例, N表示判定为负例。

三、****几个常规的指标

Accuracy:

image

Accuracy 能够清晰的判断我们模型的表现,但有一个严重的缺陷:在正负样本不均衡的情况下,占比大的类别往往会成为影响 Accuracy 的最主要因素,此时的 Accuracy 并不能很好的反映模型的整体情况。

Precision:

image

Recall:

image

Precision 与 Recall 的权衡

精确率高,意味着分类器要尽量在 “更有把握” 的情况下才将样本预测为正样本, 这意味着精确率能够很好的体现模型对于负样本的区分能力,精确率越高,则模型对负样本区分能力越强。

召回率高,意味着分类器尽可能将有可能为正样本的样本预测为正样本,这意味着召回率能够很好的体现模型对于正样本的区分能力,召回率越高,则模型对正样本的区分能力越强。

从上面的分析可以看出,精确率与召回率是此消彼长的关系, 如果分类器只把可能性大的样本预测为正样本,那么会漏掉很多可能性相对不大但依旧满足的正样本,从而导致召回率降低。

四、****F1-Score

F1-Score 能够很好的评估模型,其主要用于二分类问题, 计算如下:

image

而 更一般的有 [图片上传失败...(image-f177bc-1596257561508)]

image

其实, [图片上传失败...(image-818c5f-1596257561508)]

本质上是Recall, Precision 权重比, 当 [图片上传失败...(image-440163-1596257561508)]

时, [图片上传失败...(image-3a09ef-1596257561508)]

表明 Recall 的权重要比Precision高,其影响更大, ;当 [图片上传失败...(image-bc45ad-1596257561508)]

时, [图片上传失败...(image-2ee799-1596257561508)]

表明 Recall 的权重要比Precision低, 对应的影响更小;

前面提到 F1 针对的是二分类,而更一般的是,对于多分类问题来说, F1 的计算有多种方式,可以参见 Scikit-Learn 中的评价指标,我们来分别介绍一下。

对于一个多分类问题,假设,对于分类 [图片上传失败...(image-5d8639-1596257561508)]

而言有: [图片上传失败...(image-af765c-1596257561508)]

, 那么各种 F1 的值计算如下。

**Macro F1: **宏平均

Macro 算法在计算 Precision 与 Recall 时是先分别计算每个类别的Precision 与 Recall, 然后再进行平均。

image

那么我们就得到最终的 Macro F1 的计算为:

image

我们看到, Macro F1 本质上是所有类别的统计指标的算术平均值来求得的,这样单纯的平均忽略了样本之间分布可能存在极大不平衡的情况

Micro F1 :微平均

Micro 算法在计算 Precision 与 Recall 时会将所有类直接放到一起来计算。

image

Macro vs Micro [1]

Macro 相对 Micro 而言,小类别起到的作用更大,举个例子而言,对于一个四分类问题有:

  • class A:1 TP, 1 FP

  • class B:10 TP , 90 FP

  • class C:1 TP, 1 FP

  • class D:1 TP, 1 FP

那么对于 Precision 的计算有:

image

我们看到,对于 Macro 来说, 小类别相当程度上拉高了 Precision 的值,而实际上, 并没有那么多样本被正确分类,考虑到实际的环境中,真实样本分布和训练样本分布相同的情况下,这种指标明显是有问题的, 小类别起到的作用太大,以至于大样本的分类情况不佳。而对于 Micro 来说,其考虑到了这种样本不均衡的问题, 因此在这种情况下相对较佳。

总的来说, 如果你的类别比较均衡,则随便;如果你认为大样本的类别应该占据更重要的位置, 使用Micro;如果你认为小样本也应该占据重要的位置,则使用 Macro;如果 Micro << Macro , 则意味着在大样本类别中出现了严重的分类错误;如果 Macro << Micro , 则意味着小样本类别中出现了严重的分类错误。

为了解决 Macro 无法衡量样本均衡问题,一个很好的方法是求加权的 Macro, 因此 Weighed F1 出现了。

Weight F1

Weighted 算法算术 Macro 算法的改良版,是为了解决Macro中没有考虑样本不均衡的原因, 在计算 Precision与Recall 时候,各个类别的 Precision 与 Recall要乘以该类在总样本中的占比来求和:

image

那么我们就得到最终的 Macro F1 的计算为:

image

五、MCC :马修斯相关系数

MCC 主要用于衡量二分类问题,其综合考虑了 TP TN, FP , FN, 是一个比较均衡的指标, 对于样本不均衡情况下也可以使用。MCC的取值范围在[-1.1],取值为1表示预测与实际完全一致, 取值为0表示预测的结果还不如随机预测的结果,-1表示预测结果与实际的结果完全不一致。因此我们看到, MCC 本质上描述了预测结果与实际结果之间的相关系数。

image

值得注意的是,对于两个分类器而言,可能其中一个分类器的 F1 值较高,而其 MCC 值较低, 这表示单一的指标是无法衡量分类器的所有优点与缺点的。

六、ROC 曲线

在分类任务中,测试部分通常是获得一个概率表示当前样本属于正例的概率, 我们往往会采取一个阈值,大于该阈值的为正例, 小于该阈值的为负例。如果我们减小这个阈值, 那么会有更多的样本被识别为正类,这会提高正类的识别率,但同时会降低负类的识别率。

为了形象的描述上述的这种变化, 引入ROC曲线来评价一个分类器的好坏。ROC 曲线主要关注两个指标:

image

其中, FPR 代表将负例错分为正例的概率, TPR 表示能将正例分对的概率, 如果我们增大阈值, 则 TPR 会增加,而对应的FPR也会增大, 而绘制ROC曲线能够帮助我们找到二者的均衡点,下图很清晰的描述了ROC 曲线关系:

image

在 ROC 曲线中, 有:

  • FPR = 0, TPR = 0:表示将每一个实例都预测为负类

  • FPR = 1, TPR = 1:表示将每一个实例都预测为正例

  • FPR = 0, TPR = 1:为最优分类点

  • 分类器对应的ROC曲线应该尽可能靠近坐标轴的左上角, 而对角线的位置意味着分类器的效果和随机猜测一样的差。

ROC曲线在测试集中的样本分布发生变化的时候能够保持不变。但遗憾的是,很多时候, ROC 曲线并不能清晰的说明哪个分类器的效果更好, 而 AUC 恰恰能够对分类器做出直观的评价。

七、AUC:Area under Curve

AUC 为ROC 曲线下的面积, 这个面积的数值介于0到1之间, 能够直观的评价出分类器的好坏, AUC的值越大, 分类器效果越好。

  • AUC = 1:完美分类器, 采用该模型,不管设定什么阈值都能得出完美预测(绝大多数时候不存在)

  • 0.5 < AUC < 1:优于随机猜测,分类器好好设定阈值的话,有预测价值

  • AUC = 0.5:跟随机猜测一样,模型没有预测价值

  • AUC < 0.5 :比随机猜测还差,但是如果反着预测,就优于随机猜测。

值得一提的是,两个模型的AUC 相等并不代表模型的效果相同, 比如这样:

image

实际场景中, AUC 的确是非常常用的一种指标。

需要注意的是, 在多分类场景下的 ROC 曲线以及 AUC 值, 此时 ROC 曲线应该有多个, 而AUC 的计算如下:

image

八、P-R 曲线

P-R 曲线其横坐标为 Recall, 纵坐标为 Precision, 其能帮助我们很好的做出权衡

image

在上图中,我们发现, A 完全包住了C, 着意味着A 的Precision 与 Recall 都高于C, A优于C。而对比 A,B, 二者存在交叉的情况,此时采用曲线下面积大小衡量性能,面积越大,性能越好,此处的A优于B。

九、最后

对于最终分类指标的选择, 在不同数据集,不同场景,不同时间下都会有不同的选择,但往往最好选出一个指标来做优化,对于二分类问题,我目前用 AUC 比较多一些, 多分类我还是看 F1 值。

十、Reference

[1] Should I make decisions based on micro-averaged or macro-averaged evaluation measures?[2] Micro Average vs Macro average Performance in a Multiclass classification setting>[3 机器学习性能评估指标


在机器学习中,性能测量是一项重要任务。当涉及到分类问题时,我们依靠AUC - ROC曲线来做性能评测。当我们需要检查或可视化多类分类问题的性能时,我们使用AUC(曲线下面积)和ROC(接收器操作特性)曲线。它是检查任何分类模型性能的最重要的评估指标之一。AUC有时也被写为AUROC(接收器工作特性下的区域),本篇文章我们将着重于回答以下问题:

1.什么是AUC - ROC曲线?

2.定义AUC和ROC曲线中使用的术语。

3.如何推测模型的性能?

4.灵敏度,特异性,FPR和阈值之间的关系。

5.如何使用AUC-ROC曲线进行多类别分类?

什么是AUC-ROC 曲线?

AUC - ROC曲线是在各种阈值设置下的分类问题的性能测量方法。 ROC是概率曲线,AUC表示可分离性的程度。它告诉我们有关模型区分的能力。 AUC越高,模型越好,将0预测为0,将1预测为1。AUC越高,模型越好区分疾病患者和无疾病患者。用TPR对FPR绘制ROC曲线,其中TPR在y轴上,FPR在x轴上。

image

定义一些术语

True Positive Rate/Recall/Sensitivity

image

Specificity

image

False Positive Rate

image
image

一个优秀的模型具有接近1的AUC,这意味着它具有良好的可分离性。一个糟糕的模型的AUC接近0,这意味着它具有最差的可分离性度量。事实上,这是对结果的颠倒。它将0预测为1,将1预测为0。当AUC为0.5时,意味着模型没有任何类别分离能力。

进一步用图形来解释:ROC是概率曲线。因此,让我们绘制这些概率的分布:

(注意:红色分布曲线是阳性分类(患有疾病的患者),绿色分布曲线是阴性分类(没有疾病的患者))。

这是一个理想的情况。当两条曲线完全不重叠时,模型具有理想的可分离性度量。它完全能够区分TP和TN。

image

当两个分布重叠时,我们引入类型1和类型2错误。根据阈值,我们可以最小化或最大化它们。当AUC为0.7时,意味着该模型有70%的可能区分正类和负类。

image

下面是最糟糕的情况。当AUC约为0.5时,模型没有区分正类和负类的辨别能力。

image

当AUC大约为0时,模型实际上是对类进行了颠倒。这意味着,模型将负类预测为正类,反之亦然。

image

如何用AUC-ROC 曲线做多类别分类?

在多类别模型中,我们可以使用One vs ALL方法为N个数字类绘制N个AUC-ROC曲线。因此,例如,如果你有三个名为X,Y和Z的类,你将有一个针对Y和Z分类的X的ROC,针对X和Z分类的Y的另一个ROC,以及针对Y和X分类的Z的第三个ROC 。

参考文章

  1. 4 Things You Need to Know about AI: Accuracy, Precision, Recall and F1 scores

  2. Multi-Class Metrics Made Simple, Part I: Precision and Recall

  3. Accuracy, Precision and Recall: Multi-class Performance Metrics for Supervised Learning
    作者|NaNNN,https://zhuanlan.zhihu.com/p/147663370

  4. https://mp.weixin.qq.com/s?__biz=MzI3ODgwODA2MA==&mid=2247491912&idx=3&sn=ae041d6e643ea63522d7dfdbaa59d8ea&chksm=eb53f5dbdc247ccd64582c3d47c3bbb2e5e7661bd07c1dc710b3490d9dc7c0dfc77e46fcd204&mpshare=1&scene=1&srcid=0731N6cW5CZ4BwxWX7JGNPU8&sharer_sharetime=1596160366727&sharer_shareid=954bc357a988b3940dab8500fbc423e6&key=573aef4c1f9b4b5f562257d8f5fe4c217fbde136ce294fa69df6db9c4eddb04ea233a3f7f665ae200a4adf5a2759a7a8d128acf13b3730c1ad278678a373946f9abaa42b4ce1fab93a68b0fc174995e5&ascene=1&uin=MjkyNDEyNTQyNg%3D%3D&devicetype=Windows+10+x64&version=62090529&lang=zh_CN&exportkey=A0QCJG2BLBR47SgNJC%2Fv8bk%3D&pass_ticket=1T9XFezfdtXoUeErexfAMdTHj%2FhwSk6Z7qrJUhZZ1ZV7F2oMfLGa0fQmVOJCaW%2Bd

  5. 敲黑板!模型的度量标准不止有「准确率」,别忘了「精度」和「召回率」

  6. 确认过眼神,如何为模型选择合适的度量标准?

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

推荐阅读更多精彩内容