成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

解釋模型還只看特征重要性?那你就 OUT 咯!

開發(fā) 前端
為了區(qū)分這兩個方面,我們引入了兩個概念: 預(yù)測貢獻(xiàn)和誤差貢獻(xiàn)。這兩個概念都基于驗(yàn)證數(shù)據(jù)集的 SHAP 值,在文章中我們看到了計(jì)算它們的 Python 代碼。

特征重要性是解釋機(jī)器學(xué)習(xí)模型最常用的工具。這導(dǎo)致我們常常認(rèn)為特征重要性等同于特征好壞。

事實(shí)并非如此。

當(dāng)一個特征很重要時(shí),它僅僅意味著模型發(fā)現(xiàn)它在訓(xùn)練集中很有用。但是,這并不能說明該特征在新數(shù)據(jù)上的泛化能力!。

為了說明這一點(diǎn),我們需要區(qū)分兩個概念:

  • 預(yù)測貢獻(xiàn):變量在模型預(yù)測中的權(quán)重。這是由模型在訓(xùn)練集中發(fā)現(xiàn)的模式?jīng)Q定的。這相當(dāng)于特征重要性。
  • 錯誤貢獻(xiàn):模型在暫存數(shù)據(jù)集上的錯誤中,變量所占的權(quán)重。這可以更好地反映特征在新數(shù)據(jù)上的表現(xiàn)。

在本文中,我將解釋在分類模型中計(jì)算這兩個量背后的邏輯。我還將舉例說明在特征選擇中使用 "誤差貢獻(xiàn) "比使用 "預(yù)測貢獻(xiàn)" 會得到更好的結(jié)果。

假設(shè)我們有一個分類問題,想要預(yù)測一個人的收入是低于還是高于 10k。還假設(shè)我們已經(jīng)有了模型的預(yù)測結(jié)果:

實(shí)際值和模型預(yù)測實(shí)際值和模型預(yù)測

預(yù)測和誤差貢獻(xiàn)的計(jì)算主要基于模型對每個個體的誤差以及每個個體的 SHAP 值。因此,我們必須花一點(diǎn)時(shí)間來討論兩個相關(guān)問題:

  • 分類模型應(yīng)該使用哪種 "誤差"?
  • 我們應(yīng)該如何管理分類模型中的 SHAP 值?

我將在接下來的兩段中討論這些問題。

在分類模型中使用哪種 "誤差"?

我們的主要目標(biāo)是計(jì)算模型中每個特征的誤差貢獻(xiàn)(Error Contribution)。因此,最重要的問題是:如何定義分類模型中的 "誤差"?

請注意,我們需要一個可以在個體水平上計(jì)算的誤差,然后將其匯總到整個樣本中,得到一個 "平均誤差"(回歸模型的絕對誤差請看??顛覆認(rèn)知!這個特征很重要,但不是個好特征!)。

分類模型最常用的損失函數(shù)是對數(shù)損失(又名交叉熵)。它是否適合我們。

下面是對數(shù)損失的數(shù)學(xué)公式:

圖片圖片

對數(shù)損失似乎是最佳選擇,因?yàn)?/p>

  • 公式的外部部分只是一個簡單的平均值;
  • "損失",顧名思義意思是越小越好(就像 "誤差")。

試著理解一下,為什么我們可以稱它為 "誤差"。為了簡單起見,把注意力集中在和里面的數(shù)量上:

圖片圖片

這是單個個體對全局對數(shù)損失的貢獻(xiàn),因此我們可以稱之為 "個體對數(shù)損失"。

這個公式看起來仍然很嚇人,但如果我們考慮到,在二元分類問題中,y只能是 0 或 1,我們就可以得到一個更簡單的版本:

圖片圖片

一圖勝千言,現(xiàn)在就很容易理解對數(shù)損失背后的主要思想了。

圖片圖片

預(yù)測概率與真實(shí)值(無論是 0 還是 1)相差越遠(yuǎn),損失就越大。此外,如果預(yù)測值與真實(shí)值相差很遠(yuǎn)(例如,p=.2,y=1 或 p=.8,y=0),那么損失就會比比例損失更嚴(yán)重。現(xiàn)在我們應(yīng)該更清楚為什么對數(shù)損失實(shí)際上是一種誤差了。

我們準(zhǔn)備將單個對數(shù)損失公式轉(zhuǎn)化為一個 Python 函數(shù)。

