2018-04-17

本篇是合集文章,主要供各位童鞋系統學習和日后復習使用。本篇是舊篇中的“如何直觀地理解過擬合與欠擬合的那些事”,“分層抽樣與交叉驗證”及新篇“模型性能度量那些事”的合集,如已看過舊篇的童鞋可以直接跳到第三部分。

幻燈片1.JPG
image
image

在上前幾期中,我們曾談到過在我們希望借助統計學習方法,能夠在現有的數據當中掌握規律,從而能夠對未來/未知進行預測控制。雖然是說從現有的數據當中掌握規律,但是很顯然地,我們的重心還是在于預測上。

image

既然我們是在做預測,不可避免地,就存在對錯的問題,就存在這預測準確率的問題。若是用了精度不夠的模型,輕則可能影響生產,重則也是有可能造成事故當年,要是孔明先生不能準確預測東風,就是不是大事可成,而是萬事休矣

那當然,預測精準率高不僅僅指的是,通過學習得到這個模型對已有的數據有很好的預測能力,更重要的是對未來,未知的數據也能夠有很好的預測能力。但是在具體的執行層面,由于我們并沒有未來的數據,為了能夠充分評價模型的性能,因此我們一般可以會把現有的數據集簡單劃分為兩個部分:一部分數據用作訓練集,進行模型訓練;剩下的數據用作測試集,用于模型性能評估。(具體的劃分比例需要根據實際情況進行調整,一般的做法,我們會將大約60% ~ 80%的數據用于訓練,剩下的樣本用于測試)。

其實,我們需要把數據劃分為訓練集合測試的原因很好理解,如果我只有一個訓練數據集合,無論是模型訓練還是模型測試,都是在訓練集上執行的話,這就有點類似于運動會上,咱們既當運動員又當裁判,這事兒怎么看都透著這么點詭異了。

image

一般地,我們把在訓練集上的計算得到誤差稱之為訓練誤差,在測試集上計算得到的稱為測試誤差(也稱作為泛化誤差)。一般來說,我們通過比較測試誤差的高低從而進行模型的選擇。

舉個簡單例子說明,例如我們在研究客戶流失,在集合D中我們有1000個樣本,我們利用隨機抽樣的方法從中抽取800個樣本作為訓練集,剩下的200個作為測試集。劃分出集合后,我們就可以在訓練集S上進行模型訓練,再在測試集T上評估結果。假如在訓練集中,我們有700個樣本被正確分類,那么訓練集的正確率就有700/800100%=87.5%,而在測試集中,假如我們只有150個樣本被正確分類,那么測試集的正確率績則是150/200100%=75%.

雖然,一般來說,訓練集的準確率都是高于測試集,但是,我們認為訓練集測預測準確率不能很好地評估模型的預測能力,直觀地說,就類似上面所說這樣會帶來‘即是裁判又是運動員的問題’。進一步地說,這樣很可能會導致過擬合的問題。

讓我們再看看如下的例子,對包含10個樣本的數據集進行線性回歸,分別構建多項式:M=1,M=3,M=5以及M=9(注M=9,因為含有常數項的話,實際上已經包含有10個參數)

image
image
image
image

(1)首先,我們選擇了一個一次項的回歸模型,我們擬合出一條直線,可以看到數據擬合的效果并不好,不但與訓練數據偏差較遠,而且變動情況也沒有很好的擬合出來,可以想象得到,該模型無論是在訓練集上還是在測試集上,誤差都比較大。由于變量考慮不足或者對模型形式估計不足,這種對訓練數據基本特征都不能夠很好擬合的情況,我們稱之為“欠擬合”

(2)進一步地,當我們選取M=3的時候,盡管擬合曲線并沒有能夠完美擬合出所有的點,但已基本能夠把數據趨勢很好地擬合出來,基本能夠反映出自變量與因變量的關系,該模型在訓練集以及測試集的誤差可能都比較低,這個狀態相對合適。

