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

期末大作業:客戶流失數據可視化分析與預測

大數據 數據可視化
現在有性能各異的不同模型。通過集成學習,可以將這些模型融合在一起,以實現更高的性能!這里我們使用帶有“軟”投票的投票分類器,它根據預測概率總和的 argmax 來預測類標簽。

今天云朵君和大家一起學習一個期末作業項目。

本文亮點:

  1. 項目流程完整,從數據預處理、特征工程、建模到預測
  2. 使用Pipline構建機器學習管道
  3. 使用optuna優化算法
  4. 數據完整、代碼完整

背景

預測客戶流失是機器學習在行業中的一種常見用例,特別是在金融和訂閱服務領域。

流失率是指離開提供商的用戶數量。它也可以指離開公司的員工(員工保留率)。

因此,銀行客戶流失(又稱客戶流失)是指客戶停止與一家銀行做生意或轉向另一家銀行。

數據

數據字典:

  • Customer ID:每個客戶的唯一標識符
  • Surname:客戶的姓氏
  • Credit Score:代表客戶信用評分的數值
  • Geography:客戶居住的國家/地區
  • Gender:顧客的性別
  • Age:顧客的年齡。
  • Tenure:客戶在該銀行的服務年限
  • Balance:客戶的賬戶余額
  • NumOfProducts:客戶使用的銀行產品數量(例如儲蓄賬戶、信用卡)
  • HasCrCard:客戶是否擁有信用卡
  • IsActiveMember:客戶是否為活躍會員
  • EstimatedSalary:客戶的預計工資
  • Exited:客戶是否流失(目標變量)

目標

這是一個經典的二元分類問題。

圖片圖片

