精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

六種因果庫對比:哪種貝葉斯方法能發掘數據中的隱藏因果關系?

人工智能
面對眾多功能各異的貝葉斯和因果推斷庫,初學者往往感到無所適從。別擔心,本文將對Python中六大流行的因果推斷庫進行橫向對比,通過同一數據集上的實戰示例,幫你一次性理清它們的優缺點。

在數據科學的世界里,我們常常滿足于構建一個精準的預測模型。但很多時候,我們真正想知道的是:“為什么?”

是哪個變量真正驅動了結果的變化?哪些變量只是搭便車的乘客,僅僅與結果相關卻無直接因果?

理解變量間的因果關系至關重要。無論是進行預測性維護、優化營銷策略,還是制定關鍵業務決策,識別出真正的“驅動變量”都能讓我們事半功倍。

然而,面對眾多功能各異的貝葉斯和因果推斷庫,初學者往往感到無所適從。別擔心,本文將對Python中六大流行的因果推斷庫進行橫向對比,通過同一數據集上的實戰示例,幫你一次性理清它們的優缺點。


在因果推斷中,我們超越了預測,去識別事件發生的機制和途徑。

參與評測的六位選手是:

  • Bnlearn
  • Pgmpy
  • CausalNex
  • DoWhy
  • Pyagrum
  • CausalImpact

文章結尾有詳細的總結對比表格,幫你快速選出最適合你項目的工具庫!

因果推斷:從“是什么”到“為什么”

簡單來說,因果推斷就是確定變量之間因果關系的過程。它讓我們超越預測,去識別事件發生的機制和路徑。

想象一下,我們發現發動機故障與地理位置強相關。因果推斷能幫助我們找到背后的驅動變量——也許是該地區特定的空氣質量或操作規范,而地理位置本身只是一個乘客變量。

評測環境與數據

為了公平起見,我們使用同一個數據集進行評測:美國人口普查收入數據集。我們將圍繞一個核心問題展開分析:“擁有研究生學歷是否會增加年收入超過5萬美元的概率?”

以下是數據加載和清洗的代碼,為后續所有分析打下基礎:

# 安裝并導入必要庫
pip install datazets
import datazets as dz 
import pandas as pd 
import numpy as np
import matplotlib.pyplot as plt

# 加載數據集并清洗
df = dz.import_example(data='census_income')
# 剔除連續型變量和敏感特征
drop_cols = ['age', 'fnlwgt', 'education-num', 'capital-gain', 'capital-loss', 'hours-per-week', 'race', 'sex']
df.drop(labels=drop_cols, axis=1, inplace=True)

# 查看數據
print(df.head())

1. Bnlearn

一站式的貝葉斯網絡工具箱

一句話點評: 功能全面、開箱即用,是初學者和專家的理想選擇。

Bnlearn 提供了一套完整的工具,用于創建、分析和可視化貝葉斯網絡。它支持離散、連續和混合數據集,封裝了從結構學習、參數估計到推理驗證的核心流程。

bnlearn庫提供了一系列用于在 Python 中創建、分析和可視化貝葉斯網絡的工具。它支持離散、混合和連續數據集,設計簡潔易用,同時包含了因果學習中最基本的貝葉斯流程。借助 bnlearn,可以執行結構學習、參數估計、推理,并創建合成數據,使其既適用于探索性分析,也適用于高級因果發現。只需在初始化期間指定參數,即可應用一系列統計檢驗。此外,它還提供了一些輔助函數,用于轉換數據集、推導整個圖的拓撲順序、比較兩個網絡以及生成各種富有洞察力的圖表。

核心功能:

  • 結構學習:從數據中學習網絡結構或整合專家知識。
  • 參數學習:根據觀測數據估計條件概率分布。
  • 因果推斷:查詢網絡以計算概率、模擬干預措施并檢驗因果效應。
  • 合成數據:從學習到的貝葉斯網絡生成新的數據集,用于模擬、基準測試或數據增強。
  • 離散化數據:使用內置的離散化方法將連續變量轉換為離散狀態,以便更輕松地進行建模和推理。
  • 模型評估:使用評分函數、統計檢驗和性能指標來比較網絡。
  • 可視化:交互式圖形繪制、概率熱圖和結構疊加,直觀展示因果關系。

實戰演示:

我們讓 Bnlearn 無監督地學習數據中的因果結構,不預設目標變量。

Bnlearn for Python的一大優勢在于它能夠以無監督的方式學習因果結構。這意味著你無需指定任何目標變量,它就能自行找出答案。為此,它實現了多種搜索和評分策略:

  • 搜索策略:爬山搜索、窮舉搜索、約束搜索、Chow-Liu 算法、樸素貝葉斯算法和 TAN 算法
  • 評分策略: BIC、K2、BDEU。

