不止于調(diào)包咳秉,告訴你gbdt,xgboost是怎么計(jì)算出最終結(jié)果的

gbdt和xgboost是非常非常常用的數(shù)據(jù)挖掘算法,常用到什么程度呢鸯隅,你要是去參加面試澜建,肯定有人會(huì)問(wèn)你用過(guò)xgboost嗎?能說(shuō)出來(lái)gbdt滋迈、xgboost霎奢、lightgbm的區(qū)別嗎?當(dāng)然很多從事數(shù)據(jù)挖掘工作的小伙伴肯定不能認(rèn)慫饼灿,要說(shuō)用過(guò)幕侠,但是轉(zhuǎn)念一想你們是不是只調(diào)用過(guò)gbdt和xgboost的包,對(duì)于他們?cè)趺从?jì)算出最終結(jié)果卻一無(wú)所知碍彭,當(dāng)然嘛工作中效果好就行了嗎晤硕,管那么多原理,但真正理解原理才能知道怎么去優(yōu)化這個(gè)模型庇忌。
今天就用通俗易懂的語(yǔ)言帶大家去徹底了解這兩個(gè)模型舞箍,因?yàn)檫@兩個(gè)模型有一個(gè)遞進(jìn)的關(guān)系,xgboost實(shí)際是對(duì)gbdt的優(yōu)化皆疹,先從gbdt說(shuō)起疏橄,然后再說(shuō)xgboost。

1 gbdt模型結(jié)果的計(jì)算

gbdt的基分類器是cart,因此可以用于回歸和分類問(wèn)題捎迫,如果你愿意還可以擬合一個(gè)模型樹出來(lái)晃酒。

1.1 回歸問(wèn)題

如果你工作中更多面對(duì)的是回歸任務(wù),那么你應(yīng)該慶幸窄绒,因?yàn)榛貧w問(wèn)題的損失函數(shù)表示簡(jiǎn)單贝次,要么是絕對(duì)誤差,要么是均方損失誤差彰导,要么是二者的結(jié)合蛔翅,采用梯度下降的時(shí)候求導(dǎo)都特別簡(jiǎn)單,尤其是最常用的均方損失誤差位谋,采用梯度擬合實(shí)際就是對(duì)殘差進(jìn)行擬合山析,理解起來(lái)毫不費(fèi)力。
以預(yù)測(cè)年齡為例先說(shuō)一下gbdt做回歸的流程:
(1)明確回歸的指標(biāo)和目標(biāo)倔幼,指標(biāo)是你現(xiàn)有的特征集合盖腿,目標(biāo)是要擬合的數(shù)值,這個(gè)數(shù)值是連續(xù)的损同,此處年齡這個(gè)變量就是連續(xù)的翩腐,假設(shè)有三個(gè)樣本,年齡分別為25膏燃、26茂卦、27,你現(xiàn)在的目標(biāo)就是盡可能準(zhǔn)確的預(yù)測(cè)出來(lái)這三個(gè)人的歲數(shù)组哩。
(2)確定損失函數(shù)等龙,這個(gè)地方我認(rèn)為是非常重要的,有人對(duì)損失函數(shù)的理解可能不夠深伶贰,損失函數(shù)最大的作用是確定梯度下降時(shí)的梯度方向蛛砰,回歸問(wèn)題一般采用MSE(均方誤差損失),它求完導(dǎo)梯度實(shí)際就是殘差黍衙。
(3)擬合一顆cart樹泥畅,怎么擬合呢,我們不是有三個(gè)數(shù)據(jù):
[特征1琅翻,特征2位仁,…,特征n方椎,25]聂抢、
[特征1,特征2棠众,…琳疏,特征n,26]、
[特征1空盼,特征2疮薇,…,特征n我注,27]。
就拿這三個(gè)數(shù)據(jù)根據(jù)特征迟隅,遍歷數(shù)據(jù)特征取值去劃分cart樹但骨,由于是回歸問(wèn)題,劃分標(biāo)準(zhǔn)為所有樣本的均方誤差損失最兄窍(這部分不懂去看看cart樹吧奔缠,原理很簡(jiǎn)單),每一輪選擇一個(gè)特征進(jìn)行劃分吼野,知道所有樣本都落入葉子節(jié)點(diǎn)校哎,我們假設(shè)25在一個(gè)葉子節(jié)點(diǎn),26瞳步、27在一個(gè)葉子節(jié)點(diǎn)上闷哆,取均值就是這個(gè)葉子節(jié)點(diǎn)的得分值。
(4)計(jì)算當(dāng)前預(yù)測(cè)值单起,gbdt是殘差擬合抱怔,這一輪得到的預(yù)測(cè)值是之前所有樹的加和,有了這個(gè)加和就可以計(jì)算損失函數(shù)了嘀倒。實(shí)際上這里還有一個(gè)學(xué)習(xí)率屈留,這個(gè)學(xué)習(xí)率就是控制迭代速度的,太大了容易錯(cuò)過(guò)最優(yōu)點(diǎn)测蘑,太小了就導(dǎo)致收斂速度慢灌危。
(5)根據(jù)損失函數(shù)的形式計(jì)算梯度方向,采用MSE梯度方向就是偏差碳胳,就是說(shuō)下次用于預(yù)測(cè)的數(shù)據(jù)變成了勇蝙,
[特征1,特征2固逗,…浅蚪,特征n,0]烫罩、
[特征1惜傲,特征2,…贝攒,特征n盗誊,-0.5]、
[特征1,特征2哈踱,…荒适,特征n,0.5]开镣。
(6)重復(fù)3-5刀诬,直到達(dá)到預(yù)先設(shè)計(jì)的最大的基分類器數(shù)目或者cart樹已經(jīng)滿足收斂了就跳出來(lái)。
可以看出來(lái)邪财,在回歸問(wèn)題中葉子節(jié)點(diǎn)的得分值就是所有位于該葉子節(jié)點(diǎn)的樣本均值陕壹,最后的預(yù)測(cè)結(jié)果怎么得到呢,就是某個(gè)樣本X在每顆cart樹上對(duì)應(yīng)葉子節(jié)點(diǎn)的加和值树埠,我好像一個(gè)公式都沒放糠馆,這里放一個(gè)吧:


