集成學習(5) - 基本分類模型

1. 分類模型的模型性能度量指標

  • 1.1 TP, TN, FP和FN
    經(jīng)常有同學對這四個值混淆不清柳譬,不過沒關(guān)系干签,從這四個指標背后的英文含義去理解就很好記了碗旅。
  • T表示true,也就是真棠笑,那么F自然表示false梦碗,也就是假
  • P表示positive,可以理解成陽性,N就是negative洪规,就是陰性印屁。這里的陰陽沒有邏輯上的含義,表示的只是類別斩例,我們也可以理解成0雄人、1或者是甲乙,因為沒有邏輯因素念赶,所以叫什么都一樣础钠。

這四個就是真假和陰陽的排列組合,有T的都表示True叉谜,可以理解成預(yù)測正確旗吁。比如TP就是真陽,也就是說檢測是陽性停局,實際上也是陽性很钓。同理,TN就是真陰翻具,檢測是陰性履怯,實際上也是陰性回还。

有F則表示False, 即預(yù)測錯誤裆泳,F(xiàn)P是假陽,也就是檢測是陽性柠硕,但是實際上是陰性工禾,表示檢測錯了。同理蝗柔,F(xiàn)N是假陰闻葵,檢測是陰性,但是實際上是陽性癣丧。
我們用醫(yī)院檢測代入這幾個值當中一下就理解了槽畔,TP和TN表示檢測試劑給力,檢測準確胁编,檢測是陰就是陰厢钧,是陽就是陽。而FP和FN說明檢測試劑不行嬉橙,檢測錯了早直,要么就把沒病的檢測出了有病,要么就是明明有病沒檢測出來市框。

顯然在醫(yī)療檢測的場景當中霞扬,假陽是可以接受的,假陰不行。因為假陽我們還可以再檢測喻圃,來確定究竟是陰還是陽萤彩,如果假陰放過了病例會對病人產(chǎn)生不好的影響,所以一般來說醫(yī)療檢測試劑都會比標準更加敏感级及,這樣才能盡量不放過漏網(wǎng)之魚乒疏。

  • 1.2 召回率

召回率的英文是recall,那么什么叫召回呢饮焦?
我們假設(shè)一個場景怕吴,比如說甲是一個排長,手下有10個小兵县踢,有一個任務(wù)需要甲召集所有成員去執(zhí)行转绷。甲一聲令下,召來了8個硼啤。那么召回率就是80%议经。我們放入機器學習的場景當中去也是一樣的,在二分類場景當中谴返,一般情況下模型考慮的主要都是正例煞肾。可以理解成沙里淘金嗓袱,負例就是沙籍救,一般價值不大,而金子就是正例渠抹,就是我們需要的蝙昙。所以召回率就是我們預(yù)測準確的正例占所有正例的比例
我們把上面的TP梧却、TN奇颠、FP和FN代入計算,我們可以得到召回率REC的公式:
REC = \frac{TP}{TP+FN}

  • TP就是我們預(yù)測準確的正例放航,也就是被我們召回的部分

  • 分母為所有的正例烈拒, 那自然由兩部分組成, 預(yù)測正確的正例TP和預(yù)測錯誤的反例FN
    這里有一點點繞广鳍,關(guān)鍵點是召回是針對正例的荆几,不操心負例的情況。就好比你去淘金搜锰,你顯然不會關(guān)心沙子的情況,只會關(guān)心金子有沒有撈到蛋叼,一個意思剂陡。

  • 1.3 精確率和準確率

還是和之前我們從英文解釋來弄懂這兩個詞。

在英文當中鸭栖,精確率的英文是precision,詞典當中的解釋是:precision is defined as the proportion of the true positives against all the positive results (both true positives and false positives). 翻譯過來是所有預(yù)測為正例的樣本當中晕鹊,正確的比例暴浦。所以精確率PRE的公式為:
PRE = \frac{TP}{TP+FP}
準確率英文是accuracy,英文解釋是:accuracy is the proportion of true results (both true positives and true negatives) in the population. 翻譯過來也就是預(yù)測結(jié)果準確的概率歌焦,既然是預(yù)測結(jié)果準確飞几,那么顯然既包含了正例也包含了負例。所以準確率ACC的公式為:
ACC = \frac{TP+TN}{FP+FN+TP+TN}