為了避免處理無限值(當(dāng) y_pred 恰好為 0 或 1 時(shí)會出現(xiàn)這種情況),我們將使用一個小技巧:如果 y_pred 與 0 或 1 的距離小于 ε,我們將其分別設(shè)置為 ε 或 1-ε。對于 ε,我們將使用 1^-15(這也是 Scikit-learn 使用的默認(rèn)值)。

def individual_log_loss(y_true, y_pred, eps=1e-15):
  """Compute log-loss for each individual of the sample."""
  
  y_pred = np.clip(y_pred, eps, 1 - eps)
  return - y_true * np.log(y_pred) - (1 - y_true) * np.log(1 - y_pred)

我們可以使用該函數(shù)計(jì)算數(shù)據(jù)集中每一行的單個對數(shù)損失:

目標(biāo)變量、模型預(yù)測以及由此產(chǎn)生的個體對數(shù)損失目標(biāo)變量、模型預(yù)測以及由此產(chǎn)生的個體對數(shù)損失

可以看出,個體 1 和個體 2 的對數(shù)損失(或誤差)非常小,因?yàn)轭A(yù)測值都非常接近實(shí)際觀測值,而個體 0 的對數(shù)損失較高。

如何管理分類模型中的 SHAP 值?

最流行的模型是基于樹的模型,如 XGBoost、LightGBM 和 Catboost。在數(shù)據(jù)集上獲取基于樹的分類器的 SHAP 值非常簡單:

from shap import TreeExplainer

shap_explainer = TreeExplainer(model)
shap_values = shap_explainer.shap_values(X)

# 可以定義一個函數(shù)來獲取
def get_preds_shaps(df, features, target, ix_trn):
  """Get predictions (predicted probabilities) and SHAP values for a dataset."""
    
  model = LGBMClassifier().fit(df.loc[ix_trn, features], df.loc[ix_trn, target])
  preds = pd.Series(model.predict_proba(df[features])[:,1], index=df.index)
  shap_explainer = TreeExplainer(model)
  shap_expected_value = shap_explainer.expected_value[-1]
  shaps = pd.DataFrame(
    data=shap_explainer.shap_values(df[features])[1],
    index=df.index,
    columns=features)
  return preds, shaps, shap_expected_value

例如,我們計(jì)算了該問題的 SHAP 值,得到了如下結(jié)果:

模型預(yù)測的 SHAP 值模型預(yù)測的 SHAP 值

不過,就本文而言,只要知道以下幾點(diǎn)就足夠了:

  • SHAP 正值:該特征導(dǎo)致該個體的概率增加;
  • SHAP 負(fù)值:該特征導(dǎo)致該個體的概率降低。

因此,很明顯,個體的 SHAP 值總和與模型的預(yù)測之間存在直接關(guān)系。

然而,由于 SHAP 值可以是任何實(shí)際值(正值或負(fù)值),我們不能期望它等于對該個體的預(yù)測概率(即介于 0 和 1 之間的數(shù)字)。那么,SHAP 值總和與預(yù)測概率之間的關(guān)系是什么呢?

由于 SHAP 值可以是任何負(fù)值或正值,因此我們需要一個函數(shù)來將 SHAP 和轉(zhuǎn)化為概率。這個函數(shù)必須具備兩個特性

  • 它應(yīng)將任何實(shí)數(shù)值 "擠入" 區(qū)間 [0,1];
  • 它應(yīng)該是嚴(yán)格遞增的(因?yàn)檩^高的 SHAP 和總是與較高的預(yù)測值相關(guān)聯(lián))。

符合這些要求的函數(shù)就是 sigmoid 函數(shù)。因此,模型對某一行預(yù)測的概率等于該個體 SHAP 值總和的正余弦值。

從 SHAP 值到預(yù)測概率從 SHAP 值到預(yù)測概率

下面是 sigmoid 函數(shù)的樣子:

圖片圖片

那么,把這個公式轉(zhuǎn)換成一個 Python 函數(shù):

def shap_sum2proba(shap_sum):
  """Compute sigmoid function of the Shap sum to get predicted probability."""
  
  return 1 / (1 + np.exp(-shap_sum))

還可以用圖形顯示出來,看看我們的個體在曲線上的位置:

圖片圖片