在二元問題中,你必須猜測一個示例是否應該歸類到特定類別(通常是正類 (1) 和負類 (0)。在本例中,churn 是正類。

預測一個新的y = 0或是y = 1一項常見的任務,但在很多情況下,你必須提供一個概率,特別是在醫療應用中,你必須對不同選項中的積極預測進行排序以做出最佳決策(例如,模型#1預測0.9,模型#2預測0.8)

評估二元分類器模型的最常見指標是預測概率和觀察到的目標之間的 ROC 曲線下面積(ROC-AUC)。

ROC 曲線是評估二元分類器性能和比較多個分類器的圖表。以下是一些示例。

圖片圖片

理想情況下,性能良好的分類器的 ROC 曲線應該在假陽性率較低時攀升真陽性率(召回率)。因此,0.9–1 之間的 ROC 非常好。

壞分類器是與圖表對角線相似或相同的分類器,代表純隨機分類器的性能。

如果類別平衡,你可以認為更高的 AUC == 模型能夠輸出更高概率的真陽性結果。但是,如果陽性結果很少見,AUC 一開始就很高,增量對于更好地預測罕見類別可能意義不大。平均精度在這里將是一個更有用的指標。

加載數據

我們加載給定的生成數據,以及深度學習模型訓練的原始數據集。

train = pd.read_csv("./data/train.csv") # 數據獲取:在公眾號:數據STUDIO 后臺回復240720 獲取
original = pd.read_csv("./data/Churn_Modelling.csv")
test = pd.read_csv("./data/test.csv")

train.drop(columns=["id"], inplace=True)
test.drop(columns=["id"], inplace=True)
original.drop(columns=["RowNumber"], inplace=True)

train = pd.concat([train, original.dropna()], axis=0)
train.reset_index(inplace=True, drop=True)

target_col = "Exited"

探索性數據分析

我們有 175k 個數據點可供使用。

train.info()
<class 'pandas.core.frame.DataFrame'>
Index: 175030 entries, 0 to 175030
Data columns (total 13 columns):
 #   Column           Non-Null Count   Dtype  
---  ------           --------------   -----  
 0   CustomerId       175030 non-null  int32  
 1   Surname          175030 non-null  object 
 2   CreditScore      175030 non-null  int16  
 3   Geography        175030 non-null  object 
 4   Gender           175030 non-null  object 
 5   Age              175030 non-null  float16
 6   Tenure           175030 non-null  int8   
 7   Balance          175030 non-null  float32
 8   NumOfProducts    175030 non-null  int8   
 9   HasCrCard        175030 non-null  float16
 10  IsActiveMember   175030 non-null  float16
 11  EstimatedSalary  175030 non-null  float32
 12  Exited           175030 non-null  int8   
dtypes: float16(3), float32(2), int16(1), int32(1), int8(3), object(3)
memory usage: 9.2+ MB

減少數據集的內存,以便特征工程和建模更加節省內存。

train = reduce_mem_usage(train)
Mem. usage decreased to  9.18 Mb (50.9% reduction)

這是一個使用prettytable打印數據集中缺失數據的好函數

看來我們的數據沒有缺失值。

print_missing_table(train, test, target_col)
+-----------------+-----------+-----------------+----------------+
|     Feature     | Data Type | Train Missing % | Test Missing % |
+-----------------+-----------+-----------------+----------------+
|    CustomerId   |   int64   |       0.0       |      0.0       |
|     Surname     |   object  |       0.0       |      0.0       |
|   CreditScore   |   int64   |       0.0       |      0.0       |
|    Geography    |   object  |       0.0       |      0.0       |
|      Gender     |   object  |       0.0       |      0.0       |
|       Age       |  float64  |       0.0       |      0.0       |
|      Tenure     |   int64   |       0.0       |      0.0       |
|     Balance     |  float64  |       0.0       |      0.0       |
|  NumOfProducts  |   int64   |       0.0       |      0.0       |
|    HasCrCard    |  float64  |       0.0       |      0.0       |
|  IsActiveMember |  float64  |       0.0       |      0.0       |
| EstimatedSalary |  float64  |       0.0       |      0.0       |
|      Exited     |   int64   |       0.0       |       NA       |
+-----------------+-----------+-----------------+----------------+

以下是我們的數據。

train.head()

圖片圖片

為了簡單起見,我們過濾掉分類或連續的列。

# 每列的唯一值計數
unique_counts = train.nunique()

# 區分連續和分類的閾值
threshold = 12

# 連續變量只選擇數字列
numeric_cols = train.select_dtypes(include=[np.number]).columns.tolist()

continuous_vars = unique_counts[(unique_counts > threshold) & unique_counts.index.isin(numeric_cols)].index.tolist()
categorical_vars = unique_counts[(unique_counts <= threshold) | ~unique_counts.index.isin(numeric_cols)].index.tolist()

target_col = 'Exited'
id_col = ['id', 'CustomerId']

if target_col in categorical_vars:
    categorical_vars.remove(target_col)

for col in id_col:
    if col in continuous_vars:
        continuous_vars.remove(col)

print(f"Categorical Variables: {categorical_vars}")
print(f"Continuous/Numerical Variables: {continuous_vars}")
Categorical Variables: ['Surname', 'Geography', 'Gender', 'Tenure', 'NumOfProducts', 'HasCrCard', 'IsActiveMember']
Continuous/Numerical Variables: ['CreditScore', 'Age', 'Balance', 'EstimatedSalary']

繪制出target。

plot_categorical(train, column_name='Exited')

圖片圖片

這里存在明顯的類別不平衡。只有 20% 的數據屬于正類:Exited = 1

接下來我們看看連續變量和目標列的相互作用。

plot_violin_plots(train, continuous_vars, target_col)

圖片圖片

退出的客戶的中位數age(1) 似乎高于未退出的客戶的中位數 (0) 退出值之間的差異,這表明它可能是預測退出的相關因素。

分布balance表明,未退出的客戶(0)在 0 左右集中度較大,而退出的客戶(1)的中位數余額較高。

plot_histograms(train, continuous_vars, target_col)

圖片圖片

圖片圖片

圖片圖片

圖片圖片

我們觀察到大量未退出的年輕客戶,而退出客戶的分布則偏向于老年。這一點在 50 歲左右的峰值中尤為明顯,此時橙線超過了藍線。

plot_correlation_heatmap(train, continuous_vars, target_col)

圖片圖片

“Age”和“Exited”之間呈現出最強的正相關性(0.3366),這支持了年齡是預測客戶流失的重要因素這一發現

“Balance”也與“Exited”呈現正相關(0.1284),表明余額較高的客戶更有可能離開。

plot_pairplot(train, continuous_vars, target_col)

圖片圖片

這兩個類別之間沒有明顯的區分,這表明單個變量不足以區分退出的顧客和未退出的顧客。

特征工程

現在是時候創建一些特征了。每當你得到數據時,你都可以創建更多特征來提高模型的預測能力。這就像從數據中榨取每一點洞察力一樣。

為此,我們將構建一個管道,它是對一組數據進行操作的對象序列。操作可以包括:

  • 關系探索
  • 特征變換
  • 處理缺失值
  • 創建新特征
  • 選擇適合模型
  • 預測未知數據

這是一個簡單的轉換器示例,僅用于刪除列

class DropColumn(BaseEstimator, TransformerMixin):
    def __init__(self, cols):
        self.cols = cols

    def fit(self, X, y=None):
        return self

    def transform(self, X):
        return X.drop(self.cols, axis=1)

另一個用于一次性執行 kmeans 聚類、縮放和 PCA。

from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.cluster import KMeans


class KMeansClusterer(BaseEstimator, TransformerMixin):
    def __init__(self, features, n_clusters=20, random_state=0, n_compnotallow=None):
        self.features = features
        self.n_clusters = n_clusters
        self.random_state = random_state
        self.n_components = n_components
        self.kmeans = KMeans(n_clusters=n_clusters, n_init=50, random_state=random_state)
        self.scaler = StandardScaler()
        self.pca = PCA(n_compnotallow=n_components)
        
    def fit(self, X, y=None):
        X_scaled = self.scaler.fit_transform(X.loc[:, self.features])
        if self.n_components is not None:
            X_scaled = self.pca.fit_transform(X_scaled)
        self.kmeans.fit(X_scaled)
        
        return self
    
    def transform(self, X):
        X_scaled = self.scaler.transform(X.loc[:, self.features])
        
        # check for NaN and replace with zero
        if np.isnan(X_scaled).any():
            X_scaled = np.nan_to_num(X_scaled)
            
        if self.n_components is not None:
            X_scaled = self.pca.transform(X_scaled)
            
        X_new = pd.DataFrame()
        X_new["Cluster"] = self.kmeans.predict(X_scaled)
        
        X_copy = X.copy()
        
        # convert to dense format
        X_new["Cluster"] = X_new["Cluster"].values
        
        return pd.concat([X_copy.reset_index(drop=True), X_new.reset_index(drop=True)], axis=1)
    
clusterer_with_pca = KMeansClusterer(features=["CustomerId","EstimatedSalary","Balance"], n_clusters=10, random_state=123, n_compnotallow=3)
clusterer_with_pca.fit_transform(train)

圖片圖片

一旦定義了構建新功能和執行某些轉換所需的所有轉換器,就可以構建管道了。因篇幅限制,所有轉換器構建的完整代碼可以在@公眾號:數據STUDIO 后臺回復 240720 即可免費獲取完整代碼。

對于編碼,你需要使用列轉換器。我們將輸出設置為 pandas。

from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder

preprocessing_pipeline = Pipeline([
    ('kmeans', KMeansClusterer(features=["CustomerId", "EstimatedSalary", "Balance"], n_clusters=10, random_state=123, n_compnotallow=3)),
    ('surname_tfid', TFIDFTransformer(column="Surname", max_features=1000, n_compnotallow=5)),
    ('age_binning', VariableBinning(n_bins=5, column_name="Age")),
    ('salary_binning', VariableBinning(n_bins=10, column_name="EstimatedSalary")),
    ('balance_salary_ratio', BalanceSalaryRatioTransformer()),
    ('geo_gender', GeoGenderTransformer()),
    ('total_products', BalanceSalaryRatioTransformer()),  # Note: Should be TotalProductsTransformer, but not defined above
    ('tp_gender', TpGenderTransformer()),
    ('is_senior', IsSeniorTransformer()),
    ('quality_of_balance', QualityOfBalanceTransformer()),
    ('credit_score_tier', CreditScoreTierTransformer()),
    ('is_active_by_credit_card', IsActiveByCreditCardTransformer()),
    ('products_per_tenure', ProductsPerTenureTransformer()),
    ('customer_status', CustomerStatusTransformer()),
    ('drop', DropColumn(cols=['CustomerId', 'Surname'])),
    ('prep', ColumnTransformer([
        ('encode', OneHotEncoder(handle_unknown='ignore', sparse_output=False), 
         ['Gender', 'Geography', 'NumOfProducts', 'HasCrCard', 'IsActiveMember', 'Geo_Gender', 'Tp_Gender']),
        ],
        remainder='passthrough').set_output(transform='pandas')),
])

preprocessing_pipeline

圖片圖片

將這個管道應用到我們的訓練數據集上。

df_train = preprocessing_pipeline.fit_transform(train.drop(['Exited'], axis=1))
df_train.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 175030 entries, 0 to 175029
Data columns (total 49 columns):
 #   Column                             Non-Null Count   Dtype   
---  ------                             --------------   -----   
 0   encode__Gender_Female              175030 non-null  float64 
 1   encode__Gender_Male                175030 non-null  float64 
 2   encode__Geography_France           175030 non-null  float64 
 3   encode__Geography_Germany          175030 non-null  float64 
 4   encode__Geography_Spain            175030 non-null  float64 
 5   encode__NumOfProducts_1            175030 non-null  float64 
 6   encode__NumOfProducts_2            175030 non-null  float64 
 7   encode__NumOfProducts_3            175030 non-null  float64 
 8   encode__NumOfProducts_4            175030 non-null  float64 
 9   encode__HasCrCard_0.0              175030 non-null  float64 
 10  encode__HasCrCard_1.0              175030 non-null  float64 
 11  encode__IsActiveMember_0.0         175030 non-null  float64 
 12  encode__IsActiveMember_1.0         175030 non-null  float64 
 13  encode__Geo_Gender_France_Female   175030 non-null  float64 
 14  encode__Geo_Gender_France_Male     175030 non-null  float64 
 15  encode__Geo_Gender_Germany_Female  175030 non-null  float64 
 16  encode__Geo_Gender_Germany_Male    175030 non-null  float64 
 17  encode__Geo_Gender_Spain_Female    175030 non-null  float64 
 18  encode__Geo_Gender_Spain_Male      175030 non-null  float64 
 19  encode__Tp_Gender_1.0Female        175030 non-null  float64 
 20  encode__Tp_Gender_1.0Male          175030 non-null  float64 
 21  encode__Tp_Gender_2.0Female        175030 non-null  float64 
 22  encode__Tp_Gender_2.0Male          175030 non-null  float64 
 23  encode__Tp_Gender_3.0Female        175030 non-null  float64 
 24  encode__Tp_Gender_3.0Male          175030 non-null  float64 
 25  encode__Tp_Gender_4.0Female        175030 non-null  float64 
 26  encode__Tp_Gender_4.0Male          175030 non-null  float64 
 27  encode__Tp_Gender_5.0Female        175030 non-null  float64 
 28  encode__Tp_Gender_5.0Male          175030 non-null  float64 
 29  remainder__CreditScore             175030 non-null  int16   
 30  remainder__Age                     175030 non-null  float32 
 31  remainder__Tenure                  175030 non-null  int8    
 32  remainder__Balance                 175030 non-null  float32 
 33  remainder__EstimatedSalary         175030 non-null  float32 
 34  remainder__Cluster                 175030 non-null  int32   
 35  remainder__Surname_tfidf_0         175030 non-null  float64 
 36  remainder__Surname_tfidf_1         175030 non-null  float64 
 37  remainder__Surname_tfidf_2         175030 non-null  float64 
 38  remainder__Surname_tfidf_3         175030 non-null  float64 
 39  remainder__Surname_tfidf_4         175030 non-null  float64 
 40  remainder__QCut5_Age               175030 non-null  int64   
 41  remainder__QCut10_EstimatedSalary  175030 non-null  int64   
 42  remainder__Total_Products_Used     175030 non-null  float16 
 43  remainder__IsSenior                175030 non-null  int64   
 44  remainder__QualityOfBalance        175030 non-null  category
 45  remainder__CreditScoreTier         175030 non-null  category
 46  remainder__IsActive_by_CreditCard  175030 non-null  float16 
 47  remainder__Products_Per_Tenure     175030 non-null  float64 
 48  remainder__Customer_Status         175030 non-null  int64   
dtypes: category(2), float16(2), float32(3), float64(35), int16(1), int32(1), int64(4), int8(1)
memory usage: 56.3 MB

從 14 個特征增加到現在 48 個!

GBT 分類器

我們將訓練以下增強模型:XGBoost、Catboost、LightGBM。

我們使用Optuna來找到此 Catboost 分類器的最佳超參數。我設置n_trials=10它是為了讓它完成得更快,如果你時間充足,這里可以設置大一點(越大時間越久)。

其余模型的構建完整代碼:可以在@公眾號:數據STUDIO 后臺回復 240720 即可免費獲取完整代碼。

# 過濾警告 (FutureWarnings)
warnings.filterwarnings("ignore", 
                        category=FutureWarning, 
                        module="sklearn.utils.validation")

skf = StratifiedKFold(n_splits=10, shuffle=True, random_state=42)

def objective(trial):
    params = {
        'iterations': trial.suggest_int('iterations', 500, 1000),
        'depth': trial.suggest_int('depth', 10, 16),
        'min_data_in_leaf': trial.suggest_int('min_data_in_leaf', 2, 20),
        'learning_rate': trial.suggest_float('learning_rate', 1e-4, 0.2, log=True),
    }
    
    cb_model = CatBoostClassifier(**params, random_state=42, grow_policy='Lossguide', verbose=0)
    cb_pipeline = make_pipeline(modelling_pipeline, cb_model)
    

    cv = abs(cross_val_score(cb_pipeline, X, y, cv=skf, scoring='roc_auc').mean())
    return cv

study = optuna.create_study(directinotallow='maximize')
study.optimize(objective, n_trials=10)

best_params_cb = study.best_params
print("Best Hyperparameters for CatBoost:", best_params_cb)

完成后,你可以將最佳參數傳遞給分類器。

cb_model = CatBoostClassifier(**best_params_cb, random_state=42, verbose=0)
cb_pipeline_optimized = make_pipeline(modelling_pipeline, cb_model)

我們再進行一次 KFold 來檢查 AUC 分數。

n_splits = 10
stratkf = StratifiedKFold(n_splits=n_splits, shuffle=True, random_state=42)

cv_results = []

for fold, (train_idx, val_idx) in enumerate(stratkf.split(X, y)):
    X_train, X_val = X.iloc[train_idx], X.iloc[val_idx]
    y_train, y_val = y.iloc[train_idx], y.iloc[val_idx]
    
    cb_pipeline_optimized.fit(X_train, y_train)

    y_val_pred_prob = cb_pipeline_optimized.predict_proba(X_val)[:, 1]
    y_pred = cb_pipeline_optimized.predict(X_val)
    f1 = f1_score(y_val, y_pred, average='weighted')

    # Evaluating the model
    logloss = log_loss(y_val, y_val_pred_prob)
    roc_auc = roc_auc_score(y_val, y_val_pred_prob)
    print(f'Fold {fold + 1}, AUC-Score on Validation Set: {roc_auc}')
    print(f'Fold {fold + 1}, F1 Score on Validation Set: {f1}')
    print(f'Fold {fold + 1}, Log Loss Score on Validation Set: {logloss}')
    print('-'*70)

    cv_results.append(logloss)

average_cv_result = sum(cv_results) / n_splits
print(f'\nAverage Logarithmic Loss across {n_splits} folds: {average_cv_result}')

我們可以使用混淆矩陣檢查模型的性能。

X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=42)
cb_pipeline_optimized.fit(X = X_train,
                y = y_train)
predictions_cb = cb_pipeline_optimized.predict(X_val)
cm_cb = confusion_matrix(y_val, predictions_cb)
disp = ConfusionMatrixDisplay(confusion_matrix=cm_cb, display_labels=['Not Churn', 'Churn'])
disp.plot()
plt.show()

圖片圖片

我們的模型具有較高的真陰性率,這意味著它在識別不會流失的客戶方面比識別會流失的客戶更有效。模型預測不會流失的客戶中,有相當一部分實際上流失了,這可能是一個需要改進的領域。減少假陰性可以幫助公司更有效地采取干預措施來留住客戶。

我們還可以看到 catboost 分類器的特征重要性。

cb_feature_importance = cb_pipeline_optimized.named_steps['catboostclassifier'].feature_importances_
sorted_idx = np.argsort(cb_feature_importance)
fig = plt.figure(figsize=(18, 16))
plt.barh(range(len(sorted_idx)), cb_feature_importance[sorted_idx], align='center')
plt.yticks(range(len(sorted_idx)), np.array(train_X.columns)[sorted_idx])
plt.title('CB_Feature Importance')
plt.show()

圖片圖片

圖表顯示,對于模型的預測來說,最重要的特征包括年齡、信用評分、估計工資和集群。姓氏的 tfidf 特征似乎也與預測特征重要性有關,盡管這可能會導致對這些名字的過度擬合。

集成學習

現在有性能各異的不同模型。通過集成學習,可以將這些模型融合在一起,以實現更高的性能!

這里我們使用帶有“軟”投票的投票分類器,它根據預測概率總和的 argmax 來預測類標簽。

這些權重是一個數字,它告訴分類器在平均之前對類概率賦予多大的重要性(權重)。它們也可以使用 GridSearch 或 Optuna 進行優化。

ensemble_model = VotingClassifier(estimators=[
    ('xgb', xgb_pipeline_optimized),
    ('lgb', lgb_pipeline_optimized),
    ('cb', cb_pipeline_optimized)
], voting='soft', weights = [0.4,0.4,0.2])

ensemble_model
X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=42)

