Decision Tree病梢、Random Forest胃珍、AdaBoost、GBDT

Decision Tree

基本思想在于每次分裂節(jié)點時選取一個特征使得劃分后得到的數(shù)據(jù)集盡可能純蜓陌。

劃分標準

信息增益(Information Gain)

信息增益 = 未劃分數(shù)據(jù)集的信息熵 - 劃分后子數(shù)據(jù)集的信息熵的數(shù)學期望值觅彰。
事件x_i的信息量=-logP(x_i),信息熵就是信息量的期望值钮热,記作H(x)填抬,即H(x)=-\sum_{i=1}^{n}P(x_i)logP(x_i)
假設未劃分數(shù)據(jù)集中共有C類霉旗,劃分為了K份痴奏,則\begin{aligned} Gain&=H-\overline{H_{splited}} \\ &=(-\sum_{i=1}^{C}P(i)logP(i))-\sum_{i=1}^K P(D_i)H(D_i))\\ &=(-\sum_{i=1}^{C}P(i)logP(i))-\sum_{i=1}^K \frac{len(D_i)}{len(D)} H(D_i)) \end{aligned}

增益比率(Gain Ratio)

按照信息增益來選擇特征時總是會傾向于選擇分支多的特征屬性,這樣子能夠使得劃分后每個子集的信息熵最小厌秒。比如读拆,給每一個數(shù)據(jù)添加一個獨一無二的id值特征,則按照id值進行分類是獲得信息增益最大的鸵闪。這樣子檐晕,每個子集的信息熵為0,但是這樣的分類毫無任何意義蚌讼,無任何泛化能力辟灰。為了克服信息增益的弱泛化能力的缺陷,引入了分裂信息篡石,即
SplitInfo=-\sum_{i=1}^K \frac{len(D_i)}{len(D)} P(\frac{len(D_i)}{len(D)})
可以看出來芥喇,數(shù)據(jù)分得越多,分裂信息也就越大凰萨。那么继控,
GainRatio=\frac{Gain}{SplitInfo}
為防止SplitInfo趨于0,有時需要在分母上添加一個平滑函數(shù)胖眷。分母由SplitInfo變?yōu)?img class="math-inline" src="https://math.jianshu.com/math?formula=SplitInfo%2B%5Coverline%7BSplitInfo%7D" alt="SplitInfo+\overline{SplitInfo}" mathimg="1">武通,即加上了所有可能的分裂信息的均值。

基尼系數(shù)(Gini Index)

直觀的說珊搀,基尼系數(shù)表示的是隨機從節(jié)點中抽取兩個樣本冶忱,其對應的類別不一樣的概率。
I_G(D)=1-\sum_{i=1}^{C}P(i)^2
I_G^{Splited}(D)=\sum_{j=1}^{K}P(D_j)I_G(D_j)
\Delta I_G^{Splited}(D)=I_G(D)-I_G^{Splited}(D)

常用的決策樹類型

  • ID3
    使用信息增益作為屬性選擇標準境析。
    需離散屬性囚枪。如果是連續(xù)屬性派诬,將數(shù)據(jù)集D中元素按照此屬性進行排序,則每2個相鄰元素的中間點可以看成是潛在分裂點眶拉。從第一個潛在分裂點開始千埃,分裂D并計算2個集合的期望信息,具有最小期望信息的點稱為這個屬性的最佳分裂點忆植,其信息期望作為此屬性的信息期望放可。ID3缺點在于其傾向于選擇分支數(shù)量較多的特征變量,可能導致訓練得到一個龐大且深度淺的樹朝刊;另外耀里,輸入變量必須是分類變量,連續(xù)變量需要離散化拾氓。
  • C4.5
    使用增益比率作為屬性選擇標準冯挎。
  • CART
    分類:最小化基尼系數(shù)的均值,眾數(shù)作為最終結果咙鞍;
    回歸:最小化平方差誤差的均值房官,取均值作為最終結果。
    只能形成二叉樹续滋。