從英文的描述上我們可以明顯地看出這兩個概念的差異独撇,兩個都是預(yù)測正確的部分屑墨,但精確率只針對正例,而準確率針對的是所有樣本纷铣,既包含正例也包含負例卵史。我個人覺得這兩者翻譯成篩選正確率和判斷正確率比較容易理解一些,如果只有精確率和準確率可能還好搜立,再加上上面說的召回率以躯,可能真的要暈菜的。

1.4 F1 score

F1 score反應(yīng)了對模型召回率recall和精確率precision的取舍儒拂, 公式為:


image.png

在機器學習領(lǐng)域當中寸潦,recall和precision是不可調(diào)和的兩個值色鸳,一個模型精確率高了社痛,往往召回就低,如果熟悉數(shù)學的同學會發(fā)現(xiàn)f1-score本質(zhì)上是recall和precision的調(diào)合平均數(shù)命雀,我們可以用它來均衡recall和precision蒜哀,方便我們做取舍。

2. 常用的基本分類模型

這里主要介紹3種分類模型: 邏輯回歸LR吏砂, 決策樹模型和SVM支持向量機模型

2.1 邏輯回歸Logistic Regression:

邏輯回歸雖然名叫回歸撵儿,其實是一個用于分類的模型。邏輯回歸在之前的線性回歸模型中最后一步加入一個softmax函數(shù)狐血,將線性回歸的取值隱射到(0淀歇,1)區(qū)間,從而將結(jié)果當成一個概率用于分類匈织。從這點上說LR模型可以被認為就是一個被Sigmoid函數(shù)(logistic方程)所歸一化后的線性回歸模型浪默!函數(shù)形式為:
log_i(z) = \frac{1}{1+e^{-z}}
對應(yīng)的函數(shù)圖像如下:

image.png

邏輯回歸模型可是說是機器學習中最簡單的模型之一牡直,但同時它具有極強的解釋性,廣泛的應(yīng)用于各個領(lǐng)域纳决,同時也可以作為很多分類算法的基礎(chǔ)組件。例如使用GBDT + LR用于信用卡交易的反欺詐等阔加。另外胜榔,在很多實際用用中,由于邏輯回歸易于實現(xiàn)厌蔽,可以作為很多問題baseline奴饮。

代碼演示:使用鳶尾花數(shù)據(jù)集
step1: 導入數(shù)據(jù)集并查看:

from sklearn import datasets
iris = datasets.load_iris()
y = iris.target
iris_features = pd.DataFrame(data = iris.data, columns = iris.feature_names)
iris_features.head()
image.png

step2: 構(gòu)建模型并訓練預(yù)測:

from sklearn.model_selection import train_test_split

# 選擇其中類別為0和1的樣本(不包括2)戴卜,先進行二分類
iris_part = iris_features.iloc[:100]
iris_part_target = iris.target[:100]

# 分割測試集(20%)和訓練集(80%)
X_train, X_test, y_train,y_test = train_test_split(iris_part, iris_part_target, 
                                                   test_size = 0.2, random_state = 2020)
# 創(chuàng)建并訓練模型
clf = LogisticRegression(random_state=0, solver='lbfgs')
clf.fit(X_train, y_train)

>>> LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
          intercept_scaling=1, max_iter=100, multi_class='warn',
          n_jobs=None, penalty='l2', random_state=0, solver='lbfgs',
          tol=0.0001, verbose=0, warm_start=False)

查看訓練后的模型參數(shù):

# 查看對應(yīng)的w
print('The weight of Logistic_Regression: ', clf.coef_)
#查看對應(yīng)的w0
print( 'The intercept(w0) of Logistic_Regression: ', clf.intercept_)
>>> The weight of Logistic_Regression:  [[ 0.45181973 -0.81743611  2.14470304  0.89838607]]
>>> The intercept(w0) of Logistic_Regression:  [-6.53367714]

在計算模型精度

from sklearn.metrics import accuracy_score, confusion_matrix
train_predict = clf.predict(X_train)
test_predict = clf.predict(X_test)

train_res = accuracy_score(y_train, train_predict)
test_res = accuracy_score(y_test, test_predict)

print('The accuracy of Logistic_Regression on train set is : ', train_res)
print('The accuracy of Logistic_Regression on test set is : ', test_res)
>>> The accuracy of Logistic_Regression on train set is :  1.0
>>> The accuracy of Logistic_Regression on test set is :  1.0