某些策略需要設置根節點,例如樹增強樸素貝葉斯(TAN),當已知結果(或目標)值時建議采用此策略。這將顯著降低計算負擔,在特征數量龐大的情況下尤為推薦。此外,通過獨立性檢驗可輕松從模型中剪枝掉虛假邊。在下例中,我將采用基于BIC評分類型的爬坡搜索法進行結構學習。本例中不預先定義目標值,而是讓Bnlearn完全基于數據本身決定因果結構。

import bnlearn as bn

# 結構學習
model = bn.structure_learning.fit(df, methodtype='hillclimbsearch', scoretype='bic')
# 獨立性檢驗,修剪不顯著的邊
model = bn.independence_test(model, df, test="chi_square", alpha=0.05, prune=True)
# 參數學習
model = bn.parameter_learning.fit(model, df)
# 繪制交互式網絡圖
bn.plot(model, interactive=True) #生成的因果網絡圖會清晰展示`教育`、`職業`、`婚姻狀況`等變量如何影響`薪資`
print(model['model_edges'])
"""
[('education', 'occupation'),
 ('marital-status', 'relationship'),
 ('occupation', 'workclass'),
 ('relationship', 'salary'),
 ('relationship', 'education'),
 ('salary', 'education')]
"""

要確定有向無環圖(DAG),我們需要按上文代碼段所示指定輸入數據框。模型擬合完成后,結果將存儲在模型字典中,可用于后續分析。下圖展示了因果結構的靜態圖和交互式圖。

圖片圖片

通過學習到的有向無環圖(圖1),我們可以估計條件概率分布(CPDs,參見下文代碼部分),并使用do-calculus進行推斷。換言之,我們可以開始向數據提出問題。

# 使用估計的邊學習CPD。
# 注意我們也可以自定義邊或手動提供有向無環圖。
# model = bn.make_DAG(model['model_edges'])

# 通過提供模型和數據框學習CPD
model = bn.parameter_learning.fit(model, df)

# 打印CPD
CPD = bn.print_CPD(model)

開始提問:

問題一:擁有博士學位的人,薪資超過5萬的概率有多大?

直觀上,我們可能預期概率較高,因為受教育程度為博士。讓我們通過貝葉斯模型推導后驗概率。在下面的代碼段中,我們得出概率P=0.7093。這證實了當受教育程度為博士時,獲得>50K年薪的概率確實高于非博士學歷者。

query = bn.inference.fit(model, variables=['salary'], evidence={'education':'Doctorate'})
print(query)

"""
+---------------+---------------+
| salary        |   phi(salary) |
+===============+===============+
| salary(<=50K) |        0.2907 |
+---------------+---------------+
| salary(>50K)  |        0.7093 |
+---------------+---------------+

Summary for variables: ['salary']
Given evidence: educatinotallow=Doctorate

salary outcomes:
- salary: <=50K (29.1%)
- salary: >50K (70.9%)
"""

結果:P(>50K | 博士) = 70.9%。果然,高學歷帶來高收入!

問題二:那么只有高中學歷的人呢?

由此得出后驗概率P=0.1615。根據該數據集,學習對獲得更高薪資具有顯著益處。但需注意,我們未采用任何其他可能影響結果的約束條件作為證據。

query = bn.inference.fit(model, variables=['salary'], evidence={'education':'HS-grad'})
print(query)

"""
+---------------+---------------+
| salary        |   phi(salary) |
+===============+===============+
| salary(<=50K) |        0.8385 |
+---------------+---------------+
| salary(>50K)  |        0.1615 |
+---------------+---------------+

Summary for variables: ['salary']
Given evidence: educatinotallow=HS-grad

salary outcomes:
- salary: <=50K (83.8%)
- salary: >50K (16.2%)
"""

結果:P(>50K | 高中) = 16.2%。對比非常鮮明。

總結:

  • 優勢: pipeline 完整,易于上手,可視化效果佳,支持多種數據類型。
  • 輸入數據: 離散、連續、混合數據均可。

2. Pgmpy

底層構建模塊的樂高大師

一句話點評: 靈活度高,但需要你親手搭建一切,適合資深玩家。

Pgmpy 提供了概率圖模型的底層構建塊。它的優勢在于靈活性,你可以自由組合各種學習算法和推理方法。但這也意味著你需要更多的專業知識來搭建完整流程。

實戰演示:

實現與 Bnlearn 類似的結構學習和推理,但代碼量明顯更多。

!pip install pgmpy
from pgmpy.estimators import HillClimbSearch, BicScore, BayesianEstimator
from pgmpy.models import BayesianNetwork
from pgmpy.inference import VariableElimination