分裂相關性質(zhì)

樹分裂的終止條件

遍歷完所有屬性翰守、新劃分的數(shù)據(jù)集中只有一個類別。

分裂屬性

  • 屬性是離散值且不要求生成二叉決策樹疲酌,此時用屬性的每一個劃分作為一個分支蜡峰;
  • 屬性是離散值且要求生成二叉決策樹,此時使用屬性劃分的一個子集進行測試朗恳,按是否屬于這兩個子集分成了2個分支湿颅;
  • 屬性是連續(xù)值,此時確定一個值作為分裂點粥诫,按照值是否大于這個分裂點生成兩個分支油航。

優(yōu)缺點

  • 優(yōu)點:
    • 分類規(guī)則清晰,結果容易理解怀浆。
    • 計算量相對較小劝堪,實現(xiàn)速度快。
    • 非線性揉稚,非參數(shù)方法,誰跑效果都相對一樣熬粗。
    • 不需要預選變量搀玖,可處理異常值、缺失值(使用替代分支)驻呐、不同量綱值等數(shù)據(jù)類型灌诅。
    • 同時可以處理分類變量和數(shù)值變量芳来。但是可能決策樹對于連續(xù)變量的劃分并不合理,可以提前離散化猜拾。
    • 相對于Logistic Regression即舌,可以處理多輸出的問題。
    • 另外挎袜,決策樹不需要做變量篩選顽聂,會自動篩選《⒁牵可以做特征選擇紊搪、特征組合。
  • 缺點:
    • 最大的缺點就是很容易過擬合全景,導致實際預測的效果并不高耀石。
    • 泛化能力太差,對于沒有出現(xiàn)過的值幾乎沒有辦法爸黄。
    • 若數(shù)據(jù)集類別不平衡滞伟,生成的樹會存在偏見。
    • 不是很穩(wěn)定炕贵,數(shù)據(jù)變一點梆奈,樹就會發(fā)生變化。對異常值過于敏感鲁驶, 很容易導致樹的結構發(fā)生巨大的變化鉴裹。
    • 不適合處理高維稀疏數(shù)據(jù),不適合處理特征關聯(lián)性較強的數(shù)據(jù)钥弯。

Random Forest

random forest是decision tree的bagging径荔,并且在bagging的基礎上更進一步。其核心思想就是雙隨機過程脆霎,隨機有放回樣本采樣(行采樣)和隨機無放回特征采樣(列采樣)总处。列采樣又分為全局列采樣,即采后建樹睛蛛;局部列采樣鹦马,每次節(jié)點分裂時采樣。

基本流程

  • 樣本的隨機
    從樣本集中使用bootstrap隨機選擇N個樣本忆肾。常N=\sqrt{N_{樣本數(shù)}}荸频。
  • 特征的隨機
    從所有屬性中隨機選擇K個屬性,選擇最佳分割方式作為節(jié)點建立decision tree客冈。常K=\sqrt{N_{屬性數(shù)}}旭从。
  • 重復上述過程m次,建立了m棵樹。
  • m棵樹投票表決和悦,分類概率總和退疫,可以平衡不平衡數(shù)據(jù)集的誤差,回歸平均值鸽素。