可以看到在訓練集和測試集上模型都獲得了100% 的正確度投剥。這個從之前的數(shù)據(jù)可視化中也能看到一絲端倪江锨,因為類別0和類別1很容易區(qū)分糕篇,即區(qū)分的邊界比較明顯拌消。

下面查看混淆矩陣,并用熱力圖進行可視化

confusion_matrix_res = confusion_matrix(test_predict, y_test)
print('The confusion matrix result: \n', confusion_matrix_res)

#利用熱力圖進行可視化,
plt.figure(figsize=(8,6))
sns.heatmap(confusion_matrix_res, annot=True, cmap='Blues')
plt.xlabel('Predict lables')
plt.ylabel('True labels')

效果如下:


捕獲.JPG

2.2 決策樹

從前面的回歸算法中氓英,我們知道決策樹分類算法的實現(xiàn)關(guān)鍵在于如何根據(jù)訓練數(shù)據(jù)構(gòu)建一顆決策樹铝阐。而構(gòu)建決策樹的核心問題就在于如何選擇一個合適的分裂屬性進行一次分裂以及如何制定合適的分裂標準徘键。在最初的決策樹ID3算法中,采用信息熵(Information Entropy)來進行分裂啊鸭。算法會根據(jù)所有樣本 信息熵的變化(信息增益)來選擇最佳分類赠制。 因而信息熵就是決策樹方法中分支產(chǎn)生的衡量標準之一。

信息熵來源熱力學中的熵(Entropy)的概念烟号。最早由德國物理學家克勞修斯提出汪拥,用來表述某個體系的混亂程度篙耗。在此基礎(chǔ)上,美國的數(shù)學家脯燃,信息論的創(chuàng)始人香農(nóng)提出了信息熵的概念辕棚。它代表了一個給定數(shù)據(jù)集中的不確定性或者隨機性程度的度量邓厕。當一個數(shù)據(jù)集中的記錄全部為同一類時,則沒有不確定性补君,此時熵為0赚哗。因此我們也可以把熵看成是信息的數(shù)學期望硅堆。若要求出熵的大小渐逃,則先要計算信息:

設(shè)某個事物具有n種相互獨立的可能結(jié)果民褂,則信息的定義為:
l(x_i) = -log_2p(x_i)
為什么是以2為底的對數(shù)疯潭?這個可能和信息中的最小單位比特有關(guān)(一個比特只有0/1 2種狀態(tài)其中)竖哩,其中x_i表示第i個分類相叁,p(x_i)表示第i個分類的概率函數(shù)增淹,并且:\sum_{i=1}^np(x_i) = 1
由此乌企,信息熵H(X)就可以表示為:
H(X) = - \sum_{i=1}^np(x_i) log_2p(x_i)
對于一個簡單的二元分類加酵,此時n=2,那么其熵為:
H(X) = - p(x_1) log_2p(x_1) - p(x_2) log_2p(x_2)

決策樹分類算法的完整步驟:
a. 選擇最優(yōu)切分特征j以及該特征上的最優(yōu)點s:
遍歷特征j以及固定j后遍歷切分點s舞蔽,選擇使得基尼系數(shù)或者交叉熵最小的(j,s)
b. 按照(j,s)分裂特征空間渗柿,每個區(qū)域內(nèi)的類別為該區(qū)域內(nèi)樣本比例最多的類別脖岛。
c. 繼續(xù)調(diào)用步驟1柴梆,2直到滿足停止條件,就是每個區(qū)域的樣本數(shù)小于等于5门扇。
d. 將特征空間劃分為J個不同的區(qū)域偿渡,生成分類樹溜宽。

代碼演示:
下面我們就用Python中內(nèi)置的鳶尾花數(shù)據(jù)集來實現(xiàn)決策樹算法。

1. 導入計算庫和數(shù)據(jù)

注意決策樹分類算法是放在sklearn.tree下面

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline

from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn import datasets
from sklearn import tree

再把鳶尾花的數(shù)據(jù)導進來

iris = datasets.load_iris()

X = iris['data']
y = iris['target']

iris_feature_names = iris.feature_names
iris_feature_names
print(iris_feature_names)
>>>['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']