# 結構學習
est = HillClimbSearch(df)
scoring_method = BicScore(df)
model = est.estimate(scoring_method=scoring_method)
print("發現的邊:", model.edges())

# ... (需要手動構建模型、擬合參數,過程更復雜)
# [('education', 'salary'),
# ('marital-status', 'relationship'),
# ('occupation', 'workclass'),
# ('occupation', 'education'),
# ('relationship', 'salary'),
# ('relationship', 'occupation')]
# 推理查詢

要使用do-calculus對數據進行推斷,我們首先需要估計條件概率分布(CPDs),如下面的代碼段所示。

vec = {
    'source': ['education', 'marital-status', 'occupation', 'relationship', 'relationship', 'salary'],
    'target': ['occupation', 'relationship', 'workclass', 'education', 'salary', 'education'],
    'weight': [True, True, True, True, True, True]
}
vec = pd.DataFrame(vec)

# Create Bayesian model
bayesianmodel = BayesianNetwork(vec)

# Fit the model
bayesianmodel.fit(df, estimator=BayesianEstimator, prior_type='bdeu', equivalent_sample_size=1000)

# Create model for variable elimination
model_infer = VariableElimination(bayesianmodel)

# Query
query = model_infer.query(variables=['salary'], evidence={'education':'Doctorate'})
print(query) # 同樣得到 P=0.709

"""
+---------------+---------------+
| salary        |   phi(salary) |
+===============+===============+
| salary(<=50K) |        0.2907 |
+---------------+---------------+
| salary(>50K)  |        0.7093 |
+---------------+---------------+
"""

總結:

  • 優勢: 極其靈活,適合自定義復雜模型和研究算法。
  • 劣勢: 學習曲線陡峭,需要手動處理許多步驟。
  • 輸入數據: 必須是離散數據。

3. CausalNex

基于NOTEARS的結構探索者

一句話點評: 功能強大,但環境配置和數據預處理稍顯繁瑣。

CausalNex 基于著名的 NOTEARS 算法,擅長從數據中學習因果結構。但它僅支持離散數據,且對類別變量多的數據擬合效果不佳,需要額外的預處理來降低基數。

實戰演示:

!pip install causalnex
from causalnex.structure.notears import from_pandas
from causalnex.network import BayesianNetwork
import networkx as nx

# 數據必須轉換為數值型
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
df_num = df.apply(le.fit_transform)

# 結構學習與閾值處理
sm = from_pandas(df_num)
sm.remove_edges_below_threshold(0.8) # 過濾弱邊

# 可視化
nx.draw_networkx(sm, ...)

圖片圖片

總結:

  • 優勢: 集成了先進的NOTEARS算法。
  • 劣勢: 預處理復雜,對Python和新版庫的兼容性較差。
  • 輸入數據: 必須是數值型離散數據。

4. DoWhy

專注于因果效應估計的專家

一句話點評: 不關心完整網絡,只專注于回答“這個干預有多大效果?”

DoWhy 的思維方式與前幾個庫不同。它要求你明確定義處理變量和結果變量,然后專注于估計處理變量對結果的平均因果效應。它不擅長從數據中學習因果結構,但非常擅長在給定因果圖的情況下進行穩健的效應估計。

實戰演示:

我們研究“擁有博士學位”對“高薪”的因果效應。

!pip install dowhy
from dowhy import CausalModel
import dowhy.datasets
import datazets as dz
from sklearn.preprocessing import LabelEncoder
import numpy as np
le = LabelEncoder()
# 導入數據集并刪除連續型和敏感特征
df = dz.get(data='census_income')

drop_cols = ['age', 'fnlwgt', 'education-num', 'capital-gain', 'capital-loss', 'hours-per-week', 'race', 'sex']
df.drop(labels=drop_cols, axis=1, inplace=True)

# 處理變量必須為二元
df['education'] = df['education']=='Doctorate'

# 接下來需將數據轉換為數值型
df_num = df.copy()
for col in df_num.columns:
    df_num[col] = le.fit_transform(df_num[col])

# 指定處理變量、結果變量及潛在混雜變量
treatment = “education”
outcome = “salary”

# 步驟1. 創建因果圖
model = CausalModel(
        data=df_num,
        treatment=treatment,
        outcome=outcome,
        common_causes=list(df.columns[~np.isin(df.columns, [treatment, outcome])]),
        graph_builder='ges',
        alpha=0.05,
        )

# 展示模型
model.view_model()

圖片圖片

如上文代碼部分所見,處理變量必須為二元變量(設為“博士學位”),所有分類變量均需編碼為數值。在下文代碼部分,我們將利用因果圖的特性來識別因果效應。結果或許不足為奇:擁有博士學位確實能提高獲得優厚薪資的概率。