(3)接下來,我們進一步考擦,當我們選取M=6的時候,我們發現曲線的擬合效果進一步提高,已經非常接近實際數據;當最后,我們選擇M=9,可以發現擬合曲線穿過所有的樣本點,效果達到最好狀態,訓練誤差為0。盡管,這是在訓練集當中最好的狀態,但是正因為把樣本數據學習得太好了,將會導致我們的泛化能力大大的下降,要知道在我們的訓練集中,也是存在噪聲的這種把訓練集中數據所有特性(包括噪聲特性)都學習起來的狀態,我們稱之為‘過擬合’。過擬合狀態往往在測試集的數據上都表現都要比訓練集效果差得多;

實際上,當我們選擇M=3的時候,就已經把訓練數據的基本特征學習到了,并且這個時候模型也相對簡單,因此我們可以選取多項式(M=3)作為最終選擇。

從上面的例子,我們可以看到,隨著模型復雜度的提高(例如更多的參數),訓練誤差也會隨之減少,直至趨向于0(甚至等于0)。但對于測試誤差來說,則不是,一開始隨著模型復雜度的增加,測試誤差逐漸降低,直至模型符合現實數據情況達到最低,如果在這個基礎上模型復雜度繼續增加,那么測試誤差就會從最低點又開始增大。

下圖展示了模型復雜度與模型誤差之間的關系。

image

從上圖,我們就可以明顯看出,模型復雜度并不是越高越好。實際上,模型越復雜,出現“過擬合”的可能性就越大,因此一般而言,我們更喜歡“簡單”的模型,而這種思想確實又與眾所周知的“奧卡姆剃刀原理”是不謀而合的。

image

“奧卡姆剃刀原理”是有14世紀邏輯學家奧卡姆的威廉所提出,簡單來說就是“如無必要,勿增實體”。而放在統計學習領域里面,我們則可以翻譯為“若有兩個預測能力相當的模型時,我們應該選擇其中較為簡單的一個”

一般來說,欠擬合的問題比較清楚明了,不外乎是由于所選擇的特征不足夠或者所選擇的學習算法學習能力不夠強大。相反,過擬合的問題就比較復雜了,很多時候我們并不清楚問題是否由過擬合引起,或者說過擬合所帶來的問題有多嚴重,因為我們總是不可能避免過擬合的出現。因此,怎們選進行合適的模型選擇就變得重中之重。

因此綜合來說,為了能準確評估模型性能,我們就可以把整個數據集集分成兩個部分,一部分用于訓練模型,得到估計參數(訓練集);另一部分用于評估模型誤差,得到準確率(測試集)

image

更進一步,在有些實踐當中,如在分類問題上,我們往往在事先不知道那種算法是最優的,并且不同的算法里面也包含大量的需要人為設定的超參數。在這些情況下,我們往往需要再劃分多一個驗證集,用于選擇具體超參數,因此也可以把數據集劃分為訓練集,驗證集以及測試集。

image

步驟:

(1)首先按照一定比例劃分為廣義訓練集A以及測試集T

(2)由于我們還需要一個驗證集,所以我們再從廣義訓練集A再按比例劃分訓練集S以及驗證集V

(3)我們在訓練集S上分別采用不同的算法/參數得出模型,再利用驗證集V評估各個模型的性能。經過這一步,我們已經得到了最優的算法/參數配置

(4)根據得到的最優配置,我們在廣義訓練集A上(即S+V)重新構建模型,得到最終模型;

(5)把最終模型用于測試集T檢驗結果,進行評估測試。

注意點:

a):在步驟(3)中,利用隨機方法把廣義訓練集A直接劃分為訓練集S以及驗證集V我們一般稱之為留出法,這里的劃分方法不但可以使用隨機抽樣也可以選擇分層抽樣,這樣可以一定程度保持分布的一致性;