優(yōu)缺點

  • 優(yōu)點
    • 在當前的很多數(shù)據(jù)集上褒繁,相對其他算法有著很大的優(yōu)勢,表現(xiàn)良好馍忽。
    • 能夠處理很高維度的數(shù)據(jù)棒坏,并且不用做特征選擇。
    • 在訓練完后舵匾,它能夠給出哪些特征比較重要俊抵。
    • 在創(chuàng)建隨機森林的時候,對泛化誤差使用的是無偏估計坐梯,模型泛化能力強徽诲,一定程度上能夠避免過擬合。
    • 訓練速度快吵血,容易做成并行化方法谎替。
    • 在訓練過程中,能夠檢測到特征間的相互影響蹋辅。
    • 實現(xiàn)比較簡單钱贯。
    • 對于不平衡的數(shù)據(jù)集來說,它可以平衡誤差侦另。
    • 如果有很大一部分的特征遺失秩命,仍可以維持準確度。
  • 缺點:
    • 已經(jīng)證明了在某些噪音較大的分類或回歸問題上會過擬合褒傅。
    • 對于有不同取值的屬性的數(shù)據(jù)弃锐,取值劃分較多的屬性會對隨機森林產(chǎn)生更大的影響,所以隨機森林在這種數(shù)據(jù)上產(chǎn)出的屬性權值是不可信的殿托。

Random Forest用于特征選擇

特征選擇的目標有兩個霹菊,一是找到與因變量高度相關的特征變量;二是選出數(shù)目較少的特征變量并且能夠充分預測因變量的結果支竹。

特征重要性

  • 基尼系數(shù)
    特征i重要性=\frac{\sum_{N_{DT}}\sum_{M_i} Gini變化量(特征i)}{\sum_{j \in L}\sum_{N_{DT}}\sum_{M_j} Gini變化量(特征j)}
    其中旋廷,特征i出現(xiàn)的節(jié)點的集合記作M_i,特征j出現(xiàn)的節(jié)點的集合記作M_j礼搁,random forest中樹的棵數(shù)記作N_{DT}饶碘,將屬性集合記作L
    • 存在的問題:
      對于存在關聯(lián)的多個特征馒吴,其中任意一個都可以作為指示器或者說是優(yōu)秀特征扎运,并且一旦其中的某個特征被選中之后卑雁,其他特征的重要度就會急劇下降,因為不純度已經(jīng)被選中的那個特征降下來了绪囱,其他的特征就很難再降低那么多的不純度了。這樣一來莹捡,只有先被選中的那個特征重要度很高鬼吵,其他關聯(lián)特征的重要度往往較低。在理解數(shù)據(jù)時篮赢,就會造成誤解齿椅,導致錯誤地認為先被選中的特征是很重要的,而其余的特征是不重要的启泣,但實際上這些特征對響應變量的作用是十分接近的涣脚。
      特征隨機選擇方法稍微緩解了這個問題,但是總的來說并沒有完全解決寥茫。
  • OOB error
    將OOB數(shù)據(jù)代入訓練好的RF中去計算結果遣蚀,對比實際類別得ERROR1;對每個特征隨機添加一定的噪聲或者將當前特征隨機打散纱耻,再次代入RF去計算得ERROR2芭梯;計算ERROR1與ERROR2之間的差值,差值越大弄喘,說明對應的特征越重要玖喘。

常用的步驟

  1. 初步估計與排序
  • 對隨機森林中的特征變量按照特征重要性降序排序。
  • 確定刪除比例蘑志,從當前特征變量中剔除相應比例的不重要的特征累奈,從而得到一個新的特征集。
  • 用新的特征集建立新的隨機森林急但,并計算特征集中每個特征的重要性澎媒,降序排序。
  • 重復上述過程至剩下m個特征羊始。
  1. 根據(jù)1中得到的每個特征集及基于其建立的RF旱幼,計算OOB error,選擇OOB error最小的特征集作為最后選定的特征集突委。

Adaptive Boosting(AdaBoost)