gbdt回歸樹最終結(jié)果計(jì)算.png

就說(shuō)了不愛放公式,還得多余解釋怎憋,這個(gè)m=1:M就是M個(gè)基分類器求和又碌,講j=1:J是第m顆上的葉子節(jié)點(diǎn)編號(hào),這個(gè)I就是單位矩陣绊袋,啥意思這個(gè)樣本在葉子節(jié)點(diǎn)上就取1毕匀,不在就取0唄,cmj更簡(jiǎn)單了癌别,就是上面說(shuō)的葉子節(jié)點(diǎn)得分值期揪。
簡(jiǎn)單的理解,gbdt回歸問(wèn)題就是一個(gè)累積計(jì)算的過(guò)程规个,沒一點(diǎn)技術(shù)含量凤薛,會(huì)加法就能算,估計(jì)小學(xué)數(shù)學(xué)水平就夠了诞仓。

1.2 分類問(wèn)題

分類問(wèn)題比較有意思缤苫,也是我們工作中最長(zhǎng)遇到的場(chǎng)景,比如識(shí)別異常用戶等墅拭,這個(gè)分類又包括了二分類和多分類問(wèn)題活玲,二分類比較簡(jiǎn)單,關(guān)于多分類有很多處理方法谍婉,什么一對(duì)一舒憾、一對(duì)多策略等,說(shuō)白了就是要么轉(zhuǎn)換成多個(gè)二分類問(wèn)題穗熬,要么直接用多分類的方法去解決镀迂。二分類簡(jiǎn)單,先說(shuō)二分類吧唤蔗,再說(shuō)多分類探遵。
(1)二分類問(wèn)題
為啥說(shuō)二分類問(wèn)題簡(jiǎn)單窟赏,因?yàn)槎诸悊?wèn)題,類似于邏輯回歸箱季,直接用sigmoid函數(shù)就可以得到最終的類別歸屬概率涯穷。分類問(wèn)題的損失函數(shù)形式很多的,根據(jù)目標(biāo)變量表示的不同(0,1表示或-1,1表示)還有不同的形式藏雏,最常用的形式包括對(duì)數(shù)和指數(shù)以及二者之間的結(jié)合等拷况,還有人把回歸的MSE拿到分類問(wèn)題來(lái)一樣可以用。為啥強(qiáng)調(diào)損失函數(shù)呢掘殴,因?yàn)樵趃bdt中殘差擬合蝠嘉,梯度就是下一代要擬合的值,所以重要杯巨。
接下來(lái),放個(gè)圖努酸,這個(gè)圖是大招服爷,講的就是gbdt分類的流程,但是是一個(gè)多分類問(wèn)題的圖获诈,本來(lái)放到下面講的仍源,但是這里為了說(shuō)明方便先拿出來(lái)。二分類是多分類的一個(gè)特例舔涎,所以這個(gè)圖也適用笼踩。