b):針對留出法只是直接切割劃分,可能會為模型帶來一定的不確定性,因此這階段我們可以選擇交叉檢驗(Cross Validation,簡稱CV)進行代替;

c):可以在第四步中的廣義訓練集A得到的模型作為最終模型,也可以在確認算法及超參數的配置后,用整個數據集(A+T)作為最終模型。

image

image
image

1留出法(Hold out)與分層抽樣****

留出法就是咱們在上期文章介紹的進行對訓練集和測試集進行的劃分方法。

上期內容:如何直觀地理解過擬合與欠擬合那些事~

留出法的意思就是直接將總數據D劃分為兩個對立集合,訓練集S以及測試集T,我們有S+T=D,以及S交T等于空集;

image

舉個簡單例子說明,例如我們在研究客戶流失,在集合D中我們有1000個樣本,我們利用隨機抽樣的方法從中抽取800個樣本作為訓練集,剩下的200個作為測試集。

劃分出集合后,我們就可以在訓練集S上進行模型訓練,再在測試集T上評估結果。假如在訓練集中,我們有700個樣本被正確分類,那么分類的正確率就有700/800100%=87.5%,而在測試集中,假如我們只有150個樣本被正確分類,那么分類的正確率績優150/200100%=75%.

但實際上,這樣的做法是存在一定的問題的。由于我們采取的是完全隨機抽樣的方法,這就可能會由于抽樣劃分的問題而改變了原有的數據分布。

例如在上述1000個樣本中,其中有200名客戶被標記為流失,800名客戶被標記為普通客戶。

image

接下來,我們隨機抽取數據集D中的800個樣本作為訓練集,200個樣本作為測試。但是由于抽樣的問題,其中有100名流失客戶被分在了訓練集,另外的100名客戶被分在了測試集。

讓我們在回顧一下分布比例,原本在數據集D中,流失客戶的分布比例是20%,而經過劃分后,我們在訓練集中的流失比例只有12.5%,而在測試集中流失比例達到50%,顯然,我們的數據分布與原有的數據分布發生了極大的改變,而這很有可能給我們的模型訓練以及評估帶來非常大的隱患。

image

因此,為了避免這種情況,在我們使用留出法進行訓練集測試集劃分的時候,也會采用分層抽樣的方法。

回到原來的例子,我們可能從200個流失客戶中隨機抽取80%放到訓練集,20%放到測試集;再從800個非流失客戶中抽取80%放到訓練集,剩下20%又放回到測試集。值得注意的是,劃分訓練集以及測試集的方法是多樣的,我們完全可以通過抽樣方法的結合,幫助我們更好的決定訓練集以及測試集的組成

image

除了結合抽樣方式,另外一種改進策略被稱為“重復抽樣”。它的思想是這樣的,考慮到我們只進行一次隨機抽樣劃分訓練集與測試集可能會有存在較大的不穩定性,因此我們就將抽樣結果重復p次,最后把p次結果進行加和求平均。

2交叉驗證(Cross Validation)

雖然留出法可以通過分層抽樣解決數據分布不等的問題,但是由于我們需要拿出一部分數據作為測試,因此總有部分的數據不能用于構建模型,而一種更好的選擇是交叉驗證,一般也簡稱CV

交叉驗證法是一個將整體數據集平均劃分為k份,先取第一份子集數據作為測試集,剩下的k-1份子集數據作為訓練集進行一次試驗;之后再取第二份子集數據,剩下的k-1份子集數據在進行一次試驗,不斷往復,最后重復k次的過程,一般我們稱之為k折交叉檢驗,交叉檢驗是我們進行參數調整過程中非常重要的一個方法。