上面的代碼中留攒,我們鳶尾花數(shù)據(jù)集中的樣本的4個維度的特征,單獨拿出來用于后面的散點圖矩陣分析和決策樹分裂屬性查看魄揉,直觀一點什猖。這4個維度分別是花萼長度/寬度红淡,花瓣長度/寬度。

2. 數(shù)據(jù)初步分析與查看

在之前的文章中摇零,我們已經(jīng)使用過這個數(shù)據(jù)集了驻仅,知道了大體情況登渣。這里就不再使用shape/size/等查看數(shù)據(jù)集了。我們直接把數(shù)據(jù)iris['data']和feature_names即4個維度的名稱合并成一個DataFrame粘优,在調(diào)用pandas的散點圖矩陣觀察一下數(shù)據(jù)集

df = pd.DataFrame(iris['data'], columns = iris_feature_names)
df.head()
image.png
pd.plotting.scatter_matrix(df, c =iris['target'], figsize=(20, 20), marker='o', 
                                       hist_kwds={"bins": 20}, s=40, alpha=.8)

畫出4個維度的直方圖以及兩兩之間的散點圖雹顺,這樣可以直觀的看到數(shù)據(jù)分類情況嬉愧,如下:

matrix.png

稍微觀察一下我們就可以發(fā)現(xiàn)使用petal length區(qū)分度最好没酣,從上面圖中的第三行我們可以發(fā)現(xiàn)有一種花的petal length特別小卵迂,和其他兩種有很大的距離。另外petal width也有類似的情況(這兩個特征在直方圖中中間有斷開的地方闪金,以這里作為標準可以很容易的裂分出一類)哎垦。下面我們就創(chuàng)建決策樹算法恃疯,看看算法是不是也是這么“想”的。

3. 構(gòu)建決策樹算法模型并查看模型精度

X_train, X_test, y_train, y_test = train_test_split(X, y , test_size = 0.2, random_state = 1024)

clf = DecisionTreeClassifier(criterion= 'entropy') #以entropy熵作為分裂標準構(gòu)建決策樹
clf.fit(X_train, y_train) #訓練
y_ = clf.predict(X_test) #預(yù)測
tree_score = accuracy_score(y_test, y_) #查看模型預(yù)測結(jié)果的精度
print('該決策樹模型在測試集上的精度為: {:.2f}'.format(tree_score))
>>>該決策樹模型在測試集上的精度為: 1.00

之前我們反復的提到過在sklearn中構(gòu)建算法模型訓練預(yù)測都是統(tǒng)一的格式郑口,3-4行代碼搞定犬性。上面也是用3行代碼完成了模型的創(chuàng)建/訓練和預(yù)測腾仅,之后打印出來模型在測試集上精度。因為數(shù)據(jù)簡單鹤耍,我們獲得了100%的精度稿黄,這個和之前的KNN差不多跌造。
決策樹算法的構(gòu)建中同樣有很多參數(shù)可以調(diào),我們下次再細說财著。這里最后我們輸出一下上面算法的裂分條件和標準撑教,這個是決策樹比較贊的地方醉拓。我們可以直觀的看到算法是如何歸納訓練數(shù)據(jù)集的數(shù)據(jù)特征并選擇最佳分裂條件進行裂分,這個就是算法的學習過程愤兵。

plt.figure(figsize=(15,8))
_ = tree.plot_tree(clf, filled = True, feature_names=iris_feature_names,fontsize = 11)

結(jié)果如下圖:


tree_new.png

可以看到和我們之前預(yù)想的一致秆乳,算法第一步是按照petal length來裂分,直接得到一個葉子肛冶。我們在來套用熵的公式手算驗證一下圖中第一步得到的信息熵 entroy 為 1.584:

p1 = 39/120
p2 = 42/120
p3 = 39/120
H = -(p1 * np.log2(p1) + p2 * np.log2(p2) + p3 * np.log2(p3))
print(H)
>>>1.5840680553754911

結(jié)果和算法一致睦袖。有了這個樹荣刑,我們就可以清晰的知道算法是怎么分類的了。這個是決策樹比較好的地方董习,可視化/可解釋性強皿淋。有些算法我們不知道或者很難理解算法究竟做了什么來預(yù)測或者分類的虱颗,比如神經(jīng)網(wǎng)絡(luò)。