gbdt算法流程圖

基本你看一篇gbdt算法的文章就有這個(gè)偽代碼,但是沒人愿意給你解釋亡嫌,我一行行說(shuō)吧:
row1:K分類個(gè)數(shù)嚎于,K=2就是二分類問(wèn)題。
row2:M基分類器個(gè)數(shù)挟冠,就是你要訓(xùn)練幾顆樹出來(lái)
row3:計(jì)算屬于每一類的概率于购,softmax函數(shù)
row4:對(duì)于多分類問(wèn)題,每次迭代都訓(xùn)練和類別相同的樹知染,但是對(duì)于二分類問(wèn)題就不用這么麻煩了肋僧,多分類問(wèn)題會(huì)形成M*K顆樹。所以這里再嵌套一層循環(huán)控淡。
row5:計(jì)算殘差了
row6:拿特征值和當(dāng)前殘差值用cart擬合樹了
row7:根據(jù)損失函數(shù)計(jì)算當(dāng)前葉子節(jié)點(diǎn)的得分值嫌吠,觀察一下這個(gè)應(yīng)該是交叉熵?fù)p失函數(shù)的導(dǎo)數(shù)計(jì)算而來(lái)的,應(yīng)該是用了二階泰勒展開掺炭。具體是啥不重要辫诅,重要的是你要會(huì)套公式。雖然我不關(guān)注咋算的涧狮,但是你們可以看看這篇文章了解一下:公式推導(dǎo)泥栖,數(shù)學(xué)不好的慎點(diǎn)簇宽。

row8:更新預(yù)測(cè)值,也是累加吧享,沒啥好說(shuō)的魏割。
好勒,這里可以說(shuō)下二分類問(wèn)題的流程了:
1)明確分類的指標(biāo)和目標(biāo)钢颂,假設(shè)有三個(gè)樣本钞它,要預(yù)測(cè)是不是喜歡看電影,用0-1表示殊鞭,你現(xiàn)在的目標(biāo)就是盡可能準(zhǔn)確的預(yù)測(cè)出來(lái)這三個(gè)人到底愛不愛看電影遭垛。
2)確定損失函數(shù),二分類的損失函數(shù)一般是交叉熵?fù)p失操灿,寫起來(lái)就是下面這樣:


交叉熵?fù)p失

這個(gè)損失函數(shù)咋來(lái)的去看邏輯回歸說(shuō)的比較清楚锯仪,我就不啰嗦了,有人嫌他麻煩趾盐,給簡(jiǎn)化了:


交叉熵?fù)p失函數(shù)的簡(jiǎn)化

3)擬合一顆cart樹庶喜,這里有一個(gè)最重要的問(wèn)題就是初始的F值怎么計(jì)算,大神用0救鲤,我們直接用類別占比久窟。接下來(lái)和回歸樹一樣,我們不是有三個(gè)數(shù)據(jù):
[特征1本缠,特征2斥扛,…,特征n丹锹,1]稀颁、
[特征1,特征2楣黍,…峻村,特征n,0]锡凝、
[特征1粘昨,特征2,…窜锯,特征n张肾,0]。
就拿這三個(gè)數(shù)據(jù)根據(jù)特征锚扎,遍歷數(shù)據(jù)特征取值去劃分cart樹吞瞪,這里樹的分裂準(zhǔn)則,分類問(wèn)題啊一般是用GINI系數(shù)的驾孔,但是考慮到MSE比較好理解芍秆,也可以用MSE惯疙,推薦用MSE,因?yàn)楹?jiǎn)單妖啥。每一輪選擇一個(gè)特征進(jìn)行劃分霉颠,知道所有樣本都落入葉子節(jié)點(diǎn)。我們假設(shè)樣本1荆虱、2在一個(gè)葉子節(jié)點(diǎn)上蒿偎,樣本3在一個(gè)葉子節(jié)點(diǎn)上,你本來(lái)可以取均值獲得這個(gè)葉子節(jié)點(diǎn)的得分值的怀读,但是遺憾的是你的損失函數(shù)是交叉熵?fù)p失函數(shù)诉位,你嚴(yán)格按照公式算吧,記得要先算梯度菜枷。公式是這個(gè)東西:
葉子節(jié)點(diǎn)得分值更新公式

4)計(jì)算當(dāng)前預(yù)測(cè)值苍糠,gbdt是殘差擬合,這一輪得到的預(yù)測(cè)值是之前所有樹的加和啤誊,用這個(gè)公式算岳瞭。