一般我們常用十折交叉檢驗,不妨我們設定k=10進行舉例:

  • 首先我們把總數據集劃分為10份,分別成D1,D2,… …,D10;

  • 首先選擇D1數據集作為測試集,D2,…D10作為訓練集。在訓練集上構建模型,在測試集上進行模型評估,得到評估記過O1;

  • 之后選擇D2數據集作為測試集,D1,D3,…D10作為訓練集。在訓練集上構建模型,在測試集上進行模型評估,得到評估記過O2;

  • 分別抽去D3,D4,…,D10作為測試集,一共重復10次,并得到10個結果:O1,O2,…,O10;

  • 將得到10個結果:O1,O2,…,O10加和取平均,作為最終評估結果O。

image
image

以上過程,我們稱之為10折交叉檢驗。一般而言,在平常的使用中,10折交叉檢驗比較常見,當然也會有5折交叉檢驗,3折交叉檢驗。

更進一步地,類似于留出法可以采取重復抽樣,對于交叉檢驗來說同樣也存在著劃分方式的不同情況,因此我們也可以采用不同的劃分方式重復進行交叉試驗的方法,例如,我們利用不同的劃分方式劃分數據5次,每次都是劃分為10折,那我們就稱之為5次10折交叉試驗

特別地,交叉驗證還有一種特殊情況,稱之為留一交叉驗證(leave one Out)。它是指,我們令樣本劃分次數k等于數據集合D的樣本數量n,即對樣本集合D劃分為n份子集,每份子集只包含一個樣本。這個方法的優缺點都十分的明顯,優點點我們每次的訓練集都與原始數據集非常接近,并且也能做到訓練集與測試集是對立的,這樣可以保證我們得到的結果相對比較準確。但相對而言,采取這樣的方式也意味著我們的計算開銷會大大增加。

image

幻燈片2.JPG

在之前,我們討論了關于模型評估的那些事。我們已經知道要準確評估模型的性能,我們需要對數據劃分訓練集及測試集,那么在本期分享當中,我們將進一步為大家詳細介紹模型的評估指標。

1

回歸任務的性能度量

1.平均絕對誤差MAE

平均絕對誤差(MAE,Mean Absolute Error),或被稱為L1范數損失,作為評估指標來說現在用得比較少。

blob.png

2.均方誤差MSE

均方誤差(MSE,Mean Squared Error),是我們最常用的性能評估指標是.

blob.png

實際上,均方誤差其實就是求得我們模型預測值和實際值的偏差,因此模型的均方誤差越小越好。值得一提的是,對回歸模型有印象的同學其實也會發現,這是我么利用最小二乘法求解回歸問題時的損失函數。

3.均方根誤差RMSE

均方誤差(RMSE,Root Mean Squared Error)

blob.png

均方誤差的開方,也是經常使用的模型評估指標。從MAE,MSE、再到RMSE,都是衡量我們模型預測與實際偏差的度量,直觀地來說,以上的指標越小越好。但是上述指標有一個問題是,這是一個“比較型”的指標,也即是通過均方誤差,我們可以知道哪個模型的偏差最小,但是我們并不知道這個模型是否足夠的好,而且這個指標的大小明顯和數據的數量級有關系

例如我們構建了一個回歸模型預測廣州市區的房價,模型的RMSE為2000,我們認為模型效果是可以接受的,這是因為對于均價在40000的房價預測中,2000的偏差只是其中的5%。但是,假如我們是構建了一個回歸模型預測國內某個均價在5000的小縣城的房價時,模型的RMSE為2000明顯是不可以接受的,因為偏差已經占到均值的40%了。

blob.png

4. 決定系數

blob.png

因為MAE,MSE以及RMSE的局限性,在傳統的線性回歸中,我們往往會使用決定系數
blob.png

對模型進行評估。

blob.png

關于決定系數的詳細內容我們已在前面的文章中詳細介紹(統計挖掘那些事-9個相關R先生的故事(理論+動手案例)),這里不再復述。但值得注意的是決定系數看上去似乎不再受到數據量級的局限,但是相比于MSE等指標,決定系數只能評估對線性模型的擬合程度,因此對于可能構建了非線性模型的算法來說(例如神經網絡),我們還是需要使用RMSE進行評估。

