1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關(guān)咨詢
      選擇下列產(chǎn)品馬上在線溝通
      服務(wù)時(shí)間:8:30-17:00
      你可能遇到了下面的問題
      關(guān)閉右側(cè)工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
      python中怎么模擬決策樹

      本篇文章為大家展示了python中怎么模擬決策樹,內(nèi)容簡明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

      貴陽ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書合作)期待與您的合作!

      1,程序模擬決策樹特征選擇的三個(gè)準(zhǔn)則。

      import numpy as np
      import pandas as pd
      import matplotlib.pyplot as plt
      from sklearn.datasets import load_iris
      from sklearn.model_selection import train_test_split
      from collections import Counter
      import math
      from math import log
      import pprint
      
      # 課本例題數(shù)據(jù)
      def createData():
          datasets = [
              ['青年', '否', '否', '一般', '否'],
              ['青年', '否', '否', '好', '否'],
              ['青年', '是', '否', '好', '是'],
              ['青年', '是', '是', '一般', '是'],
              ['青年', '否', '否', '一般', '否'],
              ['中年', '否', '否', '一般', '否'],
              ['中年', '否', '否', '好', '否'],
              ['中年', '是', '是', '好', '是'],
              ['中年', '否', '是', '非常好', '是'],
              ['中年', '否', '是', '非常好', '是'],
              ['老年', '否', '是', '非常好', '是'],
              ['老年', '否', '是', '好', '是'],
              ['老年', '是', '否', '好', '是'],
              ['老年', '是', '否', '非常好', '是'],
              ['老年', '否', '否', '一般', '否']
          ]
          labels = ['年齡', '有工作', '有自己的房子', '信貸情況', '類別']
          return datasets, labels
      
      
      # 計(jì)算經(jīng)驗(yàn)熵
      def calc_ent(datasets):
          data_length = len(datasets)
          label_count = {}  # 用于記錄不同類別的個(gè)數(shù)
          for i in range(data_length):
              label = datasets[i][-1]  # 記錄了當(dāng)前一條數(shù)據(jù)的最后一維
              if label not in label_count:  # 如果第一次遇到新類別,先初始化
                  label_count[label] = 0
              label_count[label] += 1  # 類別個(gè)數(shù)加一
          # 計(jì)算熵。每次取出的p為當(dāng)前datasets集合的類別的個(gè)數(shù)
          ent = -sum( (p / data_length) * log(p / data_length, 2) for p in label_count.values() )
          return ent
      
      
      # 計(jì)算條件經(jīng)驗(yàn)熵
      def cond_ent(datasets, axis=0):  # axis是我們選擇的特征,也及時(shí)計(jì)算這個(gè)特征對(duì)集合的條件經(jīng)驗(yàn)熵。
          data_length = len(datasets)
          feature_sets = {}
          for i in range(data_length):
              feature = datasets[i][axis]
              if feature not in feature_sets:
                  feature_sets[feature] = []
              feature_sets[feature].append(datasets[i])  # 我們按照特征將數(shù)據(jù)按照字典的格式存儲(chǔ)。
          # 計(jì)算條件經(jīng)驗(yàn)熵。 (Di/D)*H(Di)。這里每次取出的p為屬于范類別的所有數(shù)據(jù)。這里的類別是axis指定的特征的分類。
          cond_ent = sum((len(p)/data_length)*calc_ent(p) for p in feature_sets.values())
          return cond_ent
      
      
      # 計(jì)算信息增益
      def info_gain(ent, cond_ent):
          return ent - cond_ent
      
      
      # 計(jì)算信息增益
      def info_gain_train(datasets):
          count = len(datasets[0]) - 1
          ent = calc_ent(datasets)
          print("當(dāng)前經(jīng)驗(yàn)熵:{:.3f}\n".format(ent))
          best_feature = []
          for c in range(count):
              print("第{}個(gè)特征的條件經(jīng)驗(yàn)熵為:{:.3f}".format(c+1, cond_ent(datasets, c)))
              c_info_gain = info_gain(ent, cond_ent(datasets, c))
              best_feature.append((c, c_info_gain))
              print("當(dāng)前特征({})的信息增益為:{:.3f}".format(label[c], c_info_gain))
          best = max(best_feature, key=lambda c : c[-1])  # 這里返回的是信息增益最大的元組
          return best
      
      
      dataset, label = createData()
      trainData = pd.DataFrame(dataset, columns=label)
      best_feature = info_gain_train(dataset)
      print("\n第{}個(gè)特征({})的信息增益最大,為:{:.3f}".format(best_feature[0]+1, label[best_feature[0]+1], best_feature[1]))

      結(jié)果

      當(dāng)前經(jīng)驗(yàn)熵:0.971
      
      第1個(gè)特征的條件經(jīng)驗(yàn)熵為:0.888
      當(dāng)前特征(年齡)的信息增益為:0.083
      第2個(gè)特征的條件經(jīng)驗(yàn)熵為:0.647
      當(dāng)前特征(有工作)的信息增益為:0.324
      第3個(gè)特征的條件經(jīng)驗(yàn)熵為:0.551
      當(dāng)前特征(有自己的房子)的信息增益為:0.420
      第4個(gè)特征的條件經(jīng)驗(yàn)熵為:0.608
      當(dāng)前特征(信貸情況)的信息增益為:0.363
      
      第3個(gè)特征(信貸情況)的信息增益最大,為:0.420

      2,程序?qū)崿F(xiàn)ID3算法

      import pandas as pd
      import numpy as np
      import math
      from math import log
      
      
      def create_data():
          datasets = [['青年', '否', '否', '一般', '否'],
                     ['青年', '否', '否', '好', '否'],
                     ['青年', '是', '否', '好', '是'],
                     ['青年', '是', '是', '一般', '是'],
                     ['青年', '否', '否', '一般', '否'],
                     ['中年', '否', '否', '一般', '否'],
                     ['中年', '否', '否', '好', '否'],
                     ['中年', '是', '是', '好', '是'],
                     ['中年', '否', '是', '非常好', '是'],
                     ['中年', '否', '是', '非常好', '是'],
                     ['老年', '否', '是', '非常好', '是'],
                     ['老年', '否', '是', '好', '是'],
                     ['老年', '是', '否', '好', '是'],
                     ['老年', '是', '否', '非常好', '是'],
                     ['老年', '否', '否', '一般', '否'],
                     ]
          labels = [u'年齡', u'有工作', u'有自己的房子', u'信貸情況', u'類別']
          # 返回?cái)?shù)據(jù)集和每個(gè)維度的名稱
          return datasets, labels
      
      
      # 定義節(jié)點(diǎn)類 二叉樹
      class Node:
          def __init__(self, root=True, label=None, feature_name=None, feature=None):
              self.root = root  # 標(biāo)記當(dāng)前節(jié)點(diǎn)是否為根節(jié)點(diǎn)
              self.label = label  # label記錄當(dāng)前節(jié)點(diǎn)的值
              self.feature_name = feature_name  # 記錄當(dāng)前特征名
              self.feature = feature  # 記錄當(dāng)前特征名在特征列表中的序號(hào)
              self.tree = {}
              self.result = {
                  'label:': self.label,
                  'feature': self.feature,
                  'tree': self.tree
              }
      
          def __repr__(self):  # 返回當(dāng)前節(jié)點(diǎn)的信息
              return '{}'.format(self.result)
      
          def add_node(self, val, node):  # 添加點(diǎn)
              self.tree[val] = node
      
          def predict(self, features):  # 預(yù)測當(dāng)前節(jié)點(diǎn)
              if self.root is True:
                  return self.label
              return self.tree[features[self.feature]].predict(features)
      
      
      class DTree:
          def __init__(self, epsilon=0.1):
              self.epsilon = epsilon  # 閾值,用于判斷當(dāng)前信息增益是否符合大小。如果信息增益小于閾值,等同于忽略。
              self._tree = {}
      
          # 熵
          @staticmethod
          def calc_ent(datasets):
              data_length = len(datasets)
              label_count = {}
              for i in range(data_length):
                  label = datasets[i][-1]
                  if label not in label_count:
                      label_count[label] = 0
                  label_count[label] += 1
              ent = -sum([(p / data_length) * log(p / data_length, 2)
                          for p in label_count.values()])
              return ent
      
          # 經(jīng)驗(yàn)條件熵
          def cond_ent(self, datasets, axis=0):
              data_length = len(datasets)
              feature_sets = {}
              for i in range(data_length):
                  feature = datasets[i][axis]
                  if feature not in feature_sets:
                      feature_sets[feature] = []
                  feature_sets[feature].append(datasets[i])
              cond_ent = sum([(len(p) / data_length) * self.calc_ent(p)
                              for p in feature_sets.values()])
              return cond_ent
      
          # 信息增益
          @staticmethod
          def info_gain(ent, cond_ent):
              return ent - cond_ent
      
          def info_gain_train(self, datasets):  # 計(jì)算當(dāng)前數(shù)據(jù)集中信息增益最大的特征。
              count = len(datasets[0]) - 1
              ent = self.calc_ent(datasets)
              best_feature = []
              for c in range(count):
                  c_info_gain = self.info_gain(ent, self.cond_ent(datasets, axis=c))
                  best_feature.append((c, c_info_gain))
              # 比較大小
              best_ = max(best_feature, key=lambda x: x[-1])
              return best_
      
          def train(self, train_data):
              """
              input:數(shù)據(jù)集D(DataFrame格式),特征集A,閾值eta
              output:決策樹T
              """
              _ = train_data.iloc[:, :-1]  # 除最后一列的所有數(shù)據(jù)
              y_train = train_data.iloc[:, -1]  # 僅包含最后一列
              features = train_data.columns[:-1]  # 除最后一個(gè)特征以外的特征
      
              # 下面是ID3算法四步。D為訓(xùn)練數(shù)據(jù)集,A為特征集。
              # 1 若D中實(shí)例屬于同一類Ck,則T為單節(jié)點(diǎn)樹,并將類Ck作為結(jié)點(diǎn)的類標(biāo)記,返回T
              if len(y_train.value_counts()) == 1:  # value_counts函數(shù),對(duì)數(shù)據(jù)按照值進(jìn)行排序,并且按照從大到小排序
                  return Node(root=True, label=y_train.iloc[0])
      
              # 2 若A為空,則T為單節(jié)點(diǎn)樹,將D中實(shí)例樹最大的類Ck作為該節(jié)點(diǎn)的類標(biāo)記,返回T
              if len(features) == 0:
                  return Node(
                      root=True,
                      label=y_train.value_counts().sort_values(
                          ascending=False).index[0])
                  # 沒有特征進(jìn)行劃分了,所以對(duì)當(dāng)前數(shù)據(jù)集所有類別進(jìn)行了歸類,并計(jì)數(shù),然后排序,
                  # 選擇類別數(shù)最大的類別,估計(jì)為當(dāng)前節(jié)點(diǎn)代表的類別
      
              # 3 計(jì)算最大信息增益
              # max_feature為信息增益最大特征名字的序號(hào),
              # max_info_gain為最大信息增益
              # max_feature_name為最大信息增益特征名字
              max_feature, max_info_gain = self.info_gain_train(np.array(train_data))
              max_feature_name = features[max_feature]
      
              # 4 信息增益小于閾值,忽略,置T為單節(jié)點(diǎn)樹,并將D中是實(shí)例數(shù)最大的類Ck作為該節(jié)點(diǎn)的類標(biāo)記,返回T
              if max_info_gain < self.epsilon:
                  return Node(
                      root=True,
                      label=y_train.value_counts().sort_values(
                          ascending=False).index[0])
      
              # 5 構(gòu)建最大信息增益點(diǎn)Ag的子集。
              # 按照Ag的每一個(gè)可能的取值ai,將數(shù)據(jù)集D分成一個(gè)Di,每個(gè)Di中實(shí)例數(shù)最大的類作為標(biāo)記,構(gòu)建子節(jié)點(diǎn)。
              # 由當(dāng)前最大信息增益點(diǎn)及其子節(jié)點(diǎn)構(gòu)成樹,并返回
              node_tree = Node(
                  root=False, feature_name=max_feature_name, feature=max_feature)
              # 將train_data按照  當(dāng)前最大信息增益特征不同值  劃分,index指value_counts后的類別部分
              feature_list = train_data[max_feature_name].value_counts().index
              for f in feature_list:
                  # 去掉 最大信息增益這個(gè)特征
                  sub_train_df = train_data.loc[train_data[max_feature_name] == f].drop([max_feature_name], axis=1)
      
                  # 6 遞歸生成樹
                  # 對(duì)去掉這個(gè)特征的數(shù)據(jù)繼續(xù)進(jìn)行訓(xùn)練
                  sub_tree = self.train(sub_train_df)
                  # 將當(dāng)前節(jié)點(diǎn)加到遞歸上層父節(jié)點(diǎn)上。
                  # 這個(gè)算法不是從根節(jié)點(diǎn),一步一步加點(diǎn)生成樹,
                  # 而是從根節(jié)點(diǎn)開始找出最大信息增益節(jié)點(diǎn),這個(gè)點(diǎn)只是聲明了一下,并沒有建立聯(lián)系。然后遞歸向下,到達(dá)葉節(jié)點(diǎn)之后,
                  # 將葉節(jié)點(diǎn)添加到上層遞歸的父節(jié)點(diǎn),然后父節(jié)點(diǎn)在train另一個(gè)子節(jié)點(diǎn),然后將子節(jié)點(diǎn)在加入到父節(jié)點(diǎn)。
                  # 這時(shí)最初的根節(jié)點(diǎn)仍然是只有一個(gè)點(diǎn),但是最下邊的某個(gè)子樹已經(jīng)建立了父子關(guān)系,生成了樹
                  node_tree.add_node(f, sub_tree)
      
              return node_tree
      
          def fit(self, train_data):
              self._tree = self.train(train_data)
              return self._tree
      
          def predict(self, X_test):
              return self._tree.predict(X_test)
      
      
      datasets, labels = create_data()
      data_df = pd.DataFrame(datasets, columns=labels)
      dt = DTree()
      tree = dt.fit(data_df)
      print(tree)
      print("下邊預(yù)測數(shù)據(jù):[老年, 否, 否, 一般],結(jié)果為:")
      print(dt.predict(['老年', '否', '否', '一般']))

      結(jié)果:

      {'label:': None, 'feature': 2, 'tree': {'否': {'label:': None, 'feature': 1, 'tree': {'否': {'label:': '否', 'feature': None, 'tree': {}}, '是': {'label:': '是', 'feature': None, 'tree': {}}}}, '是': {'label:': '是', 'feature': None, 'tree': {}}}}
      下邊預(yù)測數(shù)據(jù):[老年, 否, 否, 一般],結(jié)果為:
      否

      3,sklearn模擬

      import numpy as np
      import pandas as pd
      from sklearn.datasets import load_iris
      from sklearn.model_selection import train_test_split
      from sklearn.tree import DecisionTreeClassifier
      from sklearn.tree import export_graphviz
      import graphviz
      
      
      def create_data():
          iris = load_iris()
          df = pd.DataFrame(iris.data, columns=iris.feature_names)
          df['label'] = iris.target
          df.columns = [
              'sepal length', 'sepal width', 'petal length', 'petal width', 'label'
          ]
          data = np.array(df.iloc[:100, [0, 1, -1]])
          # print(data)
          return data[:, :2], data[:, -1]
      
      
      X, y = create_data()
      X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
      
      
      clf = DecisionTreeClassifier()
      clf.fit(X_train, y_train,)
      print(clf.score(X_test, y_test))
      
      # 為了讓下邊的語句執(zhí)行,首先要安裝graphviz,官網(wǎng)下載exe或者zip都行,這種方式要配置環(huán)境變量
      # pycharm安裝失敗時(shí),用命令行安裝pip install graphviz -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com。這種方式直接安裝在了Anaconda下就不用配置環(huán)境變量了
      # 成功后,在命令行運(yùn)行dot -v看一下是否成功安裝
      # 成功后,現(xiàn)在命令行運(yùn)行dot - c。執(zhí)行完后,在運(yùn)行程序即可。
      tree_pic = export_graphviz(clf, out_file="mytree.pdf")  # 生成了畫樹的graphviz語句
      with open('mytree.pdf') as f:
          dot_graph = f.read()  # 我們將畫樹的語句取出來
      graph = graphviz.Source(dot_graph)  # 將這些語句存儲(chǔ)
      graph.view()  # 畫出來

      結(jié)果:

      0.9666666666666667

      最初生成的mytree.pdf文件:

      python中怎么模擬決策樹

      通過dot畫出來的文件(自動(dòng)命名成Source.gv.pdf):

      python中怎么模擬決策樹

      上述內(nèi)容就是python中怎么模擬決策樹,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


      當(dāng)前標(biāo)題:python中怎么模擬決策樹
      本文網(wǎng)址:http://www.ef60e0e.cn/article/gcigoh.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        义马市| 桃江县| 霍林郭勒市| 团风县| 大姚县| 那坡县| 定兴县| 项城市| 吉林市| 长阳| 蚌埠市| 璧山县| 图木舒克市| 富锦市| 额济纳旗| 台东县| 同江市| 武隆县| 毕节市| 施秉县| 雅安市| 潞西市| 治县。| 西吉县| 砀山县| 上栗县| 北安市| 曲水县| 东乡族自治县| 岳阳县| 绵竹市| 奉贤区| 鱼台县| 新津县| 岱山县| 仪陇县| 朔州市| 格尔木市| 开鲁县| 青海省| 牟定县|