日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

python机器学习笔记:ID3决策树算法实战

發布時間:2024/1/3 综合教程 31 生活家
生活随笔 收集整理的這篇文章主要介紹了 python机器学习笔记:ID3决策树算法实战 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

  前面學習了決策樹的算法原理,這里繼續對代碼進行深入學習,并學習ID3的算法實踐過程,如果覺得這篇文章太乏味的話,可以直接看前一篇即可。

  ID3算法是一種貪心算法,用來構造決策樹,ID3算法起源于概念學習系統(CLS),以信息熵的下降速度為選取測試屬性的標準,即在每一個節點選取還尚未被用來劃分的具有最高信息增益的屬性作為劃分標準,然后繼續這個過程,直到生成的決策樹能完美的分類訓練樣例。

ID3算法的背景知識

  ID3算法最早是由羅斯昆蘭(J. Ross Quinlan)于1975年在悉尼大學提出的一種分類預測算法,算法的核心是“信息熵”。ID3算法通過計算每個屬性的信息增益,認為信息增益高的是好屬性,每次劃分選取信息增益最高的屬性為劃分標準,重復這個過程,直至生成一個能完美分類訓練樣例的決策樹。

  決策樹是對數據進行分類,以此達到預測的目的。該決策樹方法先根據訓練集數據形成決策樹,如果該樹不能對所有對象給出正確的分類,那么選擇一些例外加入到訓練集數據中,重復該過程一直到形成正確的決策集。決策樹代表著決策集的樹形結構。
  決策樹由決策結點、分支和葉子組成。決策樹中最上面的結點為根結點,每個分支是一個新的決策結點,或者是樹的葉子。每個決策結點代表一個問題或決策,通常對應于待分類對象的屬性。每一個葉子結點代表一種可能的分類結果。沿決策樹從上到下遍歷的過程中,在每個結點都會遇到一個測試,對每個結點上問題的不同的測試輸出導致不同的分支,最后會到達一個葉子結點,這個過程就是利用決策樹進行分類的過程,利用若干個變量來判斷所屬的類別。

ID3算法數據描述