2

分類任務的性能度量

1.準確率和錯誤率

對于分類任務來說,最常見的準確率和錯誤率。

模型的錯誤率:

blob.png

模型的準確率:

blob.png

其中
blob.png

為示性函數,但函數中內容為真時,函數結果取值為1,否則為0.

2.查準率,查全率和F值

模型的準確率和錯誤率是最常用的指標,但是有時候僅僅使用模型的準確率和錯誤率并不足夠。為了說明這一點,我們以二分類問題為例,假設我們建立了一個客戶影響響應模型

blob.png

表 客戶影響活動響應分析預測矩陣

|
|

預測客戶響應情況

|
|

True

|

False

|
|

實際客戶影響情況

|

True

|

TP(真正例)

|

FN(假反例)

|
|

False

|

FP(假正例)

|

TN(真反例)

|

對于模型評估,可以采取一些常用的指標進行判讀。

(1)模型準確率(Accuracy)

blob.png

(2)模型查準率(Precision)

blob.png

模型查準率又被成為精確率。正如上面所說,我們更加關心此次營銷活動中對客戶的響應預測是什么樣的情況,因此,這里引入模型精確率這個指標,它主要反映了我們對目標類別的預測準性。例如,建模人員提供了一份100人的客戶響應名單,精確率研究的是在這份名單中有多少客戶是真正響應營銷活動的。

(3)模型查全率(Recall)

blob.png

模型查全率又被稱為查全率。既然我們已經可以通過精確率把我們的焦點放在關注的類別上,那么分析工作是不是就可以結束呢?回到本案例中,假設又得到了一份100個用戶響應名單,其中的精確率也非常高,有90人真正響應了營銷活動,精確率達到90%。但問題是,如果最終響應情況是有1000人響應,那么我們就只是發現響應群體中的9%,很明顯這個結果是不能接受的。因此,可以使用召回率這個指標來衡量我們是否能夠將目標情況“一網打盡”

需要值得注意的是,我們固然希望能夠得到模型的查準率和查全率都比較高,但是模型的查全率和查準率往往是相互制約的,要提高查準率,往往會降低查全率,而要提高查全率則往往會降低查準率。而要綜合考慮模型的查準率和查全率,我們可以借助P-R曲線。

如下圖所示P-R曲線的縱坐標和橫坐標分別是模型的查準率和查全率。要繪制P-R曲線,我們可以先對模型的預測樣本按照準確率從高到低排序。接下來依次把判斷閾值從高到低調整,之后按順序閾值的調整順序依次計算不同閾值的查準率和查全率,最后把計算結果繪制到圖上就得到了下圖的結果。事實上,隨著閾值的逐漸降低,就是模型查準率下降而查全率上升的過程。

blob.png

圖 西瓜書中P-R曲線示意圖

有一點需要值得注意的是,在實際的項目當中P-R曲線往往不會這么平滑,而且很有可能是取不到(0,1)以及(1,0)兩個點。借助于P-R曲線,我們能夠很好地對模型進行綜合評估。當多個模型進行比較時,例如模型A的P-R曲線完全“包住”了另一個模型C的P-R曲線,則可以認為模型A的性能要優于模型C。但是當兩個模型的P-R曲線發生交叉時,例如模型A和模型B的P-R曲線由于發生了交叉,則可能難以判斷,這要根據我們實際的情形進行取舍。如果我們對模型的查準率有較高的要求,則可能選擇模型A,而當我們對模型的查全率有較高的要求,則可能選擇模型B。

不過另一角度來講,如果本身我們對模型查準率和查全率沒有明顯的“偏好”,實際上我們其實可以使用曲線下面積作為取舍,曲線下面積越大,模型的綜合性能越好。值得注意的是,作為對面積的替代,我們還可以利用“平衡點”(BEP,Break-Even Point),即產準率=查全率的取值點進行比較。在上圖中,模型A的平衡點要高于模型B,因此我們可以認為模型A要優于模型B。