"boosting"意為通過將一些表現(xiàn)一般柏卤,可能僅僅略好于隨機猜測的模型通過特定方法進行組合后來獲得一個表現(xiàn)較好的模型。
"adaptive"意為在訓練過程中匀油,每個新的模型都會基于前一個模型的表現(xiàn)結果進行調(diào)整缘缚。
y\in \{-1,+1\}
g_t \leftarrow \arg\min_{h\in H}(\sum_{n=1}^{N}u_n^t[y_n \neq h(x_n)])
g_{t+1} \leftarrow \arg\min_{h\in H}(\sum_{n=1}^{N}u_n^{t+1}[y_n \neq h(x_n)])
如果g_tu^{t+1}下表現(xiàn)得不好,那么返回的g_{t+1}就不會是g_t敌蚜,便可以認為g_{t+1}g_t不同桥滨。
因此,構建u^{t+1}使得在u^{t+1}g_t的表現(xiàn)近似于隨機猜,即
\frac{\sum_{n=1}^N u_n^{t+1}[y_n\neq g_t(x_n)]}{\sum_{n=1}^N u_n^{t+1}}=\frac{1}{2}
\sum_{n=1}^N u_n^{t+1}[y_n=g_t(x_n)]=\sum_{n=1}^N u_n^{t+1}[y_n\neq g_t(x_n)]齐媒。
因此蒲每,分正確的u_n^{t+1}=u_n^t*g_t在u_n^t下的分類錯誤率,分錯誤的u_n^{t+1}=u_n^t*g_t在u_n^t下的分類正確率喻括。
g_tu_n^t下的分類錯誤率為\epsilon邀杏,即\epsilon=\frac{\sum_{n=1}^N u_n^{t}[y_n\neq g_t(x_n)]}{\sum_{n=1}^N u_n^{t}}
定義縮放因子\diamondsuit_t,即\diamondsuit_t=\sqrt{\frac{1-\epsilon_t}{\epsilon_t}}
那么唬血,
incorrect\leftarrow incorrect*\diamondsuit_t, correct\leftarrow correct/\diamondsuit_t
可解釋為放大錯誤點望蜡,縮小正確點。
因此拷恨,AdaBoost算法流程總結如下:

  • 初始化:
    u^1=[\frac{1}{N},\frac{1}{N},\cdots,\frac{1}{N}]^T
  • for t = 1,2,...,T
    1. 獲得g_t
      g_t \leftarrow \arg \min_{h\in H}(\sum_{n=1}^{N}u_n^t[y_n \neq h(x_n)])
    2. 更新u^tu^{t+1}
      \epsilon=\frac{\sum_{n=1}^N u_n^{t}[y_n\neq g_t(x_n)]}{\sum_{n=1}^N u_n^{t}}
      \diamondsuit_t=\sqrt{\frac{1-\epsilon_t}{\epsilon_t}}
      對于u_n^{t+1},有
      if\ y_n=g_t(x_n),\ u_n^{t+1}=u_n^{t}/\diamondsuit_t
      if\ y_n\neq g_t(x_n),\ u_n^{t+1}=u_n^{t}*\diamondsuit_t
    3. 計算\alpha_t
      \alpha_t=\ln \diamondsuit_t
      G_t=\sum_{\tau=1}^t\alpha_{\tau} g_{\tau}
  • return h=sign(G_T)

Gradient Boosted Decision Tree(GBDT)

AdaBoost代價函數(shù)分析

\begin{aligned} u_n^{t+1}&=u_n^{t}\cdot\diamondsuit_t^{-y_n g_t(x_n)}\\ &=u_n^{t}\cdot\exp(-\alpha_ty_ng_t(x_n)) \end{aligned}
\begin{aligned} u_n^{T+1}&=u_n^1\prod_{t=1}^{T}\exp(-\alpha_t y_n g_t (x_n))\\ &=\frac{1}{N}\exp(-y_n\sum_{t=1}^{T}\alpha_t g_t (x_n)) \end{aligned}
linear\ score\ s=\sum_{t=1}^{T}\alpha_t g_t(x), \ G(x)=sign(s)
\begin{aligned} \sum_{n=1}^N u_n^{T+1}&=\sum_{n=1}^N \frac{1}{N}\exp(-y_n\sum_{t=1}^{T}\alpha_t g_t (x_n)) \\ &=\sum_{n=1}^N \frac{1}{N}\exp(-y_n s_n) \end{aligned}
可以看出來脖律,AdaBoost采用的是指數(shù)損失函數(shù)。每一次迭代更新模型的過程可以看成是求使得
\min_{\eta}\ \min_{h}\frac{1}{N}\sum_{n=1}^N \exp(-y_n\sum_{\tau=1}^{t-1}\alpha_{\tau} g_{\tau} (x_n)+\eta h(x_n))
最小的h\eta腕侄,進行推導后可以發(fā)現(xiàn)h為AdaBoost中的g_t小泉,\eta為對應的\alpha_t

