Python機器學習之隨機森林

引言

?隨機森林的原理網(wǎng)上有一大堆律秃,作為入門小白,下面來根據(jù)教材敲兩個隨機森林的代碼矮嫉。
隨機森林有兩個比較重要的參數(shù):max_features 和 n_estimators滑臊。
max_features 的取值越高,隨機森林里的每一顆決策樹就會“長得更像”弃榨。如果max_features 的取值越低菩收,就會迫使每顆決策樹的樣子更加不同,而且因為特征太少鲸睛,決策樹們不得不制造更多節(jié)點來擬合數(shù)據(jù)娜饵。
n_estimators 控制隨機森林中決策樹的數(shù)量。隨機森林構(gòu)建完成之后官辈,每顆決策樹都會單獨進行預測箱舞。如果是用來進行回歸分析的話,隨機森林會把所有決策樹預測的值取平均數(shù)拳亿;如果是用來進行分類的話晴股,在森林內(nèi)部會進行“投票”,每棵樹預測數(shù)數(shù)據(jù)類別的概率肺魁,隨機森林會把這些概率取平均值电湘,然后把樣本放入概率較高的分類中。
注釋:

sklearn.ensemble.RandomForestClassifie 隨機森林

函數(shù)原型
class sklearn.ensemble.RandomForestClassifier(
n_estimators=10,
criterion='gini',
max_depth=None,
min_samples_split=2,
min_samples_leaf=1,
min_weight_fraction_leaf=0.0,
max_features=’auto’,
max_leaf_nodes=None,
min_impurity_decrease=0.0,
min_impurity_split=None,
bootstrap=True,
oob_score=False,
n_jobs=1,
random_state=None,
verbose=0,
warm_start=False,
class_weight=None)

參數(shù)解釋
?n_estimators:整數(shù)万搔,可選擇(默認值為10)胡桨。 森林里(決策)樹的數(shù)目。
?criterion:字符串瞬雹,可選擇(默認值為“gini”)昧谊。衡量分裂質(zhì)量的性能(函數(shù))。 受支持的標準是基尼不純度的"gini",和信息增益的"entropy"(熵)酗捌。
注意:這個參數(shù)是特定樹的呢诬。
首先Gini不純度和Gini系數(shù)(coefficient)沒有關(guān)系。Gini impurity衡量的是從一個集合中隨機選擇一個元素胖缤,基于該集合中標簽的概率分布為元素分配標簽的錯誤率尚镰。對于任何一個標簽下的元素,其被分類正確的條件概率可以理解為在選擇元素時選中該標簽的概率與在分類時選中該標簽的概率哪廓」钒Γ基于上述描述,Gini impurity的計算就非常簡單了涡真,即1減去所有分類正確的概率分俯,得到的就是分類不正確的概率肾筐。若元素數(shù)量非常多,切所有元素單獨屬于一個分類時缸剪,Gini不純度達到極小值0
?max_features: 整數(shù)吗铐,浮點數(shù),字符串或者無值杏节。尋找最佳分割時需要考慮的特征數(shù)目:

  • 如果是int唬渗,就要考慮每一次分割處的max_feature特征
  • 如果是float,那么max_features就是一個百分比奋渔,那么(max_feature*n_features)特征整數(shù)值是在每個分割處考慮的镊逝。
  • 如果是auto,那么max_features=sqrt(n_features)嫉鲸,即n_features的平方根值蹋半。
  • 如果是log2,那么max_features=log2(n_features)
  • 如果是None,那么max_features=n_features
    注意:尋找分割點不會停止充坑,直到找到最少一個有效的節(jié)點劃分區(qū),即使它需要有效檢查超過max_features的特征染突。
    ?max_depth:整數(shù)或者無值捻爷。(決策)樹的最大深度。如果值為None份企,那么會擴展節(jié)點也榄,直到所有的葉子是純凈的,或者直到所有葉子包含少于min_sample_split的樣本司志。
    ?min_samples_split:整數(shù)甜紫,浮點數(shù)卒蘸。分割內(nèi)部節(jié)點所需要的最小樣本數(shù)量:
    ~如果為int犁功,那么考慮min_samples_split作為最小的數(shù)字。
    ~如果為float巢音,那么min_samples_split是一個百分比激才,并且把ceil(min_samples_split*n_samples)是每一個分割最小的樣本數(shù)量拓型。
    在版本0.18中更改:為百分比添加浮點值。