(4)F Measure

某些情況下,只考慮平衡點可能過于簡單,那么我們可以使用F1 Measure。

blob.png

實際上F1值就是查準率和查全率的調和平均數,調和平均數常用于用在相同距離但速度不同時,平均速度的計算。一段路程,前半段時速60公里,后半段時速30公里〔兩段距離相等〕,則其平均速度為兩者的調和平均數時速40公里。

但也正如我們前面所說的,有些場景下,我們對查準率和查全率的重視程度是不一樣的。例如在體檢過程中,我們希望盡可能發現體檢者是否患有某種疾病,此時我們更加重視查全率。又例如在商品推薦中中,我往往不希望過于打擾客戶,則會更加重視查準率。因此我們可以在F1值的計算中引入權重
blob.png

,**不妨使用
blob.png

代表查全率相比查準率的重要性**,有加權調和平均的計算如下:

blob.png

顯然當
blob.png

=1時,,就是
blob.png

指標。

3. ROC與AUC

通常,我們的算法模型也會為我們生成預測概率。一般我們可以選擇一個閾值,當預測概率大于這個閾值時,我們將其劃分為正類。通常我們習慣選取0.5作為閾值,當然,根據實際的任務需要,如果我們更加關注查準率,則可以適當調高閾值。相反,如果我們更加關注查全率,則可以適當調低閾值。

受試者工作特征曲線 (Receiver Operating Characteristic Curve,簡稱ROC曲線),與P-R曲線類似,我們根據預測概率對分類結果進行排序。之后從高到低依次選擇閾值對樣本進行分類,并計算出“真正例率”和“假正例率”。因為開始的時候,閾值最高,因此時所有的樣本均被劃分為負類,無論是“真正例率”和“假正例率”均為0.隨著不斷調低閾值,直至所有的樣本均被劃分為正類,這時無論是“真正例率”和“假正例率”均為1.真正例率和假正例率的定義如下:

blob.png

一個典型的ROC曲線如下圖所示,其中圖上的對角線對應于隨機猜測結果,曲線下面積越大,代表模型效果越好,顯然如果模型A的ROC曲線完全包住另一個模型B的ROC曲線,我們可以說模型A的分類效果要優于模型B。最理想的模型是曲線直接去到(0,1)這個點,此時曲線下面積達到最大,為1.比較客觀的比較方法同樣可以使用面積,AUC曲線下的面積越大,說明模型的分類效果越好,我們把ROC曲線下的面積稱之為AUC(Area Under ROC Curve)

blob.png

當然,因為在實際情況AUC(Area Under ROC Curve)是各點鏈接而成,一般出現不了上圖這般平滑的曲線,通常我們得到的ROC曲線如下圖所示。

blob.png
幻燈片5.JPG

近期熱門文章精選

1.六行代碼打造萌萌噠聊天機器人

2.超詳細|關于梯度下降方法四知四會

3.如何通俗地理解決策樹中的信息熵

4.真的只需要關心PM2.5?廣州空氣質量分析報告(附代碼)

5.重磅|谷歌發布機器學習速成課程(完美中文支持)

注:由于最近老撕比較忙,所以有些信息沒有及時查看回復(微信規定48小時沒有回復的話,則不能再次回復),所以如果浩彬老撕沒有及時回復,大家可以再次留言。

作者簡介:浩彬老撕

好玩的數據煉丹師,

曾經的IBM 數據挖掘攻城獅,

還沒開始就過氣數據科學界的段子手,

致力于數據科學知識分享,不定期送書活動

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,431評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,637評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,555評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,900評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,629評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,976評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,976評論 3 448
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,139評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,686評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,411評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,641評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,129評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,820評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,233評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,567評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,362評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,604評論 2 380

推薦閱讀更多精彩內容