2.3 SVM支持向量機

支持向量機(Support Vector Machine高帖,SVM)是一個非常強大的算法畦粮,具有非常完善的數(shù)學理論宣赔,常用于數(shù)據(jù)分類.從學術(shù)的角度來看,SVM是最接近深度學習的機器學習算法吏祸。線性SVM可以看成是神經(jīng)網(wǎng)絡(luò)的單個神經(jīng)元(雖然損失函數(shù)與神經(jīng)網(wǎng)絡(luò)不同)钩蚊,非線性的SVM則與兩層的神經(jīng)網(wǎng)絡(luò)相當砰逻,非線性的SVM中如果添加多個核函數(shù),則可以模仿多層的神經(jīng)網(wǎng)絡(luò)踊东。
當然了,沒有算法是完美的闸翅,比SVM強大的算法在集成學習和深度學習中還有很多很多缎脾。但不可否認占卧,在傳統(tǒng)的機器學習領(lǐng)域,SVM是一個非常耀眼的存在辙纬。

支持向量機的基本原理非常簡單贺拣,如圖所示捂蕴,紅色和藍色的點各為一類,我們的目標是找到一個分割平面將兩個類別分開涡匀。

通常來說陨瘩,如果數(shù)據(jù)本身是線性可分的级乍,那么事實上存在無數(shù)個這樣的超平面。這是因為給定一個分割平面稍微上移下移或旋轉(zhuǎn)這個超平面甚淡,只要不接觸這些觀測點贯卦,仍然可以將數(shù)據(jù)分開恒傻。一個很自然的想法就是找到最大間隔超平面,即找到一個分割平面距離最近的觀測點最遠睁枕。下面我們來嚴格推導:
我們根據(jù)距離超平米那最近的點,只要同時縮放w和b可以得到:
w^Tx_1 + b = 1$與$w^Tx_2+b = -1注簿,
因此:
\begin{array}{l} w^{T} x_{1}+b=1 \\ w^{T} x_{2}+b=-1 \\ \left(w^{T} x_{1}+b\right)-\left(w^{T} x_{2}+b\right)=2 \\ w^{T}\left(x_{1}-x_{2}\right)=2 \\ \qquad \begin{array}{l} w^{T}\left(x_{1}-x_{2}\right)=\|w\|_{2}\left\|x_{1}-x_{2}\right\|_{2} \cos \theta=2 \\ \left\|x_{1}-x_{2}\right\|_{2} \cos \theta=\frac{2}{\|w\|_{2}} \end{array} \\ \qquad \begin{array}{l} d_{1}=d_{2}=\frac{\left\|x_{1}-x_{2}\right\|_{2} \cos \theta}{2}=\frac{\frac{2}{\|w\|_{2}}}{2}=\frac{1}{\|w\|_{2}} \\ d_{1}+d_{2}=\frac{2}{\|w\|_{2}} \end{array} \end{array}
由此可知道SVM模型的具體形式:
\begin{aligned} \min _{w, b} & \frac{1}{2}\|w\|^{2} \\ \text { s.t. } & y^{(i)}\left(w^{T} x^{(i)}+b\right) \geq 1, \quad i=1, \ldots, n \end{aligned}
可以將約束條件寫為: g_{i}(w)=-y^{(i)}\left(w^{T} x^{(i)}+b\right)+1 \leq 0
可以將優(yōu)化問題拉格朗日化
\mathcal{L}(w, b, \alpha)=\frac{1}{2}\|w\|^{2}-\sum_{i=1}^{n} \alpha_{i}\left[y^{(i)}\left(w^{T} x^{(i)}+b\right)-1\right]
因此:
\mathcal{L}(w, b, \alpha)=\frac{1}{2}\|w\|^{2}-\sum_{i=1}^{n} \alpha_{i}\left[y^{(i)}\left(w^{T} x^{(i)}+b\right)-1\right]
欲構(gòu)造 dual 問題, 首先求拉格朗日化的問題中 \mathrm{w}\mathrm 的值, 對 \mathrm{w} 求梯度, 令梯度為 0, 可求得 w:
對 b 求梯度, 令梯度為 0, 可得:
\frac{\partial}{\partial b} \mathcal{L}(w, b, \alpha)=\sum_{i=1}^{n} \alpha_{i} y^{(i)}=0