?min_samples_leaf:整數(shù)瘸恼,浮點數(shù)劣挫。一個葉子節(jié)點所需要的權(quán)重總和(所有的輸入樣本)的最小加權(quán)分數(shù)。當sample_weight沒有提供時东帅,樣本具有相同的權(quán)重压固。
?max_leaf_nodes:整數(shù)或者無值。以最優(yōu)的方法使用max_leaf_nodes來生長樹靠闭。最好的節(jié)點被定義為不純度上的相對減少帐我。如果為None,那么不限制葉子節(jié)點的數(shù)量坎炼。
?min_impurity_split:浮點數(shù)。樹早期生長的閾值焚刚。如果一個節(jié)點的不純度超過閾值那么這個節(jié)點將會分裂点弯,否則它還是一片葉子。
自0.19版以后不推薦使用:min_impurity_split已被棄用矿咕,取而代之的是0.19中的min_impurity_decrease抢肛。min_impurity_split將在0.21中被刪除。 使用min_impurity_decrease碳柱。
?min_impurity_decrease:浮點數(shù)捡絮。如果節(jié)點的分裂導致的不純度的下降程度大于或者等于這個節(jié)點的值,那么這個節(jié)點將會被分裂莲镣。
?bootstrap:bool福稳。是否使用袋外樣本來估計泛化精度。
?n_jobs:整數(shù)瑞侮。用于擬合和預測的并行運行的工作(作業(yè))數(shù)量的圆。如果值為-1,那么工作數(shù)量被設(shè)置為核的數(shù)量半火。
?random_state: 整數(shù)越妈,RandomState實例,或者為None钮糖。RandomStateIf int梅掠,random_state是隨機數(shù)生成器使用的種子; 如果是RandomState實例,random_state就是隨機數(shù)生成器; 如果為None店归,則隨機數(shù)生成器是np.random使用的RandomState實例阎抒。
?verbose:整數(shù)∠矗控制決策樹建立過程的冗余度
?warm_start:布爾值且叁。當被設(shè)置為True時,重新使用之前呼叫的解決方案秩伞,用來給全體擬合和添加更多的估計器谴古,反之,僅僅只是為了擬合一個全新的森林稠歉。
?class_weight:字典掰担,字典序列,"balanced"怒炸〈ィ“balanced_subsample” 或者None,(默認值為None),與格式{class_label: weight}相關(guān)聯(lián)的類的可選的權(quán)值。如果沒有給值,所有的類到都應該有一個權(quán)值勺疼。對于多輸出問題教寂,一個字典序列可以按照y的列的順利被提供。
請注意执庐,對于多輸出(包括多標簽)酪耕,其權(quán)值應該被定義為它自己字典的每一列的每一個類。例如轨淌,對于四類多標簽分類迂烁,權(quán)值應該如[{0: 1, 1: 1}, {0: 1, 1: 5}, {0: 1, 1: 1}, {0: 1, 1: 1}] 這樣,而不是[{1:1}, {2:5}, {3:1}, {4:1}].這樣递鹉。
"balanced"模式使用y的值來自動的調(diào)整權(quán)值盟步,與輸入數(shù)據(jù)中類別頻率成反比,如:
n_samples / (n_classes * np.bincount(y))
"balanced_subsample"模式和"balanced"相同躏结,除了權(quán)值是基于每棵成長樹有放回抽樣計算的却盘。
對于多輸出,y的每列權(quán)值將相乘媳拴。
請注意黄橘,如果指定了sample_weight,這些權(quán)值將會和sample_weight相乘(通過擬合方法傳遞)。

一屈溉、紅酒的分類

數(shù)據(jù)采用datasets里的 紅酒數(shù)據(jù)

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
from sklearn.model_selection import train_test_split #切分訓練集和測試集
from sklearn.ensemble import RandomForestClassifier #導入隨機森林模型
from sklearn import tree, datasets