預(yù)測(cè)得分值計(jì)算公式

5)根據(jù)當(dāng)前預(yù)測(cè)值和損失函數(shù)的形式計(jì)算梯度方向,得到梯度值坷衍,更新用于訓(xùn)練樣本的目標(biāo)值,具體就不算了条舔,反正你知道這個(gè)值更新了就好了枫耳。
6)重復(fù)3-5,直到達(dá)到預(yù)先設(shè)計(jì)的最大的基分類器數(shù)目或者cart樹已經(jīng)滿足收斂了就跳出來(lái)孟抗。
然而迁杨,跳出來(lái)是跳出來(lái)了,你現(xiàn)在只有一個(gè)得分值凄硼,還沒轉(zhuǎn)化為分類概率呢铅协。這個(gè)別慌坏平,二分類嘛盛卡,用sigmoid函數(shù)帶入最終累積的函數(shù)得分值就是該樣本為類別1的概率,你再設(shè)置一個(gè)閾值峡懈,分類一下就做好了说墨。
總結(jié)一下骏全,根據(jù)損失函數(shù)的不同,gbdt分類的樣本得分值是不同的尼斧,梯度方向也是不同的姜贡,這兩部分你了解了是咋回事,二分類問(wèn)題就明明白白了棺棵。
此處是不是想有個(gè)例子楼咳,但是我懶啊熄捍,我只講原理,不過(guò)這位大哥不懶你們參考我說(shuō)的去看他的案例:gbdt二分類案例母怜。
(2)多分類問(wèn)題
上面我說(shuō)了多分類的原理了余耽,二分類實(shí)際是一種特殊的多分類問(wèn)題,多分類和二分類不同之處主要有2點(diǎn):
1)訓(xùn)練樹的顆數(shù)不同糙申,二分類每一代你訓(xùn)練一顆樹就行了宾添,但是多分類不行,每一代針對(duì)每一個(gè)類別都要訓(xùn)練一棵樹柜裸,最終得到了M*K顆樹缕陕,這里有一個(gè)疑問(wèn)是怎么根據(jù)類別訓(xùn)練樹。這個(gè)就是目標(biāo)函數(shù)的不同了疙挺,采用0-1編碼表示樣本屬于哪一個(gè)類別扛邑,在訓(xùn)練屬于這個(gè)類別的樹時(shí),目標(biāo)函數(shù)值就是1铐然,不屬于這顆樹的時(shí)候蔬崩,目標(biāo)函數(shù)值就是0。怎么訓(xùn)練樹和二分類一樣搀暑,用cart就行沥阳。
2)最后確定分類的公式不一樣了,回憶二分類問(wèn)題自点,每一個(gè)樣本在每一棵樹上都有一個(gè)得分值桐罕,計(jì)算公式上邊也說(shuō)了,也不廢話了桂敛,最后完成多輪迭代后功炮,我們有了一個(gè)總計(jì)的最終得分值,現(xiàn)在劃分類別了术唬,用softmax函數(shù)薪伏,計(jì)算出概率值后,選最大的那個(gè)作為預(yù)測(cè)分類粗仓,當(dāng)然了每一代的預(yù)測(cè)分類都是根據(jù)累計(jì)目標(biāo)函數(shù)計(jì)算的嫁怀。
很遺憾,多分類暫時(shí)沒有案例給你們看借浊。

2 xgboost模型結(jié)果的計(jì)算

這部分今天太累了不更新了眶掌。
----2019.8.7更新----
拖了好久了,今天來(lái)更新巴碗。

2.1 回歸問(wèn)題

回歸問(wèn)題永遠(yuǎn)是最好理解的問(wèn)題朴爬,和GBDT一樣,這個(gè)也是殘差預(yù)測(cè)橡淆,每一代葉子節(jié)點(diǎn)的得分值是當(dāng)前的殘差召噩,如果要算當(dāng)前的預(yù)測(cè)值得話就拿前一代累積得分值加上當(dāng)前的得分值母赵,就是最終的預(yù)測(cè)結(jié)果,當(dāng)然如果你設(shè)置了得分率具滴,需要乘上得分率凹嘲。我們來(lái)看公式:

得分計(jì)算公式

如果有學(xué)習(xí)率,把學(xué)習(xí)率乘到那兩個(gè)求和符號(hào)前邊构韵。
至于這個(gè)c怎么計(jì)算的周蹭,xgboost和gbdt不一樣的,xgboost怎么算的疲恢,你過(guò)去看看我這篇文章xgboost原理凶朗,其實(shí)就是參數(shù)的計(jì)算方法,一系列推導(dǎo)展開的显拳∨锓撸回歸問(wèn)題都這樣,就不多說(shuō)了杂数。