既然我們已經(jīng)了解了在分類問題中應(yīng)該使用哪種誤差以及如何處理 SHAP 值,那么我們就可以看看如何計(jì)算預(yù)測值和誤差貢獻(xiàn)值了。

計(jì)算 "預(yù)測貢獻(xiàn)"

當(dāng) SHAP 值為高度正值(高度負(fù)值)時(shí),預(yù)測結(jié)果會比沒有該特征時(shí)高(低)得多。換句話說,如果 SHAP 值的絕對值很大,那么該特征就會對最終預(yù)測結(jié)果產(chǎn)生很大影響。

這就是為什么我們可以通過取某一特征的 SHAP 絕對值的平均值來衡量該特征的預(yù)測貢獻(xiàn)。

prediction_contribution = shap_values.abs().mean()

在玩具數(shù)據(jù)集中,就得到了這樣的結(jié)果:

預(yù)測貢獻(xiàn)預(yù)測貢獻(xiàn)

因此,就特征的重要性而言,job是主要特征,其次是nationality,然后是age。

但誤差貢獻(xiàn)率如何呢?

5. 計(jì)算 "誤差貢獻(xiàn)"

"誤差貢獻(xiàn)" 背后的理念是計(jì)算如果我們?nèi)サ粢粋€給定的特征,模型的誤差會是多少。

有了 SHAP 值,回答這個問題就很容易了:如果我們從 SHAP 總和中剔除某個特征,就可以得到模型在不知道該特征的情況下會做出的預(yù)測。但這還不夠:正如我們所看到的,要獲得預(yù)測概率,我們首先需要應(yīng)用 sigmoid 函數(shù)。

因此,我們首先需要從 SHAP 總和中減去某個特征的 SHAP 值,然后再應(yīng)用 sigmoid 函數(shù)。這樣,我們就得到了模型在不知道這些特征的情況下的預(yù)測概率。

在 Python 中,我們可以一次性完成所有特征的預(yù)測:

y_pred_wo_feature = shap_values.apply(lambda feature: shap_values.sum(axis=1) - feature).applymap(shap_sum2proba)

如果刪除相應(yīng)特征,將得到的預(yù)測結(jié)果如果刪除相應(yīng)特征,將得到的預(yù)測結(jié)果

這意味著,如果沒有job這一特征,模型預(yù)測第一個人的概率為 71%,第二個人的概率為 62%,第三個人的概率為 73%。相反,如果我們沒有nationality這一特征,預(yù)測結(jié)果將分別為 13%、95% 和 0%。

根據(jù)我們移除的特征,預(yù)測的概率相差很大。因此,得出的誤差(個體對數(shù)損失)也會大不相同。

我們可以使用上面定義的函數(shù)("individual_log_loss")來計(jì)算沒有相應(yīng)特征時(shí)的個體對數(shù)損失:

ind_log_loss_wo_feature = y_pred_wo_feature.apply(lambda feature: individual_log_loss(y_true=y_true, y_pred=feature))

如果刪除相應(yīng)特征,我們將獲得的單個對數(shù)損失如果刪除相應(yīng)特征,我們將獲得的單個對數(shù)損失

例如,如果我們選取第一行,我們可以看到,如果沒有job特征,對數(shù)損失將為 1.24,但如果沒有nationality特征,對數(shù)損失僅為 0.13。由于我們要盡量減少損失,在這種情況下,最好是去掉nationality這個特征。

現(xiàn)在,要知道有或沒有該特征的模型會更好,我們可以計(jì)算完整模型的單個對數(shù)損失與沒有該特征的單個對數(shù)損失之間的差值:

ind_log_loss = individual_log_loss(y_true=y_true, y_pred=y_pred)
ind_log_loss_diff = ind_log_loss_wo_feature.apply(lambda feature: ind_log_loss - feature)

模型誤差與沒有該特征時(shí)的誤差之差模型誤差與沒有該特征時(shí)的誤差之差

如果這個數(shù)字是

  • 負(fù)數(shù),則該特征的存在會導(dǎo)致預(yù)測誤差減小,因此該特征對該觀測結(jié)果非常有效。
  • 正數(shù),則該特征的存在會導(dǎo)致預(yù)測誤差增大,因此該特征對該觀測結(jié)果不利。

最后,我們可以按列計(jì)算出每個特征的誤差貢獻(xiàn)值,即這些值的平均值:

error_contribution = ind_log_loss_diff.mean()

錯誤貢獻(xiàn)錯誤貢獻(xiàn)

一般來說,如果這個數(shù)字是負(fù)數(shù),則說明該特征具有積極作用;相反,如果這個數(shù)字是正數(shù),則說明該特征對模型有害,因?yàn)樗鶗黾幽P偷钠骄`差。

在這種情況下,我們可以看到,模型中job特征的存在導(dǎo)致個體對數(shù)損失平均減少-0.897,而nationality特征的存在導(dǎo)致個體對數(shù)損失平均增加 0.049。因此,盡管nationality是第二重要的特征,但它的效果并不好,因?yàn)樗鼤蛊骄鶄€體對數(shù)損失增加 0.049。

將以上過程總結(jié)一個函數(shù)公后續(xù)使用:

def get_feature_contributions(y_true, y_pred, shap_values, shap_expected_value):
  """Compute prediction contribution and error contribution for each feature."""

  prediction_contribution = shap_values.abs().mean().rename("prediction_contribution")
  
  ind_log_loss = individual_log_loss(y_true=y_true, y_pred=y_pred).rename("log_loss")
  y_pred_wo_feature = shap_values.apply(lambda feature: shap_expected_value + shap_values.sum(axis=1) - feature).applymap(shap_sum2proba)
  ind_log_loss_wo_feature = y_pred_wo_feature.apply(lambda feature: individual_log_loss(y_true=y_true, y_pred=feature))
  ind_log_loss_diff = ind_log_loss_wo_feature.apply(lambda feature: ind_log_loss - feature)
  error_contribution = ind_log_loss_diff.mean().rename("error_contribution").T
  
  return prediction_contribution, error_contribution

真實(shí)數(shù)據(jù)集示例

具體代碼可參考上一篇內(nèi)容:

下面,我將使用來自Pycaret的數(shù)據(jù)集。該數(shù)據(jù)集名為 "Gold",包含一些金融數(shù)據(jù)的時(shí)間序列。

數(shù)據(jù)集樣本。特征均以百分比表示,因此 -4.07 表示回報(bào)率為 -4.07%數(shù)據(jù)集樣本。特征均以百分比表示,因此 -4.07 表示回報(bào)率為 -4.07%

特征包括觀察時(shí)刻前 22 天、14 天、7 天和 1 天("T-22"、"T-14"、"T-7"、"T-1")的金融資產(chǎn)回報(bào)率。以下是用作預(yù)測特征的所有金融資產(chǎn):

圖片圖片

可用資產(chǎn)列表。每種資產(chǎn)的觀測時(shí)間分別為-22、-14、-7 和-1。

我們總共有 120 個特征。

我們的目標(biāo)是預(yù)測黃金未來 22 天的回報(bào)率是否會大于 5%。換句話說,目標(biāo)變量是0/1變量的:

  • 0,如果黃金未來 22 天的回報(bào)率小于 5%;
  • 1,如果黃金未來 22 天的回報(bào)率大于 5%。

圖片圖片

未來 22 天黃金回報(bào)率柱狀圖。標(biāo)為紅色的閾值用于定義我們的目標(biāo)變量:回報(bào)率是否大于 5%

加載數(shù)據(jù)集后,我執(zhí)行了以下步驟:

  1. 隨機(jī)分割整個數(shù)據(jù)集:33% 的行在訓(xùn)練數(shù)據(jù)集中,另外 33% 在驗(yàn)證數(shù)據(jù)集中,剩下的 33% 在測試數(shù)據(jù)集中。
  2. 在訓(xùn)練數(shù)據(jù)集上訓(xùn)練 LightGBM 分類器。
  3. 使用上一步訓(xùn)練的模型對訓(xùn)練、驗(yàn)證和測試數(shù)據(jù)集進(jìn)行預(yù)測。
  4. 使用 Python 庫 "shap "計(jì)算訓(xùn)練、驗(yàn)證和測試數(shù)據(jù)集的 SHAP 值。
  5. 使用我們在上一段中看到的代碼,計(jì)算每個特征在每個數(shù)據(jù)集(訓(xùn)練集、驗(yàn)證集和測試集)上的預(yù)測貢獻(xiàn)值和誤差貢獻(xiàn)值。

至此,我們就有了預(yù)測貢獻(xiàn)值和誤差貢獻(xiàn)值,可以對它們進(jìn)行比較了:

預(yù)測貢獻(xiàn)與誤差貢獻(xiàn)(驗(yàn)證數(shù)據(jù)集)預(yù)測貢獻(xiàn)與誤差貢獻(xiàn)(驗(yàn)證數(shù)據(jù)集)

通過觀察這幅圖,我們可以對模型有寶貴的了解。

最重要的特征是 T-22 天的美國債券 ETF,但它并沒有帶來如此大的誤差減少。最好的特征是 T-22 日的 3M Libor,因?yàn)樗茏畲蟪潭鹊販p少誤差。

玉米價(jià)格有一些非常有趣的地方。T-1 期和 T-22 期的收益率都是最重要的特征之一,但其中一個特征(T-1 期)是過度擬合的(因?yàn)樗鼤诡A(yù)測誤差變大)。

一般來說,我們可以觀察到所有誤差貢獻(xiàn)較大的特征都是相對于 T-1 或 T-14(觀察時(shí)刻前 1 天或 14 天)而言的,而所有誤差貢獻(xiàn)較小的特征都是相對于 T-22(觀察時(shí)刻前 22 天)而言的。這似乎表明,最近的特征容易過度擬合,而較早回報(bào)的特征往往概括性更好。

除了深入了解模型之外,我們還可以很自然地想到使用誤差貢獻(xiàn)來進(jìn)行特征選擇。這就是我們下一段要做的。

"誤差貢獻(xiàn)"進(jìn)行遞歸特征消除

遞歸特征消除(RFE)是從數(shù)據(jù)集中逐步去除特征的過程,目的是獲得更好的模型。

RFE 算法非常簡單:

  1. 初始化特征列表;
  2. 使用當(dāng)前特征列表作為預(yù)測因子,在訓(xùn)練集上訓(xùn)練一個模型;
  3. 從特征列表中刪除 "最差 "特征;
  4. 回到第 2 步(直到特征列表為空)。

在傳統(tǒng)方法中,"最差" = 最不重要。然而,根據(jù)我們的觀察,我們可能會反對先刪除危害最大的特征。

換句話說

  • 傳統(tǒng)的 RFE:先去除最無用的特征(最無用 = 驗(yàn)證集上最低的預(yù)測貢獻(xiàn))。
  • 我們的 RFE:先去除最有害的特征(最有害 = 驗(yàn)證集上最高的誤差貢獻(xiàn))。

為了驗(yàn)證這種直覺是否正確,我使用這兩種方法進(jìn)行了模擬。

這是驗(yàn)證集上的對數(shù)損失結(jié)果:

兩種策略在驗(yàn)證集上的對數(shù)損失兩種策略在驗(yàn)證集上的對數(shù)損失

由于對數(shù)損失是一個 "越低越好 "的指標(biāo),我們可以看到,在驗(yàn)證數(shù)據(jù)集上,我們的 RFE 版本明顯優(yōu)于經(jīng)典 RFE。

不過,你可能會懷疑,只看驗(yàn)證集并不公平,因?yàn)檎`差貢獻(xiàn)是在驗(yàn)證集上計(jì)算的。那么,我們來看看測試集。