#載入紅酒數(shù)據(jù)
wine = datasets.load_wine()

#只選取前兩個特征
X = wine.data[:, :2]
y = wine.target

#拆分訓練集和數(shù)據(jù)集
X_train, X_test, y_train, y_test = train_test_split(X, y)

#設(shè)定隨機森林中有6顆樹
forest = RandomForestClassifier(n_estimators=6, random_state=3)

#擬合數(shù)據(jù)
forest.fit(X_train, y_train)

#繪制圖形
#定義圖像中分區(qū)的顏色和散點的顏色
cmap_light= ListedColormap(['#FFAAAA', '#AAFFAA', '#AAAAFF'])
cmap_bold = ListedColormap(['#FF0000', '#00FF00', '#0000FF'])

#分別用樣本的兩個特征值創(chuàng)建圖像和橫軸和縱軸
x_min, x_max = X[:,0].min()-1, X[:,0].max()+1
y_min, y_max = X[:,1].min()-1, X[:,1].max()+1
#用不同的背景色表示不同的類
xx, yy = np.meshgrid(np.arange(x_min, x_max, .02),
                     np.arange(y_min, y_max, .02))
z = forest.predict(np.c_[(xx.ravel(), yy.ravel())]).reshape(xx.shape)

plt.figure()
plt.pcolormesh(xx, yy, z, cmap=cmap_light)

#用散點把樣本標出來
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=cmap_bold, edgecolors='k', s=20)
plt.xlim(xx.min(), xx.max())
plt.ylim(yy.min(), yy.max())

plt.title('Classifier: RandomForestClassifier') #依照參數(shù)值修改標題
plt.show()

運行結(jié)果如下圖可示旬陡,隨機森林的分類比較細膩,可調(diào)節(jié)參數(shù)查看分類器的表現(xiàn)


6.3RadomForest.png

二语婴、要不要和相親對象進一步發(fā)展

采用美國1994 年采集的的成年人數(shù)據(jù)集,包括年齡驶睦、工作單位性質(zhì)砰左、學歷等。下完之后是.data格式场航,重命名為.csv
數(shù)據(jù)集從這個地址下載:archive.ics.uci.edu/ml/machine-learning-databases/adult/

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
from sklearn.model_selection import train_test_split #切分訓練集和測試集
from sklearn.ensemble import RandomForestClassifier #導入隨機森林模型
from sklearn.tree import DecisionTreeClassifier #導入決策樹模型
import graphviz
from sklearn.tree import export_graphviz  #導入決策樹中輸出graphviz的接口
from sklearn.externals.six import StringIO

#載入數(shù)據(jù)集
data = pd.read_csv('adult.csv', header=None, index_col=False, names=['年齡', '單位性質(zhì)', '權(quán)重', '學歷', '受教育時長', '婚姻狀況',
                                                                     '職業(yè)', '家庭情況', '種族', '性別', '資產(chǎn)所得', '資產(chǎn)損失',
                                                                     '周工作時長','原籍', '收入'])

#只取部分數(shù)據(jù)
data_lite = data[['年齡', '單位性質(zhì)', '學歷', '性別', '周工作時長', '職業(yè)', '收入']]

#查看前5條數(shù)據(jù)
print('>>>>>>>>>>>原始數(shù)據(jù)前5行')
print(data_lite.head(5))

#使用 get_dummies 處理數(shù)據(jù)缠导,將文本數(shù)據(jù)轉(zhuǎn)化為數(shù)值,將特征值拆開溉痢,轉(zhuǎn)換為0,1
data_dummie = pd.get_dummies(data_lite)

#對比原始特征和虛擬變量特征
print('樣本原始特征:\n', list(data_lite.columns), '\n')
print('虛擬變量特征:\n', list(data_dummie.columns), '\n')
print(list(data_dummie.columns)[:-2])

#查看前5條數(shù)據(jù)
print('>>>>>>>>>>>get_dummies 處理后數(shù)據(jù)前5行')
print(data_dummie.head(5))