# 步驟2:識別因果效應并返回目標估計量
identified_estimand = model.identify_effect(proceed_when_unidentifiable=True)

# 結果
print(identified_estimand)
"""
[16-09-2025 21:06:21] [dowhy.causal_identifier.auto_identifier] [INFO] Causal effect can be identified.
[16-09-2025 21:06:21] [dowhy.causal_identifier.auto_identifier] [INFO] Instrumental variables for treatment and outcome:[]
[16-09-2025 21:06:21] [dowhy.causal_identifier.auto_identifier] [INFO] Frontdoor variables for treatment and outcome:[]
[16-09-2025 21:06:21] [dowhy.causal_identifier.auto_identifier] [INFO] Number of general adjustment sets found: 1
[16-09-2025 21:06:21] [dowhy.causal_identifier.auto_identifier] [INFO] Causal effect can be identified.
"""

print(identified_estimand)

"""
Estimand type: EstimandType.NONPARAMETRIC_ATE

### Estimand : 1
Estimand name: backdoor
Estimand expression:
     d                                                                         ?
────────────(E[salary|native-country,occupation,marital-status,workclass,relat ?
d[education]                                                                   ?

?          
? ionship])
?          
Estimand assumption 1, Unconfoundedness: If U→{education} and U→salary then P(salary|education,native-country,occupation,marital-status,workclass,relationship,U) = P(salary|education,native-country,occupation,marital-status,workclass,relationship)

### Estimand : 2
Estimand name: iv
No such variable(s) found!

### Estimand : 3
Estimand name: frontdoor
No such variable(s) found!

### Estimand : 4
Estimand name: general_adjustment
Estimand expression:
     d                                                                         ?
────────────(E[salary|native-country,marital-status,occupation,workclass,relat ?
d[education]                                                                   ?

?          
? ionship])
?          
Estimand assumption 1, Unconfoundedness: If U→{education} and U→salary then P(salary|education,native-country,marital-status,occupation,workclass,relationship,U) = P(salary|education,native-country,marital-status,occupation,workclass,relationship)
"""
# 步驟3:使用統計方法估計目標估計量。
estimate = model.estimate_effect(identified_estimand, method_name="backdoor.propensity_score_stratification"

# 結果
print(estimate)
"""
*** Causal Estimate ***

## Identified estimand
Estimand type: EstimandType.NONPARAMETRIC_ATE

### Estimand : 1
Estimand name: backdoor
Estimand expression:
     d                                                                         ?
────────────(E[salary|native-country,occupation,marital-status,workclass,relat ?
d[education]                                                                   ?

?          
? ionship])
?          
Estimand assumption 1, Unconfoundedness: If U→{education} and U→salary then P(salary|education,native-country,occupation,marital-status,workclass,relationship,U) = P(salary|education,native-country,occupation,marital-status,workclass,relationship)

## Realized estimand
b: salary~education+native-country+occupation+marital-status+workclass+relationship
Target units: ate

## Estimate
Mean value: 0.46973242081553496
## Estimate
# Mean value: 0.4697157228651772

"""
# 步驟4:通過多重穩健性檢驗來反駁所得估計值。
refute_results = model.refute_estimate(identified_estimand, estimate, method_name="random_common_cause")

總結:

  • 優勢: 因果效應估計的框架非常嚴謹,內置多種魯棒性檢驗。
  • 劣勢: 無法學習因果圖,輸出結果較復雜,需要統計知識解讀。
  • 輸入數據: 需要明確的處理變量和結果變量。

5. PyAgrum

多才多藝的圖模型學者

一句話點評: 來自學術界的全能選手,功能豐富但文檔相對學院派。

PyAgrum 是一個功能強大的概率圖模型庫,不僅支持貝葉斯網絡,還支持馬爾可夫網絡等。它提供了多種學習算法和推理工具,但安裝和入門可能對新手有些挑戰。

實戰演示:

# 安裝 pyagrum
pip install pyagrum

# 安裝 graphviz(可視化所需)
pip install setgraphviz
import datazets as dz
import pandas as pd
import pyagrum as gum
import pyagrum.lib.notebook as gnb
import pyagrum.lib.explain as explain
import pyagrum.lib.bn_vs_bn as bnvsbn

# 導入庫以顯示點圖
from setgraphviz import setgraphviz
# 設置路徑
setgraphviz()

# 導入數據集并剔除連續型和敏感特征
df = dz.get(data='census_income')
# 數據清洗
drop_cols = ['age', 'fnlwgt', 'education-num', 'capital-gain', 'capital-loss', 'hours-per-week', 'race', 'sex']
df.drop(labels=drop_cols, axis=1, inplace=True)
# 刪除存在任何缺失值的行
df2 = df.dropna().copy()
# 將所有缺失值替換為占位符字符串
df2 = df2.fillna(“missing”).replace(“?”, “missing”)

# 確保分類列為類別型數據類型(pyAgrum要求離散變量)
for col in df2.columns:
    df2[col] = df2[col].astype(“category”)

# 從pandas數據框創建學習器
learner = gum.BNLearner(df2)

# 配置評分與搜索策略
learner.useScoreBIC()
learner.useGreedyHillClimbing()

# 訓練網絡
bn = learner.learnBN()

# 學習參數
bn2 = learner.learnParameters(bn.dag())

# 繪制網絡圖
gnb.showBN(bn2)

圖片圖片

總結:

  • 優勢: 功能全面,模型種類多。
  • 劣勢: 對數據預處理要求嚴格,可視化依賴Graphviz,社區資源相對較少。
  • 輸入數據: 必須是完整的離散數據集。

6. CausalImpact

時間序列因果推斷的利器

一句話點評: 專為時間序列設計,評估政策、活動等干預的短期影響。

CausalImpact 與其他庫完全不同。它使用貝葉斯結構時間序列模型,來評估一次干預(如新政策上線、營銷活動)對時間序列數據的影響。它的核心是比較干預發生后的實際值與“假設未發生干預”的預測值之間的差異。

實戰演示:

假設我們有一段時間內的網站流量數據,并在第70天進行了一次改版。

from causalimpact import CausalImpact
import pandas as pd

# 模擬數據:y是流量,x1是控制變量,第71天后y有一個提升
data = pd.DataFrame({'y': y_data, 'x1': x1_data})

# 定義干預前后時間段
impact = CausalImpact(data, pre_period=[0, 69], post_period=[70, 99])
impact.run()
impact.plot() # 生成包含三個面板的詳細效果圖
impact.summary()
#                              Average    Cumulative
# Actual                           130          3773
# Predicted                        120          3501
# 95% CI                    [118, 122]  [3447, 3555]
                                                  
# Absolute Effect                    9           272
# 95% CI                       [11, 7]    [326, 218]
                                                  
# Relative Effect                 7.8%          7.8%
# 95% CI                  [9.3%, 6.2%]  [9.3%, 6.2%]
                                                  
# P-value                         0.0%              
# Prob. of Causal Effect        100.0%

# Summary report
impact.summary(output="report")

平均值列描述了干預后時段的平均時間。累計值列匯總了各個時間點的數據,當響應變量代表流量指標(如查詢量、點擊量、訪問量、安裝量、銷售額或收入)時,這種視角尤為有用。本例中可見因果效應概率為100%,P值為0——這符合預期,因為數據中已包含該信息。

在圖4中,我們可以看到三個子圖,其描述如下:在子圖1,我們既能看到原始數據,也能看到針對治療后時期的反事實預測。子圖2展示了觀測數據與反事實預測之間的差異,該差異即模型所確定的點因果效應估計值。子圖3通過聚合前一面板的點效應貢獻,描繪了干預措施的累積效應。需特別注意的是,這些推論的有效性依賴于協變量未受干預本身影響的假設。此外,模型還假定協變量與處理時間序列在前期建立的關系,在后期始終保持一致。

總結:

  • 優勢: 解決時間序列因果問題的專用工具,結果解釋直觀。
  • 劣勢: 僅適用于時間序列數據,不適用于構建通用因果圖。
  • 輸入數據: 時間序列數據,需明確干預點。

寫在最后

庫名稱

核心功能

輸入數據

學習曲線

最適合場景

Bnlearn

全流程貝葉斯網絡

離散/連續/混合

平緩

通用因果發現與推理

Pgmpy

概率圖模型底層構建塊

離散

陡峭

自定義模型、算法研究

CausalNex

基于NOTEARS的結構學習

數值型離散

中等

需要先進結構學習算法的項目

DoWhy

因果效應估計

處理+結果變量

中等

A/B測試、政策效果評估

PyAgrum

多種圖模型

離散

中等

學術研究、需要多種模型類型

CausalImpact

時間序列干預分析

時間序列

平緩

營銷活動、產品改版影響評估

如何選擇?看這里:

  1. 如果你想快速入門,從數據中自動發現因果關系并進行推理,Bnlearn 是你的不二之選。
  2. 如果你是高級用戶,希望完全控制建模的每一個細節,請選擇 Pgmpy。
  3. 如果你的核心任務是評估某個處理變量對結果變量的因果效應,DoWhy 提供了最嚴謹的框架。
  4. 如果你的數據是時間序列,并且想評估一次干預的因果影響,CausalImpact 是唯一答案。

希望這篇詳盡的對比能幫助你在因果推斷的旅程中,找到那盞最明亮的指路明燈!

責任編輯:武曉燕 來源: 數據STUDIO
相關推薦

2013-06-06 09:15:43

大數據

2019-10-15 05:15:00

深度學習人工智能AI

2023-08-15 15:44:55

React開發

2023-06-01 16:45:11

React開發JavaScript

2022-05-30 16:42:20

數據中心

2025-01-20 08:50:00

2023-05-04 07:23:04

因果推斷貝葉斯因果網絡

2017-08-07 13:02:32

全棧必備貝葉斯

2022-01-14 10:34:50

黑客隱藏蹤跡網絡安全

2011-03-08 08:59:01

SQL Server數數據移動

2017-10-20 11:07:45

編程代碼編程模式

2023-08-28 07:15:49

AIGC因果推斷

2023-09-06 08:00:00

ChatGPT數據分析

2011-09-13 15:51:54

刪除數據庫重復行

2023-09-24 14:52:21

數據分析相關系數矩陣

2022-10-30 14:54:58

測試數據貝葉斯推理

2011-02-24 10:56:34

人才

2022-05-25 09:55:40

數據重復提交Java

2023-04-26 08:41:16

Git撤消更改

2017-10-27 11:47:05

SQL數據庫優化
點贊
收藏

51CTO技術棧公眾號

欧美在线导航| 欧美性受ⅹ╳╳╳黑人a性爽| 国产模特精品视频久久久久| 亚洲黄在线观看| 91九色在线观看视频| 天天躁日日躁狠狠躁喷水| 亚洲深夜av| 欧美一级艳片视频免费观看| japanese在线播放| 99精品国产99久久久久久97| 欧美人成在线| 亚洲精品国产精品国产自| 久草青青在线观看| 色av男人的天堂免费在线| 久久裸体视频| 久久国产精品网站| 插我舔内射18免费视频| 日韩漫画puputoon| 亚洲精品国产第一综合99久久 | 成人免费区一区二区三区| 亚洲精品v亚洲精品v日韩精品| 亚洲丶国产丶欧美一区二区三区| 欧美黄色直播| 999久久久久久| 国产精品综合色区在线观看| 日韩网站免费观看| 女同性αv亚洲女同志| 91av亚洲| 亚洲精品视频在线观看网站| 久久久久久一区| 在线免费观看一级片| 国产综合色产| 在线色欧美三级视频| www.四虎精品| 国产亚洲精彩久久| 亚洲午夜在线电影| 亚洲人一区二区| 蜜桃久久一区二区三区| 久久www免费人成看片高清| 色综合91久久精品中文字幕 | 极品国产人妖chinesets亚洲人妖 激情亚洲另类图片区小说区 | 性久久久久久久久久久| youjizz在线视频| 日韩激情网站| 在线播放/欧美激情| 国产主播自拍av| 日本中文字幕在线看| 波多野结衣在线一区| 国产免费一区视频观看免费| 日韩欧美视频免费观看| 日韩在线网址| 欧美系列亚洲系列| 欧美 国产 综合| 视频在线这里都是精品| 中文幕一区二区三区久久蜜桃| 精品无码久久久久国产| 国产精品视频a| 久久午夜精品| 欧美亚州一区二区三区| 国产第一页第二页| 久久高清精品| 国产一区二区三区久久精品| 黄色国产在线视频| 国产精品美女午夜爽爽| 色播五月激情综合网| heyzo亚洲| 另类视频在线| 一区二区三区在线视频免费观看| 日韩欧美第二区在线观看| 无码精品黑人一区二区三区| 成人久久久精品乱码一区二区三区| 亚洲最大成人在线| 一区二区不卡视频在线观看| 日本亚洲一区二区| 国产精品高清在线| 成人免费视频国产免费| 亚洲特色特黄| 久久久噜噜噜久久久| 欧美成人免费观看视频| 亚洲成人三区| 日韩中文娱乐网| 超碰人人干人人| 精品国产精品久久一区免费式| 国产午夜精品一区理论片飘花| 少妇大叫太粗太大爽一区二区| 亚洲调教一区| 永久555www成人免费| 日韩av在线看免费观看| 精品在线观看入口| 一本色道久久88综合亚洲精品ⅰ| 精品无码在线观看| 日韩欧美中字| 九九热99久久久国产盗摄| 久草成人在线视频| 亚洲激情女人| 日韩美女免费视频| 男人天堂av在线播放| 全国精品久久少妇| 91午夜在线播放| 丰满人妻一区二区三区四区53| 成人激情免费网站| 欧美日韩国产免费一区二区三区| 成人免费视频| 亚洲精品一二三四区| 男人添女人下部视频免费| 免费成人在线电影| 欧美午夜一区二区| 中文字幕在线观看91| 婷婷亚洲精品| 色伦专区97中文字幕| 免费中文字幕视频| 视频一区中文字幕国产| 亚洲va久久久噜噜噜久久天堂| av免费在线观看不卡| 东方欧美亚洲色图在线| 欧美日韩一区在线视频| a视频在线播放| 疯狂蹂躏欧美一区二区精品| 久国产精品视频| 奇米影视777在线欧美电影观看| 在线视频一区二区| 国产成人精品av久久| 麻豆高清免费国产一区| 国产一区二区三区无遮挡| 色综合久久网女同蕾丝边| 国产精品三级视频| 日韩中文字幕在线免费| 成人日韩av| 日韩欧美一卡二卡| 熟女少妇内射日韩亚洲| 国产精品v亚洲精品v日韩精品| 国产精品91在线| 丰满大乳国产精品| 中文字幕+乱码+中文字幕一区| 麻豆视频传媒入口| 欧美影视资讯| 日韩精品视频在线播放| 69xx绿帽三人行| 日韩中文欧美在线| 国产伦精品一区二区三区四区视频| 你懂的在线观看| 亚洲欧美区自拍先锋| 日韩中文字幕在线视频观看| 视频二区欧美毛片免费观看| 中国china体内裑精亚洲片| 天天操天天爽天天干| 精品一区二区三区欧美| 日本一区美女| 亚洲啊v在线| 精品毛片乱码1区2区3区 | 午夜在线观看视频| 欧美日韩激情视频| 国产国语老龄妇女a片| 我不卡手机影院| 国产成人一区二区三区电影| 午夜国产在线观看| 午夜婷婷国产麻豆精品| 欧美午夜精品一区二区| 精品欧美久久| 奇门遁甲1982国语版免费观看高清 | 成年人av网站| 久久午夜免费电影| 各处沟厕大尺度偷拍女厕嘘嘘| 国产一区二区久久久久| 久久精品电影网| 国产精品主播一区二区| 国产精品久久久久aaaa| 孩娇小videos精品| 免费视频亚洲| 日韩av成人在线观看| 男人的天堂在线视频| 色婷婷av一区| 欧美福利第一页| 亚洲欧美视频| 日韩色妇久久av| 在线一区视频观看| 这里精品视频免费| 国产又大又黄的视频| 亚洲三级在线免费观看| √天堂资源在线| 天天综合亚洲| 91嫩草免费看| av伦理在线| 亚洲美女免费精品视频在线观看| 日韩综合在线观看| 国产精品美女一区二区三区| 在线能看的av网站| 99视频精品全国免费| 亚洲综合色激情五月| 亚洲丝袜精品| 亚洲国产精品国自产拍av秋霞| 四虎永久在线精品| 久久精品亚洲乱码伦伦中文| 向日葵污视频在线观看| 羞羞答答成人影院www| 国产日韩精品入口| 白白色在线观看| 亚洲天堂男人的天堂| 这里只有精品9| 一区二区成人在线| 双性尿奴穿贞c带憋尿| 奇米777欧美一区二区| 最近中文字幕免费mv| 91国内精品白嫩初高生| 日本免费一区二区三区视频观看| 视频一区二区三区不卡| 亚洲精品在线观看网站| 亚洲无码精品一区二区三区| 亚洲欧美一区二区三区极速播放| 爽爽爽在线观看| 视频一区中文字幕| 中文精品无码中文字幕无码专区 | 日韩有码一区二区三区| 国产又大又长又粗又黄| 日韩福利视频一区| 成人精品一区二区三区| 日本在线影院| 色综合亚洲精品激情狠狠| 色噜噜在线播放| 欧美丰满高潮xxxx喷水动漫| 国产精品午夜影院| 亚洲女爱视频在线| 精品无码一区二区三区| 国产酒店精品激情| 国产小视频精品| 亚洲区一区二| 中文字幕一区二区三区四区五区人| 群体交乱之放荡娇妻一区二区| 成人国产精品一区二区| 樱花草涩涩www在线播放| 中文字幕免费国产精品| 亚洲爱情岛论坛永久| 欧美午夜一区二区三区| 国产成人在线免费观看视频| 亚洲天堂a在线| 亚洲第一视频区| 91视视频在线直接观看在线看网页在线看| 99九九99九九九99九他书对| 日韩精品一二三| 波多野结衣家庭教师在线播放| 久久久人成影片免费观看| 日韩一区不卡| 自拍视频一区| 99精品国产高清一区二区| 爱情电影网av一区二区| 国产精品免费小视频| 欧美黑人疯狂性受xxxxx野外| 久久人人97超碰精品888| 主播国产精品| 日韩性生活视频| 日p在线观看| 这里只有视频精品| 蝌蚪视频在线播放| 亚洲精品一区久久久久久| 狠狠躁夜夜躁av无码中文幕| 欧美视频一二三区| 综合久久中文字幕| 欧美网站一区二区| 无码一区二区三区在线观看| 色综合天天性综合| 800av免费在线观看| 精品人伦一区二区三区蜜桃网站| 日本一区二区欧美| 亚洲女与黑人做爰| 中文字幕一区二区三区手机版| 亚洲激情图片一区| 久久精品99久久久久久| 亚洲国产一区二区视频| 国产在线拍揄自揄拍| 亚洲第一久久影院| 成人午夜视频精品一区| 黑人欧美xxxx| av毛片在线免费观看| 欧美在线视频全部完| 欧美成人一区二区三区四区| 欧美日韩精品一区视频| 97精品人妻一区二区三区在线| 91精品国产91久久久久久最新毛片 | 亚洲一卡二卡三卡四卡| 午夜偷拍福利视频| 欧美丝袜美女中出在线| 这里只有精品999| 在线成人小视频| 亚洲精品久久久久avwww潮水| 精品国产sm最大网站免费看| 奇米影视888狠狠狠777不卡| 伊人一区二区三区久久精品| 免费黄色在线网站| 九九热精品视频| 中文字幕在线直播| 国产精品视频午夜| 精品一区二区三区中文字幕视频| www日韩av| 久久av网址| 中文字幕乱码免费| 国产精品久久久亚洲一区| 久久久久国产一区| 国产精品18久久久久久vr| 国产精品久久AV无码| 国产女主播一区| 国产又黄又爽又无遮挡| 懂色av影视一区二区三区| 中文字幕在线日本| 日韩女优视频免费观看| jizz日韩| 欧美高清视频在线播放| 成人线上视频| 91精品视频在线看| 神马久久av| 天天干天天操天天干天天操| 亚洲国产高清一区| 不卡的av中文字幕| 成人蜜臀av电影| 国产高清一区二区三区四区| 亚洲风情在线资源站| 中文字幕人妻丝袜乱一区三区| 日韩一区二区免费在线电影| 免费福利在线观看| 欧美风情在线观看| 精品网站在线| 精品久久久久久一区| 国产精品99久久久久久动医院| 女人被男人躁得好爽免费视频| 久久国产99| 韩国黄色一级片| 成人免费一区二区三区在线观看| 五月婷婷激情网| 欧美一卡二卡在线观看| 国产区在线视频| 97视频在线免费观看| 玖玖精品一区| 一区二区精品免费视频| 欧美亚洲一级| 少妇极品熟妇人妻无码| 亚洲欧洲国产日韩| 日韩黄色一级视频| 亚洲国产天堂久久综合网| 中中文字幕av在线| 国产这里只有精品| 精品国产一区一区二区三亚瑟| 日韩一级性生活片| 蜜臀av一区二区在线免费观看 | 成人福利电影精品一区二区在线观看| 波多野结衣av在线观看| 黑人精品xxx一区| 五月天激情开心网| 欧美激情a∨在线视频播放| 四虎影视精品永久在线观看| 视频一区免费观看| 天堂久久久久va久久久久| 波多野结衣有码| 亚洲综合自拍偷拍| 亚洲国产精品视频在线| 欧美剧在线观看| 午夜精品在线| www.avtt| av电影天堂一区二区在线 | 91精品一区国产高清在线gif| 亚欧在线免费观看| 久久久久成人黄色影片| 91丝袜一区二区三区| 亚洲欧美国产精品久久久久久久| av影院在线| 国产区一区二区| 9色国产精品| 国产三级视频网站| 欧美性xxxx极品hd满灌| 欧洲天堂在线观看| 国产91在线高潮白浆在线观看| 亚洲自拍都市欧美小说| av动漫免费看| 中文字幕巨乱亚洲| 亚洲图片在线播放| 久久中文字幕国产| 911亚洲精品| 国产乱子伦农村叉叉叉| 久久久亚洲欧洲日产国码αv| 久久精品久久久久久久| 亚洲日韩欧美视频| 国产午夜久久av| 免费一级特黄毛片| 久久婷婷久久一区二区三区| 中文字幕免费观看| 日韩中文字幕精品| 日韩精品一区二区三区中文| 国产精品一区在线免费观看| 成人午夜短视频| 亚洲熟妇无码乱子av电影| 在线精品播放av| 日韩欧美中文字幕一区二区三区| 黄色a级片免费看| 久久毛片高清国产| 中日韩av在线| 久久综合色影院| 欧美久久香蕉| 在线观看国产一级片| 亚洲综合色丁香婷婷六月图片| 亚州视频一区二区三区| 国产精品入口免费视| 在线不卡视频|