兩種策略在測試集上的對數(shù)損失兩種策略在測試集上的對數(shù)損失

即使現(xiàn)在兩種方法之間的差距變小了,但我們可以看到差距仍然很大,因此足以得出結(jié)論:在這個數(shù)據(jù)集上,基于誤差貢獻(xiàn)的 RFE 明顯優(yōu)于基于預(yù)測貢獻(xiàn)的 RFE。

除了對數(shù)損失,我們還可以考慮一種更有實(shí)用價(jià)值的指標(biāo)。例如,我們來看看驗(yàn)證集上的平均精度:

兩種策略在驗(yàn)證集上的平均精確度兩種策略在驗(yàn)證集上的平均精確度

值得注意的是,盡管貢獻(xiàn)誤差是基于對數(shù)損失計(jì)算的,但我們在平均精度方面也取得了很好的結(jié)果。

如果我們想根據(jù)平均精度做出決定,那么我們就會選擇驗(yàn)證集上平均精度最高的模型。這意味著:

  • 基于誤差貢獻(xiàn)的 RFE:具有 19 個特征的模型;
  • 基于預(yù)測貢獻(xiàn)的 RFE:具有 14 個特征的模型;

如果我們這樣做,在新數(shù)據(jù)上會觀察到什么性能?回答這個問題的最佳代表就是測試集:

圖片圖片

兩種策略在驗(yàn)證集上的平均精確度

同樣在這種情況下,基于誤差貢獻(xiàn)的 RFE 性能總體上優(yōu)于基于預(yù)測貢獻(xiàn)的 RFE。特別是,根據(jù)我們之前的判斷:

  • 基于誤差貢獻(xiàn)的 RFE(包含 19 個特征的模型): 平均精確度為 72.8%;
  • 基于預(yù)測貢獻(xiàn)的 RFE(模型有 14 個特征):平均精度為 65.6%: 平均精度為 65.6%。

因此,通過使用基于誤差貢獻(xiàn)的 RFE,而不是傳統(tǒng)的基于預(yù)測貢獻(xiàn)的 RFE,我們可以在平均精確度上額外獲得 7.2% 的顯著提高!

結(jié)論

特征重要性的概念在機(jī)器學(xué)習(xí)中扮演著重要角色。然而,"重要性" 的概念常常被誤認(rèn)為是 "好"。

為了區(qū)分這兩個方面,我們引入了兩個概念: 預(yù)測貢獻(xiàn)和誤差貢獻(xiàn)。這兩個概念都基于驗(yàn)證數(shù)據(jù)集的 SHAP 值,在文章中我們看到了計(jì)算它們的 Python 代碼。

我們還在一個真實(shí)的金融數(shù)據(jù)集(其中的任務(wù)是預(yù)測黃金價(jià)格)上對它們進(jìn)行了嘗試,結(jié)果證明,與傳統(tǒng)的基于預(yù)測貢獻(xiàn)的 RFE 相比,基于誤差貢獻(xiàn)的遞歸特征消除可使平均精度提高 7%。

責(zé)任編輯:武曉燕 來源: 數(shù)據(jù)STUDIO
相關(guān)推薦

2021-07-19 16:23:55

數(shù)據(jù)安全滴滴大數(shù)據(jù)

2021-04-16 20:46:21

PythonXGBoost 特征

2017-01-03 17:50:04

2009-12-25 15:00:48

WPF軟件

2010-07-30 16:28:06

2023-10-24 11:07:57

2023-09-18 15:54:56

Python機(jī)器學(xué)習(xí)

2020-08-27 07:00:00

代碼軟件應(yīng)用程序

2013-08-08 10:10:06

備份策略全備份增量備份

2017-12-29 10:14:48

IT項(xiàng)目

2011-07-05 18:30:44

站內(nèi)優(yōu)化

2009-12-23 15:57:40

WPF傳遞事件

2009-05-05 09:45:56

程序員職場成長過程

2017-08-04 08:48:33

公有云云存儲故障

2016-08-29 20:31:17

2009-11-25 17:36:38

PHP函數(shù)includ

2009-09-28 13:23:00

CCNA學(xué)習(xí)方法CCNA

2009-03-03 17:25:41

2021-12-22 23:12:19

物聯(lián)網(wǎng)隱私安全

2022-11-04 14:13:54

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 麻豆久久| 国产精品不卡视频 | 91麻豆精品国产91久久久久久 | 日韩在线播放一区 | 欧美一区二区三区四区视频 | 91视频网址 | 国产精品毛片无码 | 久久久久久高清 | 精品国产乱码久久久久久丨区2区 | 欧美久久综合 | 亚洲国产精品久久人人爱 | 蜜桃精品视频在线 | 国产精品观看 | 黄色片视频 | 美女天天干天天操 | 久久精品中文字幕 | 欧美乱大交xxxxx另类电影 | 午夜视频在线免费观看 | 免费在线黄色av | 国产精品免费在线 | 亚洲免费在线观看 | 国产三级国产精品 | 能看的av | 成人免费视频观看视频 | 成人福利网站 | 久久精品99| 99re在线视频 | 三级欧美 | 作爱视频免费看 | 国产精品一区久久久 | 欧美一级三级在线观看 | 免费视频一区二区 | 日日综合 | 污书屋 | 在线播放中文字幕 | 91精品国模一区二区三区 | 希岛爱理在线 | 久草精品在线 | 精品久久久久久久久久 | 男女免费网站 | 亚洲国产第一页 |