#定義數(shù)據(jù)集的特征值
features = data_dummie.loc[:,'年齡':'職業(yè)_ Transport-moving']
#將特征數(shù)值賦值給X
X = features.values
#將收入大于50k作為預測目標
y = data_dummie['收入_ >50K'].values

#拆分訓練集和數(shù)據(jù)集
X_train, X_test, y_train, y_test = train_test_split(X, y)

#用最大深度為5 的決策樹擬合數(shù)據(jù)
clf = DecisionTreeClassifier(max_depth=6)#依次取max_depth=1僻造, 3, 5 查看結(jié)果
clf.fit(X_train, y_train)

#用隨機森林擬合數(shù)據(jù)
forest = RandomForestClassifier(n_estimators=6, random_state=2)
forest.fit(X_train, y_train)

print('代碼運行結(jié)果為:')
print('==========================')
print("決策樹訓練數(shù)據(jù)得分:{:.2f}".format(clf.score(X_test, y_test)))
print('==========================')
print("隨機森林訓練數(shù)據(jù)得分:{:.2f}".format(forest.score(X_test, y_test)))

#畫出決策樹的執(zhí)行圖
dot_data = StringIO()
dot_data = export_graphviz(clf, out_file=None, class_names=list(data_dummie.columns),
                feature_names=list(data_dummie.columns)[:-2], impurity=False, filled=True)
graph = graphviz.Source(dot_data) # doctest: +SKIP

#在同級目錄下生成tree.pdf文件
graph.render("Datingtree") # 保存成pdf