Gradient Boosting

Gradient Boosting與base model為決策樹的結合即為GBDT模型兜挨。由于決策樹是非線性的膏孟,并且隨著深度的加深,非線性越來越強拌汇,基于決策樹的GBDT也是非線性的柒桑。
AdaBoost是Gradient Boosting的一個特例,或者說Gradient Boosting是對AdaBoost進行了推廣噪舀。
Gradient Boosting抽象地說魁淳,模型的訓練過程是對于任意可導目標函數(shù)的優(yōu)化過程。通過反復地選擇一個指向負梯度方向的函數(shù)与倡。該算法可以被看做是在函數(shù)空間里對目標函數(shù)進行了優(yōu)化界逛。Gradient Boosting在每一次模型迭代中求解使得\min_{\eta}\ \min_{h}\frac{1}{N}\sum_{n=1}^N err(\sum_{\tau=1}^{t-1}\alpha_{\tau} g_{\tau} (x_n)+\eta h(x_n), y_n)最小的h\eta作為對應的g_t\alpha_t
和AdaBoost一樣纺座,Gradient Boosting也是重復選擇一個表現(xiàn)一般的模型息拜,并且每次都基于先前模型的表現(xiàn)進行調(diào)整。不同的是净响,AdaBoost是通過提升錯分數(shù)據(jù)點的權重來定位模型的不足而Gradient Boosting是通過計算梯度來定位模型的不足少欺。因此,相比AdaBoost馋贤,Gradient Boosting可以使用更多種類的目標函數(shù)赞别。
因此,Gradient Boosting算法流程總結如下:

  • 初始化:
    s_1=s_2=\cdots=s_N=0
  • for t = 1,2,...,T
    1. g_t \leftarrow A\{(x_n,y_n-s_n)\}配乓,如果模型A使用的是二次代價回歸函數(shù)的話仿滔;
    2. 使用基于\{(g_t(x_n),y_n-s_n)\}的單一變量線性回歸計算出\alpha_t值惠毁;
    3. 更新s_n\leftarrow s_n+\alpha_t g_t(x_n)
  • return G(x)=\sum_{t=1}^T\alpha_t g_t(x)

Gradient Boosting for Regression

有一組數(shù)據(jù)(x_1,y_1),\cdots,(x_N,y_N)和一個基礎模型F,想最小化F(x_i)和真實值y_i之間的二次代價函數(shù)崎页。\forall i \in [1,N]鞠绰,稱h_i=y_i-F(x_i)為關于x_i的殘差,可以訓練一個回歸樹h來擬合\{(x_i,y_i-F(x_i))\}飒焦,這樣就得到了一個更好的模型F+h洞豁,重復這一個過程,最終得到了一個讓人滿意的模型荒给。
這里使用回歸樹去擬合殘差,其實就是用回歸樹去擬合負梯度刁卜。當loss不為square loss時志电,殘差不一定等于負梯度!我們實際上是在通過梯度下降法對模型參數(shù)進行更新蛔趴,這樣理解的好處在于我們可以將這個算法推廣到其他的損失函數(shù)上去挑辆。回歸不一定適用平方代價孝情,平方代價的優(yōu)點在于便于理解和實現(xiàn)鱼蝉,缺點在于對于異常值的魯棒性較差。有時候會選擇其他的代價函數(shù)箫荡,如absolute loss魁亦,即y-F或者huber loss,即
if\ |y-F|\leq \delta,\ 則\frac{1}{2}(y-F)^2;\ if\ |y-F|> \delta,\ 則\delta(|y-F|-\frac{\delta}{2})羔挡。
梯度下降法的思想使得我們可以非常輕易地改用不同的損失函數(shù)設計Gradient Boosting算法洁奈。另外在使用某些其他損失函數(shù)時,殘差比起負梯度更容易受到異常值的影響绞灼。