所使用的樣本數據有一定的要求,ID3是:

  描述-屬性-值相同的屬性必須描述每個例子和有固定數量的價值觀。
  預定義類-實例的屬性必須已經定義的,也就是說,他們不是學習的ID3。
  離散類-類必須是尖銳的鮮明。連續類分解成模糊范疇(如金屬被“努力,很困難的,靈活的,溫柔的,很軟”都是不可信的。
  足夠的例子——因為歸納概括用于(即不可查明)必須選擇足夠多的測試用例來區分有效模式并消除特殊巧合因素的影響。
  ID3決定哪些屬性如何是最好的。一個統計特性,被稱為信息增益,使用熵得到給定屬性衡量培訓例子帶入目標類分開。信息增益最高的信息(信息是最有益的分類)被選擇。為了明確增益,我們首先從信息論借用一個定義,叫做熵。每個屬性都有一個熵。

ID3決策樹概述

  ID3決策樹是一種非常重要的用來處理分類問題的結構,它形似一個嵌套N層的IF…ELSE結構,但是它的判斷標準不再是一個關系表達式,而是對應的模塊的信息增益。它通過信息增益的大小,從根節點開始,選擇一個分支,如同進入一個IF結構的statement,通過屬性值的取值不同進入新的IF結構的statement,直到到達葉子節點,找到它所屬的“分類”標簽。

  它的流程圖是一顆無法保證平衡的多叉樹,每一個父節點都是一個判斷模塊,通過判斷,當前的向量會進入它的某一個子節點中,這個子節點是判斷模塊或者終止模塊(葉子節點),當且僅當這個向量到達葉子節點,它也就找到了它的“分類”標簽。

  ID3決策樹通過一個固定的訓練集是可以形成一顆永久的“樹”的,這課樹可以進行保存并且運用到不同的測試集中,唯一的要求就是測試集和訓練集需要是結構等價的。這個訓練過程就是根據訓練集創建規則的過程,這也是機器學習的過程。

  ID3決策樹的一個巨大缺陷是:它將產生過度匹配問題。這里在不討論信息增益的前提下,有這樣一個例子:人的屬性中有性別和年齡兩個屬性,由于人的性別只有男和女兩種,年齡有很多種分支,當它有超過兩個分支的時候,在用信息增益選擇新的屬性的時候,會選擇年齡而不是性別,因為ID3決策樹在使用信息增益來劃分數據集的時候會傾向于選擇屬性分支更多的一個;另外一個缺陷是,人的年齡假定為1~100,如果不進行離散化,即區間的劃分,那么在選擇年齡這個屬性的時候,這棵決策樹會產生最多100個分支,這是非??膳露依速M空間和效率的,考慮這 樣一種情況:兩個人的其他所有屬性完全相同,他們的分類都是"A",然而在年齡這一個樹節點中分支了,而這個年齡下有一個跟這兩個人很像,卻不屬于“A”類別的人,由于ID3決策樹無法處理連續性數據,那么這兩個人很有可能被劃分到兩個分類中,這是不合理的,這也是C4.5決策樹考慮的問題。

ID3決策樹算法推導

  如果以前沒有接觸過決策樹,完全不用擔心,它的概念非常簡單,即使不知道它也可以通過簡單的圖像了解其工作原理,下圖就是一個決策樹,正方形代表判斷模型(decision block),橢圓形代表終止模塊(terminating block),表示已經得出結論,可以終止運行。從判斷模塊引出的左右箭頭稱作分支(branch),它首先檢測發送郵件域名地址。如果地址為myEmployer.com,則將其分類“無聊時需要閱讀的郵件”中。如果郵件不是來自這個域名,則檢查郵件內容里是否包含單詞曲棍球,如果包含則將郵件歸類到“需要及時處理的盆友郵件”,如果不包含則將郵件歸類到“無需閱讀的垃圾郵件”。

  決策樹很多任務都是為了數據中蘊含的知識信息,因此決策樹可以使用不熟悉的數據集合,并從中提取出一系列的規則,機器學習算法最終將使用這些機器從數據及中創造的規則。專家系統中經常使用決策樹,而且決策樹給出結果往往可以匹敵在當前領域具有幾十年工作經驗的人類專家。

  現在我們已經大致了解了決策樹可以完成哪些任務,接下來我們將學習如何從一堆原始數據中構造決策樹,首先我們討論構造決策樹的方法,以及如何編寫決策樹的Python代碼;接著剔除一些度量算法成功率的方法;最后使用遞歸建立分類器,并且使用Matplotlib繪制決策樹圖,構造完成決策樹分類器之后,我們將輸入一些隱形眼鏡的處方數據,并由決策樹分類器預測需要的鏡片類型。

1,決策樹的構造

  在一步步地構造決策樹算法的時候,首先我們討論數學上如何使用信息論劃分數據集,然后編寫代碼將理論應用到具體的數據集上,最后編寫代碼構建決策樹。

  在構造決策樹時,我們需要解決的第一個問題就是,當前數據集上哪個特征在劃分數據分類時起決定性作用。為了找到決定性的特征,劃分出最好的結果,我們必須評估每個特征。完成測試之后,原始數據集就被劃分為幾個數據子集,這些數據子集會分布在第一個決策點的所有分支上,如果某個分支下的數據屬于同一類型,則當前無需閱讀的垃圾郵件已經正確的劃分數據分類,無需進一步對數據集進行分割,如果數據子集內的數據不屬于同一類型,則需要重復劃分數據子集的過程,如何劃分數據子集的算法和劃分原始數據集的方法相同,知道所有具有相同類型的數據均在一個數據子集內。

  創建分支的偽代碼函數createBranch() 如下所示:

檢測數據集中的每個子項是否屬于同一分類:
    If  so  retrun   類標簽;
    Else
            尋找劃分數據集的最好特征

            劃分數據集

            創建分支節點

                for  每個劃分的子集

                    調用函數createBranch并增加返回結果到分支節點中
                
                return  分支節點

  上面的偽代碼createBranch是一個遞歸函數,在倒數第二行直接調用了它自己,后面我們將把上面的偽代碼轉換為Python代碼,這里我們需要了解一下算法是如何劃分數據集的。

1.1 決策樹的一般流程

(1) 收集數據:可以使用任何方法
(2) 準備數據:樹構造算法只適用于標稱型數據,因此數值型數據必須離散化
(3) 分析數據:可以使用任何方法,構造樹完成之后,我們應該檢查圖像是否符合預期
(4) 訓練算法:構造樹的數據結構
(5) 測試算法:使用經驗樹計算錯誤率
(6)使用算法:此步驟可以適用于任何監督學習算法,而使用決策樹可以更好的理解數據的內在含義

1.2 劃分特征

  一些決策樹算法采用二分法劃分數據,此處不采用這種方法,本次將使用ID3算法劃分數據集,該算法處理如何劃分數據集,何時停止劃分數據集。如果依據某個屬性劃分數據將會產生4個可能的值,我們將數據劃分為四塊,并創建四個不同的分支,每次劃分數據集時我們只選取一個特征屬性,如果訓練集中存在20個特征,第一次我們選擇哪個特征作為劃分的參考屬性呢?

  下表的數據包含5個海洋動物,特征包括:不浮出水面是否可以生存,以及是否有腳趾。我們可以將這些動物劃分為兩類:魚類和非魚類,現在我們想要決定依據第一個特征還是第二個特征劃分數據,那么那個特征可以作為第一個劃分點呢?讓我們繼續學習。

1.3 信息增益

  劃分數據集的大原則是:將無序的數據變得更加有序。我們可以使用多種方法劃分數據集,但是每種方法都有各自的優缺點。組織雜亂無章數據的一種方法就是使用信息論度量信息,信息論是量化處理信息的分支科學。我們可以在劃分數據之前使用信息論量化度量信息的內容。

  在劃分數據集之前之后信息發生的變化成為信息增益,知道如何計算信息增益,我們就可以計算每個特征值劃分數據集獲得的信息增益,獲得信息增益最高的特征就是最好的選擇。

  在可以評測哪種數據劃分方式是最好的數據劃分之前,我們必須學習如何計算信息增益。集合信息的度量方式稱為香農熵或者簡稱為熵(這名字來源于信息論之父克勞德*香農)

  熵定義為信息的期望值,在明白這個概念之前,我們必須知道信息的定義,如果待分類的事務可能劃分在多個分類之中,則符號Xi的信息定義為:

  其中P(Xi)是選擇該分類的概率。

  為了計算熵,我們需要計算所有類別所有可能值包含的信息期望值,通過下面的公式得到:

  其中n是分類的數目。

代碼如下:

  此代碼是使用Python計算給定數據集的信息熵。

from math import log

# 計算數據的熵(entropy)
def calcShannonRnt(dataSet):
    # 數據條數,計算數據集中實例的總數
    numEntries = len(dataSet)
    labelCounts = {}
    for featVec in dataSet:
        # 每行數據的最后一個類別(也就是標簽)
        currentLable = featVec[-1]
        if currentLable not in labelCounts.keys():
            labelCounts[currentLable] = 0
        # 統計有多少個類以及每個類的數量
        labelCounts[currentLable]  += 1
    shannonEnt = 0.0
    for key in labelCounts:
        # 計算單個類的熵值
        prob = float(labelCounts[key]) / numEntries
        # 累加每個類的熵值
        shannonEnt -= prob * log(prob , 2)
    return shannonEnt

  下面我們創建一個簡單的數據集(此處我們使用機器學習實戰中的簡單魚鑒定數據集):

# 創建數據集
def createDataSet():
    dataSet = [[1,1,'yes'],
               [1,1,'yes'],
               [1,0,'no'],
               [0,1,'no'],
               [0,1,'no']]
    labels = ['no surfacing','flippers']
    return dataSet,labels

  代碼執行結果:

myData,labels = createDataSet()
print(myData)
print(labels)

shannonEnt = calcShannonRnt(myData)
print(shannonEnt)

'''
[[1, 1, 'yes'], [1, 1, 'yes'], [1, 0, 'no'], [0, 1, 'no'], [0, 1, 'no']]
['no surfacing', 'flippers']
0.9709505944546686
'''

  從結果來看,熵為0.97,熵越高,則混合的數據也越多,隨機變量的不確定性越大,我們可以在數據集中添加更多的分類,觀察熵是如何變化的。

2,劃分數據集

  上面我們學習了如何度量數據集的無序程度,分類算法除了需要測量信息熵,還需要劃分數據集,度量劃分數據集的熵,以便判斷當前是否正確地劃分了數據集,我們將對每個特征劃分數據集的結果計算一次信息熵,然后判斷按照哪個特征劃分數據集是最好的劃分方式。想象一個分布在二維空間的數據散點圖,需要在數據之間畫條線,將他們分成兩部分,我們應該按照x軸還是y軸劃分呢?

  按照給定特征劃分數據集代碼:

# 按照給定特征劃分數據集
def splitDataSet(dataSet,axis,value):
    '''

    :param dataSet: 待劃分的數據集
    :param axis: 劃分數據集的特征
    :param value: 特征的返回值
    :return:
    '''
    retDataSet = []
    for featVec in dataSet:
        # 如果發現符合要求的特征,將其添加到新創建的列表中
        if featVec[axis] == value:
            reduceFeatVec = featVec[:axis]
            reduceFeatVec.extend(featVec[axis+1:])
            retDataSet.append(reduceFeatVec)

    return retDataSet

  我們使用劃分數據集測試一下,可以看到劃分數據集結果如下:

myData,labels = createDataSet()
print(myData)
print(labels)

splitDataSetVal = splitDataSet(myData,0,1)
print(splitDataSetVal)
splitDataSetVal = splitDataSet(myData,0,0)
print(splitDataSetVal)

'''
[[1, 1, 'yes'], [1, 1, 'yes'], [1, 0, 'no'], [0, 1, 'no'], [0, 1, 'no']]
['no surfacing', 'flippers']
[[1, 'yes'], [1, 'yes'], [0, 'no']]
[[1, 'no'], [1, 'no']]
'''

  接下來,我們將遍歷整個數據集,循環計算香農熵和splitDataSet()函數,找到最好的特征劃分方式,熵計算將會告訴我們如何劃分數據集是最好的數據組織方式。

  選擇最好的數據集劃分方式代碼:

# 選擇最好的數據集劃分方式
def chooseBestFeatureTpSplit(dataSet):
    '''
        此函數中調用的數據滿足以下要求
        1,數據必須是一種由列表元素組成的列表,而且所有列表元素都要具有相同的數據長度
        2,數據的最后一列或者實例的最后一個元素是當前實例的類別標簽
    :param dataSet:
    :return:
    '''
    numFeatures = len(dataSet[0]) - 1
    # 原始的熵
    baseEntropy = calcShannonRnt(dataSet)
    bestInfoGain = 0.0
    bestFeature = -1
    for i in range(numFeatures):
        # 創建唯一的分類標簽列表
        featList = [example[i] for example in dataSet]
        uniqueVals = set(featList)
        newEntropy = 0.0
        for value in uniqueVals:
            # 計算每種劃分方式的信息熵,并對所有唯一特征值得到的熵求和
            subDataSet = splitDataSet(dataSet,i,value)
            prob = len(subDataSet)/float(len(dataSet))
            # 按照特征分類后的熵
            newEntropy += prob * calcShannonRnt(subDataSet)
        infoGain = baseEntropy - newEntropy
        if (infoGain > bestInfoGain):
            # 計算最好的信息增益,信息增益越大,區分樣本的能力越強,根據代表性
            bestInfoGain = infoGain
            bestFeature = i
    return bestFeature

  測試代碼,得到結果:

myData,labels = createDataSet()
print(myData)
print(labels)

bestFeatureRes = chooseBestFeatureTpSplit(myData)
print(bestFeatureRes)
'''
[[1, 1, 'yes'], [1, 1, 'yes'], [1, 0, 'no'], [0, 1, 'no'], [0, 1, 'no']]
['no surfacing', 'flippers']
0
'''

  結果告訴我們第0個特征是最好的用于劃分數據集的特征。如果按此特征分類,第一個海洋動物分組將有兩個屬于魚類,兩個屬于非魚類,另一個分組則只有一個非魚類。

  假設我們按照第一個特征屬性劃分數據,也就是說第一個特征是1的放在一個組,第一個特征是0的放在另一個組,數據一致性如何?按照上述的方法劃分數據集,第一個特征為1的海洋生物分組將有兩個屬于魚類,一個屬于非魚類;另一個分組則全部屬于非魚類。

3 遞歸構建決策樹

 總結一下構建決策樹的工作原理:得到原始數據集,然后基于最好的屬性值劃分數據集,由于特征值可能多于兩個,因此可能存在大于兩個分支的數據集劃分。第一次劃分之后,數據將向下傳遞到樹分支的下一個節點,在這個節點上,我們可以再次劃分數據。因此我們可以采用遞歸的原則處理數據集。

  遞歸結束的條件是:程序遍歷完所有劃分數據集的屬性,或者每個分支下的所有實例都具有相同的分類。如果所有實例具有相同的分類,則得到一個葉子節點護著終止塊。任何到達葉子節點的數據必然屬于葉子節點的分類,參見下圖:

  第一個結束條件使得算法可以終止,我們甚至可以設置算法可以劃分的最大分組數目。當然目前我們只需要在算法開始運行前計算列的數目,查看算法是否使用了所有屬性即可,如果數據集已經處理了所有屬性,但是類標簽依然不是唯一的,此時我們需要決定如何定義該葉子節點,在這種情況下,我們通常會采用多數表決的方法決定該葉子節點的分類。

  按照分類后類別數量排序代碼:

# 按照分類后類別數量排序
def majorityCnt(classList):
    classCount = {}
    for vote in classList:
        if vote not in classCount.keys():
            classCount[vote] = 0
        classCount[vote] += 1
    sortedClassCount = sorted(classCount.items(),
                              key=operator.itemgetter(1),reverse=True)
    return sortedClassCount[0][0]

  創建樹的函數代碼:

# 創建樹的函數代碼
def createTree(dataSet,labels):
    '''

        :param dataSet:  輸入的數據集
        :param labels:  標簽列表(包含了數據集中所有特征的標簽)
        :return:
        '''
    # classList 包含了數據集中所有類的標簽
    classList = [example[-1] for example in dataSet]
    # 類別完全相同則停止繼續劃分
    if classList.count(classList[0]) == len(classList):
        return classList[0]
    # 遍歷完所有特征時返回出現次數最多的
    if len(dataSet[0])  == 1:
        return majorityCnt(classList)
    bestFeat = chooseBestFeatureTpSplit(dataSet)
    bestFeatLabel = labels[bestFeat]
    # 字典myTree存儲了樹的所有信息,這對于后面繪制樹形圖很重要
    myTree = {bestFeatLabel:{}}
    del(labels[bestFeat])
    # 得到列表包含的所有屬性值
    featValues = [example[bestFeat] for example in dataSet]
    uniqueVals = set(featValues)
    for value in uniqueVals:
        subLabels =labels[:]
        myTree[bestFeatLabel][value] = createTree(splitDataSet(dataSet,bestFeat,value),
                                                  subLabels)

  運行代碼結果如下:

myData,labels = createDataSet()
print(myData)
print(labels)

myTree = createTree(myData,labels)
print(myTree)
'''
[[1, 1, 'yes'], [1, 1, 'yes'], [1, 0, 'no'], [0, 1, 'no'], [0, 1, 'no']]
['no surfacing', 'flippers']
{'no surfacing': {0: 'no', 1: {'flippers': {0: 'no', 1: 'yes'}}}}
'''

  從結果來看,變量myTree包含了很多代表樹結構信息的嵌套字典,從左邊開始,第一次關鍵字nosurfacing是第一個劃分數據集的特征名稱,該關鍵字的值也是另一個數據字典,第二個關鍵字是no surfacing特征劃分的數據集,這些關鍵字的值時no surfacing節點的子節點,這些值可能是類標簽,也可能是另一個數據字典,如果值時類標簽,則該子節點是葉子節點;如果值時另一個數據字典,則子節點是一個判斷節點,這種格式結構不斷重復就構成了整棵樹。

4 使用Matplotlib注解繪制樹形圖

  上面我們學習了如何從數據集中創建樹,然而字典的表示形式非常不易于理解,而且直接繪制圖形也比較困難,這里我們學習使用Matplotlib庫創建樹形圖。決策樹的主要優點就是直觀易于理解,如果不能將其直觀的顯示出來,就無法發揮其優勢。

  Matplotlib可以對文字著色并提供多種形狀以供選擇,而且我們還可以反轉箭頭,將它指向文本框而不是數據點。

  使用文本注解繪制樹節點代碼:

import matplotlib.pyplot as plt

# 定義文本框和箭頭格式(樹節點格式的常量)
decisionNode = dict(boxstyle='sawtooth',fc='0.8')
leafNode = dict(boxstyle='round4',fc='0.8')
arrows_args = dict(arrowstyle='<-')

# 繪制帶箭頭的注解
def plotNode(nodeTxt,centerPt,parentPt,nodeType):
    createPlot.ax1.annotate(nodeTxt,xy=parentPt,
                            xycoords='axes fraction',
                            xytext=centerPt,textcoords='axes fraction',
                            va='center',ha='center',bbox=nodeType,
                            arrowprops=arrows_args)

def createPlot():
    # 創建一個新圖形并清空繪圖區
    fig = plt.figure(1,facecolor='white')
    fig.clf()
    createPlot.ax1 = plt.subplot(111,frameon=False)
    plotNode('a decision node',(0.5,0.1),(0.1,0.5),decisionNode)
    plotNode('a leaf node',(0.8,0.1),(0.3,0.8),leafNode)
    plt.show()

if __name__ == '__main__':
    createPlot()

  結果:

5 構造決策樹

  繪制一顆完整的樹需要一些技巧。我們雖然有x,y坐標,但是如何放置所有的樹節點卻是個問題,我們必須知道有多少個葉子節點,以便可以正確確定x軸的長度我們還需要知道樹有多少層,以便可以正確確定y軸的高度,這里我們定義兩個新函數getNumLeafs() 和getTreeDepth(),來獲取葉節點數目和樹的層數,如下:

  獲取葉子節點的數目和樹的層數代碼:

import matplotlib.pyplot as plt

def myTree():
    treeData = {'no surfacing': {0: 'no', 1: {'flippers': {0: 'no', 1: 'yes'}}}}
    return treeData

# 獲取葉子節點的數目
def getNumLeafs(myTree):
    # 初始化結點數
    numLeafs = 0
    firstSides = list(myTree.keys())
    # 找到輸入的第一個元素,第一個關鍵詞為劃分數據集類別的標簽
    firstStr = firstSides[0]
    secondDect = myTree[firstStr]
    for key in secondDect.keys():
        # 測試節點的數據類型是否為字典
        if type(secondDect[key]).__name__ == 'dict':
            numLeafs += getNumLeafs(secondDect[key])
        else:
            numLeafs +=1
    return numLeafs

# 獲取樹的層數
def getTreeDepth(myTree):
    maxDepth = 0
    firstSides = list(myTree.keys())
    firstStr = firstSides[0]
    secondDict = myTree[firstStr]
    for key in secondDict.keys():
        # 測試節點的數據類型是否為字典
        if type(secondDict[key]).__name__ == 'dict':
            thisDepth = 1 + getTreeDepth(secondDict[key])
        else:
            thisDepth = 1
        if thisDepth > maxDepth:
            maxDepth = thisDepth

    return maxDepth

if __name__ == '__main__':
    myData  = myTree()
    LeafNum = getNumLeafs(myData)
    TreeDepth = getTreeDepth(myData)
    print(LeafNum)
    print(TreeDepth)

  測試結果如下:

3
2

  下面我們將前面的方法組合在一起,得到決策樹,此時我們需要更新畫圖的代碼:

完整代碼如下:

import matplotlib.pyplot as plt

# 定義文本框和箭頭格式(樹節點格式的常量)
decisionNode = dict(boxstyle='sawtooth',fc='0.8')
leafNode = dict(boxstyle='round4',fc='0.8')
arrows_args = dict(arrowstyle='<-')

# 繪制帶箭頭的注解
def plotNode(nodeTxt,centerPt,parentPt,nodeType):
    createPlot.ax1.annotate(nodeTxt,xy=parentPt,
                            xycoords='axes fraction',
                            xytext=centerPt,textcoords='axes fraction',
                            va='center',ha='center',bbox=nodeType,
                            arrowprops=arrows_args)


# 在父子節點間填充文本信息
def plotMidText(cntrPt,parentPt,txtString):
    xMid = (parentPt[0] - cntrPt[0]) / 2.0 + cntrPt[0]
    yMid = (parentPt[1] - cntrPt[1]) / 2.0 + cntrPt[1]
    createPlot.ax1.text(xMid,yMid,txtString, va="center", ha="center", rotation=30)

def plotTree(myTree,parentPt,nodeTxt):
    # 求出寬和高
    numLeafs = getNumLeafs(myData)
    depth = getTreeDepth(myData)
    firstStides = list(myTree.keys())
    firstStr = firstStides[0]
    # 按照葉子結點個數劃分x軸
    cntrPt = (plotTree.xOff + (0.1 + float(numLeafs)) /2.0/plotTree.totalW,plotTree.yOff)
    plotMidText(cntrPt,parentPt,nodeTxt)
    plotNode(firstStr,cntrPt,parentPt,decisionNode)
    secondDict = myTree[firstStr]
    # y方向上的擺放位置 自上而下繪制,因此遞減y值
    plotTree.yOff = plotTree.yOff - 1.0/plotTree.totalD
    for key in secondDict.keys():
        if type(secondDict[key]).__name__  == 'dict':
            plotTree(secondDict[key],cntrPt,str(key))
        else:
            plotTree.xOff = plotTree.xOff + 1.0 / plotTree.totalW  # x方向計算結點坐標
            plotNode(secondDict[key], (plotTree.xOff, plotTree.yOff), cntrPt, leafNode)  # 繪制
            plotMidText((plotTree.xOff, plotTree.yOff), cntrPt, str(key))  # 添加文本信息
    plotTree.yOff = plotTree.yOff + 1.0 / plotTree.totalD  # 下次重新調用時恢復y

def myTree():
    treeData = {'no surfacing': {0: 'no', 1: {'flippers': {0: 'no', 1: 'yes'}}}}
    return treeData

# 獲取葉子節點的數目
def getNumLeafs(myTree):
    # 初始化結點數
    numLeafs = 0
    firstSides = list(myTree.keys())
    # 找到輸入的第一個元素,第一個關鍵詞為劃分數據集類別的標簽
    firstStr = firstSides[0]
    secondDect = myTree[firstStr]
    for key in secondDect.keys():
        # 測試節點的數據類型是否為字典
        if type(secondDect[key]).__name__ == 'dict':
            numLeafs += getNumLeafs(secondDect[key])
        else:
            numLeafs +=1
    return numLeafs

# 獲取樹的層數
def getTreeDepth(myTree):
    maxDepth = 0
    firstSides = list(myTree.keys())
    firstStr = firstSides[0]
    secondDict = myTree[firstStr]
    for key in secondDict.keys():
        # 測試節點的數據類型是否為字典
        if type(secondDict[key]).__name__ == 'dict':
            thisDepth = 1 + getTreeDepth(secondDict[key])
        else:
            thisDepth = 1
        if thisDepth > maxDepth:
            maxDepth = thisDepth

    return maxDepth

# 主函數
def createPlot(inTree):
    # 創建一個新圖形并清空繪圖區
    fig = plt.figure(1,facecolor='white')
    fig.clf()
    axprops = dict(xticks=[], yticks=[])
    createPlot.ax1 = plt.subplot(111, frameon=False, **axprops)  # no ticks
    # createPlot.ax1 = plt.subplot(111, frameon=False) #ticks for demo puropses
    plotTree.totalW = float(getNumLeafs(inTree))
    plotTree.totalD = float(getTreeDepth(inTree))
    plotTree.xOff = -0.5 / plotTree.totalW
    plotTree.yOff = 1.0
    plotTree(inTree, (0.5, 1.0), '')
    plt.show()


if __name__ == '__main__':
    myData  = myTree()
    myData['no surfacing'][3] = 'maybe'
    print(myData)
    # LeafNum = getNumLeafs(myData)
    # TreeDepth = getTreeDepth(myData)
    # print(LeafNum)
    # print(TreeDepth)
    createPlot(myData)

  

6 測試算法:使用決策樹執行分類

  依靠訓練數據構造了決策樹之后,我們可以將它用于實際數據的分類,在執行數據分類時,需要決策樹以及用于構造樹的標簽向量。然后,程序比較測試數據與決策樹上的數值,遞歸執行該過程直到進入葉子節點,最后將測試數據定義為葉子節點所屬的類型。

 使用決策樹的分類函數代碼:

from math import log
import operator

# 計算數據的熵(entropy)
def calcShannonRnt(dataSet):
    # 數據條數,計算數據集中實例的總數
    numEntries = len(dataSet)
    labelCounts = {}
    for featVec in dataSet:
        # 每行數據的最后一個類別(也就是標簽)
        currentLable = featVec[-1]
        if currentLable not in labelCounts.keys():
            labelCounts[currentLable] = 0
        # 統計有多少個類以及每個類的數量
        labelCounts[currentLable]  += 1
    shannonEnt = 0.0
    for key in labelCounts:
        # 計算單個類的熵值
        prob = float(labelCounts[key]) / numEntries
        # 累加每個類的熵值
        shannonEnt -= prob * log(prob , 2)
    return shannonEnt

# 創建數據集
def createDataSet():
    dataSet = [[1,1,'yes'],
               [1,1,'yes'],
               [1,0,'no'],
               [0,1,'no'],
               [0,1,'no']]
    labels = ['no surfacing','flippers']
    # dataSet = [['Long', 'Think', 'male'],
    #            ['Short', 'Think', 'male'],
    #            ['Short', 'Think', 'male'],
    #            ['Long', 'Thin', 'female'],
    #            ['Short', 'Thin', 'female'],
    #            ['Short', 'Think', 'female'],
    #            ['Long', 'Think', 'female'],
    #            ['Long', 'Think', 'female']]
    # labels = ['hair', 'voice']
    return dataSet,labels

# 按照給定特征劃分數據集
def splitDataSet(dataSet,axis,value):
    '''

    :param dataSet: 待劃分的數據集
    :param axis: 劃分數據集的特征
    :param value: 特征的返回值
    :return:
    '''
    retDataSet = []
    for featVec in dataSet:
        # 如果發現符合要求的特征,將其添加到新創建的列表中
        if featVec[axis] == value:
            reduceFeatVec = featVec[:axis]
            reduceFeatVec.extend(featVec[axis+1:])
            retDataSet.append(reduceFeatVec)

    return retDataSet

# 選擇最好的數據集劃分方式
def chooseBestFeatureTpSplit(dataSet):
    '''
        此函數中調用的數據滿足以下要求
        1,數據必須是一種由列表元素組成的列表,而且所有列表元素都要具有相同的數據長度
        2,數據的最后一列或者實例的最后一個元素是當前實例的類別標簽
    :param dataSet:
    :return:
    '''
    numFeatures = len(dataSet[0]) - 1
    # 原始的熵
    baseEntropy = calcShannonRnt(dataSet)
    bestInfoGain = 0.0
    bestFeature = -1
    for i in range(numFeatures):
        # 創建唯一的分類標簽列表
        featList = [example[i] for example in dataSet]
        uniqueVals = set(featList)
        newEntropy = 0.0
        for value in uniqueVals:
            # 計算每種劃分方式的信息熵,并對所有唯一特征值得到的熵求和
            subDataSet = splitDataSet(dataSet,i,value)
            prob = len(subDataSet)/float(len(dataSet))
            # 按照特征分類后的熵
            newEntropy += prob * calcShannonRnt(subDataSet)
        infoGain = baseEntropy - newEntropy
        if (infoGain > bestInfoGain):
            # 計算最好的信息增益,信息增益越大,區分樣本的能力越強,根據代表性
            bestInfoGain = infoGain
            bestFeature = i
    return bestFeature

# 按照分類后類別數量排序
def majorityCnt(classList):
    classCount = {}
    for vote in classList:
        if vote not in classCount.keys():
            classCount[vote] = 0
        classCount[vote] += 1
    sortedClassCount = sorted(classCount.items(),
                              key=operator.itemgetter(1),reverse=True)
    return sortedClassCount[0][0]

# 創建樹的函數代碼
def createTree(dataSet,labels):
    '''

        :param dataSet:  輸入的數據集
        :param labels:  標簽列表(包含了數據集中所有特征的標簽)
        :return:
        '''
    # classList 包含了數據集中所有類的標簽
    classList = [example[-1] for example in dataSet]
    # 類別完全相同則停止繼續劃分
    if classList.count(classList[0]) == len(classList):
        return classList[0]
    # 遍歷完所有特征時返回出現次數最多的
    if len(dataSet[0])  == 1:
        return majorityCnt(classList)
    bestFeat = chooseBestFeatureTpSplit(dataSet)
    bestFeatLabel = labels[bestFeat]
    # 字典myTree存儲了樹的所有信息,這對于后面繪制樹形圖很重要
    myTree = {bestFeatLabel:{}}
    del(labels[bestFeat])
    # 得到列表包含的所有屬性值
    featValues = [example[bestFeat] for example in dataSet]
    uniqueVals = set(featValues)
    for value in uniqueVals:
        subLabels =labels[:]
        myTree[bestFeatLabel][value] = createTree(splitDataSet(dataSet,bestFeat,value),
                                                  subLabels)

    return myTree

# 使用決策樹的分類函數
def classify(inputTree ,featLabels,testVec):
    firstSides = list(inputTree.keys())
    firstStr = firstSides[0]
    secondDict = inputTree[firstStr]
    # print('featLables:',featLabels)
    featIndex = featLabels.index(firstStr)
    for key in secondDict.keys():
        # 若該特征值等于當前key,yes往下走
        if testVec[featIndex]  == key:
            if type(secondDict[key]).__name__ == 'dict':
                classLabel = classify(secondDict[key],featLabels,testVec)
            else:
                classLabel = secondDict[key]
    return classLabel
#使用決策樹來分類
def classify11(inputTree,featLabels,testVec):
    #python3.X
    firstSides = list(inputTree.keys())
    firstStr = firstSides[0]  # 找到輸入的第一個元素
    # python3.X
    secondDict=inputTree[firstStr]  #baocun在secondDict中
    featIndex=featLabels.index(firstStr)  #建立索引
    for key in secondDict.keys():
        if testVec[featIndex]==key: #若該特征值等于當前key,yes往下走
            if type(secondDict[key]).__name__=='dict':# 若為樹結構
                classLabel=classify(secondDict[key],featLabels,testVec) #遞歸調用
            else:  classLabel=secondDict[key]#為葉子結點,賦予label值
    return classLabel #分類結果

def retrieveTree(i):
    listOfTrees = [
        {'no surfacing': {0: 'no', 1: {'flippers': {0: 'no', 1: 'yes'}}}},
        {'no surfacing': {0: 'no', 1: {'flippers': {0: {'head':{0:'no', 1: 'yes'}},1:'no'}}}}
    ]
    return listOfTrees[i]

  測試結果如下:

if __name__ == '__main__':
    myData,labels = createDataSet()
    # print(myData)
    # print(labels)

    myTree = createTree(myData,labels)

    # print(myTree0)
    myTree1 = {'no surfacing': {0: 'no', 1: {'flippers': {0: 'no', 1: 'yes'}}}}
    # print(type(myTree1))
    # myTree = retrieveTree(0)
    myData, labels = createDataSet()
    print(myData)
    print(labels)
    res1 = classify(myTree,labels,[1,1])
    print(res1)
    res2 = classify(myTree,labels,[1,0])
    print(res2)


'''
[[1, 1, 'yes'], [1, 1, 'yes'], [1, 0, 'no'], [0, 1, 'no'], [0, 1, 'no']]
['no surfacing', 'flippers']
yes
no
'''

  

7 使用算法:決策樹的存儲

  構造決策樹是很耗時的任務,即使處理很小的數據集,如前面的樣本數據,也要花費幾秒的時間,如果數據集很大,將會耗費很多計算時間,然而使用創建好的決策樹解決問題,則可以很快完成。所以為了節省時間,最好能夠在每次執行分類時調用已經構造好的決策樹,為了解決這個問題,需要使用pickle序列化對象。序列化對象可以在磁盤上保存對象,并在需要的時候讀取出來,任何對象都可以執行序列化操作,字典對象也不例外。

  使用pickle模塊存儲決策樹代碼:

# 使用pickle模塊存儲決策樹
def storeTree(inputTree,filename):
    import pickle
    fw =open(filename,'wb')
    pickle.dump(inputTree,fw)
    fw.close()

def grabTree(filename):
    import pickle
    fr = open(filename,'rb')
    return pickle.load(fr)

  

 通過上面的代碼,我們可以將分類器存儲在硬盤上,而不是每次對數據分類時重新學習一邊,這就是決策樹的優點之一。

  驗證上面代碼,測試結果如下:

if __name__ == '__main__':
    myData,labels = createDataSet()
    myTree = createTree(myData,labels)
    print(myTree)
    print(type(myTree))
    myTree1 = {'no surfacing': {0: 'no', 1: {'flippers': {0: 'no', 1: 'yes'}}}}
    storeTree(myTree1,'classifierStorage.txt')
    res = grabTree('classifierStorage.txt')
    print(res)

'''
{'no surfacing': {0: 'no', 1: {'flippers': {0: 'no', 1: 'yes'}}}}
<class 'dict'>
{'no surfacing': {0: 'no', 1: {'flippers': {0: 'no', 1: 'yes'}}}}
'''

  

8 示例:使用決策樹預測隱形眼鏡類型

  此處通過一個例子學習決策樹如何預測患者需要佩戴的隱形眼鏡類型,使用小數據集,我們就可以利用決策樹學到很多知識:眼科醫生是如何判斷患者需要佩戴的鏡片類型;

(隱形眼鏡數據集時非常著名的數據集,它包含很多患者眼部狀況的觀察條件以及醫生推薦的隱形眼鏡類型,隱形眼鏡類型包括硬材質,軟材質以及不適合佩戴隱形眼鏡。數據來源于UCI數據庫,為了更容易顯示數據,機器學習實戰將數據做了簡單的更改,數據存儲在文本文件中)

  lenses.txt內容可以去我的GitHub上拿(GitHub地址:https://github.com/LeBron-Jian/MachineLearningNote

  程序如下:

# _*_coding:utf-8_*_
import operator
from math import log
import  matplotlib.pyplot as  plt

# 計算香農熵  度量數據集無序程度
def calcShannonEnt(dataSet):
    numEntries = len(dataSet)
    labelCounts = {}
    for fearVec in dataSet:
        currentLabel = fearVec[-1]
        if currentLabel not in labelCounts.keys():
            labelCounts[currentLabel] = 0
        labelCounts[currentLabel] +=1
    shannonEnt = 0.0
    for key in labelCounts:
        prob = float(labelCounts[key])/numEntries
        shannonEnt -= prob*log(prob,2)
    return shannonEnt

# 劃分數據集
def  splitDataSet(dataSet,axis,value):
    retDataSet = []
    for featVec in dataSet:
        if featVec[axis] == value:
            reducesFeatVec = featVec[:axis]
            reducesFeatVec.extend(featVec[axis+1:])
            retDataSet.append(reducesFeatVec)
    return retDataSet

# 選擇最好的數據集劃分方式
def chooseBestFeatureTpSplit(dataSet):
    '''
        此函數中調用的數據滿足以下要求
        1,數據必須是一種由列表元素組成的列表,而且所有列表元素都要具有相同的數據長度
        2,數據的最后一列或者實例的最后一個元素是當前實例的類別標簽
    :param dataSet:
    :return:
    '''
    numFeatures = len(dataSet[0]) - 1
    # 原始的熵
    baseEntropy = calcShannonEnt(dataSet)
    bestInfoGain = 0.0
    bestFeature = -1
    for i in range(numFeatures):
        # 創建唯一的分類標簽列表
        featList = [example[i] for example in dataSet]
        uniqueVals = set(featList)
        newEntropy = 0.0
        for value in uniqueVals:
            # 計算每種劃分方式的信息熵,并對所有唯一特征值得到的熵求和
            subDataSet = splitDataSet(dataSet,i,value)
            prob = len(subDataSet)/float(len(dataSet))
            # 按照特征分類后的熵
            newEntropy += prob * calcShannonEnt(subDataSet)
        infoGain = baseEntropy - newEntropy
        if (infoGain > bestInfoGain):
            # 計算最好的信息增益,信息增益越大,區分樣本的能力越強,根據代表性
            bestInfoGain = infoGain
            bestFeature = i
    return bestFeature

# 按照分類后類別數量排序
def majorityCnt(classList):
    classCount = {}
    for vote in classList:
        if vote not in classCount.keys():
            classCount[vote] = 0
        classCount[vote] += 1
    sortedClassCount = sorted(classCount.items(),
                              key=operator.itemgetter(1),reverse=True)
    return sortedClassCount[0][0]

# 創建樹的函數代碼
def createTree(dataSet,labels):
    '''

        :param dataSet:  輸入的數據集
        :param labels:  標簽列表(包含了數據集中所有特征的標簽)
        :return:
        '''
    # classList 包含了數據集中所有類的標簽
    classList = [example[-1] for example in dataSet]
    # 類別完全相同則停止繼續劃分
    if classList.count(classList[0]) == len(classList):
        return classList[0]
    # 遍歷完所有特征時返回出現次數最多的
    if len(dataSet[0])  == 1:
        return majorityCnt(classList)
    bestFeat = chooseBestFeatureTpSplit(dataSet)
    bestFeatLabel = labels[bestFeat]
    # 字典myTree存儲了樹的所有信息,這對于后面繪制樹形圖很重要
    myTree = {bestFeatLabel:{}}
    del(labels[bestFeat])
    # 得到列表包含的所有屬性值
    featValues = [example[bestFeat] for example in dataSet]
    uniqueVals = set(featValues)
    for value in uniqueVals:
        subLabels =labels[:]
        myTree[bestFeatLabel][value] = createTree(splitDataSet(dataSet,bestFeat,value),
                                                  subLabels)

    return myTree

# 獲取葉子節點的數目
def getNumLeafs(myTree):
    # 初始化結點數
    numLeafs = 0
    firstSides = list(myTree.keys())
    # 找到輸入的第一個元素,第一個關鍵詞為劃分數據集類別的標簽
    firstStr = firstSides[0]
    secondDect = myTree[firstStr]
    for key in secondDect.keys():
        # 測試節點的數據類型是否為字典
        if type(secondDect[key]).__name__ == 'dict':
            numLeafs += getNumLeafs(secondDect[key])
        else:
            numLeafs +=1
    return numLeafs

# 獲取樹的層數
def getTreeDepth(myTree):
    maxDepth = 0
    firstSides = list(myTree.keys())
    firstStr = firstSides[0]
    secondDict = myTree[firstStr]
    for key in secondDict.keys():
        # 測試節點的數據類型是否為字典
        if type(secondDict[key]).__name__ == 'dict':
            thisDepth = 1 + getTreeDepth(secondDict[key])
        else:
            thisDepth = 1
        if thisDepth > maxDepth:
            maxDepth = thisDepth

    return maxDepth

# 定義文本框和箭頭格式(樹節點格式的常量)
decisionNode = dict(boxstyle='sawtooth',fc='0.8')
leafNode = dict(boxstyle='round4',fc='0.8')
arrows_args = dict(arrowstyle='<-')

# 繪制帶箭頭的注解
def plotNode(nodeTxt,centerPt,parentPt,nodeType):
    createPlot.ax1.annotate(nodeTxt,xy=parentPt,
                            xycoords='axes fraction',
                            xytext=centerPt,textcoords='axes fraction',
                            va='center',ha='center',bbox=nodeType,
                            arrowprops=arrows_args)


# 在父子節點間填充文本信息
def plotMidText(cntrPt,parentPt,txtString):
    xMid = (parentPt[0] - cntrPt[0]) / 2.0 + cntrPt[0]
    yMid = (parentPt[1] - cntrPt[1]) / 2.0 + cntrPt[1]
    createPlot.ax1.text(xMid,yMid,txtString, va="center", ha="center", rotation=30)


def plotTree(myTree,parentPt,nodeTxt):
    # 求出寬和高
    numLeafs = getNumLeafs(myData)
    depth = getTreeDepth(myData)
    firstStides = list(myTree.keys())
    firstStr = firstStides[0]
    # 按照葉子結點個數劃分x軸
    cntrPt = (plotTree.xOff + (0.1 + float(numLeafs)) /2.0/plotTree.totalW,plotTree.yOff)
    plotMidText(cntrPt,parentPt,nodeTxt)
    plotNode(firstStr,cntrPt,parentPt,decisionNode)
    secondDict = myTree[firstStr]
    # y方向上的擺放位置 自上而下繪制,因此遞減y值
    plotTree.yOff = plotTree.yOff - 1.0/plotTree.totalD
    for key in secondDict.keys():
        if type(secondDict[key]).__name__  == 'dict':
            plotTree(secondDict[key],cntrPt,str(key))
        else:
            plotTree.xOff = plotTree.xOff + 1.0 / plotTree.totalW  # x方向計算結點坐標
            plotNode(secondDict[key], (plotTree.xOff, plotTree.yOff), cntrPt, leafNode)  # 繪制
            plotMidText((plotTree.xOff, plotTree.yOff), cntrPt, str(key))  # 添加文本信息
    plotTree.yOff = plotTree.yOff + 1.0 / plotTree.totalD  # 下次重新調用時恢復y

# 主函數
def createPlot(inTree):
    # 創建一個新圖形并清空繪圖區
    fig = plt.figure(1,facecolor='white')
    fig.clf()
    axprops = dict(xticks=[], yticks=[])
    createPlot.ax1 = plt.subplot(111, frameon=False, **axprops)  # no ticks
    # createPlot.ax1 = plt.subplot(111, frameon=False) #ticks for demo puropses
    plotTree.totalW = float(getNumLeafs(inTree))
    plotTree.totalD = float(getTreeDepth(inTree))
    plotTree.xOff = -0.5 / plotTree.totalW
    plotTree.yOff = 1.0
    plotTree(inTree, (0.5, 1.0), '')
    plt.show()

if __name__ == '__main__':
    fr = open('lenses.txt')
    lenses = [inst.strip().split('	')  for inst in fr.readlines()]
    lensesLabels = ['age','prescript','astigmatic','tearRate']
    print(lenses)
    myData = createTree(lenses, lensesLabels)
    print(myData)
    createPlot(myData)

  結果如下:

  上圖所示的決策樹非常好的匹配了實驗數據,然而這些選項可能太多了。我們將這種問題稱為過度匹配,為了減少過度匹配問題,我們可以裁剪決策樹,去掉一些不必要的葉子節點,如果葉子節點只能增加少許信息,則可以刪除該節點,將它并入到其他葉子節點中。

  ID3算法無法直接處理數值型數據,盡管我們可以通過量化的方法將數值型數據轉化為標稱型數值,但是如果存在太多的特征劃分,ID3算法仍然會面臨其他問題。

9 總結

  決策樹分類器就像帶有終止塊的流程圖,終止塊表示分類結果。開始處理數據集時,我們首先需要測量集合中數據的不一致性,也就是熵,然后尋找最優方案劃分數據集,直到數據集中的所有數據屬于同一分類。ID3算法可以用于劃分標稱型數據集。構建決策樹時,我們通常采取遞歸的方法將數據集轉化為決策樹。一般我們并不構造新的數據結構,而是使用字典存儲樹節點信息。

完整代碼及其數據,請移步小編的GitHub

  傳送門:請點擊我

  如果點擊有誤:https://github.com/LeBron-Jian/MachineLearningNote

參考文獻:機器學習實戰

總結

以上是生活随笔為你收集整理的python机器学习笔记:ID3决策树算法实战的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

18网站在线观看 | 韩国av电影网 | 久久夜色精品国产欧美一区麻豆 | 视频 天天草 | 国产91影视 | 黄色成人免费电影 | 人人爽人人爽人人爽学生一级 | 国产成年免费视频 | 久草视频在线免费 | 欧美日韩高清不卡 | 精品久久一二三区 | 国产精品1区2区3区在线观看 | 日韩大片在线免费观看 | 国产婷婷精品 | 国产精品视频在线观看 | 天天鲁天天干天天射 | 91成版人在线观看入口 | 人人爽人人爽人人爽学生一级 | 国产精品一区二区三区久久久 | 日本aaa在线观看 | 国产二区视频在线观看 | 胖bbbb搡bbbb擦bbbb| 日韩成人xxxx | 中文字幕资源网在线观看 | 91欧美精品| 97色噜噜| 91色欧美 | 午夜久久影视 | 在线观看日本韩国电影 | 黄色一级在线免费观看 | 天天操导航 | 久久伊人精品天天 | 免费a视频在线 | 99久久夜色精品国产亚洲96 | 日韩精品专区 | 91视频传媒 | 欧美亚洲国产精品久久高清浪潮 | 在线免费观看黄色小说 | 亚洲精品午夜国产va久久成人 | 亚洲一区免费在线 | 在线观看午夜 | 狠狠久久伊人 | 日韩欧美视频免费看 | 成人av网站在线观看 | av品善网 | 欧产日产国产69 | av在线收看| 国产精品久久久久9999吃药 | 四虎国产精品免费 | 日韩激情片在线观看 | 国产精品视频app | 久久国产精品99久久久久 | 国产涩涩在线观看 | 亚洲欧美日本一区二区三区 | 91亚洲激情 | 91大神精品视频 | 久久一本综合 | 看毛片的网址 | 亚洲免费公开视频 | 天天干.com | 久草在线免费新视频 | 91精品综合| 17videosex性欧美| 欧美精品久久天天躁 | 91av视频在线播放 | 久久综合婷婷综合 | 欧美一级日韩免费不卡 | 激情综合色图 | 超碰av在线 | 91一区啪爱嗯打偷拍欧美 | 色姑娘综合天天 | 91在线中文 | 国产直播av | 色精品视频 | 99热国产在线 | 国产精品第一页在线 | 在线欧美最极品的av | 97色国产| 日日摸日日 | 最新成人av | 毛片无卡免费无播放器 | 热99在线视频 | 天天玩天天干 | 日韩黄色一级电影 | 精品爱爱 | 国产精品免费在线 | 激情欧美一区二区免费视频 | 伊人久久在线观看 | 国产精品v欧美精品v日韩 | 久久日本视频 | 麻豆视频免费网站 | 狠狠搞,com | 久久久久免费 | 国产一区二区在线视频观看 | 精品国产一区二区三区av性色 | 久久精品这里热有精品 | 91av视频观看| 福利视频导航网址 | 国产精品久久久久久久久久东京 | 天堂资源在线观看视频 | 日本h在线播放 | 久久综合九色综合97_ 久久久 | 一级电影免费在线观看 | 亚洲免费成人 | 亚州精品天堂中文字幕 | 久久艹国产视频 | 精品视频在线视频 | 国产成人一区二区三区在线观看 | 亚洲精品色视频 | 久久精品999 | 97人人爽人人 | 韩国一区二区av | a黄色片| 日韩中文字幕国产 | 日本中文乱码卡一卡二新区 | 最近日本字幕mv免费观看在线 | 日韩爱爱网站 | 国内精品久久久精品电影院 | 91精品办公室少妇高潮对白 | 国产一区二区高清视频 | av免费黄色 | 免费观看v片在线观看 | 免费久久久 | 欧美孕交vivoestv另类 | 五月激情久久久 | 成人免费视频免费观看 | 在线观看中文av | 韩国精品在线观看 | 超碰在线最新地址 | 日韩国产欧美在线播放 | 国产aa精品 | 国产午夜三级一区二区三桃花影视 | 久久精品男人的天堂 | 久久刺激视频 | 超碰成人网 | 伊人天天综合 | 手机在线看永久av片免费 | 亚洲国产精品一区二区久久hs | 色综合国产 | 91av视屏 | 激情文学丁香 | 黄色成品视频 | 亚洲精品视频中文字幕 | 欧美性做爰猛烈叫床潮 | 丝袜美腿在线视频 | 美女网站免费福利视频 | 久久99国产精品免费 | 成人免费毛片aaaaaa片 | 亚洲激精日韩激精欧美精品 | 日韩av片免费在线观看 | 精品99在线观看 | 国产小视频在线免费观看 | 少妇bbw搡bbbb搡bbbb | 亚洲电影av在线 | 天天干天天操天天干 | 三上悠亚一区二区在线观看 | 日韩av电影免费观看 | 在线免费观看羞羞视频 | 国内精品久久久久影院一蜜桃 | 精品av在线播放 | 久久精品女人毛片国产 | 国产成人精品综合久久久 | 国产99色| 日本黄色免费电影网站 | 成人中心免费视频 | 国产精品女 | 爱色婷婷| 国产精品一区二区无线 | 久久99国产精品视频 | 日韩欧美在线第一页 | 天天舔夜夜操 | 亚洲视频一 | 久久人人97超碰精品888 | 久久久精品久久日韩一区综合 | 91色偷偷| 国产一在线精品一区在线观看 | 亚洲精品白浆高清久久久久久 | 日日碰夜夜爽 | 黄色成人毛片 | 久久久久电影网站 | 久久草网站 | 亚洲一一在线 | 亚洲成人免费 | 99精品一级欧美片免费播放 | 九七人人干 | 伊人久久五月天 | 国产97视频在线 | 9在线观看免费高清完整 | 国产成人精品综合久久久久99 | 天天拍天天操 | 在线电影 一区 | 婷婷色九月 | 精品一二三四视频 | 色播99| 日韩欧美高清 | 碰超在线观看 | 又色又爽又黄 | 日韩黄色免费电影 | 国产美女主播精品一区二区三区 | 激情综合站 | 成人午夜电影在线观看 | 在线播放 日韩专区 | 嫩草91影院| 亚洲欧美日韩一区二区三区在线观看 | 麻豆视频国产在线观看 | 在线观看免费 | 国产91国语对白在线 | 天天操操操操操操 | 天天干天天拍天天操 | www.狠狠 | 久久不射网站 | 午夜av日韩 | 麻豆传媒电影在线观看 | 久久国产精品第一页 | 不卡av电影在线观看 | 91在线影院 | 中文在线√天堂 | 成人黄色大片 | 天天色天天色天天色 | 人人舔人人干 | 热久久免费国产视频 | 久久精品一区二区 | 免费日韩电影 | 国产一级在线视频 | 91在线九色 | 亚洲精品日韩av | 最新日韩视频 | 在线 你懂 | 久久久久亚洲精品国产 | 国产精品久久久久aaaa九色 | 久久亚洲私人国产精品 | 日韩最新理论电影 | aaa黄色毛片| 狠狠久久伊人 | 亚洲一区av | a天堂在线看 | 亚洲天堂精品 | 在线婷婷| 久久综合国产伦精品免费 | 五月宗合网 | 午夜精品视频福利 | 日韩中文免费视频 | 日韩精品视频在线观看免费 | 欧美va天堂va视频va在线 | 超碰久热| 国产亚洲精品bv在线观看 | 色综合婷婷久久 | 久热香蕉视频 | 日本黄色大片儿 | 91精品国产91久久久久久三级 | 九九久久久 | 高清有码中文字幕 | 亚洲资源网 | 激情五月开心 | 日韩精品中文字幕久久臀 | 草樱av| 91精品国产99久久久久 | 麻豆免费精品视频 | 在线精品视频免费播放 | 狠狠狠色丁香综合久久天下网 | 久久影院亚洲 | 91精品久久久久久综合乱菊 | 国产精品一区一区三区 | 四虎影视久久久 | 亚洲毛片久久 | 日韩视频免费看 | 国产99免费视频 | 热久久免费视频精品 | 草免费视频 | 超碰97人人射妻 | 999久久久免费精品国产 | 欧美91精品久久久久国产性生爱 | 亚洲成人网在线 | 国产一级免费片 | 999成人| 中文字幕之中文字幕 | 亚洲精品五月 | 免费观看成人网 | 久久免费精品 | 国产精品黄色影片导航在线观看 | 久久精品99久久久久久 | 人人玩人人爽 | 免费在线观看成人av | 国产高清免费视频 | 一区 二区电影免费在线观看 | 久久久国产毛片 | 欧美一区二区三区特黄 | 在线国产专区 | 日韩精品欧美专区 | 美女一区网站 | 久久精品成人热国产成 | 久久香蕉电影网 | 日韩a在线播放 | 在线看成人片 | 综合久久影院 | 国产精品久久久久久久久久不蜜月 | 在线免费观看麻豆视频 | 欧美作爱视频 | 四虎成人免费观看 | 97超碰在线久草超碰在线观看 | 久久精品婷婷 | 在线看一区二区 | 99热最新地址| 97在线观看免费高清 | 欧美亚洲国产精品久久高清浪潮 | 中文字幕av在线电影 | 国产美女视频黄a视频免费 久久综合九色欧美综合狠狠 | av一级在线| 亚洲精品乱码久久 | 制服丝袜成人在线 | 久久久久久不卡 | 欧美淫视频| 在线a视频 | 色av色av色av | 综合色婷婷 | 亚洲精品97 | 日韩免费专区 | 久99久视频 | 天天综合人人 | 热精品 | 99视频在线精品国自产拍免费观看 | 日韩午夜在线观看 | 久草在线视频首页 | 欧美 国产 视频 | www.狠狠色.com| 狠狠狠色丁香婷婷综合久久88 | 亚洲欧美在线综合 | 在线观看 亚洲 | 99久久国产免费看 | 手机在线欧美 | 国产成人不卡 | 成人av影视观看 | 国产一区二区三精品久久久无广告 | 91欧美日韩国产 | 在线观看免费av网 | 久久夜色精品国产亚洲aⅴ 91chinesexxx | 高清色免费 | 欧美性生活小视频 | 国产成人久久精品亚洲 | 国产黄大片| 日本三级久久久 | 国产精品入口传媒 | 色综合天天爱 | 日韩中文字幕视频在线 | 欧美一级电影片 | 亚洲精品国偷拍自产在线观看蜜桃 | 国产一级片网站 | 国产亚洲一区二区三区 | 日韩在线视频国产 | 天天综合操| 国产精品视频免费在线观看 | 精品一区二区三区电影 | 国产视频二区三区 | 黄色成人av网址 | 亚洲精品国内 | 国产又黄又猛又粗 | 国产一及片 | 婷婷色中文字幕 | 人人揉人人揉人人揉人人揉97 | 国产精品区在线观看 | 亚洲视频在线观看 | 天天激情综合 | 懂色av一区二区三区蜜臀 | 国产综合香蕉五月婷在线 | 女人高潮一级片 | 国产精品区免费视频 | 超碰在线资源 | 欧美性天天 | 麻豆一区二区三区视频 | 特级a老妇做爰全过程 | 免费日韩在线 | 日韩黄色中文字幕 | 香蕉视频91 | 日精品在线观看 | 中文字幕乱码一区二区 | 夜夜嗨av色一区二区不卡 | 中文字幕999 | 免费在线色电影 | 久久久久五月 | 色婷婷国产 | 在线视频免费观看 | av超碰在线观看 | 国产免费又爽又刺激在线观看 | 狠狠操夜夜 | 日韩精品一二三 | 精品国偷自产在线 | 91最新在线视频 | 少妇高潮流白浆在线观看 | 国产免费国产 | 久久久影院一区二区三区 | 在线免费黄色av | 激情综合色播五月 | 久久久久久久久久久综合 | 亚洲精品乱码久久久久久蜜桃91 | 久久国产欧美日韩 | 亚洲国产高清视频 | 911国产 | 亚洲成av| 日韩免费中文 | 国产亚洲精品成人 | 久久情爱 | 国产精品 9999 | 久久精品美女视频 | 在线激情影院一区 | 国产片网站 | 97超视频 | 国产999精品视频 | 久久久色 | 亚洲欧美成aⅴ人在线观看 四虎在线观看 | 青草视频在线播放 | 日韩av二区| 日日碰狠狠添天天爽超碰97久久 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 久久久国产一区二区三区四区小说 | 婷婷深爱激情 | 日韩色区| 中文在线字幕免 | 日韩理论在线播放 | 亚洲欧洲精品一区二区 | 日韩欧美中文 | 天天狠狠操 | 日韩精品久久久久久久电影99爱 | 国产xxxx | 丁香婷婷久久久综合精品国产 | 99热官网 | 欧美一级黄大片 | 免费a v在线 | 欧美一区二区三区在线观看 | 人人看看人人 | 日韩色av色资源 | 久久久久久欧美二区电影网 | 日日天天av | 在线影院 国内精品 | 黄色免费电影网站 | 在线观看黄色大片 | 欧美另类人妖 | 黄污视频网站大全 | 青青河边草观看完整版高清 | 欧美久久久一区二区三区 | 婷婷激情综合五月天 | 超碰av在线 | 免费在线一区二区三区 | 精品久久精品久久 | 91免费试看 | 亚洲视频在线观看 | 黄网站色欧美视频 | 国产做aⅴ在线视频播放 | 欧美孕妇视频 | 天堂av免费| 国产精品成人品 | 九九久久成人 | 黄色国产在线 | 亚洲成av人影片在线观看 | 亚洲精品字幕在线 | 少妇搡bbbb搡bbb搡69 | 亚洲国产小视频在线观看 | 亚洲精品免费视频 | www激情网| 人人玩人人添人人澡97 | 久久免费公开视频 | 黄色av网站在线观看免费 | 欧美日韩国产mv | 亚洲精品国偷拍自产在线观看 | 国产精品入口久久 | 成人免费观看网站 | ,午夜性刺激免费看视频 | 免费国产一区二区 | www天天操 | 五月婷婷中文字幕 | 美女视频久久久 | 国产精品久久久久av免费 | 黄色大全视频 | 91精品国产综合久久福利 | 久热只有精品 | 久久精品官网 | 伊人黄 | 成人在线网站观看 | 中文字幕 国产精品 | zzijzzij亚洲成熟少妇 | 制服丝袜一区二区 | 国产系列在线观看 | 91av视频在线观看免费 | 天天操狠狠干 | 国产精品a久久久久 | 亚洲区精品视频 | 免费成人av电影 | 免费日韩一区二区三区 | 国产色在线 | 日韩免费在线观看视频 | 国产一卡久久电影永久 | av免费电影在线观看 | 国产日本在线 | 丁香在线视频 | 不卡av电影在线 | 久久视频免费在线观看 | 性色av免费看 | 久久精品成人欧美大片古装 | 久久夜色精品国产欧美乱 | 久久不卡电影 | 国产黄免费看 | 深爱婷婷激情 | 日日日日日 | 97人人超 | 在线视频观看你懂的 | 6699私人影院 | 成人久久精品 | 久草com | 日韩3区 | 日本精品视频免费 | 精品国产乱码久久久久久三级人 | 色综合久久五月天 | 国产999免费视频 | 国产精品久久久久久久久久白浆 | 国产精品久久久一区二区三区网站 | 免费av试看 | 成人午夜电影在线播放 | 99热超碰| 久久久久国产精品免费免费搜索 | 国产精品嫩草影视久久久 | 国产视频一区二区在线播放 | 国产一级精品在线观看 | 九九精品视频在线观看 | 国产精品热 | 国产精品国产毛片 | 国产一区二区视频在线播放 | 久久无码av一区二区三区电影网 | 亚洲精品99久久久久中文字幕 | 国产精品久久久久999 | 91看片在线观看 | 色国产在线 | 久久综合久久八八 | 中文字幕免费在线 | www.婷婷com | 色综合综合 | 日韩免费一级a毛片在线播放一级 | 久久久久久久久亚洲精品 | www激情com | 国产黄影院色大全免费 | 欧美另类xxx| 亚洲精品视频在线播放 | 欧美一级乱黄 | 国产精品美女久久久 | 成人午夜网址 | 91成年人视频 | 亚州精品国产 | 国产精品少妇 | 久久人人97超碰国产公开结果 | 国产亚洲精品女人久久久久久 | 色欧美88888久久久久久影院 | 久久久久日本精品一区二区三区 | zzijzzij亚洲成熟少妇 | 在线观看中文字幕一区二区 | 人人澡人 | 香蕉久久国产 | www.黄色| 嫩模bbw搡bbbb搡bbbb | 国产美女久久 | 亚洲视频1区2区 | 精品国产美女在线 | 日日爽夜夜操 | 亚洲精品在线资源 | 日日操天天爽 | 91亚洲精品久久久蜜桃 | 337p西西人体大胆瓣开下部 | 欧美成人性网 | 亚洲精品久久久久999中文字幕 | 欧美精品在线观看一区 | 成人观看| 亚洲女同ⅹxx女同tv | 色综合天天综合 | 欧美精品二 | 中文字幕在线观看的网站 | 日本黄色免费看 | 日韩欧美一区二区三区黑寡妇 | 日本xxxxav | 91免费高清视频 | 国产一级免费视频 | 成年人在线看片 | 欧美成人久久 | 中文字幕在线国产精品 | 国产小视频免费在线观看 | 在线中文字母电影观看 | 一级黄网 | 欧美一区影院 | 91视频在线免费 | 在线看免费 | 永久精品视频 | 欧美在线视频第一页 | 国产成人一区三区 | 午夜手机电影 | 国产无套一区二区三区久久 | 国产成人精品一区二区三区福利 | 日本aaaa级毛片在线看 | 免费视频久久久久久久 | 成人资源在线观看 | 日本成人a| 91最新在线观看 | 亚洲国产精品99久久久久久久久 | 亚洲精品国产欧美在线观看 | 中文乱幕日产无线码1区 | 一区二区精品久久 | 九色porny真实丨国产18 | 欧美一区成人 | 91大片网站| 国产日本高清 | av日韩不卡 | 久久久久久久久久久久亚洲 | 美女啪啪图片 | 日韩一区二区三区免费视频 | 久久久久久久久久久久久影院 | 免费观看国产视频 | 欧美日韩精品在线观看视频 | 亚洲午夜久久久久久久久电影网 | 国产在线免费观看 | 日精品在线观看 | 久久天天躁狠狠躁亚洲综合公司 | 亚洲精品国偷拍自产在线观看蜜桃 | 国内精品视频久久 | 亚洲精品高清在线 | 亚洲日本国产精品 | 精品视频 | 久久久久久久久久久免费av | 国产中文字幕国产 | 亚洲 欧美 综合 在线 精品 | 高清精品视频 | 伊人狠狠操 | 免费网址在线播放 | 色爽网站 | 女人久久久久 | 又污又黄网站 | 五月婷婷一区二区三区 | 四虎精品成人免费网站 | 福利视频网址 | 国产精品一区二区在线观看免费 | 天天综合日日夜夜 | 中文字幕国产在线 | av在线电影网站 | 国产精品片 | 久久夜色精品亚洲噜噜国4 午夜视频在线观看欧美 | 99精品免费在线观看 | 亚洲欧美视频一区二区三区 | 麻豆av一区二区三区在线观看 | 免费黄色在线播放 | 久久久精品影视 | 96超碰在线 | 久久精品久久精品 | 久久精品视频在线 | 一区二区三区电影在线播 | 婷婷色在线视频 | 日韩av手机在线观看 | 国产精品美女久久久久久久 | 久久精品亚洲一区二区三区观看模式 | 99久久激情 | 欧美精品久| 天天夜夜狠狠操 | 欧美一区二视频在线免费观看 | 91在线小视频 | 四虎亚洲精品 | 国产免费午夜 | 免费福利视频网 | 日韩毛片久久久 | 日韩午夜电影网 | 激情五月av | 深爱激情亚洲 | 三级a毛片 | 久久国内精品 | 久久久久久久久久久电影 | 激情婷婷亚洲 | 欧美日韩中文字幕综合视频 | 日韩国产精品久久久久久亚洲 | 西西444www高清大胆 | 久久久久久高潮国产精品视 | 521色香蕉网站在线观看 | 亚洲aⅴ免费在线观看 | 国产精品久久久久毛片大屁完整版 | 日韩精品中文字幕久久臀 | 伊人久久国产 | 伊人伊成久久人综合网站 | 99这里只有久久精品视频 | 午夜色场| 久草网视频在线观看 | 亚洲国产精品va在线看 | 国产美女在线精品免费观看 | av中文字幕av | 99精品视频在线观看 | 三级小视频在线观看 | 综合久久精品 | 亚洲伦理一区 | 久久久久久国产精品亚洲78 | 五月色丁香 | 99人成在线观看视频 | 成人a级免费视频 | 四虎影视成人 | 国产精品高清一区二区三区 | 日韩av免费观看网站 | 欧美一区二区免费在线观看 | 国产91aaa | 日韩中文字幕视频在线 | 手机在线欧美 | 色99在线 | 91av短视频 | 91人人视频在线观看 | 国产精品2018| 久久综合电影 | 在线观看av网 | www婷婷| 中国精品少妇 | 欧美大码xxxx | 久久精品在线 | 国产成人精品一区二区三区 | 久久久影视 | 激情五月婷婷 | 免费视频一二三区 | 亚洲天天在线日亚洲洲精 | 伊人久久五月天 | 黄色一集片 | 特级黄录像视频 | 欧美另类一二三四区 | 久久久久国产a免费观看rela | 一级一片免费看 | 亚洲国产成人在线播放 | 久久国产一区二区三区 | 久久国产网 | 国产日韩欧美在线观看视频 | 色综合综合 | 久国产在线播放 | 不卡av在线免费观看 | 日韩精品91偷拍在线观看 | 精品91在线 | 一区二区三区四区在线 | 日韩免费三区 | 久久情爱| 中文字幕资源在线观看 | 久久福利电影 | 久二影院| 97爱爱爱 | 婷婷丁香花五月天 | 玖玖玖影院 | 免费国产在线精品 | 日日干夜夜操视频 | 91福利视频免费观看 | 在线观看国产永久免费视频 | 超碰夜夜 | 91在线观看欧美日韩 | 狠狠操在线 | 日韩欧美在线播放 | 久久伊人国产精品 | 天天五月天色 | 激情综合婷婷 | 欧美巨大荫蒂茸毛毛人妖 | 国精产品满18岁在线 | 国际精品久久久 | 国产国语在线 | 久操97 | 激情五月开心 | 欧美不卡视频在线 | 亚洲精品自在在线观看 | 日日干天天射 | 国产精品久久久久久久久久久久 | 天天射天天干天天操 | 亚洲精品午夜一区人人爽 | 久久视频网址 | 欧美一级日韩三级 | 国产成人高清在线 | 色综合久久久久久久久五月 | 久久视频免费看 | 午夜精品av在线 | 五月婷婷另类国产 | 深夜免费小视频 | 欧美日韩精品免费观看视频 | 久久久国产精品人人片99精片欧美一 | 日韩视频在线观看免费 | www亚洲精品| 国产91亚洲精品 | 蜜桃视频在线视频 | 国产成人精品一区二 | 久久精品com | 在线观看中文av | 国产精品久久久久久久久久三级 | 人人涩 | 久久久免费观看视频 | 亚洲精品高清视频 | 天天爽网站 | 99热在线精品观看 | 91 在线视频播放 | 久久国产亚洲 | 亚洲最新av网站 | 欧美午夜理伦三级在线观看 | 99精品国产高清在线观看 | 美女视频永久黄网站免费观看国产 | 在线观看色视频 | 中文字幕精品久久 | 天天天天色射综合 | 麻豆视频在线观看 | 免费a级观看 | 337p日本大胆噜噜噜噜 | 97av在线视频免费播放 | 又污又黄网站 | 久久精品99国产精品亚洲最刺激 | 久久视频一区二区 | 免费黄色看片 | 日韩网站在线播放 | 男女免费视频观看 | 在线观看欧美成人 | 精品一二三四视频 | 久久精品国产成人 | 国产精品黑丝在线观看 | 黄色影院在线免费观看 | 最近日韩中文字幕中文 | 91视频在线免费 | 婷婷激情在线 | 一本一本久久a久久精品牛牛影视 | 免费无遮挡动漫网站 | 日韩精品视频免费 | 日韩久久网站 | 国产香蕉视频 | 亚洲区另类春色综合小说校园片 | 在线观看韩日电影免费 | 免费看成年人 | 成年人黄色免费网站 | 国产日韩精品一区二区三区在线 | 久久精品国产第一区二区三区 | 91一区一区三区 | 一区二区三区中文字幕在线观看 | 日本中文字幕网站 | 亚洲成人软件 | 国产精品久久久久影院 | 国产99久久久精品 | 2019精品手机国产品在线 | 国产 字幕 制服 中文 在线 | 婷婷中文字幕综合 | 国产成人三级一区二区在线观看一 | 天堂网中文在线 | 国产成人一区二区三区在线观看 | 午夜精品久久久久久久99 | 日本免费一二三区 | 日韩精品一区二区三区免费观看视频 | 在线免费黄色 | 国产一区在线免费 | 日韩精品最新在线观看 | 日韩精品一区二区三区在线视频 | 国产中文字幕大全 | 久久久久久蜜av免费网站 | 91香蕉亚洲精品 | 偷拍区另类综合在线 | 一区二区三区高清在线 | www视频在线观看 | 久久久久久影视 | 国产精品免费久久 | 午夜影视剧场 | 国产小视频在线观看 | 日韩特黄av| 日韩久久久久久久久久 | 国产在线观看你懂得 | 日本最新高清不卡中文字幕 | 亚洲 欧美 综合 在线 精品 | 久久福利精品 | 精品亚洲免费 | 国产精品自产拍在线观看蜜 | 免费观看的黄色片 | 久综合网 | 天天射日 | 国产日韩欧美视频 | 欧美日韩高清一区二区 | 久久精品成人欧美大片古装 | 在线影视 一区 二区 三区 | 91精品国产自产老师啪 | 97看片吧 | www.黄色片网站| 国产91免费在线观看 | 99视频国产精品 | 久久久五月天 | 中文字幕在线影院 | 国产精品久久久久一区 | 久久久久久伊人 | 国产精品精品久久久 | 美女国产 | 国产999精品久久久久久 | 一色屋精品视频在线观看 | 国产精品一区二区三区99 | 免费看黄色大全 | av电影一区二区三区 | 91精品人成在线观看 | 天天综合天天做 | 伊人日日干 | 久久精品视频在线看 | 欧美午夜精品久久久久久孕妇 | 蜜臀av免费一区二区三区 | 人人草在线视频 | 欧美一级特黄aaaaaa大片在线观看 | 色综合天天干 | 亚洲四虎| 亚洲精品资源 | 91视频在线观看免费 | 69亚洲乱| 偷拍精偷拍精品欧洲亚洲网站 | www黄色软件 | 五月情婷婷 | 亚洲视频在线观看 | 婷婷色在线 | 成人avav | 在线色网站| 日韩亚洲在线观看 | 国产不卡精品 | 久久超级碰 | 日韩 在线a| 天天射综合网站 | 久久性生活片 | www.夜夜干.com | 我要看黄色一级片 | 日本久久电影网 | 在线91视频 | 国产亚洲aⅴaaaaaa毛片 | 一区二区三区在线观看免费视频 | 欧美激情视频一区二区三区免费 | 色综合久久久久久中文网 | av激情五月 | 韩日精品在线 | 国语自产偷拍精品视频偷 | 久久久久久中文字幕 | 天天干天天干天天 | 六月丁香在线观看 | 成人黄色小说在线观看 | 欧美日韩综合在线观看 | 精品视频免费看 | 久草色在线观看 | 丁香婷婷在线 | 黄色软件大全网站 | 91精品在线免费 | 日本公妇色中文字幕 | 麻豆视频国产精品 | 久草在线视频在线观看 | 国产成年人av | 国产精品永久在线观看 | 五月婷婷色 | 在线观看va| 欧美日本啪啪无遮挡网站 | 亚洲精品国产精品国自 | 日韩视频在线不卡 | 夜夜爱av | 国产婷婷精品 | 97超碰资源网 | 国产经典av | 激情中文字幕 | 国产精品久久久久久婷婷天堂 | 色国产精品一区在线观看 | a午夜在线 | 中文在线www | 97精品久久| 欧美资源 | 91网在线观看 | 亚洲人在线7777777精品 | 国产精品亚洲片在线播放 | 91亚洲精品久久久蜜桃 | 欧美日本啪啪无遮挡网站 | 成人一区影院 | 国产高清免费观看 | 97视频播放 | 亚洲日本va中文字幕 | 日韩精品中文字幕在线观看 | 日韩91精品 | 99爱视频在线观看 | 99久久精品久久久久久清纯 | 中文在线www| 91视频国产高清 | 在线观看免费av网站 | 国产视频2区 | 国产精品av在线免费观看 | 丁香久久激情 | 亚洲黄色免费 | 午夜美女wwww | 久久久久欧美精品999 | 欧美国产不卡 | 菠萝菠萝蜜在线播放 | 超碰在线最新网址 | 欧美精品一区二区性色 | 超碰在线公开免费 | 亚洲精品免费观看视频 | av中文字幕在线免费观看 | 欧美一二区在线 | 日韩a级黄色片 | 亚洲黄色一级电影 | 色五丁香 | 国产99久久久精品 | 91久久精| 久久情侣偷拍 | 久久久av免费 | 成人免费视频a | 色香com.| 欧美日韩国产二区三区 | 亚洲国产精品一区二区尤物区 | www.色午夜 | 在线婷婷| 91在线小视频 | 亚洲国产一二三 | 四虎视频| 国产欧美精品一区二区三区 | 亚洲精品在线一区二区三区 |