#對Mr Z男士進行預測(年齡37孩饼,在省機關(guān)工作髓削,碩士學歷等等)
Mr_z = [[37, 40, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
dating_desc = clf.predict(Mr_z)
dating_desc1 = forest.predict(Mr_z)
print('決策樹預測結(jié)果為:')
print('==========================')
if dating_desc ==1 :
    print("金龜婿啊,這哥們月薪超過5萬了镀娶,快去約會")
else:
    print("算了立膛,不滿足你的要求")
print('\n')
print('隨機森林預測結(jié)果為:')
print('==========================')
if dating_desc ==1 :
    print("金龜婿啊,這哥們月薪超過5萬了,快去約會")
else:
    print("算了宝泵,不滿足你的要求")

執(zhí)行結(jié)果如下:


6.4DexisionAndRadomForest.png
>>>>>>>>>>>原始數(shù)據(jù)前5行
   年齡               單位性質(zhì)          學歷       性別  周工作時長                  職業(yè)  \
0  39          State-gov   Bachelors     Male     40        Adm-clerical   
1  50   Self-emp-not-inc   Bachelors     Male     13     Exec-managerial   
2  38            Private     HS-grad     Male     40   Handlers-cleaners   
3  53            Private        11th     Male     40   Handlers-cleaners   
4  28            Private   Bachelors   Female     40      Prof-specialty   

       收入  
0   <=50K  
1   <=50K  
2   <=50K  
3   <=50K  
4   <=50K  
樣本原始特征:
 ['年齡', '單位性質(zhì)', '學歷', '性別', '周工作時長', '職業(yè)', '收入'] 

虛擬變量特征:
 ['年齡', '周工作時長', '單位性質(zhì)_ ?', '單位性質(zhì)_ Federal-gov', '單位性質(zhì)_ Local-gov', '單位性質(zhì)_ Never-worked', '單位性質(zhì)_ Private', '單位性質(zhì)_ Self-emp-inc', '單位性質(zhì)_ Self-emp-not-inc', '單位性質(zhì)_ State-gov', '單位性質(zhì)_ Without-pay', '學歷_ 10th', '學歷_ 11th', '學歷_ 12th', '學歷_ 1st-4th', '學歷_ 5th-6th', '學歷_ 7th-8th', '學歷_ 9th', '學歷_ Assoc-acdm', '學歷_ Assoc-voc', '學歷_ Bachelors', '學歷_ Doctorate', '學歷_ HS-grad', '學歷_ Masters', '學歷_ Preschool', '學歷_ Prof-school', '學歷_ Some-college', '性別_ Female', '性別_ Male', '職業(yè)_ ?', '職業(yè)_ Adm-clerical', '職業(yè)_ Armed-Forces', '職業(yè)_ Craft-repair', '職業(yè)_ Exec-managerial', '職業(yè)_ Farming-fishing', '職業(yè)_ Handlers-cleaners', '職業(yè)_ Machine-op-inspct', '職業(yè)_ Other-service', '職業(yè)_ Priv-house-serv', '職業(yè)_ Prof-specialty', '職業(yè)_ Protective-serv', '職業(yè)_ Sales', '職業(yè)_ Tech-support', '職業(yè)_ Transport-moving', '收入_ <=50K', '收入_ >50K'] 

['年齡', '周工作時長', '單位性質(zhì)_ ?', '單位性質(zhì)_ Federal-gov', '單位性質(zhì)_ Local-gov', '單位性質(zhì)_ Never-worked', '單位性質(zhì)_ Private', '單位性質(zhì)_ Self-emp-inc', '單位性質(zhì)_ Self-emp-not-inc', '單位性質(zhì)_ State-gov', '單位性質(zhì)_ Without-pay', '學歷_ 10th', '學歷_ 11th', '學歷_ 12th', '學歷_ 1st-4th', '學歷_ 5th-6th', '學歷_ 7th-8th', '學歷_ 9th', '學歷_ Assoc-acdm', '學歷_ Assoc-voc', '學歷_ Bachelors', '學歷_ Doctorate', '學歷_ HS-grad', '學歷_ Masters', '學歷_ Preschool', '學歷_ Prof-school', '學歷_ Some-college', '性別_ Female', '性別_ Male', '職業(yè)_ ?', '職業(yè)_ Adm-clerical', '職業(yè)_ Armed-Forces', '職業(yè)_ Craft-repair', '職業(yè)_ Exec-managerial', '職業(yè)_ Farming-fishing', '職業(yè)_ Handlers-cleaners', '職業(yè)_ Machine-op-inspct', '職業(yè)_ Other-service', '職業(yè)_ Priv-house-serv', '職業(yè)_ Prof-specialty', '職業(yè)_ Protective-serv', '職業(yè)_ Sales', '職業(yè)_ Tech-support', '職業(yè)_ Transport-moving']
>>>>>>>>>>>get_dummies 處理后數(shù)據(jù)前5行
   年齡  周工作時長  單位性質(zhì)_ ?  單位性質(zhì)_ Federal-gov  單位性質(zhì)_ Local-gov  單位性質(zhì)_ Never-worked  \
0  39     40        0                  0                0                   0   
1  50     13        0                  0                0                   0   
2  38     40        0                  0                0                   0   
3  53     40        0                  0                0                   0   
4  28     40        0                  0                0                   0   

   單位性質(zhì)_ Private  單位性質(zhì)_ Self-emp-inc  單位性質(zhì)_ Self-emp-not-inc  單位性質(zhì)_ State-gov  \
0              0                   0                       0                1   
1              0                   0                       1                0   
2              1                   0                       0                0   
3              1                   0                       0                0   
4              1                   0                       0                0   

     ...     職業(yè)_ Machine-op-inspct  職業(yè)_ Other-service  職業(yè)_ Priv-house-serv  \
0    ...                         0                  0                    0   
1    ...                         0                  0                    0   
2    ...                         0                  0                    0   
3    ...                         0                  0                    0   
4    ...                         0                  0                    0   

   職業(yè)_ Prof-specialty  職業(yè)_ Protective-serv  職業(yè)_ Sales  職業(yè)_ Tech-support  \
0                   0                    0          0                 0   
1                   0                    0          0                 0   
2                   0                    0          0                 0   
3                   0                    0          0                 0   
4                   1                    0          0                 0   

   職業(yè)_ Transport-moving  收入_ <=50K  收入_ >50K  
0                     0          1         0  
1                     0          1         0  
2                     0          1         0  
3                     0          1         0  
4                     0          1         0  

[5 rows x 46 columns]
代碼運行結(jié)果為:
==========================
決策樹訓練數(shù)據(jù)得分:0.79
==========================
隨機森林訓練數(shù)據(jù)得分:0.78
決策樹預測結(jié)果為:
==========================
算了好啰,不滿足你的要求


隨機森林預測結(jié)果為:
==========================
算了,不滿足你的要求

注釋:

畫決策樹的圖的時候出現(xiàn)了中文亂碼的情況儿奶,參考這兩位大哥的帖子修改
《window系統(tǒng)sklearn決策樹graphviz繪圖中文亂碼解決方法》
《Graphviz畫決策樹中文亂碼解決》

三框往、隨機森林的優(yōu)勢和不足

優(yōu)勢:

  • 1.由于對每個特征進行單獨處理,因此并不需要對數(shù)據(jù)進行轉(zhuǎn)換闯捎,幾乎不需要對數(shù)據(jù)進行預處理
  • 2.支持并行處理椰弊,用 n_jobs 參數(shù)來調(diào)節(jié)。當n_jobs = -1時隙券,隨機森林會使用CPU的全部內(nèi)核男应。
  • 3.隨機森林生成每顆決策樹的方法是隨機的,如果不希望建模的結(jié)果太過于不穩(wěn)定的話娱仔,要固化 random_state參數(shù)
    不足:
  • 對于高維數(shù)據(jù)集沐飘、稀疏數(shù)據(jù)集來說,線性模型比隨機森林的表現(xiàn)要好
  • 隨機森林系相對更消耗內(nèi)存牲迫,速度也比線性模型慢耐朴,如果希望節(jié)省內(nèi)存和時間的話,建議選擇線性模型
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末盹憎,一起剝皮案震驚了整個濱河市筛峭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌陪每,老刑警劉巖影晓,帶你破解...
    沈念sama閱讀 221,430評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異檩禾,居然都是意外死亡挂签,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評論 3 398
  • 文/潘曉璐 我一進店門盼产,熙熙樓的掌柜王于貴愁眉苦臉地迎上來饵婆,“玉大人,你說我怎么就攤上這事戏售∏群耍” “怎么了?”我有些...
    開封第一講書人閱讀 167,834評論 0 360
  • 文/不壞的土叔 我叫張陵灌灾,是天一觀的道長搓译。 經(jīng)常有香客問我,道長锋喜,這世上最難降的妖魔是什么侥衬? 我笑而不...
    開封第一講書人閱讀 59,543評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上轴总,老公的妹妹穿的比我還像新娘直颅。我一直安慰自己,他們只是感情好怀樟,可當我...
    茶點故事閱讀 68,547評論 6 397
  • 文/花漫 我一把揭開白布功偿。 她就那樣靜靜地躺著,像睡著了一般往堡。 火紅的嫁衣襯著肌膚如雪械荷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,196評論 1 308
  • 那天虑灰,我揣著相機與錄音吨瞎,去河邊找鬼。 笑死穆咐,一個胖子當著我的面吹牛颤诀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播对湃,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼崖叫,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了拍柒?” 一聲冷哼從身側(cè)響起心傀,我...
    開封第一講書人閱讀 39,671評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拆讯,沒想到半個月后脂男,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,221評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡种呐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,303評論 3 340
  • 正文 我和宋清朗相戀三年宰翅,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片陕贮。...
    茶點故事閱讀 40,444評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖潘飘,靈堂內(nèi)的尸體忽然破棺而出肮之,到底是詐尸還是另有隱情,我是刑警寧澤卜录,帶...
    沈念sama閱讀 36,134評論 5 350
  • 正文 年R本政府宣布戈擒,位于F島的核電站,受9級特大地震影響艰毒,放射性物質(zhì)發(fā)生泄漏筐高。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,810評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望柑土。 院中可真熱鬧蜀肘,春花似錦、人聲如沸稽屏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽狐榔。三九已至坛增,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間薄腻,已是汗流浹背收捣。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留庵楷,地道東北人罢艾。 一個月前我還...
    沈念sama閱讀 48,837評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像嫁乘,于是被迫代替她去往敵國和親昆婿。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,455評論 2 359