2.2 分類問(wèn)題

在說(shuō)分類問(wèn)題之前宛畦,給大家一個(gè)提示。
xgboost這個(gè)包有原生和sklearn兩個(gè)接口揍移,具體怎么區(qū)分呢:
原生接口:
舉個(gè)例子

import xgboost as xgb
params = {
    'eta':0.1,
    'max_depth':2,
    'min_child_weight':3,
    'gamma':0,
    'subsample':.8,
    'colsample_bytree':.7,
    'reg_alpha':1,
    'objective':'reg:linear'
}
dtrain = xgb.DMatrix(xtrain,ytrain)
dtest = xgb.DMatrix(xtest,ytest)
watchlist1 = [(dtrain,'train'),(dtest,'test')]

model1 = xgb.train(params=params,dtrain=dtrain,num_boost_round=100,early_stopping_rounds=10,evals=watchlist1)

這是原生的次和,數(shù)據(jù)需要整理成它要求的樣子,直接調(diào)用包的train函數(shù)進(jìn)行訓(xùn)練那伐。
sklearn接口:

from xgboost.sklearn import XGBRegressor
model2 = XGBRegressor(
    learn_rate = 0.1,
    max_depth = 2,
    min_child_weight = 3,
    gamma = 0,
    subsample = 0.8,
    colsample_bytree = 0.7,
    reg_alpha = 1,
    objective = 'reg:linear',
    n_estimators = 100
)
watchlist2 = [(xtrain,ytrain),(xtest,ytest)]
model2.fit(xtrain,ytrain,eval_set=watchlist2,early_stopping_rounds=10)

sklearn接口就簡(jiǎn)單多了踏施,跟你平時(shí)用sklearn的其他算法是一樣的。
為什么說(shuō)這個(gè)喧锦,因?yàn)槎咴诮Y(jié)果輸出是有區(qū)別的读规。
不管是多分類還是二分類任務(wù)抓督,我直接說(shuō)了燃少。

  • 原生接口,返回的是概率值铃在,這個(gè)概率值是每一個(gè)樣本在每一棵樹上得分加種后阵具,采用softmax歸一化的值。
  • sklearn定铜,返回的事類別阳液,它直接以0.5為閾值進(jìn)行劃分,當(dāng)然為了給你創(chuàng)造空間揣炕,還提供了predict_proba 函數(shù)返回預(yù)測(cè)概率值帘皿。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市畸陡,隨后出現(xiàn)的幾起案子鹰溜,更是在濱河造成了極大的恐慌虽填,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件曹动,死亡現(xiàn)場(chǎng)離奇詭異斋日,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)墓陈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門恶守,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人贡必,你說(shuō)我怎么就攤上這事兔港。” “怎么了赊级?”我有些...
    開封第一講書人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵押框,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我理逊,道長(zhǎng)橡伞,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任晋被,我火速辦了婚禮兑徘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘羡洛。我一直安慰自己挂脑,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開白布欲侮。 她就那樣靜靜地躺著崭闲,像睡著了一般。 火紅的嫁衣襯著肌膚如雪威蕉。 梳的紋絲不亂的頭發(fā)上刁俭,一...
    開封第一講書人閱讀 49,749評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音韧涨,去河邊找鬼牍戚。 笑死,一個(gè)胖子當(dāng)著我的面吹牛虑粥,可吹牛的內(nèi)容都是我干的如孝。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼娩贷,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼第晰!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤茁瘦,失蹤者是張志新(化名)和其女友劉穎罗岖,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體腹躁,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡桑包,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了纺非。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哑了。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖烧颖,靈堂內(nèi)的尸體忽然破棺而出弱左,到底是詐尸還是另有隱情,我是刑警寧澤炕淮,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布拆火,位于F島的核電站,受9級(jí)特大地震影響涂圆,放射性物質(zhì)發(fā)生泄漏们镜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一润歉、第九天 我趴在偏房一處隱蔽的房頂上張望模狭。 院中可真熱鬧,春花似錦踩衩、人聲如沸嚼鹉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)锚赤。三九已至,卻和暖如春褐鸥,著一層夾襖步出監(jiān)牢的瞬間线脚,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工晶疼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留酒贬,地道東北人又憨。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓翠霍,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親蠢莺。 傳聞我的和親對(duì)象是個(gè)殘疾皇子寒匙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

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