ensemble_model.fit(X = X_train, y = y_train)

predictions_ensemble = ensemble_model.predict(X_val)

cm_ensemble = confusion_matrix(y_val, predictions_ensemble)

disp = ConfusionMatrixDisplay(confusion_matrix=cm_ensemble, display_labels=['Not Churn', 'Churn'])
disp.plot()
plt.show()

請注意,我們的假陰性略有減少,而真陽性有所增加。

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

2023-07-26 12:38:42

PyGWalker數據類型

2025-07-03 01:45:00

2016-11-25 11:16:22

阿里支付寶數據分析

2021-11-29 13:29:06

Basemap可視化分析

2022-06-15 08:25:07

Python天氣數據可視化分析

2018-01-25 14:34:18

大數據可視化工具

2020-09-09 12:15:50

大數據互聯網可視化

2018-01-03 17:22:22

DataHunter數據可視化分析

2018-11-14 10:15:58

開源技術 數據

2020-09-27 14:56:33

工具數據可視化技術

2020-09-27 10:32:05

開發 Github可視化

2016-04-26 14:04:29

大數據可視化

2021-06-04 12:56:22

數據分析崗位

2017-02-07 15:54:14

數據可視化數據分析

2021-05-06 09:57:18

Python 開發編程語言

2021-08-05 10:46:59

