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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

【Python机器学习】决策树ID3算法结果可视化附源代码 对UCI数据集Caesarian Section进行分类

發(fā)布時(shí)間:2023/12/20 python 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Python机器学习】决策树ID3算法结果可视化附源代码 对UCI数据集Caesarian Section进行分类 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

決策樹(shù)

  • 實(shí)現(xiàn)所用到的庫(kù)
  • 實(shí)現(xiàn)
    • 經(jīng)驗(yàn)熵計(jì)算
      • 經(jīng)驗(yàn)熵計(jì)算公式
    • 條件熵
    • 信息增益
    • ID3
      • 選擇信息增益最大的屬性
      • 過(guò)程
    • 擬合
    • 預(yù)測(cè)
    • 評(píng)估
  • 決策樹(shù)可視化
    • 決策樹(shù)保存
    • 決策樹(shù)讀取
    • 效果圖
  • 總代碼
    • 如何獲得每一步計(jì)算結(jié)果
  • 實(shí)驗(yàn)結(jié)果(決策樹(shù))
    • debug模式


決策樹(shù)(Decision Tree)是在已知各種情況發(fā)生概率的基礎(chǔ)上,通過(guò)構(gòu)成決策樹(shù)來(lái)求取凈現(xiàn)值的期望值大于等于零的概率,評(píng)價(jià)項(xiàng)目風(fēng)險(xiǎn),判斷其可行性的決策分析方法,是直觀運(yùn)用概率分析的一種圖解法。由于這種決策分支畫(huà)成圖形很像一棵樹(shù)的枝干,故稱(chēng)決策樹(shù)。 來(lái)源:決策樹(shù)_百度百科

數(shù)據(jù)集使用UCI數(shù)據(jù)集 Caesarian Section Classification Dataset Data Set

【與數(shù)據(jù)集相關(guān)的詳細(xì)信息和下載地址】

  • 本代碼實(shí)現(xiàn)了決策樹(shù)ID3算法,并使用決策樹(shù)ID3算法進(jìn)行預(yù)測(cè)。
  • 決策樹(shù)算法寫(xiě)到類(lèi)中,實(shí)現(xiàn)代碼復(fù)用,并在使用過(guò)程中降低復(fù)雜度。
  • 將logging日志等級(jí)調(diào)整為DEBUG,可以輸出決策樹(shù)每一步的詳細(xì)過(guò)程
  • 通過(guò)使用mermaid的文本繪圖格式對(duì)決策樹(shù)進(jìn)行了可視化

實(shí)現(xiàn)所用到的庫(kù)

  • Python 3
  • Pandas
  • sklearn(僅用于切分?jǐn)?shù)據(jù)集)
  • numpy

實(shí)現(xiàn)

經(jīng)驗(yàn)熵計(jì)算

熵中的概率由數(shù)據(jù)估計(jì)(特別是最大似然估計(jì))得到時(shí),所對(duì)應(yīng)的熵稱(chēng)為經(jīng)驗(yàn)熵

經(jīng)驗(yàn)熵計(jì)算公式

H=?∑i=1np(xi)log2(p(xi))H = -\sum^n_{i=1}p(x_i)log_2(p(x_i))H=?i=1n?p(xi?)log2?(p(xi?))

def empirical_entropy(self, dataset=None):"""求經(jīng)驗(yàn)熵$$H = -\sum^n_{i=1}p(x_i)log_2(p(x_i))$$:return: Float 經(jīng)驗(yàn)熵"""if dataset is None:dataset = self.DataSetcolumns_count = dataset.iloc[:, -1].value_counts()entropy = 0total_count = columns_count.sum()for count in columns_count:p = count / total_countentropy -= p * np.log2(p)return entropy

條件熵

條件熵 H(Y∣X)H(Y|X)H(Y∣X)表示在已知隨機(jī)變量X的條件下隨機(jī)變量Y的不確定性。

定義X給定條件下Y的條件概率分布的對(duì)X的數(shù)學(xué)期望

H(Y∣X)=∑i=1np(i)H(Y∣X=xi)H(Y|X) = \sum_{i=1}^np(i)H(Y|X=x_i)H(YX)=i=1n?p(i)H(YX=xi?)

信息增益

信息增益表示得知特征X的信息而使得類(lèi)Y的信息不確定性減少的程度。
即:選擇該特征對(duì)分類(lèi)的幫助程度。

在分類(lèi)問(wèn)題困難時(shí),也就是說(shuō)在訓(xùn)練數(shù)據(jù)集經(jīng)驗(yàn)熵大的時(shí)候,信息增益值會(huì)偏大反之信息增益值會(huì)偏小

使用信息增益比可以對(duì)這個(gè)問(wèn)題進(jìn)行校正,這是特征選擇的另一個(gè)標(biāo)準(zhǔn)。

特征A對(duì)訓(xùn)練數(shù)據(jù)集D的信息增益g(D,A),定義為集合D的經(jīng)驗(yàn)熵H(D)與特征A給定條件下D的經(jīng)驗(yàn)條件熵H(D|A)之差:

g(D,A)=H(D)?H(D∣A)g(D,A) = H(D)-H(D|A)g(D,A)=H(D)?H(DA)

ID3

簡(jiǎn)單來(lái)說(shuō),就是不斷選取能夠?qū)Ψ诸?lèi)提供最大效果的屬性,然后根據(jù)屬性的各個(gè)值選取接下來(lái)的最佳屬性

選擇信息增益最大的屬性

因?yàn)闂l件經(jīng)驗(yàn)熵越小(表示該分類(lèi)的結(jié)果比較統(tǒng)一,即信息增益越大)表示該屬性對(duì)于分類(lèi)重要性越大

其中extract_dataset 相當(dāng)于在符合指定條件下數(shù)據(jù)集,用于接下來(lái)計(jì)算條件經(jīng)驗(yàn)熵,并獲得信息增益。

def extract_dataset(self, dataset: pd.DataFrame, column, label):"""根據(jù)column和label篩選出指定的數(shù)據(jù)集:return: pd.DataFrame 篩選后的數(shù)據(jù)集"""if type(column) == int:split_dataset = dataset[dataset.iloc[:, column] == label].drop(dataset.columns[column], axis=1)else:split_dataset = dataset[dataset.loc[:, column] == label].drop(column, axis=1)return split_datasetdef best_empirical_entropy(self, dataset: pd.DataFrame = None):"""選取數(shù)據(jù)集中的columns中,最好的column(經(jīng)驗(yàn)熵最大):param dataset: 帶選取的數(shù)據(jù)集:return: 返回column"""if dataset is None:dataset = self.DataSetcolumns = dataset.columns[:-1]total_count = dataset.shape[0]empirical_entropy = self.empirical_entropy(dataset)logging.debug(f"now dataset shape is {dataset.shape}, column is {dataset.columns.tolist()}")logging.debug(f"empirical_entropy is {empirical_entropy}")informationGain_max = -1best_column = Nonefor column in columns:entropy_tmp = 0data_counts = dataset.loc[:, column].value_counts()data_labels = data_counts.indexlogging.debug(f"now is {column}")for label in data_labels:split_dataset = self.extract_dataset(dataset, column, label)count = split_dataset.shape[0]p = count / total_countentropy_tmp += p * self.empirical_entropy(split_dataset)logging.debug(f"now label is {label}, chooseData shape is {split_dataset.shape}, "f"Ans count: {split_dataset.iloc[:, -1].value_counts().tolist()}, "f"entropy: {self.empirical_entropy(split_dataset)}")informationGain = empirical_entropy - entropy_tmplogging.debug(f"entropy: {entropy_tmp}, {column} informationGain:{informationGain}")if informationGain > informationGain_max:best_column = columninformationGain_max = informationGainlogging.debug(f"Choose {best_column}:{informationGain_max}")return best_column