\mathrm{w} 帶入拉格朗日化的原問題可得
\begin{array}{l} \mathcal{L}(w, b, \alpha)=\sum_{i=1}^{n} \alpha_{i}-\frac{1}{2} \sum_{i, j=1}^{n} y^{(i)} y^{(j)} \alpha_{i} \alpha_{j}\left(x^{(i)}\right)^{T} x^{(j)}-b \sum_{i=1}^{n} \alpha_{i} y^{(i)} \\ \mathcal{L}(w, b, \alpha)=\sum_{i=1}^{n} \alpha_{i}-\frac{1}{2} \sum_{i, j=1}^{n} y^{(i)} y^{(j)} \alpha_{i} \alpha_{j}\left(x^{(i)}\right)^{T} x^{(j)} \end{array}
因此:
\begin{aligned} &\text { 對拉格朗日化的原問題求最小值, 得到了 } \mathrm{w} \text { , 現(xiàn)在可以構(gòu)造 dual 問題 }\\ &\begin{aligned} \max _{\alpha} & W(\alpha)=\sum_{i=1}^{n} \alpha_{i}-\frac{1}{2} \sum_{i, j=1}^{n} y^{(i)} y^{(j)} \alpha_{i} \alpha_{j}\left\langle x^{(i)}, x^{(j)}\right\rangle \\ \text { s.t. } & \alpha_{i} \geq 0, \quad i=1, \ldots, n \\ & \sum_{i=1}^{n} \alpha_{i} y^{(i)}=0 \end{aligned}\\ &\text { 可以推導出 b的值為: } b^{*}=-\frac{\max _{i: y^{(i)}=-1} w^{* T} x^{(i)}+\min _{i: y^{(i)}=1} w^{* T} x^{(i)}}{2}\\ &\begin{array}{r} \text { SVM的決策子如下,值的符號為類別. } \\ \qquad w^{T} x+b=\left(\sum_{i=1}^{n} \alpha_{i} y^{(i)} x^{(i)}\right)^{T} x+b=\sum_{i=1}^{n} \alpha_{i} y^{(i)}\left\langle x^{(i)}, x\right\rangle+b \end{array} \end{aligned}

參考:

  1. 召回眼耀、精確佩憾、準確,這些讓人頭大的概念一文全都講清楚, 源于TechFlow 楞黄,作者梁唐
  2. Datawhale開源項目:機器學習集成學習與模型融合(基于python)
    作者: 李祖賢抡驼,陳琰鈺,趙可桑阶,楊毅遠勾邦,薛傳雨
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市萎河,隨后出現(xiàn)的幾起案子蕉饼,更是在濱河造成了極大的恐慌,老刑警劉巖擎椰,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件达舒,死亡現(xiàn)場離奇詭異,居然都是意外死亡巩搏,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門丰辣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來笙什,“玉大人睦擂,你說我怎么就攤上這事杖玲。” “怎么了摆马?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵囤采,是天一觀的道長。 經(jīng)常有香客問我乓搬,道長代虾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任江掩,我火速辦了婚禮环形,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘抬吟。我一直安慰自己统抬,他們只是感情好任洞,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布交掏。 她就那樣靜靜地躺著盅弛,像睡著了一般叔锐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上讨盒,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天步责,我揣著相機與錄音,去河邊找鬼遂鹊。 笑死蔗包,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的舟陆。 我是一名探鬼主播耻矮,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼宦赠!你這毒婦竟也來了米母?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤妙色,失蹤者是張志新(化名)和其女友劉穎身辨,沒想到半個月后丐谋,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體号俐,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡吏饿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年蔬浙,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片笨忌。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡官疲,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出袁余,到底是詐尸還是另有隱情咱揍,我是刑警寧澤煤裙,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布噪漾,位于F島的核電站硼砰,受9級特大地震影響题翰,放射性物質(zhì)發(fā)生泄漏诈胜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一血公、第九天 我趴在偏房一處隱蔽的房頂上張望缓熟。 院中可真熱鬧摔笤,春花似錦垦写、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至漓帚,卻和暖如春午磁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背昧辽。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工登颓, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人咕痛。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓喇嘱,卻偏偏與公主長得像,于是被迫代替她去往敵國和親腔丧。 傳聞我的和親對象是個殘疾皇子作烟,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容