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

機器學習算法實踐:決策樹 (Decision Tree)

人工智能 機器學習 算法
最近打算系統學習下機器學習的基礎算法,避免眼高手低,決定把常用的機器學習基礎算法都實現一遍以便加深印象。本文為這系列博客的第一篇,關于決策樹(Decision Tree)的算法實現,文中我將對決策樹種涉及到的算法進行總結并附上自己相關的實現代碼。

前言

最近打算系統學習下機器學習的基礎算法,避免眼高手低,決定把常用的機器學習基礎算法都實現一遍以便加深印象。本文為這系列博客的第一篇,關于決策樹(Decision Tree)的算法實現,文中我將對決策樹種涉及到的算法進行總結并附上自己相關的實現代碼。所有算法代碼以及用于相應模型的訓練的數據都會放到GitHub上(https://github.com/PytLab/MLBox).

本文中我將一步步通過MLiA的隱形眼鏡處方數集構建決策樹并使用Graphviz將決策樹可視化。

正文

決策樹學習

決策樹學習是根據數據的屬性采用樹狀結構建立的一種決策模型,可以用此模型解決分類和回歸問題。常見的算法包括 CART(Classification And Regression Tree), ID3, C4.5等。我們往往根據數據集來構建一棵決策樹,他的一個重要任務就是為了數據中所蘊含的知識信息,并提取出一系列的規則,這些規則也就是樹結構的創建過程就是機器學習的過程。

決策樹的結構

以下面一個簡單的用于是否買電腦預測的決策樹為例子,樹中的內部節點表示某個屬性,節點引出的分支表示此屬性的所有可能的值,葉子節點表示最終的判斷結果也就是類型。

 

借助可視化工具例如Graphviz,matplotlib的注解等等都可以講我們創建的決策樹模型可視化并直接被人理解,這是貝葉斯神經網絡等算法沒有的特性。

決策樹算法

決策樹算法主要是指決策樹進行創建中進行樹分裂(劃分數據集)的時候選取最優特征的算法,他的主要目的就是要選取一個特征能夠將分開的數據集盡量的規整,也就是盡可能的純. 最大的原則就是: 將無序的數據變得更加有序

這里總結下三個常用的方法:

  • 信息增益(information gain)
  • 增益比率(gain ratio)
  • 基尼不純度(Gini impurity)

信息增益 (Information gain)

這里涉及到了信息論中的一些概念:某個事件的信息量,信息熵,信息增益等, 關于事件信息的通俗解釋可以看知乎上的一個回答

  • 某個事件 i 的信息量: 這個事件發生的概率的負對數

 

  • 信息熵就是平均而言一個事件發生得到的信息量大小,也就是信息量的期望值 

 

任何一個序列都可以獲取這個序列的信息熵,也就是將此序列分類后統計每個類型的概率,再用上述公式計算,使用Python實現如下:

  1. def get_shanno_entropy(self, values): 
  2.  
  3.     ''' 根據給定列表中的值計算其Shanno Entropy 
  4.  
  5.     ''
  6.  
  7.     uniq_vals = set(values
  8.  
  9.     val_nums = {keyvalues.count(keyfor key in uniq_vals} 
  10.  
  11.     probs = [v/len(valuesfor k, v in val_nums.items()] 
  12.  
  13.     entropy = sum([-prob*log2(prob) for prob in probs]) 
  14.  
  15.     return entropy  

信息增益

我們將一組數據集進行劃分后,數據的信息熵會發生改變,我們可以通過使用信息熵的計算公式分別計算被劃分的子數據集的信息熵并計算他們的平均值(期望值)來作為分割后的數據集的信息熵。新的信息熵的相比未劃分數據的信息熵的減小值便是信息增益了. 這里我在最初就理解錯了,于是寫出的代碼并不能創建正確的決策樹。

假設我們將數據集D劃分成kk 份D1,D2,…,Dk,則劃分后的信息熵為:

 

信息增益便是兩個信息熵的差值

 

在這里我主要使用信息增益來進行屬性選擇,具體的實現代碼如下:

  1. def choose_best_split_feature(self, dataset, classes): 
  2.  
  3.     ''' 根據信息增益確定最好的劃分數據的特征 
  4.  
  5.   
  6.  
  7.     :param dataset: 待劃分的數據集 
  8.  
  9.     :param classes: 數據集對應的類型 
  10.  
  11.   
  12.  
  13.     :return: 劃分數據的增益最大的屬性索引 
  14.  
  15.     ''
  16.  
  17.     base_entropy = self.get_shanno_entropy(classes) 
  18.  
  19.   
  20.  
  21.     feat_num = len(dataset[0]) 
  22.  
  23.     entropy_gains = [] 
  24.  
  25.     for i in range(feat_num): 
  26.  
  27.         splited_dict = self.split_dataset(dataset, classes, i) 
  28.  
  29.         new_entropy = sum([ 
  30.  
  31.             len(sub_classes)/len(classes)*self.get_shanno_entropy(sub_classes) 
  32.  
  33.             for _, (_, sub_classes) in splited_dict.items() 
  34.  
  35.         ]) 
  36.  
  37.         entropy_gains.append(base_entropy - new_entropy) 
  38.  
  39.   
  40.  
  41.     return entropy_gains.index(max(entropy_gains))  

增益比率

增益比率是信息增益方法的一種擴展,是為了克服信息增益帶來的弱泛化的缺陷。因為按照信息增益選擇,總是會傾向于選擇分支多的屬性,這樣會是的每個子集的信息熵最小。例如給每個數據添加一個第一無二的id值特征,則按照這個id值進行分類是獲得信息增益最大的,這樣每個子集中的信息熵都為0,但是這樣的分類便沒有任何意義,沒有任何泛化能力,類似過擬合。

因此我們可以通過引入一個分裂信息來找到一個更合適的衡量數據劃分的標準,即增益比率。

分裂信息的公式表示為:

 

當然SplitInfo有可能趨近于0,這個時候增益比率就會變得非常大而不可信,因此有時還需在分母上添加一個平滑函數,具體的可以參考參考部分列出的文章

基尼不純度(Gini impurity)

基尼不純度的定義:

 

其中m 表示數據集D 中類別的個數, pi 表示某種類型出現的概率。可見當只有一種類型的時候基尼不純度的值為0,此時不純度最低。

針對劃分成k個子數據集的數據集的基尼不純度可以通過如下式子計算:

 

由此我們可以根據不純度的變化來選取最有的樹分裂屬性

 

樹分裂

有了選取最佳分裂屬性的算法,下面我們就需要根據選擇的屬性來將樹進一步的分裂。所謂樹分裂只不過是根據選擇的屬性將數據集劃分,然后在總劃分出來的數據集中再次調用選取屬性的方法選取子數據集的中屬性。實現的最好方式就是遞歸了.

關于用什么數據結構來表示決策樹,在Python中可以使用字典很方便的表示決策樹的嵌套,一個樹的根節點便是屬性,屬性對應的值又是一個新的字典,其中key為屬性的可能值,value為新的子樹。

下面是我使用Python實現的根據數據集創建決策樹:

  1. def create_tree(self, dataset, classes, feat_names): 
  2.  
  3.     ''' 根據當前數據集遞歸創建決策樹 
  4.  
  5.   
  6.  
  7.     :param dataset: 數據集 
  8.  
  9.     :param feat_names: 數據集中數據相應的特征名稱 
  10.  
  11.     :param classes: 數據集中數據相應的類型 
  12.  
  13.   
  14.  
  15.     :param tree: 以字典形式返回決策樹 
  16.  
  17.     ''
  18.  
  19.     # 如果數據集中只有一種類型停止樹分裂 
  20.  
  21.     if len(set(classes)) == 1: 
  22.  
  23.         return classes[0] 
  24.  
  25.   
  26.  
  27.     # 如果遍歷完所有特征,返回比例最多的類型 
  28.  
  29.     if len(feat_names) == 0: 
  30.  
  31.         return get_majority(classes) 
  32.  
  33.   
  34.  
  35.     # 分裂創建新的子樹 
  36.  
  37.     tree = {} 
  38.  
  39.     best_feat_idx = self.choose_best_split_feature(dataset, classes) 
  40.  
  41.     feature = feat_names[best_feat_idx] 
  42.  
  43.     tree[feature] = {} 
  44.  
  45.   
  46.  
  47.     # 創建用于遞歸創建子樹的子數據集 
  48.  
  49.     sub_feat_names = feat_names[:] 
  50.  
  51.     sub_feat_names.pop(best_feat_idx) 
  52.  
  53.   
  54.  
  55.     splited_dict = self.split_dataset(dataset, classes, best_feat_idx) 
  56.  
  57.     for feat_val, (sub_dataset, sub_classes) in splited_dict.items(): 
  58.  
  59.         tree[feature][feat_val] = self.create_tree(sub_dataset, 
  60.  
  61.                                                    sub_classes, 
  62.  
  63.                                                    sub_feat_names) 
  64.  
  65.     self.tree = tree 
  66.  
  67.     self.feat_names = feat_names 
  68.  
  69.   
  70.  
  71.     return tree  

樹分裂的終止條件有兩個

  • 一個是遍歷完所有的屬性

可以看到,在進行樹分裂的時候,我們的數據集中的數據向量的長度是不斷縮短的,當縮短到0時,說明數據集已經將所有的屬性用盡,便也分裂不下去了, 這時我們選取最終子數據集中的眾數作為最終的分類結果放到葉子節點上.

  • 另一個是新劃分的數據集中只有一個類型。

若某個節點所指向的數據集都是同一種類型,那自然沒有必要在分裂下去了即使屬性還沒有遍歷完.

構建一棵決策樹

這我用了一下MLiA書上附帶的隱形眼鏡的數據來生成一棵決策樹,數據中包含了患者眼部狀況以及醫生推薦的隱形眼鏡類型.

首先先導入數據并將數據特征同類型分開作為訓練數據用于生成決策樹

  1. from trees import DecisionTreeClassifier 
  2.  
  3.   
  4.  
  5. lense_labels = ['age''prescript''astigmatic''tearRate'
  6.  
  7. X = [] 
  8.  
  9. Y = [] 
  10.  
  11.   
  12.  
  13. with open('lenses.txt''r'as f: 
  14.  
  15.     for line in f: 
  16.  
  17.         comps = line.strip().split('\t'
  18.  
  19.         X.append(comps[: -1]) 
  20.  
  21.         Y.append(comps[-1])  

生成決策樹:

  1. clf = DecisionTreeClassifier() 
  2.  
  3. clf.create_tree(X, Y, lense_labels)  

查看生成的決策樹:

  1. In [2]: clf.tree 
  2.  
  3. Out[2]: 
  4.  
  5. {'tearRate': {'normal': {'astigmatic': {'no': {'age': {'pre''soft'
  6.  
  7.       'presbyopic': {'prescript': {'hyper''soft''myope''no lenses'}}, 
  8.  
  9.             'young''soft'}}, 
  10.  
  11.     'yes': {'prescript': {'hyper': {'age': {'pre''no lenses'
  12.  
  13.                 'presbyopic''no lenses'
  14.  
  15.                         'young''hard'}}, 
  16.  
  17.           'myope''hard'}}}}, 
  18.  
  19.   'reduced''no lenses'}}  

可視化決策樹

直接通過嵌套字典表示決策樹對人來說不好理解,我們需要借助可視化工具可視化樹結構,這里我將使用Graphviz來可視化樹結構。為此實現了講字典表示的樹生成Graphviz Dot文件內容的函數,大致思想就是遞歸獲取整棵樹的所有節點和連接節點的邊然后將這些節點和邊生成Dot格式的字符串寫入文件中并繪圖。

遞歸獲取樹的節點和邊,其中使用了uuid給每個節點添加了id屬性以便將相同屬性的節點區分開.

  1. def get_nodes_edges(self, tree=None, root_node=None): 
  2.  
  3.     ''' 返回樹中所有節點和邊 
  4.  
  5.     ''
  6.  
  7.     Node = namedtuple('Node', ['id''label']) 
  8.  
  9.     Edge = namedtuple('Edge', ['start''end''label']) 
  10.  
  11.   
  12.  
  13.     if tree is None: 
  14.  
  15.         tree = self.tree 
  16.  
  17.   
  18.  
  19.     if type(tree) is not dict: 
  20.  
  21.         return [], [] 
  22.  
  23.   
  24.  
  25.     nodes, edges = [], [] 
  26.  
  27.   
  28.  
  29.     if root_node is None: 
  30.  
  31.         label = list(tree.keys())[0] 
  32.  
  33.         root_node = Node._make([uuid.uuid4(), label]) 
  34.  
  35.         nodes.append(root_node) 
  36.  
  37.   
  38.  
  39.     for edge_label, sub_tree in tree[root_node.label].items(): 
  40.  
  41.         node_label = list(sub_tree.keys())[0] if type(sub_tree) is dict else sub_tree 
  42.  
  43.         sub_node = Node._make([uuid.uuid4(), node_label]) 
  44.  
  45.         nodes.append(sub_node) 
  46.  
  47.   
  48.  
  49.         edge = Edge._make([root_node, sub_node, edge_label]) 
  50.  
  51.         edges.append(edge) 
  52.  
  53.   
  54.  
  55.         sub_nodes, sub_edges = self.get_nodes_edges(sub_tree, root_node=sub_node) 
  56.  
  57.         nodes.extend(sub_nodes) 
  58.  
  59.         edges.extend(sub_edges) 
  60.  
  61.   
  62.  
  63.     return nodes, edges  

生成dot文件內容

  1. def dotify(self, tree=None): 
  2.  
  3.     ''' 獲取樹的Graphviz Dot文件的內容 
  4.  
  5.     ''
  6.  
  7.     if tree is None: 
  8.  
  9.         tree = self.tree 
  10.  
  11.   
  12.  
  13.     content = 'digraph decision_tree {\n' 
  14.  
  15.     nodes, edges = self.get_nodes_edges(tree) 
  16.  
  17.   
  18.  
  19.     for node in nodes: 
  20.  
  21.         content += '    "{}" [label="{}"];\n'.format(node.id, node.label) 
  22.  
  23.   
  24.  
  25.     for edge in edges: 
  26.  
  27.         start, label, end = edge.start, edge.label, edge.end 
  28.  
  29.         content += '    "{}" -> "{}" [label="{}"];\n'.format(start.id, end.id, label) 
  30.  
  31.     content += '}' 
  32.  
  33.   
  34.  
  35.     return content  

隱形眼鏡數據生成Dot文件內容如下:

  1. digraph decision_tree { 
  2.  
  3.     "959b4c0c-1821-446d-94a1-c619c2decfcd" [label="call"]; 
  4.  
  5.     "18665160-b058-437f-9b2e-05df2eb55661" [label="to"]; 
  6.  
  7.     "2eb9860d-d241-45ca-85e6-cbd80fe2ebf7" [label="your"]; 
  8.  
  9.     "bcbcc17c-9e2a-4bd4-a039-6e51fde5f8fd" [label="areyouunique"]; 
  10.  
  11.     "ca091fc7-8a4e-4970-9ec3-485a4628ad29" [label="02073162414"]; 
  12.  
  13.     "aac20872-1aac-499d-b2b5-caf0ef56eff3" [label="ham"]; 
  14.  
  15.     "18aa8685-a6e8-4d76-bad5-ccea922bb14d" [label="spam"]; 
  16.  
  17.     "3f7f30b1-4dbb-4459-9f25-358ad3c6d50b" [label="spam"]; 
  18.  
  19.     "44d1f972-cd97-4636-b6e6-a389bf560656" [label="spam"]; 
  20.  
  21.     "7f3c8562-69b5-47a9-8ee4-898bd4b6b506" [label="i"]; 
  22.  
  23.     "a6f22325-8841-4a81-bc04-4e7485117aa1" [label="spam"]; 
  24.  
  25.     "c181fe42-fd3c-48db-968a-502f8dd462a4" [label="ldn"]; 
  26.  
  27.     "51b9477a-0326-4774-8622-24d1d869a283" [label="ham"]; 
  28.  
  29.     "16f6aecd-c675-4291-867c-6c64d27eb3fc" [label="spam"]; 
  30.  
  31.     "adb05303-813a-4fe0-bf98-c319eb70be48" [label="spam"]; 
  32.  
  33.     "959b4c0c-1821-446d-94a1-c619c2decfcd" -> "18665160-b058-437f-9b2e-05df2eb55661" [label="0"]; 
  34.  
  35.     "18665160-b058-437f-9b2e-05df2eb55661" -> "2eb9860d-d241-45ca-85e6-cbd80fe2ebf7" [label="0"]; 
  36.  
  37.     "2eb9860d-d241-45ca-85e6-cbd80fe2ebf7" -> "bcbcc17c-9e2a-4bd4-a039-6e51fde5f8fd" [label="0"]; 
  38.  
  39.     "bcbcc17c-9e2a-4bd4-a039-6e51fde5f8fd" -> "ca091fc7-8a4e-4970-9ec3-485a4628ad29" [label="0"]; 
  40.  
  41.     "ca091fc7-8a4e-4970-9ec3-485a4628ad29" -> "aac20872-1aac-499d-b2b5-caf0ef56eff3" [label="0"]; 
  42.  
  43.     "ca091fc7-8a4e-4970-9ec3-485a4628ad29" -> "18aa8685-a6e8-4d76-bad5-ccea922bb14d" [label="1"]; 
  44.  
  45.     "bcbcc17c-9e2a-4bd4-a039-6e51fde5f8fd" -> "3f7f30b1-4dbb-4459-9f25-358ad3c6d50b" [label="1"]; 
  46.  
  47.     "2eb9860d-d241-45ca-85e6-cbd80fe2ebf7" -> "44d1f972-cd97-4636-b6e6-a389bf560656" [label="1"]; 
  48.  
  49.     "18665160-b058-437f-9b2e-05df2eb55661" -> "7f3c8562-69b5-47a9-8ee4-898bd4b6b506" [label="1"]; 
  50.  
  51.     "7f3c8562-69b5-47a9-8ee4-898bd4b6b506" -> "a6f22325-8841-4a81-bc04-4e7485117aa1" [label="0"]; 
  52.  
  53.     "7f3c8562-69b5-47a9-8ee4-898bd4b6b506" -> "c181fe42-fd3c-48db-968a-502f8dd462a4" [label="1"]; 
  54.  
  55.     "c181fe42-fd3c-48db-968a-502f8dd462a4" -> "51b9477a-0326-4774-8622-24d1d869a283" [label="0"]; 
  56.  
  57.     "c181fe42-fd3c-48db-968a-502f8dd462a4" -> "16f6aecd-c675-4291-867c-6c64d27eb3fc" [label="1"]; 
  58.  
  59.     "959b4c0c-1821-446d-94a1-c619c2decfcd" -> "adb05303-813a-4fe0-bf98-c319eb70be48" [label="1"]; 
  60.  

 這樣我們便可以使用Graphviz將決策樹繪制出來

  1. with open('lenses.dot''w'as f: 
  2.  
  3.     dot = clf.tree.dotify() 
  4.  
  5.     f.write(dot) 
  6.  
  7.  
  8. dot -Tgif lenses.dot -o lenses.gif  

效果如下:

 

 

使用生成的決策樹進行分類

對未知數據進行預測,主要是根據樹中的節點遞歸的找到葉子節點即可。z這里可以通過為遞歸進行優化,代碼實現如下:

  1. def classify(self, data_vect, feat_names=None, tree=None): 
  2.  
  3.     ''' 根據構建的決策樹對數據進行分類 
  4.  
  5.     ''
  6.  
  7.     if tree is None: 
  8.  
  9.         tree = self.tree 
  10.  
  11.   
  12.  
  13.     if feat_names is None: 
  14.  
  15.         feat_names = self.feat_names 
  16.  
  17.   
  18.  
  19.     # Recursive base case
  20.  
  21.     if type(tree) is not dict: 
  22.  
  23.         return tree 
  24.  
  25.   
  26.  
  27.     feature = list(tree.keys())[0] 
  28.  
  29.     value = data_vect[feat_names.index(feature)] 
  30.  
  31.     sub_tree = tree[feature][value] 
  32.  
  33.   
  34.  
  35.     return self.classify(feat_names, data_vect, sub_tree)  

決策樹的存儲

通過字典表示決策樹,這樣我們可以通過內置的pickle或者json模塊將其存儲到硬盤上,同時也可以從硬盤中讀取樹結構,這樣在數據集很大的時候可以節省構建決策樹的時間.

  1. def dump_tree(self, filename, tree=None): 
  2.  
  3.     ''' 存儲決策樹 
  4.  
  5.     ''
  6.  
  7.     if tree is None: 
  8.  
  9.         tree = self.tree 
  10.  
  11.   
  12.  
  13.     with open(filename, 'w'as f: 
  14.  
  15.         pickle.dump(tree, f) 
  16.  
  17.   
  18.  
  19. def load_tree(self, filename): 
  20.  
  21.     ''' 加載樹結構 
  22.  
  23.     ''
  24.  
  25.     with open(filename, 'r'as f: 
  26.  
  27.         tree = pickle.load(f) 
  28.  
  29.         self.tree = tree 
  30.  
  31.     return tree  

總結

本文一步步實現了決策樹的實現, 其中使用了ID3算法確定最佳劃分屬性,并通過Graphviz可視化了構建的決策樹。本文相關的代碼鏈接: https://github.com/PytLab/MLBox/tree/master/decision_tree

參考:

  • 《Machine Learning in Action》
  • 數據挖掘系列(6)決策樹分類算法 

 

責任編輯:龐桂玉 來源: Python開發者
相關推薦

2017-05-10 15:41:29

機器學習算法數據

2017-11-21 13:00:20

機器學習決策樹可視化

2022-12-21 14:39:35

機器學習案發決策樹

2014-07-07 10:05:57

機械學習

2022-11-11 08:00:00

決策樹機器學習監督學習

2012-08-06 09:04:01

決策樹建模

2024-09-11 08:34:28

2017-10-18 14:11:20

機器學習決策樹隨機森林

2018-02-02 17:08:48

機器學習算法決策樹

2016-09-30 16:12:47

GBDT算法決策樹

2017-02-23 08:45:36

Python決策樹數據集

2023-08-11 17:30:54

決策樹機器學習算法

2020-12-22 19:37:04

決策樹機器學習人工智能

2019-05-15 09:00:00

決策樹機器學習人工智能

2018-02-02 15:50:07

決策樹Apache Spar數據

2017-08-04 14:28:40

決策樹隨機森林CART模型

2022-01-24 09:00:00

機器學習決策樹算法

2017-12-12 12:24:39

Python決策樹

2017-09-11 13:33:44

大數據數據可視化決策樹

2021-11-08 07:11:49

決策樹數據分類器
點贊
收藏

51CTO技術棧公眾號

欧美激情影音先锋| 日韩精品一区二区三区在线播放| 日本在线观看一区二区三区| 中文字幕精品一区二区精| 99久久久久国产精品| 欧美成人video| 欧美成人免费高清视频| 老司机午夜在线| 懂色av一区二区三区免费观看| 18一19gay欧美视频网站| 午夜黄色福利视频| 久草精品视频| 91麻豆精品国产91| 波多野结衣家庭教师视频| 成人短视频在线| 久久久综合视频| 国产精品久久久久久久午夜| 国产一级大片在线观看| 久久大综合网| 国产手机视频精品| 国产精品久久久久野外| 中韩乱幕日产无线码一区| 亚洲va欧美va人人爽午夜| 性欧美.com| 日本人妖在线| 福利一区二区在线| 91精品久久久久久久久不口人| 啦啦啦免费高清视频在线观看| 五月天综合网站| 一个色综合导航| 日本免费福利视频| 国产伦乱精品| 日韩欧美高清dvd碟片| 亚洲这里只有精品| 国产另类xxxxhd高清| 激情成人中文字幕| 欧美国产综合在线| 羞羞的视频在线观看| 国产精品麻豆欧美日韩ww| 欧美日韩国产精品一区二区| 黄色www视频| 国产91高潮流白浆在线麻豆| 亚洲综合大片69999| 97人妻精品一区二区三区视频 | 正在播放亚洲1区| 波多野结衣先锋影音| julia中文字幕一区二区99在线| 欧美精品tushy高清| 免费日韩视频在线观看| 男女羞羞在线观看| 日韩欧美成人网| 丰满人妻中伦妇伦精品app| 蜜桃麻豆av在线| 天天射综合影视| 欧美不卡在线播放| 两个人看的在线视频www| 亚洲成在人线免费| 成人性免费视频| 狠狠躁少妇一区二区三区| 午夜精品福利一区二区三区av | 日韩精品一区二区三区视频| 精品亚洲视频在线| 国产精品美女久久久久人| 欧美一级xxx| 欧美久久久久久久久久久| 97人人澡人人爽91综合色| 亚洲大胆人体视频| xxxwww国产| 竹菊久久久久久久| 中文字幕国产亚洲2019| 色欲一区二区三区精品a片| 欧美二区不卡| 午夜精品久久久久久久99黑人| 日韩精品乱码久久久久久| 国产精品免费看| 国产精品久久久久久久久久久久久| 中文字幕欧美色图| 国产精品自产自拍| 精品视频在线观看| 啊v在线视频| 亚洲精品中文在线观看| 免费一级特黄毛片| 麻豆精品蜜桃| 日韩亚洲欧美综合| 偷拍女澡堂一区二区三区| 国产精品一区二区av交换| 丝袜情趣国产精品| 精品少妇久久久久久888优播| 亚洲伊人观看| 91久久精品国产91性色| 日韩一卡二卡在线| 国产精品久久久久久亚洲毛片| 91精品国产毛片武则天| 97人人在线视频| 欧美色倩网站大全免费| 国内自拍偷拍视频| 精品国产91| 日韩在线视频中文字幕| 粉嫩aⅴ一区二区三区| 免费av网站大全久久| 国产91免费视频| 18视频免费网址在线观看| 亚洲影院理伦片| 婷婷激情四射五月天| 999久久精品| 在线观看视频99| 精品无码久久久久| 麻豆传媒一区二区三区| 久久久久久久久一区二区| 国产网友自拍视频导航网站在线观看| 午夜精彩视频在线观看不卡| 日本不卡一区二区在线观看| 神马午夜久久| 欧美大片在线影院| 在线观看中文字幕av| 99久久精品免费精品国产| 日本精品免费视频| 澳门av一区二区三区| 欧美r级在线观看| 国产麻豆a毛片| 丝袜亚洲精品中文字幕一区| 成人免费视频网站入口| 免费在线午夜视频| 欧美亚洲一区二区在线| 91av在线免费| 99亚洲精品| 国产成人精品日本亚洲11| 国产精品久久麻豆| 欧美日本高清视频在线观看| 亚洲久久久久久久| 亚洲男女自偷自拍| 精品日产一区2区三区黄免费 | 欧美日韩视频免费播放| 久久久久亚洲av片无码v| 亚洲草久电影| 成人网页在线免费观看| 永久av在线| 欧美男人的天堂一二区| 天堂av网手机版| 日韩精品国产欧美| 日韩高清av| 亚洲一二三四| 国产亚洲欧洲高清| 无码人妻精品一区二区三区9厂| 波波电影院一区二区三区| 国产爆乳无码一区二区麻豆| 91精品亚洲一区在线观看| 日韩在线视频观看正片免费网站| 一二三区在线播放| 中文字幕中文在线不卡住| 九九热免费在线观看| 91偷拍一区二区三区精品| 国产精品普通话| 日本蜜桃在线观看| 在线播放91灌醉迷j高跟美女| 国产黄色片在线| 国产精品亚洲一区二区三区妖精 | 成人一级黄色大片| 精品一二三四区| 青少年xxxxx性开放hg| 成人在线精品| 九色91av视频| 人妻一区二区三区| 日韩欧美国产成人| 美国黑人一级大黄| 韩国成人在线视频| 国产在线观看欧美| 超碰在线亚洲| 欧美一级高清免费| 色视频在线免费观看| 91精品婷婷国产综合久久性色| 日本黄色小说视频| 97成人超碰视| 亚洲一级片免费| 日韩手机在线导航| 性欧美长视频免费观看不卡| 国产黄色片免费| 偷拍亚洲欧洲综合| www.黄色在线| 国产乱子伦一区二区三区国色天香 | 一二三四中文字幕| 加勒比色综合久久久久久久久| 18性欧美xxxⅹ性满足| av大片在线观看| 日韩欧美国产一区在线观看| 国产免费观看av| 国产精品国产三级国产aⅴ入口| 手机av在线网站| 亚洲综合99| 一级全黄肉体裸体全过程| 欧美挤奶吃奶水xxxxx| 国产日韩专区在线| 看黄在线观看| 久久国产精品首页| 日韩私人影院| 日韩一区二区不卡| 无码aⅴ精品一区二区三区| 亚洲欧洲日本在线| 女尊高h男高潮呻吟| 国产一区中文字幕| 免费观看成人在线视频| 黄色工厂这里只有精品| 神马影院我不卡午夜| 第四色在线一区二区| 国产精品久久一区主播| av有码在线观看| 久久精品亚洲精品| 国产剧情在线观看| 亚洲韩国欧洲国产日产av| 国产精品国产三级国产aⅴ| 欧美日韩另类字幕中文| 最新一区二区三区| 中文无字幕一区二区三区| 成人在线视频免费播放| 激情综合色丁香一区二区| 国产男女激情视频| 99精品国产在热久久| 成人免费看片视频在线观看| 成人6969www免费视频| 久久亚洲午夜电影| 大香伊人久久精品一区二区| 91最新在线免费观看| aaaa欧美| 国产精品草莓在线免费观看| 国内激情视频在线观看| 欧美精品第一页在线播放| 国产精品实拍| 久久久国产精品亚洲一区| www.国产精品.com| 亚洲性猛交xxxxwww| 欧美美乳在线| 日韩精品视频三区| 免费观看成年人视频| 精品国产一区二区三区四区四| 92久久精品一区二区| 欧美日韩一卡二卡三卡| 成年人晚上看的视频| 一本久久综合亚洲鲁鲁五月天| 91蜜桃视频在线观看| 亚洲一级二级三级| 国产性70yerg老太| 亚洲国产精品一区二区www在线| 一区二区视频免费看| 亚洲精品亚洲人成人网| 欧美人禽zoz0强交| 亚洲精品国产无天堂网2021| 91传媒免费观看| 亚洲欧美日韩国产手机在线| 污软件在线观看| 一个色综合网站| 精品一级少妇久久久久久久| 亚洲成人中文在线| 国产无遮挡aaa片爽爽| 午夜在线成人av| 国产成人在线视频观看| 欧美性xxxx| 超碰在线免费97| 欧美日韩国产小视频在线观看| 中文字幕在线播出| 欧美一级视频精品观看| www日本高清视频| 亚洲第一视频网| 欧美日韩伦理片| 日韩中文视频免费在线观看| 欧美成人二区| 欧美国产在线视频| 亚洲人成午夜免电影费观看| 国产精品久久久久av免费| 日韩综合av| 国产精品v欧美精品∨日韩| 日韩一级电影| 亚洲免费在线精品一区| 欧美成熟视频| 成年人视频网站免费观看| 青青草一区二区三区| 在线a免费观看| 99精品一区二区| 人人艹在线视频| 亚洲伊人色欲综合网| 无码人妻熟妇av又粗又大| 欧美精品 国产精品| 亚洲精品国偷拍自产在线观看蜜桃| 亚洲精品国产精品乱码不99按摩| 国产精品四虎| 欧美精品午夜视频| 芒果视频成人app| 亚洲综合日韩在线| 一区二区美女| 特级西西人体www高清大胆| 国产视频欧美| 亚洲综合123| 91偷拍与自偷拍精品| 午夜成人亚洲理伦片在线观看| 亚洲成人av免费| 一二区在线观看| 国产丝袜一区二区| 国产黄色小视频在线| 日韩女在线观看| 亚洲精品一区二区三区中文字幕| 日韩电影免费观看高清完整| 欧美特黄一区| 久久婷五月综合| 久久这里都是精品| 欧美国产日韩综合| 欧美色中文字幕| 色视频精品视频在线观看| 草民午夜欧美限制a级福利片| 欧美特大特白屁股xxxx| 国产精品乱码| 888久久久| 亚洲性生活网站| 99在线精品免费| 欧美精品乱码视频一二专区| 在线视频亚洲一区| 五月婷婷六月丁香综合| 欧美丰满老妇厨房牲生活| 欧美xxxx性| 亚洲春色综合另类校园电影| 亚洲在线成人| 91精品啪在线观看国产| 亚洲精品自拍动漫在线| 91精品国产乱码久久久| 亚洲一级免费视频| 久久爱91午夜羞羞| 开心色怡人综合网站| 国产综合久久| 亚洲熟妇一区二区| 亚洲精品ww久久久久久p站| 国产一区二区三区中文字幕| 在线观看国产成人av片| 激情开心成人网| 青娱乐一区二区| 欧美专区18| 欧美性xxxx图片| 欧美日韩国产精品一区| 高清国产mv在线观看| 欧美大片免费观看| 中文在线免费一区三区| 日韩一级片一区二区| 国产精品69毛片高清亚洲| 一区二区国产精品精华液| 欧美精品xxxxbbbb| 超碰最新在线| 99re6热在线精品视频播放速度| 国产精品99久久精品| www.成年人| 亚洲精品写真福利| www.黄色小说.com| 欧美激情视频网站| 蜜桃一区av| 99爱视频在线| 国产日韩在线不卡| 亚洲系列在线观看| 久久久精品2019中文字幕神马| 高清久久精品| 欧美国产视频一区| av资源网一区| 色av性av丰满av| 中文字幕日韩有码| japansex久久高清精品| 乱熟女高潮一区二区在线| 99精品国产热久久91蜜凸| 老熟妇仑乱一区二区av| 中文字幕av日韩| 九色精品蝌蚪| 蜜桃传媒一区二区三区| xf在线a精品一区二区视频网站| 中文字幕在线看人| 日韩亚洲精品电影| 91综合久久爱com| 玩弄japan白嫩少妇hd| 亚洲欧美中日韩| 韩国av电影在线观看| 欧美做受高潮电影o| 色呦哟—国产精品| 波多野结衣办公室双飞| 色网综合在线观看| 成人免费看片| 蜜桃av久久久亚洲精品| 美国十次了思思久久精品导航| 欧美成欧美va| 亚洲欧美资源在线| 精品91福利视频| 啊啊啊一区二区| 亚洲天天做日日做天天谢日日欢| 色窝窝无码一区二区三区| 国产精品吊钟奶在线| 欧美人成在线| 无码人妻aⅴ一区二区三区69岛| 91精品国产免费久久综合| 黄色漫画在线免费看| 樱花www成人免费视频| 99精品国产99久久久久久白柏| 亚洲中文字幕一区二区| 91精品国产色综合| 亚洲国产一成人久久精品| 人妻熟女aⅴ一区二区三区汇编| 91精品国产高清一区二区三区蜜臀 | 日韩精品免费| 亚洲精品乱码久久久久久不卡|