過(guò)程

  • 選取信息增益最大的屬性。
  • 如果各個(gè)屬性的最大的信息增益不夠大,即對(duì)分類(lèi)幫助有限,此時(shí)直接設(shè)定為結(jié)果分類(lèi)中,數(shù)量最多的一個(gè)值
  • 如果沒(méi)有可以選取的屬性(因?yàn)閷傩栽谥耙呀?jīng)選擇完了),此時(shí)同樣選取結(jié)果數(shù)量最多的一個(gè)值

    造成沒(méi)有可以選取的原因:因?yàn)榭赡芡粋€(gè)屬性,可能有不同結(jié)果。

  • 選取當(dāng)前屬性的各個(gè)值,然后分別執(zhí)行1;
  • 當(dāng)遞歸完畢,即每個(gè)屬性的值最終都有一個(gè)值,即為決策樹(shù),如果在測(cè)試過(guò)程出現(xiàn)訓(xùn)練階段沒(méi)有出現(xiàn)的結(jié)果,可以為每一個(gè)屬性單獨(dú)設(shè)置一個(gè)其他值用于表示決策樹(shù)中沒(méi)有該屬性的值時(shí)決策樹(shù)的輸出結(jié)果,這個(gè)值可以設(shè)置為當(dāng)前屬性數(shù)量最多的結(jié)果值
  • def id3(self, dataset: pd.DataFrame = None):'''實(shí)現(xiàn)決策樹(shù)的ID3算法:param dataset: 輸入的數(shù)據(jù)集:return: dict 決策樹(shù)節(jié)點(diǎn)'''if dataset is None:dataset = self.DataSetnext_tree = {}result_count = dataset.iloc[:, -1].value_counts()result_max = result_count.idxmax()next_tree["其他"] = result_maxif result_count.shape[0] == 1 or dataset.shape[1] < 2 or self.empirical_entropy(dataset) < self._threshold:self._leafCount += 1logging.debug(f"select decision {result_max}, result_type:{result_count.tolist()}, dataset column:{dataset.shape}, lower than threshold:{self.empirical_entropy(dataset) < self._threshold}")tree = {"next": next_tree}else:best_column = self.best_empirical_entropy(dataset)value_counts = dataset[best_column].value_counts()labels = value_counts.indexfor label in labels:logging.debug(f"now choose_column:{best_column}, label: {label}")split_dataset = self.extract_dataset(dataset, best_column, label)next_decision = self.id3(split_dataset)next_tree[label] = next_decisiontree = {"column": best_column, "next": next_tree}return tree

    擬合

    def fit(self, x: pd.DataFrame, y=None, algorithm: str = "id3", threshold=0.1):'''擬合函數(shù),輸入數(shù)據(jù)集進(jìn)行擬合,其中如果y沒(méi)有輸入,則x的最后一列應(yīng)包含分類(lèi)結(jié)果:param x: pd.DataFrame數(shù)據(jù)集的屬性(當(dāng)y為None時(shí),為整個(gè)數(shù)據(jù)集-包含結(jié)果):param y: list like,shape=(-1,)數(shù)據(jù)集的結(jié)果:param algorithm: 選擇算法(目前僅有ID3):param threshold: 選擇信息增益的閾值:return: 決策樹(shù)的根節(jié)點(diǎn)'''self.check_dataset(x, dimension=2)self.check_dataset(y, dimension=1)self._threshold = thresholddataset = xif y is not None:dataset.insert(dataset.shape[1], 'DECISION_tempADD', y)self.decision_tree = eval("self." + algorithm)(dataset)logging.info(f"decision_tree leaf:{self._leafCount}")return self.decision_tree

    預(yù)測(cè)

    def predict(self, x: pd.DataFrame):'''預(yù)測(cè)數(shù)據(jù):param x:pd.DataFrame 輸入的數(shù)據(jù)集:return: 分類(lèi)結(jié)果'''self.y_predict = x.apply(self._predict_line, axis=1)return self.y_predictdef _predict_line(self, line):"""私有函數(shù),用于在predict中,對(duì)每一行數(shù)據(jù)進(jìn)行預(yù)測(cè):param line: 輸入的數(shù)據(jù)集的某一行數(shù)據(jù):return: 該一行的分類(lèi)結(jié)果"""tree = self.decision_treewhile True:try:if len(tree["next"]) == 1:return tree["next"]["其他"]else:value = line[tree["column"]]tree = tree["next"][value]except:return tree["next"]["其他"]

    評(píng)估

    評(píng)估結(jié)果的準(zhǔn)確度,精確度,召回率。

    • score評(píng)估函數(shù):僅適用于二分類(lèi),對(duì)于多分類(lèi)該算法不適用(但是決策樹(shù)代碼可以predict預(yù)測(cè))
    • 同時(shí)score判斷正例需要結(jié)果為1,反例結(jié)果為0。
    def score(self, y):'''評(píng)估函數(shù),用于評(píng)估結(jié)果:param y: 輸入實(shí)際的結(jié)果:return: None'''if self.y_predict is None:raise Exception("before score should predict first!")y_acutalTrue = y[(y == 1) & (self.y_predict == 1)].shape[0]y_acutalFalse = y[(y == 0) & (self.y_predict == 0)].shape[0]y_predictTrue = self.y_predict[self.y_predict == 1].shape[0]y_true = y[y == 1].shape[0]y_total = y.shape[0]logging.debug(f"y_acutalTrue:{y_acutalTrue}, y_acutalFalse:{y_acutalFalse}, y_predictTrue:{y_predictTrue}, "f"y_true:{y_true}, y_total:{y_total}")Accuracy = (y_acutalTrue + y_acutalFalse) / y_totalPrecision = y_acutalTrue / y_predictTrueRecall = y_acutalTrue / y_trueprint("Accuracy: ", Accuracy,"Precision: ", Precision,"Recall: ", Recall)

    決策樹(shù)可視化

    利用mermaid文本繪圖,將預(yù)測(cè)的值做了合并,同一屬性的不同值但是分類(lèi)結(jié)果相同,則可視化時(shí)都指向同一個(gè)輸出節(jié)點(diǎn)。

    • 可視化函數(shù)提供了兩種輸出格式
      • markdown格式
      • html格式(推薦,使用瀏覽器即可查看決策樹(shù))

    決策樹(shù)保存

    def save(self, savePath: str):open(savePath, "w").write(str(decisionTree.decision_tree))logging.info(f"決策樹(shù)已保存,位置:{savePath}")

    決策樹(shù)讀取

    def load(self, savePath: str):tree = eval(open(savePath, "r").read())if type(tree) == dict:self.decision_tree = treeelse:raise Exception("Load Faild!")

    效果圖

    示例圖,非數(shù)據(jù)集分類(lèi)結(jié)果圖

    def visualOutput(self, savePath="", outputFormat="html", direction="TD"):'''將決策樹(shù)可視化輸出,格式為‘md'或’html':param outputFormat: 設(shè)置輸出格式:return: 對(duì)應(yīng)輸出格式的文本'''if self.decision_tree is None:raise Exception("should fit first!")text = ""if outputFormat == "md":text = self._format_md(direction=direction)elif outputFormat == "html":text = self._format_html(direction=direction)if savePath != "":open(savePath, "w", encoding="utf-8").write(text)return textdef _format_html(self, direction="TD"):'''決策樹(shù)的可視化為html格式:return: html代碼'''html_start = '<!DOCTYPE html><html lang="en"><head>' \'<meta charset="UTF-8">' \'<meta name="viewport" content="width=device-width, initial-scale=1.0">' \'<meta http-equiv="X-UA-Compatible" content="ie=edge">' \'<title>DecisionTree</title>' \'<script src="https://cdn.bootcss.com/mermaid/8.0.0-rc.8/mermaid.min.js">' \'</script></head><body><div class="mermaid">{}</div>'html_end = '</body></html>'mermaid = self._format_md(end=";", direction=direction)mermaid = mermaid.replace("```mermaid\n", "").replace("```", "")html = html_start.replace("{}", mermaid)+html_endreturn htmldef _format_md(self, direction="TD", end="\n"):'''決策樹(shù)的可視化為md代碼(mermaid代碼):param end: 設(shè)置每行結(jié)尾符號(hào):param direction: 設(shè)置方向:return:'''md = "```mermaid\n"md += f"graph {direction}{end}"total_node = 1current_nodeID = 0if len(self.decision_tree) != 2:code_line = f"{current_nodeID}(start)-->{self.decision_tree['next']['其他']}"return md + code_line + "\n```"queue = [self.decision_tree]while len(queue) > 0:node = queue.pop(0)ans_node = []for key in node["next"].keys():if type(node['next'][key]) == dict:if len(node['next'][key]) == 1:decision = node['next'][key]['next']['其他']if decision not in ans_node:ans_node.append(decision)nodeID_ans = ans_node.index(decision)code_line = f"{current_nodeID}({node['column']})--{key}-->" \f"L{current_nodeID}_{nodeID_ans}({decision})"else:code_line = f"{current_nodeID}({node['column']})--{key}-->{total_node}"queue.append(node["next"][key])total_node += 1else:decision = node['next'][key]if decision not in ans_node:ans_node.append(decision)nodeID_ans = ans_node.index(decision)code_line = f"{current_nodeID}({node['column']})--{key}-->" \f"L{current_nodeID}_{nodeID_ans}({decision})"# code_line_b = str(code_line.encode("utf-8")).lstrip("b'").rstrip("'")md += code_line+endcurrent_nodeID += 1return md + "```"

    總代碼

    如何獲得每一步計(jì)算結(jié)果

    不想要那么多過(guò)程,可以將開(kāi)頭的logging.basicConfig中的level設(shè)置為INFO即可。

    即:
    logging.basicConfig(level=logging.DEBUG, format="%(asctime)s-[%(name)s]\t[%(levelname)s]\t[%(funcName)s]: %(message)s")

    修改為:
    logging.basicConfig(level=logging.INFO, format="%(asctime)s-[%(name)s]\t[%(levelname)s]\t[%(funcName)s]: %(message)s")

    如果需要導(dǎo)出日志:
     參數(shù)filename為輸出日志位置。
     參數(shù)filemode為輸出日志寫(xiě)入模式。
    logging.basicConfig(level=logging.DEBUG, filename='DecisionTree.log', filemode='w', format="%(asctime)s-[%(name)s]\t[%(levelname)s]\t[%(funcName)s]: %(message)s")

    運(yùn)行代碼可能存在問(wèn)題

    • 數(shù)據(jù)集不對(duì):Caesarian Section Classification Dataset下載后為arff格式,該代碼使用的數(shù)據(jù)集格式為csv,需要將arff中的數(shù)據(jù)提取出來(lái),可以使用記事本,將arff的數(shù)據(jù)部分保存為csv格式即可。
    • 此外本代碼提供一個(gè)demo,無(wú)需外部數(shù)據(jù)集亦可運(yùn)行。
    • score評(píng)估函數(shù):僅適用于二分類(lèi),對(duì)于多分類(lèi)該算法不適用(決策樹(shù)可以predict),同時(shí)score判斷正例需要結(jié)果為1,反例結(jié)果為0。
    import pandas as pd import numpy as np import logging from sklearn.model_selection import train_test_splitlogging.basicConfig(level=logging.DEBUG,format="%(asctime)s-[%(name)s]\t[%(levelname)s]\t[%(funcName)s]: %(message)s") """ application: Decision_tree-ID3 writer: Flysky Date: 2020年10月14日 """class DecisionTree:def __init__(self):self.DataSet = Noneself._threshold = 0.1self._leafCount = 0self.decision_tree = Noneself.y_predict = Nonedef check_dataset(self, dataset: pd.DataFrame, dimension=2):if len(dataset.shape) != dimension:raise ValueError(f"data dimension not {dimension} but {len(dataset.shape)}")def empirical_entropy(self, dataset=None):"""求經(jīng)驗(yàn)熵$$H = -\sum^n_{i=1}p(x_i)log_2(p(x_i))$$:return: Float 經(jīng)驗(yàn)熵"""if dataset is None:dataset = self.DataSetcolumns_count = dataset.iloc[:, -1].value_counts()entropy = 0total_count = columns_count.sum()for count in columns_count:p = count / total_countentropy -= p * np.log2(p)return entropydef extract_dataset(self, dataset: pd.DataFrame, column, label):"""根據(jù)column和label篩選出指定的數(shù)據(jù)集:return: pd.DataFrame 篩選后的數(shù)據(jù)集"""if type(column) == int:split_dataset = dataset[dataset.iloc[:, column] == label].drop(dataset.columns[column], axis=1)else:split_dataset = dataset[dataset.loc[:, column] == label].drop(column, axis=1)return split_datasetdef best_empirical_entropy(self, dataset: pd.DataFrame = None):"""選取數(shù)據(jù)集中的columns中,最好的column(經(jīng)驗(yàn)熵最大):param dataset: 帶選取的數(shù)據(jù)集:return: 返回column"""if dataset is None:dataset = self.DataSetcolumns = dataset.columns[:-1]total_count = dataset.shape[0]empirical_entropy = self.empirical_entropy(dataset)logging.debug(f"now dataset shape is {dataset.shape}, column is {dataset.columns.tolist()}")logging.debug(f"empirical_entropy is {empirical_entropy}")informationGain_max = -1best_column = Nonefor column in columns:entropy_tmp = 0data_counts = dataset.loc[:, column].value_counts()data_labels = data_counts.indexlogging.debug(f"now is {column}")for label in data_labels:split_dataset = self.extract_dataset(dataset, column, label)count = split_dataset.shape[0]p = count / total_countentropy_tmp += p * self.empirical_entropy(split_dataset)logging.debug(f"now label is {label}, chooseData shape is {split_dataset.shape}, "f"Ans count: {split_dataset.iloc[:, -1].value_counts().tolist()}, "f"entropy: {self.empirical_entropy(split_dataset)}")informationGain = empirical_entropy - entropy_tmplogging.debug(f"entropy: {entropy_tmp}, {column} informationGain:{informationGain}")if informationGain > informationGain_max:best_column = columninformationGain_max = informationGainlogging.debug(f"Choose {best_column}:{informationGain_max}")return best_columndef id3(self, dataset: pd.DataFrame = None):'''實(shí)現(xiàn)決策樹(shù)的ID3算法:param dataset: 輸入的數(shù)據(jù)集:return: dict 決策樹(shù)節(jié)點(diǎn)'''if dataset is None:dataset = self.DataSetnext_tree = {}result_count = dataset.iloc[:, -1].value_counts()result_max = result_count.idxmax()next_tree["其他"] = result_maxif result_count.shape[0] == 1 or dataset.shape[1] < 2 or self.empirical_entropy(dataset) < self._threshold:self._leafCount += 1logging.debug(f"select decision {result_max}, result_type:{result_count.tolist()}, dataset column:{dataset.shape}, lower than threshold:{self.empirical_entropy(dataset) < self._threshold}")tree = {"next": next_tree}else:best_column = self.best_empirical_entropy(dataset)value_counts = dataset[best_column].value_counts()labels = value_counts.indexfor label in labels:logging.debug(f"now choose_column:{best_column}, label: {label}")split_dataset = self.extract_dataset(dataset, best_column, label)next_decision = self.id3(split_dataset)next_tree[label] = next_decisiontree = {"column": best_column, "next": next_tree}return treedef fit(self, x: pd.DataFrame, y=None, algorithm: str = "id3", threshold=0.1):'''擬合函數(shù),輸入數(shù)據(jù)集進(jìn)行擬合,其中如果y沒(méi)有輸入,則x的最后一列應(yīng)包含分類(lèi)結(jié)果:param x: pd.DataFrame數(shù)據(jù)集的屬性(當(dāng)y為None時(shí),為整個(gè)數(shù)據(jù)集-包含結(jié)果):param y: list like,shape=(-1,)數(shù)據(jù)集的結(jié)果:param algorithm: 選擇算法(目前僅有ID3):param threshold: 選擇信息增益的閾值:return: 決策樹(shù)的根節(jié)點(diǎn)'''self.check_dataset(x, dimension=2)self.check_dataset(y, dimension=1)self._threshold = thresholddataset = xif y is not None:dataset.insert(dataset.shape[1], 'DECISION_tempADD', y)self.decision_tree = eval("self." + algorithm)(dataset)logging.info(f"decision_tree leaf:{self._leafCount}")return self.decision_treedef leaf_count(self):'''統(tǒng)計(jì)葉子節(jié)點(diǎn)個(gè)數(shù)(此處的葉子節(jié)點(diǎn)即能確定分類(lèi)的屬性值所對(duì)應(yīng)的分類(lèi)結(jié)果值:return: 葉子節(jié)點(diǎn)個(gè)數(shù)'''return self._leafCountdef predict(self, x: pd.DataFrame):'''預(yù)測(cè)數(shù)據(jù):param x:pd.DataFrame 輸入的數(shù)據(jù)集:return: 分類(lèi)結(jié)果'''self.y_predict = x.apply(self._predict_line, axis=1)return self.y_predictdef _predict_line(self, line):"""私有函數(shù),用于在predict中,對(duì)每一行數(shù)據(jù)進(jìn)行預(yù)測(cè):param line: 輸入的數(shù)據(jù)集的某一行數(shù)據(jù):return: 該一行的分類(lèi)結(jié)果"""tree = self.decision_treewhile True:try:if len(tree["next"]) == 1:return tree["next"]["其他"]else:value = line[tree["column"]]tree = tree["next"][value]except:return tree["next"]["其他"]def score(self, y):'''評(píng)估函數(shù),用于評(píng)估結(jié)果:param y: 輸入實(shí)際的結(jié)果:return: None'''if self.y_predict is None:raise Exception("before score should predict first!")y_acutalTrue = y[(y == 1) & (self.y_predict == 1)].shape[0]y_acutalFalse = y[(y == 0) & (self.y_predict == 0)].shape[0]y_predictTrue = self.y_predict[self.y_predict == 1].shape[0]y_true = y[y == 1].shape[0]y_total = y.shape[0]logging.debug(f"y_acutalTrue:{y_acutalTrue}, y_acutalFalse:{y_acutalFalse}, y_predictTrue:{y_predictTrue}, "f"y_true:{y_true}, y_total:{y_total}")Accuracy = (y_acutalTrue + y_acutalFalse) / y_totalPrecision = y_acutalTrue / y_predictTrueRecall = y_acutalTrue / y_trueprint("Accuracy: ", Accuracy,"Precision: ", Precision,"Recall: ", Recall)def visualOutput(self, savePath="", outputFormat="html", direction="TD"):'''將決策樹(shù)可視化輸出,格式為‘md'或’html':param outputFormat: 設(shè)置輸出格式:return: 對(duì)應(yīng)輸出格式的文本'''if self.decision_tree is None:raise Exception("should fit first!")text = ""if outputFormat == "md":text = self._format_md(direction=direction)elif outputFormat == "html":text = self._format_html(direction=direction)if savePath != "":open(savePath, "w", encoding="utf-8").write(text)return textdef _format_html(self, direction="TD"):'''決策樹(shù)的可視化為html格式:return: html代碼'''html_start = '<!DOCTYPE html><html lang="en"><head>' \'<meta charset="UTF-8">' \'<meta name="viewport" content="width=device-width, initial-scale=1.0">' \'<meta http-equiv="X-UA-Compatible" content="ie=edge">' \'<title>DecisionTree</title>' \'<script src="https://cdn.bootcss.com/mermaid/8.0.0-rc.8/mermaid.min.js">' \'</script></head><body><div class="mermaid">{}</div>'html_end = '</body></html>'mermaid = self._format_md(end=";", direction=direction)mermaid = mermaid.replace("```mermaid\n", "").replace("```", "")html = html_start.replace("{}", mermaid) + html_endreturn htmldef _format_md(self, direction="TD", end="\n"):'''決策樹(shù)的可視化為md代碼(mermaid代碼):param end: 設(shè)置每行結(jié)尾符號(hào):param direction: 設(shè)置方向:return:'''md = "```mermaid\n"md += f"graph {direction}{end}"total_node = 1current_nodeID = 0if len(self.decision_tree) != 2:code_line = f"{current_nodeID}(start)-->{self.decision_tree['next']['其他']}"return md + code_line + "\n```"queue = [self.decision_tree]while len(queue) > 0:node = queue.pop(0)ans_node = []for key in node["next"].keys():if type(node['next'][key]) == dict:if len(node['next'][key]) == 1:decision = node['next'][key]['next']['其他']if decision not in ans_node:ans_node.append(decision)nodeID_ans = ans_node.index(decision)code_line = f"{current_nodeID}({node['column']})--{key}-->" \f"L{current_nodeID}_{nodeID_ans}({decision})"else:code_line = f"{current_nodeID}({node['column']})--{key}-->{total_node}"queue.append(node["next"][key])total_node += 1else:decision = node['next'][key]if decision not in ans_node:ans_node.append(decision)nodeID_ans = ans_node.index(decision)code_line = f"{current_nodeID}({node['column']})--{key}-->" \f"L{current_nodeID}_{nodeID_ans}({decision})"# code_line_b = str(code_line.encode("utf-8")).lstrip("b'").rstrip("'")md += code_line + endcurrent_nodeID += 1return md + "```"def load(self, savePath: str):tree = eval(open(savePath, "r").read())if type(tree) == dict:self.decision_tree = treeelse:raise Exception("Load Faild!")def save(self, savePath: str):open(savePath, "w").write(str(decisionTree.decision_tree))logging.info(f"決策樹(shù)已保存,位置:{savePath}")if __name__ == '__main__':# 初始化決策樹(shù)decisionTree = DecisionTree()# 不需要外部數(shù)據(jù)集的demodemo_data = [[0, 2, 0, 0, 0],[0, 2, 0, 1, 0],[1, 2, 0, 0, 1],[2, 1, 0, 0, 1],[2, 0, 1, 0, 1],[2, 0, 1, 1, 0],[1, 0, 1, 1, 1],[0, 1, 0, 0, 0],[0, 0, 1, 0, 1],[2, 1, 1, 0, 1],[0, 1, 1, 1, 1],[1, 1, 0, 1, 1],[1, 2, 1, 0, 1],[2, 1, 0, 1, 0]]dataset = pd.DataFrame(demo_data)dataset.columns = ['年齡', '有工作', '是學(xué)生', '信貸情況', "借貸"]# UCI數(shù)據(jù)集Caesarian Section Classification# dataset = pd.read_csv("caesarian.csv", header=None)# dataset.columns = ["Age", "Delivery_number", "Delivery_time", "Blood_of_Pressure", "Heart_Problem", "Caesarian"]# age = dataset["Age"].value_counts().sort_index() # 將Age分為三層,低于24歲,低于31歲,高于30歲# dataset["Age"][dataset["Age"] < 24] = 0# dataset["Age"][(dataset["Age"] > 23) & (dataset["Age"] < 31)] = 1# dataset["Age"][30 < dataset["Age"]] = 2# print(dataset.info())# 將數(shù)據(jù)集的屬性和結(jié)果分開(kāi)X = dataset.iloc[:, :-1]Y = dataset.iloc[:, -1]# 使用skleran切分?jǐn)?shù)據(jù)集# X_train, X_test, Y_train, Y_test = train_test_split(X, Y, train_size=0.7, shuffle=True)# else直接使用數(shù)據(jù)集作為測(cè)試集X_train = X_test = XY_train = Y_test = Y# 擬合e = decisionTree.fit(X_train, Y_train, threshold=-1)# 保存決策樹(shù)decisionTree.save("decisionTree.txt")# 加載決策樹(shù)decisionTree.load("decisionTree.txt")# 預(yù)測(cè)predict_y = decisionTree.predict(X_test)# 評(píng)估decisionTree.score(Y_test)# 可視化輸出(html格式)# visualOutput可選參數(shù)outputFormat=["md", "html"],direction方向,設(shè)置決策樹(shù)的方向=["LR","RL","TD","DT"],默認(rèn)TD,從上到下decisionTree.visualOutput(savePath="decisionTree.html", outputFormat="html")

    實(shí)驗(yàn)結(jié)果(決策樹(shù))

    debug模式

    使用demo數(shù)據(jù)集運(yùn)行

    2020-10-14 00:47:19,827-[root] [DEBUG] [best_empirical_entropy]: now dataset shape is (14, 5), column is ['年齡', '有工作', '是學(xué)生', '信貸情況', 'DECISION_tempADD'] 2020-10-14 00:47:19,827-[root] [DEBUG] [best_empirical_entropy]: empirical_entropy is 0.9402859586706311 2020-10-14 00:47:19,831-[root] [DEBUG] [best_empirical_entropy]: now is 年齡 2020-10-14 00:47:19,849-[root] [DEBUG] [best_empirical_entropy]: now label is 2, chooseData shape is (5, 4), Ans count: [3, 2], entropy: 0.9709505944546686 2020-10-14 00:47:19,859-[root] [DEBUG] [best_empirical_entropy]: now label is 0, chooseData shape is (5, 4), Ans count: [3, 2], entropy: 0.9709505944546686 2020-10-14 00:47:19,865-[root] [DEBUG] [best_empirical_entropy]: now label is 1, chooseData shape is (4, 4), Ans count: [4], entropy: 0.0 2020-10-14 00:47:19,865-[root] [DEBUG] [best_empirical_entropy]: entropy: 0.6935361388961918, 年齡 informationGain:0.24674981977443933 2020-10-14 00:47:19,868-[root] [DEBUG] [best_empirical_entropy]: now is 有工作 2020-10-14 00:47:19,880-[root] [DEBUG] [best_empirical_entropy]: now label is 1, chooseData shape is (6, 4), Ans count: [4, 2], entropy: 0.9182958340544896 2020-10-14 00:47:19,889-[root] [DEBUG] [best_empirical_entropy]: now label is 2, chooseData shape is (4, 4), Ans count: [2, 2], entropy: 1.0 2020-10-14 00:47:19,896-[root] [DEBUG] [best_empirical_entropy]: now label is 0, chooseData shape is (4, 4), Ans count: [3, 1], entropy: 0.8112781244591328 2020-10-14 00:47:19,897-[root] [DEBUG] [best_empirical_entropy]: entropy: 0.9110633930116763, 有工作 informationGain:0.02922256565895487 2020-10-14 00:47:19,898-[root] [DEBUG] [best_empirical_entropy]: now is 是學(xué)生 2020-10-14 00:47:19,909-[root] [DEBUG] [best_empirical_entropy]: now label is 1, chooseData shape is (7, 4), Ans count: [6, 1], entropy: 0.5916727785823275 2020-10-14 00:47:19,917-[root] [DEBUG] [best_empirical_entropy]: now label is 0, chooseData shape is (7, 4), Ans count: [4, 3], entropy: 0.9852281360342515 2020-10-14 00:47:19,918-[root] [DEBUG] [best_empirical_entropy]: entropy: 0.7884504573082896, 是學(xué)生 informationGain:0.15183550136234159 2020-10-14 00:47:19,920-[root] [DEBUG] [best_empirical_entropy]: now is 信貸情況 2020-10-14 00:47:19,927-[root] [DEBUG] [best_empirical_entropy]: now label is 0, chooseData shape is (8, 4), Ans count: [6, 2], entropy: 0.8112781244591328 2020-10-14 00:47:19,937-[root] [DEBUG] [best_empirical_entropy]: now label is 1, chooseData shape is (6, 4), Ans count: [3, 3], entropy: 1.0 2020-10-14 00:47:19,937-[root] [DEBUG] [best_empirical_entropy]: entropy: 0.8921589282623617, 信貸情況 informationGain:0.04812703040826949 2020-10-14 00:47:19,937-[root] [DEBUG] [best_empirical_entropy]: Choose 年齡:0.24674981977443933 2020-10-14 00:47:19,940-[root] [DEBUG] [id3]: now choose_column:年齡, label: 2 2020-10-14 00:47:19,950-[root] [DEBUG] [best_empirical_entropy]: now dataset shape is (5, 4), column is ['有工作', '是學(xué)生', '信貸情況', 'DECISION_tempADD'] 2020-10-14 00:47:19,950-[root] [DEBUG] [best_empirical_entropy]: empirical_entropy is 0.9709505944546686 2020-10-14 00:47:19,953-[root] [DEBUG] [best_empirical_entropy]: now is 有工作 2020-10-14 00:47:19,964-[root] [DEBUG] [best_empirical_entropy]: now label is 1, chooseData shape is (3, 3), Ans count: [2, 1], entropy: 0.9182958340544896 2020-10-14 00:47:19,974-[root] [DEBUG] [best_empirical_entropy]: now label is 0, chooseData shape is (2, 3), Ans count: [1, 1], entropy: 1.0 2020-10-14 00:47:19,974-[root] [DEBUG] [best_empirical_entropy]: entropy: 0.9509775004326937, 有工作 informationGain:0.01997309402197489 2020-10-14 00:47:19,976-[root] [DEBUG] [best_empirical_entropy]: now is 是學(xué)生 2020-10-14 00:47:19,983-[root] [DEBUG] [best_empirical_entropy]: now label is 1, chooseData shape is (3, 3), Ans count: [2, 1], entropy: 0.9182958340544896 2020-10-14 00:47:19,992-[root] [DEBUG] [best_empirical_entropy]: now label is 0, chooseData shape is (2, 3), Ans count: [1, 1], entropy: 1.0 2020-10-14 00:47:19,992-[root] [DEBUG] [best_empirical_entropy]: entropy: 0.9509775004326937, 是學(xué)生 informationGain:0.01997309402197489 2020-10-14 00:47:19,995-[root] [DEBUG] [best_empirical_entropy]: now is 信貸情況 2020-10-14 00:47:20,004-[root] [DEBUG] [best_empirical_entropy]: now label is 0, chooseData shape is (3, 3), Ans count: [3], entropy: 0.0 2020-10-14 00:47:20,013-[root] [DEBUG] [best_empirical_entropy]: now label is 1, chooseData shape is (2, 3), Ans count: [2], entropy: 0.0 2020-10-14 00:47:20,013-[root] [DEBUG] [best_empirical_entropy]: entropy: 0.0, 信貸情況 informationGain:0.9709505944546686 2020-10-14 00:47:20,013-[root] [DEBUG] [best_empirical_entropy]: Choose 信貸情況:0.9709505944546686 2020-10-14 00:47:20,015-[root] [DEBUG] [id3]: now choose_column:信貸情況, label: 0 2020-10-14 00:47:20,021-[root] [DEBUG] [id3]: select decision 1, result_type:[3], dataset column:(3, 3), lower than threshold:False 2020-10-14 00:47:20,021-[root] [DEBUG] [id3]: now choose_column:信貸情況, label: 1 2020-10-14 00:47:20,027-[root] [DEBUG] [id3]: select decision 0, result_type:[2], dataset column:(2, 3), lower than threshold:False 2020-10-14 00:47:20,028-[root] [DEBUG] [id3]: now choose_column:年齡, label: 0 2020-10-14 00:47:20,037-[root] [DEBUG] [best_empirical_entropy]: now dataset shape is (5, 4), column is ['有工作', '是學(xué)生', '信貸情況', 'DECISION_tempADD'] 2020-10-14 00:47:20,037-[root] [DEBUG] [best_empirical_entropy]: empirical_entropy is 0.9709505944546686 2020-10-14 00:47:20,038-[root] [DEBUG] [best_empirical_entropy]: now is 有工作 2020-10-14 00:47:20,046-[root] [DEBUG] [best_empirical_entropy]: now label is 2, chooseData shape is (2, 3), Ans count: [2], entropy: 0.0 2020-10-14 00:47:20,052-[root] [DEBUG] [best_empirical_entropy]: now label is 1, chooseData shape is (2, 3), Ans count: [1, 1], entropy: 1.0 2020-10-14 00:47:20,060-[root] [DEBUG] [best_empirical_entropy]: now label is 0, chooseData shape is (1, 3), Ans count: [1], entropy: 0.0 2020-10-14 00:47:20,060-[root] [DEBUG] [best_empirical_entropy]: entropy: 0.4, 有工作 informationGain:0.5709505944546686 2020-10-14 00:47:20,061-[root] [DEBUG] [best_empirical_entropy]: now is 是學(xué)生 2020-10-14 00:47:20,068-[root] [DEBUG] [best_empirical_entropy]: now label is 0, chooseData shape is (3, 3), Ans count: [3], entropy: 0.0 2020-10-14 00:47:20,076-[root] [DEBUG] [best_empirical_entropy]: now label is 1, chooseData shape is (2, 3), Ans count: [2], entropy: 0.0 2020-10-14 00:47:20,076-[root] [DEBUG] [best_empirical_entropy]: entropy: 0.0, 是學(xué)生 informationGain:0.9709505944546686 2020-10-14 00:47:20,077-[root] [DEBUG] [best_empirical_entropy]: now is 信貸情況 2020-10-14 00:47:20,085-[root] [DEBUG] [best_empirical_entropy]: now label is 0, chooseData shape is (3, 3), Ans count: [2, 1], entropy: 0.9182958340544896 2020-10-14 00:47:20,092-[root] [DEBUG] [best_empirical_entropy]: now label is 1, chooseData shape is (2, 3), Ans count: [1, 1], entropy: 1.0 2020-10-14 00:47:20,092-[root] [DEBUG] [best_empirical_entropy]: entropy: 0.9509775004326937, 信貸情況 informationGain:0.01997309402197489 2020-10-14 00:47:20,092-[root] [DEBUG] [best_empirical_entropy]: Choose 是學(xué)生:0.9709505944546686 2020-10-14 00:47:20,094-[root] [DEBUG] [id3]: now choose_column:是學(xué)生, label: 0 2020-10-14 00:47:20,100-[root] [DEBUG] [id3]: select decision 0, result_type:[3], dataset column:(3, 3), lower than threshold:False 2020-10-14 00:47:20,100-[root] [DEBUG] [id3]: now choose_column:是學(xué)生, label: 1 2020-10-14 00:47:20,106-[root] [DEBUG] [id3]: select decision 1, result_type:[2], dataset column:(2, 3), lower than threshold:False 2020-10-14 00:47:20,106-[root] [DEBUG] [id3]: now choose_column:年齡, label: 1 2020-10-14 00:47:20,112-[root] [DEBUG] [id3]: select decision 1, result_type:[4], dataset column:(4, 4), lower than threshold:False 2020-10-14 00:47:20,112-[root] [INFO] [fit]: decision_tree leaf:5 2020-10-14 00:47:20,113-[root] [INFO] [save]: 決策樹(shù)已保存,位置:decisionTree.txt 2020-10-14 00:47:20,123-[root] [DEBUG] [score]: y_acutalTrue:9, y_acutalFalse:5, y_predictTrue:9, y_true:9, y_total:14

    總結(jié)

    以上是生活随笔為你收集整理的【Python机器学习】决策树ID3算法结果可视化附源代码 对UCI数据集Caesarian Section进行分类的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    成人毛片a | 久久久久久久免费 | 日韩成人中文字幕 | 四虎成人精品在永久免费 | 成人小视频在线播放 | 欧美va天堂va视频va在线 | 手机看片福利 | 狠狠狠综合 | 国产一级精品视频 | 国产小视频你懂的在线 | 国产91aaa| 久久免费一级片 | 最新av在线播放 | 91久久久久久国产精品 | 国产欧美综合在线观看 | 黄色网址a | 午夜精品一二区 | 五月天伊人 | 亚洲一区二区三区在线看 | 欧美二区在线播放 | 国内精品亚洲 | 97人人模人人爽人人喊中文字 | 玖玖视频免费在线 | 国产精品一区在线播放 | 久久午夜视频 | 国内精品在线观看视频 | 夜夜干夜夜 | 91精品系列| 亚洲精品玖玖玖av在线看 | 国产专区精品 | 国产一级片直播 | 在线三级中文 | 久久国产精品免费视频 | 亚洲激情av | 九九久久婷婷 | 亚洲国产精品人久久电影 | 丁香综合网 | 久久久国产影视 | 国产视频久久久 | 国产成人精品一区二三区 | 天天曰视频 | 欧美日韩国产一区二区三区在线观看 | 五月婷久| 色吊丝在线永久观看最新版本 | 韩国精品在线 | 国产欧美精品在线观看 | 亚洲精品福利在线观看 | 亚洲视频在线播放 | 一区二区精 | 久久一区二区三区超碰国产精品 | 超碰97公开 | 欧亚日韩精品一区二区在线 | 日韩免费一级a毛片在线播放一级 | 免费日韩电影 | 国产亚洲91| 视频在线观看一区 | 欧美 日韩 性 | 精品中文字幕在线 | 久久免费公开视频 | 97av在线视频 | 国产精品毛片一区二区在线看 | 三级av在线免费观看 | 亚洲精品美女在线观看 | 96国产精品视频 | 91精品网站在线观看 | 黄色毛片网站在线观看 | 久久精品一区二区三区视频 | 日韩高清一区二区 | 久久精品免费播放 | 久久久国产精品人人片99精片欧美一 | 久久国产精品免费观看 | 色综合天 | 韩国精品视频在线观看 | 久久久穴 | 97成人精品视频在线观看 | 日韩日韩日韩日韩 | 日韩在线观看视频免费 | 亚洲毛片一区二区三区 | 中文字幕一区二区三区四区在线视频 | 亚洲视频www | 国产69精品久久久久久 | 久久久国产精品视频 | 色网站免费在线看 | 国产在线不卡视频 | 永久免费的啪啪网站免费观看浪潮 | 亚洲精品一区二区三区四区高清 | 久久字幕 | 日韩啪啪小视频 | 91中文在线观看 | av九九| 99爱在线 | 日韩国产精品久久久久久亚洲 | 久久免费播放 | 久热免费在线观看 | 亚洲国产高清在线 | 国产又粗又猛又黄又爽 | 日韩一级片网址 | 国产一二三区在线观看 | 日本成人免费在线观看 | 国内精品久久久久国产 | 五月激情久久久 | 国产一级二级三级视频 | 中文字幕在线日亚洲9 | 国产亚洲精品无 | 久久久久成人精品 | 久久久精品国产免费观看同学 | 18pao国产成视频永久免费 | 国产在线a免费观看 | 国产在线精 | av在线小说| 婷婷精品国产一区二区三区日韩 | 日韩av看片| 91成人在线观看喷潮 | www.99久久.com | 一级大片在线观看 | 国产精品 中文字幕 亚洲 欧美 | 国产欧美综合在线观看 | 嫩嫩影院理论片 | 欧美色一色| 日韩动漫免费观看高清完整版在线观看 | 日韩专区在线观看 | 九色91福利 | 欧美日韩一级久久久久久免费看 | 久久免费国产电影 | 国内精自线一二区永久 | 国产精品免费小视频 | 操碰av | 亚洲国产久 | 亚洲一区 av| 久久麻豆视频 | 亚洲最大免费成人网 | 一区二区视频在线免费观看 | 久久精品2 | 在线导航av| 91成人网在线观看 | 久久se视频 | 国产日本在线播放 | 国产成人精品亚洲a | 干干干操操操 | 日韩欧美在线综合网 | 91在线永久 | 成人黄色在线观看视频 | www.午夜| 伊人射 | www免费在线观看 | 国产一二三区在线观看 | 日韩久久精品一区二区三区下载 | 欧美成人高清 | 中文av在线播放 | 国产免费又粗又猛又爽 | av免费在线网 | 91视频国产免费 | 婷婷中文字幕综合 | 在线观看亚洲免费视频 | 五月激情电影 | 91在线观 | av成人在线电影 | 久久av在线播放 | 99免在线观看免费视频高清 | 欧美日韩免费一区二区 | 国产精品原创在线 | 亚洲国产日本 | 国产一在线精品一区在线观看 | av天天草 | 娇妻呻吟一区二区三区 | 日韩大片在线 | 国产精品igao视频网网址 | 中文字幕精品一区二区三区电影 | 91精品视频网站 | 久久精品国产精品亚洲精品 | 欧美色综合天天久久综合精品 | 日韩av在线一区二区 | 成人av资源网 | 在线天堂8√ | 欧美日韩在线电影 | 日本特黄特色aaa大片免费 | 亚洲jizzjizz日本少妇 | 久久天天躁夜夜躁狠狠85麻豆 | 久久久www成人免费精品张筱雨 | 91女子私密保健养生少妇 | 日韩在线播放视频 | 在线观看免费av网站 | 久久精品中文字幕少妇 | 不卡视频一区二区三区 | 91人人爽人人爽人人精88v | 日韩在线免费播放 | 成人毛片在线观看 | av色一区 | 天天干夜夜爱 | 高清不卡毛片 | 成人av高清在线 | 成人国产精品久久久春色 | 97精品国自产拍在线观看 | 丝袜美女在线观看 | 91视频在线免费看 | 精品免费一区二区三区 | 成人国产精品 | 正在播放 国产精品 | 国产精品九九九 | 69绿帽绿奴3pvideos | 国产a精品 | 欧美日韩视频在线观看一区二区 | 国产96在线视频 | www.久草.com | av一二三区| 视频在线观看99 | 在线中文字幕网站 | 黄色资源在线 | 三级视频国产 | 免费看精品久久片 | 日本在线精品视频 | 久久久这里有精品 | av在线电影网站 | 三级动态视频在线观看 | 一区二区三区精品在线视频 | 久久五月情影视 | 国产日韩欧美中文 | 亚洲麻豆精品 | 亚洲精品午夜aaa久久久 | 国产精品伦一区二区三区视频 | 日韩丝袜 | 色噜噜狠狠狠狠色综合 | av成人在线电影 | 免费国产黄线在线观看视频 | 亚洲精品白浆高清久久久久久 | 99久热在线精品视频成人一区 | 五月婷婷六月丁香激情 | 麻豆视传媒官网免费观看 | 91精品在线免费观看视频 | 日韩黄色av网站 | 日日干夜夜操视频 | av在线免费网 | 国产原创在线观看 | 尤物97国产精品久久精品国产 | 97在线免费视频观看 | 综合久久一本 | 国产在线高清精品 | 黄色三级网站 | 午夜精品福利一区二区 | 日韩一区精品 | 亚洲国产日韩欧美在线 | 国产专区日韩专区 | 国产免费成人 | 国产精品一区在线 | 国内精品视频久久 | 久久黄色影院 | www178ccom视频在线 | 久久久精品福利视频 | 黄污视频网站大全 | 色婷婷免费视频 | 成人免费影院 | 干亚洲少妇| 在线观看免费一级片 | 国产无遮挡又黄又爽在线观看 | 久久久久国产一区二区三区四区 | 成人在线黄色 | 免费看一级特黄a大片 | 国产成人精品日本亚洲999 | 亚洲国产高清视频 | 三上悠亚一区二区在线观看 | 国产精品粉嫩 | 日韩av视屏在线观看 | 91亚色在线观看 | 精品免费99久久 | 99热精品国产一区二区在线观看 | 国产综合片 | 特黄特黄的视频 | 久草视频看看 | 天天综合导航 | 久久精品视频日本 | 在线观看av麻豆 | 免费情缘 | 最近中文字幕大全 | 日韩美精品视频 | 亚洲精品国产高清 | 精品免费观看 | 在线亚洲日本 | 国产理论一区二区三区 | 国产精品乱看 | 97超视频在线观看 | 亚洲欧美视频一区二区三区 | 麻豆传媒一区二区 | 国产视频一区二区在线观看 | 国产精品99久久久久人中文网介绍 | 韩日精品在线 | 超级碰视频 | 在线观看亚洲精品 | 日韩激情视频在线 | 国产又粗又猛又色又黄网站 | 色久五月 | 五月婷婷六月丁香在线观看 | 久草精品视频在线看网站免费 | 国产香蕉久久精品综合网 | 亚洲另类久久 | 日韩特黄一级欧美毛片特黄 | 久久香蕉国产精品麻豆粉嫩av | 国产视频欧美视频 | 成人黄色电影在线观看 | 午夜性盈盈 | 色久综合 | 日本在线观看一区二区三区 | 免费av在线网站 | 福利视频网站 | 91视频88av| 日韩欧美有码在线 | 99热精品久久 | 国产超碰在线 | 亚洲综合情 | 婷婷久久网 | 激情视频免费观看 | 人人插人人做 | 日韩在线欧美在线 | 五月天综合激情网 | 日韩欧美视频免费在线观看 | 日韩欧美在线一区 | 黄色软件视频网站 | 久久99久久精品 | 黄色亚洲大片免费在线观看 | 久久99精品久久久久久三级 | 午夜在线资源 | 欧美地下肉体性派对 | 日韩高清观看 | a级片在线播放 | 国产视频精品久久 | 亚洲污视频| 亚洲一区二区高潮无套美女 | 精品中文字幕在线观看 | 免费亚洲视频 | 午夜精品一二三区 | 国产精品美女在线 | 日本激情视频中文字幕 | 99视频精品免费视频 | 玖玖在线看 | 丁香色综合 | 免费视频国产 | 国产成视频在线观看 | 日韩在线高清免费视频 | 国产亚洲成av人片在线观看桃 | 精品亚洲成a人在线观看 | 激情五月av | 日韩av有码在线 | 97手机电影网 | 国产亚洲欧美在线视频 | 久久精品久久精品久久39 | 中文字字幕在线 | 在线观看免费91 | 中国一 片免费观看 | 最新国产视频 | 成年人在线免费看视频 | 日本中文字幕网 | 精产嫩模国品一二三区 | 99精品欧美一区二区三区黑人哦 | 久久综合成人 | 麻豆精品国产传媒 | 精品久久久成人 | 中文字幕亚洲精品在线观看 | 在线视频精品 | 国内精品美女在线观看 | 亚洲精品av中文字幕在线在线 | 国产高清久久久久 | a黄色片在线观看 | 亚洲精品456在线播放第一页 | 成人在线观看资源 | 女人高潮一级片 | 欧美日韩高清一区二区 国产亚洲免费看 | 欧美日韩高清 | 成人91在线 | 一区二区视频免费在线观看 | 久草爱视频 | 国产高清精 | 在线成人观看 | 色综合久久中文综合久久牛 | 一区二区三区中文字幕在线观看 | 91麻豆精品91久久久久同性 | 黄色三级视频片 | 午夜精品一二区 | bayu135国产精品视频 | 叶爱av在线| 久久激情电影 | 国产自在线观看 | 91免费看黄色 | 亚洲视频在线观看 | 欧美精品久久久久久久久久丰满 | 天天综合网在线 | 亚洲国产小视频在线观看 | 亚洲国内精品在线 | 精品久久毛片 | 欧美韩国日本在线 | 日韩精品欧美精品 | 中文久草| 91夫妻视频 | 国产精品不卡在线观看 | 国产一区影院 | 国产午夜精品一区二区三区四区 | 久久久久久久久久久久久9999 | 午夜视频一区二区三区 | aa一级片 | 国产一区免费 | 二区三区毛片 | 狠狠狠狠狠狠天天爱 | 在线91视频 | 国内精品久久久久久中文字幕 | 91麻豆精品国产91久久久无限制版 | 成人黄色免费观看 | 在线亚洲欧美视频 | 亚洲少妇xxxx | av丝袜美腿 | 久草精品视频在线观看 | 99久久婷婷国产一区二区三区 | 91污在线观看 | 国产在线视频一区二区三区 | 日本成址在线观看 | 国产亚洲视频在线 | 国产第一页在线观看 | 国产精品永久免费视频 | 亚洲伊人成综合网 | 午夜影视av | 91精品视频网站 | 香蕉视频色 | 日韩69av| 国产a网站 | 玖玖精品在线 | a v在线观看 | 免费观看mv大片高清 | 国产不卡在线播放 | 超碰在线中文字幕 | 久草免费看 | 亚洲影视九九影院在线观看 | 国产一区二区久久 | 欧美久久电影 | 久久久久久国产精品 | 欧美不卡在线 | 91最新网址在线观看 | 国产精品久久久久亚洲影视 | 2022中文字幕在线观看 | 久久免费a | 永久精品视频 | 精品在线小视频 | 国产最新视频在线 | av在线免费观看不卡 | 精品久久久久久综合 | 午夜婷婷综合 | 日韩国产精品久久 | 射久久 | 亚洲三级精品 | 一区二区三区在线观看 | 久久69av | 欧美另类sm图片 | 又黄又爽又湿又无遮挡的在线视频 | 日韩亚洲在线视频 | 日韩精品不卡 | 97在线精品 | 亚洲一区二区三区精品在线观看 | 亚洲激情在线观看 | 国产精品麻豆果冻传媒在线播放 | 日韩中文在线字幕 | 亚洲欧洲精品视频 | 久久久久国产精品视频 | 99精品国产在热久久下载 | 右手影院亚洲欧美 | 最新亚洲视频 | 亚洲人成人99网站 | 午夜手机电影 | 超碰激情在线 | 欧美精品亚洲精品 | 97精品国产91久久久久久久 | 黄色看片| 国产又粗又猛又爽又黄的视频免费 | 成人黄色电影在线 | 日韩在线观看你懂得 | 国产资源网 | 在线天堂视频 | av在线影片| 精品一区精品二区 | 在线观看欧美成人 | 国产视频亚洲精品 | 国产麻豆果冻传媒在线观看 | 国产亚洲精品综合一区91 | 日韩精品电影在线播放 | av三区在线| 日韩精品一区二区在线视频 | 天天久久综合 | 国产精品区二区三区日本 | 蜜桃视频在线视频 | 国产精品成人在线观看 | 激情五月婷婷综合网 | 日韩亚洲国产精品 | 国产精品一区二区三区在线播放 | 天天干天天干天天操 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 99久久精品久久久久久清纯 | 国产精品视频久久久 | 视频在线观看亚洲 | 久久中文欧美 | 天天草天天插 | 27xxoo无遮挡动态视频 | av电影免费在线看 | 天天色天天综合网 | 激情五月婷婷综合 | 国产精品国产三级国产aⅴ无密码 | 国产成视频在线观看 | 中文字幕一区二区三区视频 | 美女免费视频网站 | 五月天免费网站 | 麻豆成人网 | 久草视频网 | 香蕉网址| 久草在线费播放视频 | 精品99免费视频 | 欧美日韩一级在线 | 91精品国产乱码久久桃 | а天堂中文最新一区二区三区 | 在线 精品 国产 | 日韩精品极品视频 | 国产一区二区在线影院 | 亚洲欧美乱综合图片区小说区 | 大胆欧美gogo免费视频一二区 | 97成人在线视频 | 国产精品99久久久久久小说 | 亚州国产精品 | 亚洲激情| 欧美一区二区在线刺激视频 | 国产69精品久久久久久久久久 | 91丨九色丨国产丨porny精品 | 在线观看你懂的网站 | 午夜精品一区二区三区视频免费看 | 中文字幕在线电影 | 最新超碰在线 | 天天干天天干天天干天天干天天干天天干 | 日本精品免费看 | 中文字幕av在线电影 | 欧美精品成人在线 | 91九色性视频| 欧美日韩中文字幕在线视频 | 天天操天天摸天天射 | 久久成人一区 | 韩国av免费观看 | 狠狠的操狠狠的干 | 久久综合射| 丁香五月缴情综合网 | 欧美日本不卡 | 日本九九视频 | 国产高清专区 | 在线观看免费黄视频 | 玖玖国产精品视频 | 四虎免费在线观看视频 | 成年人免费av网站 | 日韩av免费观看网站 | 精品久久久久亚洲 | 成人a毛片| 欧美日韩免费一区二区三区 | 久久不卡日韩美女 | 一区二区三区四区在线免费观看 | 久草影视在线观看 | h文在线观看免费 | 日日夜夜免费精品视频 | 亚洲精品在 | 欧美日产一区 | 狠狠久久综合 | 免费日韩一级片 | 三上悠亚一区二区在线观看 | 久久久免费精品视频 | 国际精品久久 | 99国产精品久久久久老师 | 国产人免费人成免费视频 | 欧美精品网站 | 久久精品小视频 | 亚洲国产大片 | 五月天久久激情 | 亚洲 欧美 91 | 久草在线在线视频 | 久青草视频 | 青青河边草观看完整版高清 | 欧美a级片免费看 | 97在线超碰 | 国产91全国探花系列在线播放 | 97免费中文视频在线观看 | 日韩影片在线观看 | 婷婷在线免费 | 日本中文字幕在线 | 国内精品在线观看视频 | 在线观看www. | 狠狠躁日日躁狂躁夜夜躁 | 五月天激情综合 | 亚洲一级黄色片 | 91在线免费看片 | 日韩网站在线免费观看 | 涩涩色亚洲一区 | 91在线观看高清 | 中文字幕免费高清 | 欧美人交a欧美精品 | 欧美最爽乱淫视频播放 | 99 精品 在线 | 夜色.com| 国产精品一区二区久久精品爱微奶 | 小草av在线播放 | 免费黄色在线播放 | 亚洲精选国产 | 高清国产在线一区 | 91视频啊啊啊 | 青青网视频| 国产一级性生活视频 | 深爱开心激情 | 午夜精品av在线 | 操操操人人人 | 亚洲永久精品在线 | 97香蕉久久超级碰碰高清版 | 欧美一级黄大片 | 特级西西www44高清大胆图片 | 国产成人一区二 | 色偷偷中文字幕 | 91亚洲精品国产 | 一区二区三区四区五区在线视频 | 国产亚洲成av人片在线观看桃 | 99久久精品日本一区二区免费 | 四虎8848免费高清在线观看 | 一色屋精品视频在线观看 | 日韩精品中文字幕有码 | 国产精品久久免费看 | 天天撸夜夜操 | 91成人精品国产刺激国语对白 | 91精品一区国产高清在线gif | 在线免费黄网站 | 蜜臀久久99精品久久久无需会员 | 国产精品国内免费一区二区三区 | 久久精品视频在线播放 | 亚洲美女精品区人人人人 | 在线一区二区三区 | 欧美性做爰猛烈叫床潮 | 色婷婷狠狠18| 中文字幕在线播放av | 午夜手机电影 | 午夜婷婷网 | 久久免费精品一区二区三区 | 91 中文字幕| 999久久久久久 | 韩国一区在线 | 天天综合色网 | 91丨九色丨蝌蚪丨老版 | 久久国产成人午夜av影院潦草 | 日韩二三区 | 成人电影毛片 | 亚洲麻豆精品 | 国产97免费 | 国产一区二区精品91 | 午夜视频免费 | 成人高清在线观看 | 国产精品2020 | 狠狠的操狠狠的干 | 亚洲成av人影片在线观看 | 九九免费精品 | 又污又黄网站 | 亚洲精选久久 | 天天舔夜夜操 | 国产中文字幕第一页 | 久久久久久久国产精品影院 | 精品国产乱码久久久久 | 99精品国自产在线 | 亚洲国产视频在线 | 亚洲精品午夜国产va久久成人 | www.色综合.com| 欧美最新大片在线看 | 亚洲爱视频 | 四虎最新入口 | 欧美日韩精品久久久 | www操操| 国产精品高清免费在线观看 | 国产淫片 | 婷婷综合伊人 | 一区二区三区中文字幕在线观看 | 一区二区三区在线视频111 | 一级黄视频 | 久久久久久国产精品免费 | 国产精品va视频 | 91麻豆精品国产91久久久更新时间 | 亚洲狠狠操 | 日本黄色免费在线观看 | 正在播放久久 | 国产精品视频免费在线观看 | 豆豆色资源网xfplay | 久久图 | 成人h在线播放 | 国产美女久久 | 97精品久久人人爽人人爽 | 亚洲一区欧美精品 | 成人小视频在线免费观看 | 激情久久网 | 在线观看一级 | 999ZYZ玖玖资源站永久 | 中文字幕精品一区二区精品 | 中文字幕一区二区三区精华液 | 国产在线毛片 | 国产精品伦一区二区三区视频 | 成人在线中文字幕 | 福利一区二区在线 | 97国产小视频 | 91精品免费在线视频 | 999成人免费视频 | 欧美一区二区三区在线播放 | 91探花在线 | 久久综合久久综合这里只有精品 | 久久成人高清 | 综合天堂av久久久久久久 | 狠狠色狠狠色终合网 | 国产中文字幕91 | 亚洲精品人人 | 特黄特色特刺激视频免费播放 | 亚洲欧美视频在线 | 国产免费资源 | 激情综合啪 | 午夜视频在线瓜伦 | 99热手机在线观看 | 久久久久久免费网 | 91九色在线观看 | 91麻豆精品国产91久久久无需广告 | 国产精品男女视频 | 99在线观看精品 | 天天射天天干天天爽 | 国产精品欧美久久久久久 | 超碰在线97国产 | 成人中心免费视频 | 日日干夜夜爱 | 福利一区二区三区四区 | 日韩精品最新在线观看 | 天天射天天爱天天干 | 国产九色在线播放九色 | 久久精品精品电影网 | 欧美日韩亚洲在线观看 | 久久精品这里都是精品 | 国产精彩视频 | 色婷婷中文 | 日韩3区 | 国产精品美女999 | 亚洲国产97在线精品一区 | 欧美电影黄色 | 最新久久免费视频 | 激情综合狠狠 | 久久乐九色婷婷综合色狠狠182 | 91大神一区二区三区 | 成年人免费观看国产 | 中文字幕一区在线观看视频 | av在线免费观看网站 | 美女视频黄免费的久久 | 国产日产精品久久久久快鸭 | 亚洲精品国产精品国自产观看 | 亚洲成成品网站 | 99热这里只有精品免费 | av中文字幕网址 | 久草久草在线 | 在线观看91久久久久久 | 国产精品不卡av | 色综合天天做天天爱 | 97人人添人澡人人爽超碰动图 | 国产美女精品视频 | 在线国产日韩 | 色综合天天天天做夜夜夜夜做 | 99视频国产精品免费观看 | 国产日韩精品在线观看 | 久久成人在线视频 | 国产在线一区观看 | 免费av在 | 天天天在线综合网 | 久草网在线视频 | 欧美成a人片在线观看久 | 狠狠狠狠狠狠狠干 | 天天爱综合 | 日韩在线观看你懂得 | 亚洲日韩中文字幕 | 日本在线中文在线 | 久久精品成人欧美大片古装 | 成人app在线播放 | 成人免费在线视频观看 | 亚洲精品456在线播放乱码 | 国产精品第二页 | 婷婷丁香色 | 欧美日韩国产二区 | 四季av综合网站 | 精品久久久久久久久久岛国gif | 91黄视频在线 | 免费看91的网站 | 国产精品刺激对白麻豆99 | 激情久久综合 | 182午夜在线观看 | 天天看天天干天天操 | 超碰在线天天 | 国产h片在线观看 | www黄色| 丁香午夜 | 国内精品福利视频 | 91在线视频免费观看 | 国产视频九色蝌蚪 | 99av在线视频| 欧美日本国产在线观看 | 中文字幕在线看 | 91成人精品国产刺激国语对白 | 精品美女在线视频 | 国产99免费 | 亚洲另类视频在线 | 奇米影视777四色米奇影院 | 亚洲欧美va | 欧洲av在线 | 久久国产一二区 | 久久曰视频 | 亚洲精品啊啊啊 | 日韩一级电影网站 | 久久综合久久综合这里只有精品 | 尤物97国产精品久久精品国产 | 97看片 | 亚洲婷婷免费 | 日韩精品一区在线观看 | a一片一级| 五月开心色 | 九九热在线视频 | 久久综合五月婷婷 | 中文字幕在线不卡国产视频 | 日日摸日日添日日躁av | 麻豆成人在线观看 | 四虎成人精品在永久免费 | 国产区久久 | 97视频免费在线看 | av黄色影院 | 亚洲 欧美变态 另类 综合 | 国产人成在线观看 | 亚洲欧美日韩一区二区三区在线观看 | 涩av在线 | 网站在线观看日韩 | 色综合久久88色综合天天6 | 国产精品久久久一区二区三区网站 | 99久久免费看 | 日韩精品在线看 | 免费观看www小视频的软件 | 91理论电影| 深爱激情站| 免费精品人在线二线三线 | 五月天亚洲综合小说网 | 亚州国产精品视频 | 免费h漫在线观看 | 亚洲天堂网视频在线观看 | 精品国产成人 | 91中文字幕网 | 色99久久| 一区二区三区日韩在线 | 美女久久久久久久 | 中文字幕二区在线观看 | 午夜精品久久久久久久久久 | 91亚洲精品乱码久久久久久蜜桃 | 欧美日产在线观看 | 亚洲更新最快 | 91亚色视频| 精品在线视频一区 | 996久久国产精品线观看 | 亚洲一二视频 | 日韩一区正在播放 | 日韩久久久久久 | 波多野结衣亚洲一区二区 | 国产成人亚洲在线观看 | 国产亲近乱来精品 | 一区二区三区在线看 | 天堂资源在线观看视频 | 蜜桃视频色 | 日日添夜夜添 | 亚洲激情电影在线 | 免费在线一区二区 | 亚洲国产精品va在线看黑人动漫 | 欧美日韩在线免费视频 | 国产精品a久久久久 | 97av色| 超碰在线人人97 | 97香蕉久久国产在线观看 | 久久99热国产 | 亚洲天堂精品 | 日韩久久一区 | 国产精品一区在线 | 国产精品女人久久久久久 | 香蕉视频在线观看免费 | 日本中文在线播放 | 五月婷婷中文网 | 日韩精品久久一区二区三区 | 日日干美女| 免费视频区 | 久久久久久久久久国产精品 | 超碰97国产在线 | 国产精品 中文在线 | 91色国产在线 | 999久久久欧美日韩黑人 | 亚洲一片黄 | 精品久久久久免费极品大片 | 在线成人性视频 | 国产尤物视频在线 | 日日碰狠狠添天天爽超碰97久久 | 亚洲精品午夜久久久久久久 | 三上悠亚在线免费 | 国产伦理一区二区三区 | 国产一区二区成人 | 毛片3 | 久久久国产精品一区二区中文 | 久久国产精品色av免费看 | 9999激情 | 在线看片91 | 日韩精品黄| 亚洲 av网站| 久热免费 | 色在线中文字幕 | 91免费在线看片 | 免费观看9x视频网站在线观看 | 亚洲无人区小视频 | 精品国产电影一区 | 在线观看日韩国产 | 97视频免费在线观看 | 日韩二三区 | 在线综合 亚洲 欧美在线视频 | 五月婷久久 | 亚洲乱亚洲乱妇 | 久久久久久久久久久免费 | 欧美在线free| 久久综合九色九九 | 精品a视频 | 日韩精品一区二区三区免费观看 | 久久精品五月 | 97精品国产97久久久久久久久久久久 | 91精品国产乱码久久桃 | 国产一线天在线观看 | 久久成人在线视频 | 视频在线日韩 | 欧美精品免费视频 | 国产精品中文字幕在线播放 | 欧美久久电影 | 97超碰在线久草超碰在线观看 | 国产黄色美女 | 国产高清区 | 国产精成人品免费观看 | 91在线最新 | 新版资源中文在线观看 | 中文字幕永久免费 | 久久久久欧美精品 | 亚洲免费在线视频 | 亚洲成人av一区二区 | 婷婷久久国产 | 久久久在线免费观看 | 日韩黄色免费在线观看 | 夜夜澡人模人人添人人看 | 国产一区麻豆 | 国产视频在线观看一区二区 | 国产精品麻豆果冻传媒在线播放 | 日韩在线中文字幕视频 | 在线看片a| 国产免费叼嘿网站免费 | 中文在线a∨在线 | 国产伦理久久精品久久久久_ | 国产一区在线观看视频 | 天堂av在线中文在线 | 日韩毛片一区 | 日韩美女久久 | 成人黄色小说在线观看 | 麻豆视频一区 | 国产成人一区二区精品非洲 | 黄色三级视频片 | 国产五月天婷婷 | 欧美色图亚洲图片 | 国产中文字幕在线播放 | 亚洲精品高清一区二区三区四区 | 午夜视频亚洲 | 欧美在线91| 国产在线看| 91精品在线免费 | 在线视频你懂得 | 国产一级片久久 | 午夜av色| 国产精品久久久久四虎 | 色播五月激情综合网 | 婷婷六月激情 | 日韩二区精品 | 久久久九九| 九九爱免费视频在线观看 | 久久久久欧美精品 | 91成人精品 | 久久久污| 麻豆一区二区三区视频 | 日韩精品视频在线观看免费 | 国产视频亚洲视频 | 亚洲综合色激情五月 | 日日爱网站 | 亚洲激情电影在线 | 夜夜夜夜猛噜噜噜噜噜初音未来 | www.亚洲激情.com | 丁香六月久久综合狠狠色 | 亚洲综合涩 | 国产亚洲在线 | 精品亚洲视频在线 | 高清不卡一区二区三区 | 中文一二区 | 国产精品久久久久久久免费大片 | 在线 成人 | 亚洲国产mv | 亚洲综合色站 | 五月婷婷影院 | 91免费版在线观看 | 日韩激情中文字幕 |