GitHub代碼開發者

2020-09-28 15:13:11

數據可視化技術工具

2021-06-30 23:38:56

Python微信好友

2022-11-26 21:34:08

Python可視化世界杯

2016-11-28 15:03:06

Python數據可視化網絡分析
點贊
收藏

51CTO技術棧公眾號

6080午夜不卡| 国产精品欧美综合| 天天操天天射天天| 欧美成人激情| 91在线视频官网| 久久精品最新地址| youjizzxxxx18| 人妻少妇一区二区三区| 亚洲色图88| 在线观看国产91| 久久99热只有频精品91密拍| 五月天av网站| 97久久中文字幕| 国产欧美一区视频| 青青久久av北条麻妃黑人| 国产香蕉精品视频| 182tv在线播放| 国产精品99久久精品| 一本色道亚洲精品aⅴ| 国产麻豆日韩| 国产精品白浆一区二小说| 国产成年精品| 亚洲素人一区二区| 国产欧美韩国高清| 成人看片人aa| 国产精品久久久亚洲| 初高中福利视频网站| 欧美极品另类| 九九久久精品视频| 最近2019中文免费高清视频观看www99| 日韩av片在线看| 五十路在线观看| 日韩视频在线一区二区三区| 亚洲国产91色在线| 天堂…中文在线最新版在线| 蜜桃91麻豆精品一二三区| 中文精品久久| 亚洲美女久久久| www.日日操| h网站视频在线观看| 蜜桃视频第一区免费观看| 在线成人激情黄色| 免费观看a级片| 亚洲午夜精品网| 精品久久久久久久久久| 99久久久精品免费观看国产 | 免费av网站大全久久| 久久久久久久久中文字幕| 日本精品一区二区三区在线| 在线观看亚洲视频| 欧美性猛交乱大交| 国产成人午夜性a一级毛片| 中文无字幕一区二区三区 | 欧美一级在线观看| 日本a在线天堂| 免费av网站观看| 国产精品一区不卡| 97不卡在线视频| av黄色在线免费观看| 久久精品国产福利| 亚洲欧美激情视频在线观看一区二区三区 | 综合 欧美 亚洲日本| 91精品国产色综合久久不卡粉嫩| 色视频欧美一区二区三区| 亚洲免费久久| 亚洲不卡免费视频| 亚洲影音先锋| 精品国产一区二区三区四区在线观看| 香蕉视频在线观看黄| 精品国产伦一区二区三区观看说明| 性感美女久久精品| 一区二区高清视频| 亚洲 欧美 激情 另类| 成人免费看视频| 国产精品久久久久99| 免费看一级一片| 精品一级毛片| 亚洲精品av在线| 亚洲制服中文字幕| 345成人影院| 亚洲最快最全在线视频| 亚洲精品久久区二区三区蜜桃臀| av资源网站在线观看| 国产精品久久久久久久久搜平片| 国产精品免费一区二区三区观看| 亚洲第一天堂网| 99久久亚洲一区二区三区青草| 国产欧美va欧美va香蕉在| 国产精品乱码一区二区| 国产精品一二| 欧美激情综合亚洲一二区| 久久中文字幕在线观看| 99国产精品免费视频观看| 久久综合电影一区| 国产农村妇女精品一区| 羞羞答答成人影院www| 亚洲午夜女主播在线直播| 国产伦精品一区二区三区精品| 日韩福利在线观看| 色屁屁一区二区| 国产福利精品一区二区三区| 日韩视频网站在线观看| 精品久久久久久中文字幕一区奶水 | 欧美精品不卡| 俺去了亚洲欧美日韩| 欧美精品久久久久性色| 中文一区二区| 91精品在线播放| 亚洲一区精品在线观看| 石原莉奈在线亚洲三区| 日本高清视频精品| 一区二区精品视频在线观看| 免费成人av在线播放| 国产福利久久精品| 亚洲黄色小说网| 国产日韩高清在线| 欧美视频小说| 免费在线视频你懂得| 99re热这里只有精品视频| 亚洲国产高清国产精品| 岛国在线视频网站| 天天色天天操综合| 亚洲老女人av| 欧美特黄色片| 亚洲精品中文字幕av| 国产精品三级在线观看无码| 欧美三级午夜理伦三级在线观看| 亚洲第一页中文字幕| 妖精视频在线观看免费| av成人天堂| 国产精品播放| 菠萝蜜视频国产在线播放| 亚洲精选在线视频| 超碰在线人人爱| 免费久久精品| 影音先锋日韩有码| 久久久久久91亚洲精品中文字幕| 国产亚洲精品久久久久婷婷瑜伽| 亚洲在线www| 狠狠综合久久av一区二区| 最新国产精品久久精品| 久久在线中文字幕| 国产剧情av在线播放| 日韩三级视频中文字幕| 无码成人精品区在线观看| 亚洲人metart人体| 亚洲一区二区三区香蕉| 伊人在线视频| 一区二区激情视频| 国产不卡的av| 亚洲精品**不卡在线播he| 中文在线资源观看视频网站免费不卡| 国产精品麻豆免费版现看视频| 中文字幕免费一区二区三区| 国产精品偷伦免费视频观看的| 国产在线观看黄| 亚洲欧美日韩国产综合在线| 99re精彩视频| 国产精品午夜av| 国产一区二区三区精品久久久| 台湾佬中文在线| 精品亚洲porn| 久久99精品久久久久久久久久| 欧美人动性xxxxz0oz| 日本韩国精品在线| 三上悠亚影音先锋| 欧美fxxxxxx另类| 国产成人精品国内自产拍免费看| 99久久亚洲精品日本无码| 黄一区二区三区| 欧美日韩一区二区三区电影| 亚洲午夜天堂| 亚洲色图激情小说| 久久久久成人片免费观看蜜芽| 国产伦精品一区二区三区免费| 欧美另类videosbestsex日本| 亚洲日本一区二区三区在线| 国产小视频国产精品| 蜜臀尤物一区二区三区直播| 成人午夜激情片| 久久久久久久午夜| 国产精品一站二站| 久久99久久亚洲国产| 高潮毛片又色又爽免费| 国产 日韩 欧美大片| 亚洲视频sss| 成人久久精品| 午夜精品久久久久久久99热| 国产色视频在线| 亚洲国产日韩a在线播放| 成人综合久久网| 国产精品美女久久久久久不卡| 欧美精品xxx| 日韩电影免费| 婷婷成人激情在线网| 亚洲性猛交xxxx乱大交| 狠狠色伊人亚洲综合成人| 国产黄色激情视频| 国产高清亚洲| 97在线视频免费播放| 91xxx在线观看| 在线一区二区三区四区| 精品欧美一区二区久久久久| 久久国产精品第一页| av中文字幕av| 精品国产第一国产综合精品| 国产69精品99久久久久久宅男| 精品国产av一区二区| 最新国产成人在线观看| 给我免费观看片在线电影的| 亚洲福利一区| 精品日韩电影| 久久青草伊人| 日韩大片在线观看视频| 免费一级a毛片夜夜看| 久久久精品影视| 老太脱裤子让老头玩xxxxx| 精品国产91| 国产一区二区三区色淫影院| 波多野结衣乳巨码无在线观看| 精品国产一区二区三区忘忧草 | 亚洲高清免费在线观看| 影音先锋久久资源网| 在线观看欧美亚洲| 国产美女久久| 6080yy精品一区二区三区| av免费在线网站| 中文字幕国产精品久久| 亚洲av成人无码网天堂| 日韩精品在线一区二区| 精品无码人妻一区二区三区品| 国产亲近乱来精品视频| 黄色av网址在线观看| 国产一区二区伦理片| 久久久久久久9| 婷婷久久综合| 亚洲精品中文字幕在线| 久久av综合| 精品久久久久久中文字幕动漫 | 首页欧美精品中文字幕| 免费国产黄色网址| 一区在线视频观看| 国产精品videossex国产高清| 先锋资源久久| 在线观看一区二区三区三州 | 成人成人成人在线视频| 可以在线看的av网站| 一区在线免费| 欧美黑人经典片免费观看| 亚洲第一毛片| 成年人午夜免费视频| 国产91一区| 免费国产一区二区| 欧美v亚洲v综合v国产v仙踪林| 国产成人a亚洲精品| 欧美日韩精品免费观看视完整| 中文国产亚洲喷潮| 国产福利小视频在线| 欧美一级视频精品观看| 91久久久久国产一区二区| 欧美美女网站色| 国产特黄大片aaaa毛片| 亚洲国产精品t66y| 久久久久久成人网| 成人av在线播放网站| av av在线| 91色porny在线视频| 国产精品探花在线播放| 国产美女精品在线| 久久综合桃花网| 国产a久久麻豆| 亚洲av成人无码一二三在线观看| 91在线视频播放| 五月天精品视频| 国产精品久久久久9999吃药| 欧美精品xxxxx| 精品久久久久久亚洲精品| 美女黄页在线观看| 91精品国产麻豆| 欧美视频xxx| 亚洲欧洲自拍偷拍| 黄在线免费观看| 在线色欧美三级视频| 麻豆网站在线| 久久久久成人精品| 欧美理论影院| 成人网在线免费看| 国产成人在线中文字幕| 日韩欧美三级电影| 一个色免费成人影院| 欧美一二三区| 天堂一区二区三区四区| 高清国语自产拍免费一区二区三区| 激情av综合| 成人在线免费观看一区| 任你躁在线精品免费| 亚洲三区在线| 国产欧美亚洲一区| 激情黄色小视频| 99久久99久久精品免费观看| 人成免费在线视频| 亚洲大片精品永久免费| 怡春院在线视频| 欧美天堂亚洲电影院在线播放| 中文字幕在线观看视频网站| 亚洲国产精品一区二区www在线| 中文字幕视频网站| 91精品国产品国语在线不卡| 色视频免费在线观看| 久久综合色88| 欧美日韩精品免费观看视欧美高清免费大片| 91国产精品电影| 欧美网站免费| 欧美日韩精品久久| 亚洲午夜91| 99热久久这里只有精品| 日韩—二三区免费观看av| 五月婷婷狠狠操| yourporn久久国产精品| 日本在线一级片| 一区二区三区在线不卡| 欧美日韩在线视频免费| 91成人看片片| 日韩在线免费播放| 欧美激情国内偷拍| 888av在线视频| 欧美在线观看视频| 日韩欧美少妇| 久久久99国产精品免费| 欧美日韩亚洲国产精品| 国产一区二区在线观看免费视频| 国产亚洲精品超碰| 国产精品777777| 亚洲精品一区二区三区婷婷月| aaa在线播放视频| 国产精品手机视频| 亚洲视频精品| 久草免费资源站| 亚洲一区在线观看免费 | 日本在线观看不卡视频| 欧美性猛交xxxx乱大交91| 国产三级一区二区| 亚洲 欧美 中文字幕| 国产视频精品久久久| 青青青免费在线视频| 好吊色欧美一区二区三区四区 | 久久久伊人欧美| 一区二区亚洲视频| 男人c女人视频| 国产精品456露脸| 黄色网址在线视频| 亚瑟在线精品视频| 欧美一级免费片| 久久久久久久久亚洲| 老牛国内精品亚洲成av人片| 欧美久久久久久久久久久久久 | 欧美一区二区视频在线观看2020| 日本在线天堂| 国产精品视频资源| 国产精品99一区二区三| 久久aaaa片一区二区| 亚洲一区二区三区四区在线观看 | 国产欧美精品日韩区二区麻豆天美| 日韩精品一区二区亚洲av观看| 亚洲欧美中文另类| 成人国产一区| 亚洲精品天堂成人片av在线播放| 国v精品久久久网| 亚洲婷婷综合网| 中文字幕亚洲欧美日韩高清 | 欧美日韩一区二区在线观看| 性生活三级视频| 韩国福利视频一区| 一本色道久久综合狠狠躁的番外| 欧美在线观看视频网站| 国产精品久久久久天堂| 天堂网av手机版| 亚洲香蕉成视频在线观看| 国内精品伊人| 欧美狂野激情性xxxx在线观| 91丨porny丨首页| 在线观看免费观看在线| 色综合久久88色综合天天看泰| 欧美人成在线观看ccc36| www.xxx亚洲| 一区二区三区欧美久久| 欧美一区二区少妇| 国产这里只有精品| 欧美日韩国产高清电影| 国产探花在线观看视频| 午夜精品在线视频一区| a中文在线播放| 国产精品久久久久久久久久直播| 亚洲综合社区| 国产一区二区视频在线观看免费| 亚洲激情在线观看| 亚洲精品aaa| 无码人妻h动漫| 久久人人超碰精品| 国产一级做a爱片久久毛片a|