精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

国产精品午夜影院| 奇米777在线视频| 国产二区在线播放| 经典三级在线一区| 国内精品国产三级国产在线专| 国产精品成人免费一区久久羞羞| 在线观看欧美日韩电影| 中文字幕综合网| 免费日韩av电影| 91影院在线播放| 宅男噜噜噜66一区二区| 久久精品电影网站| 91中文字幕永久在线| 国产精一区二区| 一本大道av伊人久久综合| 国产av不卡一区二区| 你懂的在线视频| 岛国av在线一区| 国产剧情日韩欧美| 91午夜视频在线观看| 久久久久蜜桃| 尤物九九久久国产精品的分类| 欧美日韩一区二区区别是什么| 欧美日韩精品免费观看视完整| 亚洲最快最全在线视频| 一区二区在线观| 日本人妖在线| 成人精品鲁一区一区二区| 91精品美女在线| 在线视频精品免费| 亚洲一区亚洲| 国内精品久久久久久中文字幕| 老熟妇一区二区| 首页亚洲中字| 日韩www在线| 欧洲成人午夜精品无码区久久| 日日夜夜一区| 在线观看一区二区精品视频| 六月激情综合网| av老司机免费在线| 亚洲国产精品天堂| 真人抽搐一进一出视频| 人人超在线公开视频| 亚洲色欲色欲www| 一本一本a久久| 18视频免费网址在线观看| 久久久国产精品午夜一区ai换脸| 久久久久久a亚洲欧洲aⅴ| 亚洲乱码国产乱码精品精软件| 韩国精品一区二区| 国产在线观看91精品一区| 最近中文字幕在线观看视频| 日韩av在线播放中文字幕| 国产精品扒开腿做爽爽爽视频| 人妻 日韩精品 中文字幕| 久久www成人_看片免费不卡| 久久噜噜噜精品国产亚洲综合| 久久免费公开视频| 亚洲成色精品| 欧美中文在线观看国产| 精品人妻一区二区三区免费看| 99国产精品视频免费观看一公开 | 成人国内精品久久久久一区| 中文字幕乱码人妻二区三区| 麻豆精品视频在线观看免费| 国产主播欧美精品| 国产熟女精品视频| 成人午夜av在线| 鲁丝一区二区三区免费| 国产日韩精品在线看| 国产精品成人一区二区艾草 | 欧美特黄一级片| 欧美福利影院| 国模精品系列视频| 麻豆成人免费视频| 理论电影国产精品| 99国产超薄肉色丝袜交足的后果| 黄色一级a毛片| 久久久久久久久岛国免费| 视频在线精品一区| 99在线播放| 黑人精品xxx一区一二区| 国产v亚洲v天堂无码久久久| 欧美亚洲福利| 精品国产电影一区二区| 亚洲av无码一区二区二三区| 国产伦精品一区二区三区视频| 中文字幕亚洲二区| 国产精品日日夜夜| 日韩电影在线免费观看| 99精品国产高清一区二区| 日本人妖在线| 亚洲欧美另类综合偷拍| 国产l精品国产亚洲区久久| 国产69精品久久| 亚洲成人久久久| 青青青视频在线免费观看| 国产精品黄色| 国产精品嫩草影院久久久| www国产一区| 中文字幕+乱码+中文字幕一区| 国产激情片在线观看| 黑人巨大精品欧美一区二区桃花岛| 欧美人与性动xxxx| 国产三级视频网站| 欧美jizzhd精品欧美巨大免费| 欧美在线一级视频| 韩国av免费在线| 国产精品白丝在线| 少妇高清精品毛片在线视频 | 东方av正在进入| 久久精品欧洲| 国产精选一区二区| 国产原创在线观看| 欧美日韩一本到| 51调教丨国产调教视频| 欧美伊人久久| 国产日韩欧美视频在线| 嫩草研究院在线| 香港成人在线视频| 18深夜在线观看免费视频| 久久精品高清| 日本精品性网站在线观看| 丰满人妻熟女aⅴ一区| 中文字幕亚洲综合久久菠萝蜜| 成年人免费在线播放| 北条麻妃一区二区三区在线| 久久精品视频免费播放| 中文字幕在线播放不卡| 久久精品视频在线免费观看| 波多野结衣乳巨码无在线| 午夜电影一区| 欧美成在线视频| 国产精品国产av| 国产精品水嫩水嫩| 亚洲 激情 在线| 欧美日韩伦理| 国产精品久久久久久久久免费 | 久久九九国产精品怡红院| 国产精品免费无遮挡无码永久视频| 99精品偷自拍| 久久精品国产sm调教网站演员| 97超碰成人| 欧美激情日韩图片| 黑人乱码一区二区三区av| 一区二区三区日韩精品| 无码人妻丰满熟妇区毛片蜜桃精品| 亚洲字幕久久| 成人免费视频网站| 欧美aaaaaaa| 亚洲黄页网在线观看| 午夜精品三级久久久有码| 91色在线porny| 日本三区在线观看| 日韩国产在线| 国产欧美日韩中文字幕在线| 欧美性videos| 制服丝袜成人动漫| 久久久久亚洲AV| 成人高清免费观看| 日本www在线播放| 国产成人精品免费视| 国产精品一二区| 成人午夜在线影视| 日韩免费一区二区三区在线播放| 久久精品视频久久| 91免费国产视频网站| 日本中文字幕高清| 91精品久久久久久久久久不卡| 亚洲最大成人在线| 蜜桃视频在线观看播放| 国产小视频国产精品| 一级黄色免费看| 艳妇臀荡乳欲伦亚洲一区| 性欧美丰满熟妇xxxx性久久久| 久久久久久久波多野高潮日日| 五月天色一区| 久久9999免费视频| 38少妇精品导航| 色多多视频在线观看| 精品欧美黑人一区二区三区| 四虎影院在线免费播放| 亚洲色图欧美偷拍| 亚洲精品女人久久久| 美女久久久精品| 日韩精品在线观看av| 成人毛片免费看| 97伦理在线四区| 欧美色网在线| 久久久久成人网| av基地在线| 精品国产伦一区二区三区观看体验| 91视频久久久| 亚洲另类在线制服丝袜| 国产精品1000部啪视频| 韩国欧美国产一区| 国产成人av影视| 狠狠色丁香久久综合频道| 日韩在线三区| 久久porn| 91夜夜未满十八勿入爽爽影院| 色在线中文字幕| 久久综合九色九九| 国产一区二区影视| 亚洲精品999| 国产chinasex对白videos麻豆| 91黄视频在线| 日韩手机在线观看| 亚洲欧美色综合| 337人体粉嫩噜噜噜| 波多野结衣中文字幕一区| 在线a免费观看| 日韩国产精品91| 日韩在线一级片| 国产精品av一区二区| 亚洲一卡二卡区| 国产剧情在线观看一区| 久久国产精品亚洲va麻豆| 中文字幕视频精品一区二区三区| 国产精品久久久久久av福利软件| 成人黄色动漫| 色中色综合影院手机版在线观看| 91最新在线| 亚洲人成网站777色婷婷| 三级小视频在线观看| 日韩视频永久免费| 国产精品羞羞答答在线| 欧美日韩亚洲综合| 国产99久久久久久免费看| 欧美性猛交xxxxx免费看| 国产精品成人久久| 亚洲国产欧美日韩另类综合| 中文字幕在线有码| 亚洲欧美另类小说视频| 疯狂撞击丝袜人妻| 亚洲视频你懂的| 久草视频手机在线| ●精品国产综合乱码久久久久| 手机毛片在线观看| 国产精品丝袜一区| 在线观看黄网址| 亚洲人一二三区| 手机在线免费看毛片| 中文字幕一区二区三区乱码在线| 激情高潮到大叫狂喷水| 最近日韩中文字幕| 黄色片子在线观看| 亚洲欧美一区二区三区国产精品| 日本黄色片免费观看| 亚洲永久免费视频| 欧美成人aaaaⅴ片在线看| 亚洲成人精品一区| 亚洲欧美自拍视频| 在线中文字幕一区| 亚洲一区二区激情| 欧美一区二区免费| 亚洲黄色小说网址| 日韩成人在线免费观看| 欧美视频免费一区二区三区| 国产亚洲精品久久久| 欧美三级电影一区二区三区| 久久国产精彩视频| 国产天堂在线播放视频| 欧美在线一级va免费观看| 精品三区视频| 亚洲综合在线小说| 黑人久久a级毛片免费观看| 久久久精品有限公司| 日韩精品永久网址| 50度灰在线观看| 国产日韩一区二区三区在线播放| 人妻无码视频一区二区三区| 久久国产精品第一页| 美女扒开腿免费视频| 久久影音资源网| 亚洲色图27p| 香蕉乱码成人久久天堂爱免费| 欧美三日本三级少妇99| 欧美日韩中文精品| 亚洲精品一区二区三区区别| 亚洲网站在线观看| 18网站在线观看| 庆余年2免费日韩剧观看大牛| а√天堂资源国产精品| 国产传媒一区二区三区| 九一亚洲精品| 麻豆传媒网站在线观看| 国产精品久久久免费 | 欧美成人一区二区三区四区| 8x福利精品第一导航| 天堂v视频永久在线播放| 成人在线观看视频网站| 蜜桃视频在线观看www社区| 欧美裸体男粗大视频在线观看| 国产精品vvv| 成人av在线天堂| 日韩av黄色在线| 在线码字幕一区| 亚洲一区二区动漫| 日韩欧美色视频| 国产拍欧美日韩视频二区| 久久久久噜噜噜亚洲熟女综合| 91高清在线观看| 可以免费观看的毛片| 日韩中文字幕视频在线| 日韩欧美一中文字暮专区| 成人性生交xxxxx网站| 亚洲区小说区图片区qvod| 狠狠精品干练久久久无码中文字幕 | 亚洲国产另类 国产精品国产免费| avav免费在线观看| 欧美一级视频免费在线观看| 中文字幕日韩在线| 91九色国产ts另类人妖| 蜜桃视频一区二区| 亚洲午夜久久久久久久久红桃| 亚洲另类在线制服丝袜| 911美女片黄在线观看游戏| 亚洲色在线视频| 无遮挡爽大片在线观看视频| 国产精品国产三级欧美二区| 亚洲欧美色图| 欧美美女性视频| 国产欧美日韩视频一区二区| 亚洲欧美综合另类| 亚洲精品国产综合久久| 男女羞羞视频在线观看| 91在线免费看片| 亚洲色图二区| 国产探花在线观看视频| 国产精品国产自产拍高清av | 麻豆国产精品官网| 天天干天天舔天天操| 91黄色小视频| 波多野结衣在线网站| 国产成人啪精品视频免费网| 免费欧美一区| 久久久久久三级| 欧美国产精品一区二区三区| 国产精品高清无码| 综合136福利视频在线| 欧美日韩精品一区二区三区视频| 少妇免费毛片久久久久久久久| 日韩在线一区二区三区| 精品欧美一区二区久久久| 在线观看亚洲成人| av网在线观看| 91精品视频在线看| 一区二区三区网站| 91精品人妻一区二区三区蜜桃2 | 久久久久久久久久久黄色 | 秋霞电影一区二区| 尤物在线免费视频| 欧美一卡二卡在线| 2020av在线| 美国av一区二区三区| 日韩激情一区二区| 美国精品一区二区| 91精品国产福利在线观看| 日韩影视在线| 蜜桃91精品入口| 日本女人一区二区三区| 欧美手机在线观看| 精品国产91乱码一区二区三区| 日本不卡1234视频| 日韩精品成人一区二区在线观看| 久久国产婷婷国产香蕉| 免费无遮挡无码永久在线观看视频| 欧美精品一区二区三区视频| 国产精品粉嫩| 宅男一区二区三区| av电影一区二区| 中文精品久久久久人妻不卡| 久久99久久亚洲国产| 亚洲成a人片77777在线播放| 在线观看免费视频高清游戏推荐| 亚洲视频综合在线| 五月婷婷狠狠干| 国产伦精品一区二区三区精品视频| 午夜精品国产| 国产交换配乱淫视频免费| 欧美区视频在线观看| 国产美女高潮在线观看| 亚洲一区二区四区| 成人精品免费视频| 97精品人妻一区二区三区| 久久久噜噜噜久久| 欧美电影三区| 国产老熟女伦老熟妇露脸| 欧美日韩国产中文| 深夜福利视频一区二区| 中文字幕一区二区三区在线乱码 | 国产麻豆一区| 男女私大尺度视频| 中文字幕一区二区三区精华液| 无码国精品一区二区免费蜜桃| 国产精品久久久久高潮| 日韩一级不卡| 国产一区二区播放| 在线视频精品一|