Random Forest vs GBDT

相同

隨機森林和GBDT都屬于集成算法利术,base model都是決策樹。

不同

隨機森林

隨機森林是決策樹的bagging低矮。
bagging通過重復對原訓練數(shù)據(jù)集上進行有放回地采樣生成的數(shù)據(jù)集用base model進行訓練多次印叁,然后,對于分類求眾數(shù)军掂,對于回歸求平均作為最終結果轮蜕。
可并行。
隨機森林希望單個決策樹偏差小良姆、方差大肠虽,這樣通過N個決策樹的疊加可以減少方差,達到較好的結果玛追。N越大税课,泛化能力越好闲延。
隨機森林里的樹可以是分類樹也可以是回歸樹。

GBDT

GBDT是決策樹的boosting韩玩。
boosting通過在原訓練數(shù)據(jù)集變化的版本上進行base model的訓練垒玲,當前base model的訓練是基于上一個base model的表現(xiàn)的,然后線性組合起這些base model找颓。
是串行合愈。
GBDT希望單個決策樹能力只要好于隨機即可,這樣通過boosting后就可以降低偏差击狮,達到較好的表現(xiàn)佛析。
樹越多,GBDT越可能過擬合彪蓬。
GBDT的核心在于累加所有樹的結果作為最終結果寸莫,而分類樹的結果顯然是沒辦法累加的,所以GBDT中的樹都是回歸樹档冬,不是分類樹膘茎。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市酷誓,隨后出現(xiàn)的幾起案子披坏,更是在濱河造成了極大的恐慌,老刑警劉巖盐数,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件棒拂,死亡現(xiàn)場離奇詭異,居然都是意外死亡玫氢,警方通過查閱死者的電腦和手機着茸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來琐旁,“玉大人涮阔,你說我怎么就攤上這事』遗梗” “怎么了敬特?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長牺陶。 經(jīng)常有香客問我伟阔,道長,這世上最難降的妖魔是什么掰伸? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任皱炉,我火速辦了婚禮,結果婚禮上狮鸭,老公的妹妹穿的比我還像新娘合搅。我一直安慰自己多搀,他們只是感情好,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布灾部。 她就那樣靜靜地躺著康铭,像睡著了一般厚骗。 火紅的嫁衣襯著肌膚如雪缩膝。 梳的紋絲不亂的頭發(fā)上姆怪,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天血筑,我揣著相機與錄音,去河邊找鬼养葵。 笑死蜒什,一個胖子當著我的面吹牛拇泛,可吹牛的內(nèi)容都是我干的荣倾。 我是一名探鬼主播扫责,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼逃呼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起者娱,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤抡笼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后黄鳍,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體推姻,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年框沟,在試婚紗的時候發(fā)現(xiàn)自己被綠了藏古。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡忍燥,死狀恐怖拧晕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情梅垄,我是刑警寧澤厂捞,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站队丝,受9級特大地震影響靡馁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜机久,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一臭墨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧膘盖,春花似錦胧弛、人聲如沸尤误。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽袄膏。三九已至,卻和暖如春掺冠,著一層夾襖步出監(jiān)牢的瞬間沉馆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工德崭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留斥黑,地道東北人。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓眉厨,卻偏偏與公主長得像锌奴,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子憾股,可洞房花燭夜當晚...
    茶點故事閱讀 44,700評論 2 354