4.3—スイカ機械学習法本放課後ドリルpython実現エントロピー画定の情報に基づいた決定の木アルゴリズム(简単に、全面的に)

前文(坑が、運行コードを前に、ぜひ読む、以下の部分を理解し、良い環境関連の配置)

pythonのうちdecisiontreeclaasifier使い方sklearn庫モウソウチク公式ドキュメント:

python使用のような方法はid3 cartと差別化が、具体的にモウソウチクブログ:


最終の比較分析を経て、我々の選定dictvectorizer方法を使ってデータの離散型の内容に対するコードで、同

  1. 使用preprocessing . labelbinarizer表記に対するコードを理解しやすく、は、ラベルを

  2. dictvectorizerの処理対象は符号化(非デジタル)が一定の構造の特徴データ、辞书などは、

    #-*- coding:utf-8 -*-
    
    #学习目标:使用DictVectorizer对使用字典存储的数据进行特征抽取和向量化
    
    #定义一组字典列表,用来表示多个数据样本(每个字典代表一个数据样本)
    measurements = [{'city':'Beijing','temperature':33.},{'city':'London','temperature':12.},{'city':'San Fransisco','temperature':18.}]
    #从sklearn.feature_extraction导入DictVectorizer
    from sklearn.feature_extraction import DictVectorizer
    vec = DictVectorizer()
    #输出转化后的特征矩阵
    print vec.fit_transform(measurements).toarray()
    #输出各个维度的特征含义
    print vec.get_feature_names()
    

    出力の結果は、

    [[  1.   0.   0.  33.]
     [  0.   1.   0.  12.]
     [  0.   0.   1.  18.]]
    
    ['city=Dubai', 'city=London', 'city=San Fransisco', 'temperature']
    

    dictvectorizer難くない発見し、非のデジタル処理方式は、原の特徴の名称を借り、組合の新たな特徴を、

    うち[1 . 1 . 1 . 33 .]代表の意味はシティ』=となる、temperature = 33』

    するなら、私たちのスイカ資料集2.0どうしてこの方法に適用ねぇ?

    まず、我々のデータを集中的に『密度』と『含まれる糖率の連続』は、他の属性は離散のため、この統一できる方法を使って一回

    第二に、この方法の離散型データ均使用−1では、まるでリニア模型の復帰率に対するで使った「ステップ関数」のように

そして問題を話し合った意思決定の木の可視化…


運行の手続きを経て一dot文書が、使用gvedit . exeを開けば、注意:私、ヘッドバンガー手続きの問題が最終的に中国语をきちんとファイル出力、rmvbテキストを開けた後でテキストで添加必要あまり行


総で、我々の大体のプログラミングの主な発想ができる、データ読み取り使用後2値化コードをつづりするタイプの符号化データを、1

下面実現の一歩一歩プログラムコードを付加詳細に説明し、個別のコードと説明が……

  • データ集——スイカデータ集3.0 . csv (gbk我々のcsvファイルコーディングタイプは、文書のデータ読み取りを使うとき注意して

    编号,色泽,根蒂,敲声,纹理,脐部,触感,密度,含糖率,好瓜
    1,青绿,蜷缩,浊响,清晰,凹陷,硬滑,0.697,0.46,是
    2,乌黑,蜷缩,沉闷,清晰,凹陷,硬滑,0.774,0.376,是
    3,乌黑,蜷缩,浊响,清晰,凹陷,硬滑,0.634,0.264,是
    4,青绿,蜷缩,沉闷,清晰,凹陷,硬滑,0.608,0.318,是
    5,浅白,蜷缩,浊响,清晰,凹陷,硬滑,0.556,0.215,是
    6,青绿,稍蜷,浊响,清晰,稍凹,软粘,0.403,0.237,是
    7,乌黑,稍蜷,浊响,稍糊,稍凹,软粘,0.481,0.149,是
    8,乌黑,稍蜷,浊响,清晰,稍凹,硬滑,0.437,0.211,是
    9,乌黑,稍蜷,沉闷,稍糊,稍凹,硬滑,0.666,0.091,否
    10,青绿,硬挺,清脆,清晰,平坦,软粘,0.243,0.267,否
    11,浅白,硬挺,清脆,模糊,平坦,硬滑,0.245,0.057,否
    12,浅白,蜷缩,浊响,模糊,平坦,软粘,0.343,0.099,否
    13,青绿,稍蜷,浊响,稍糊,凹陷,硬滑,0.639,0.161,否
    14,浅白,稍蜷,沉闷,稍糊,凹陷,硬滑,0.657,0.198,否
    15,乌黑,稍蜷,浊响,清晰,稍凹,软粘,0.36,0.37,否
    16,浅白,蜷缩,浊响,模糊,平坦,硬滑,0.593,0.042,否
    17,青绿,蜷缩,沉闷,稍糊,稍凹,硬滑,0.719,0.103,否
    
  • 主要ブロック

    1. 関数is_numberを作る役割はデータの文字型のデジタルへの転換floatタイプ。

      def is_number(n):
          is_number = True
          try:
              num = float(n)
              # 检查 "nan"
              is_number = num == num   # 或者使用 `math.isnan(num)`
          except ValueError:
              is_number = False
          return is_number
      
    2. 一関数データ読み取り用を構築するデータを预处理

      def loadData(filename):
          data=open(filename,'r',encoding='GBK')
          reader = csv.reader(data)
          headers = next(reader)
      
          featureList = []
          labelList = []
      
          for row in reader:
              labelList.append(row[len(row)-1])
              rowDict = {}
              for i in range(1,len(row)-1):
                  if is_number(row[i]) == True:
                      rowDict[headers[i]] = float(row[i])
                  else:
                      rowDict[headers[i]]=row[i]
              featureList.append(rowDict)
      
          print(featureList)
          print(labelList)
      
          return featureList,labelList
      
    3. 出力构造の意思決定の木を可視化

      def createDTree(featureList,labelList):
          vec = DictVectorizer()
          dummyX = vec.fit_transform(featureList).toarray()
          # print("dummyX:"+str(dummyX))
          # print(vec.get_feature_names())
          # print("labelList:"+str(labelList))
      
          lb = preprocessing.LabelBinarizer()
          dummyY = lb.fit_transform(labelList)
          # print("dummyY: ",str(dummyY))
      
          clf = tree.DecisionTreeClassifier(criterion='gini')
          clf = clf.fit(dummyX,dummyY)
          print("clf: ",str(clf))
          print(vec.get_feature_names())
          print(dummyX)
          print(dummyY)
          target_name=['不是好瓜','是好瓜']
      
          with open("DecisionTree_gini.dot",'w') as f:
              f = tree.export_graphviz(clf,feature_names=vec.get_feature_names(),class_names=target_name,out_file=f)
      
    4. 外部の発進関数

      filename='西瓜数据集3.0.csv'
      featureList,labelList=loadData(filename)
      createDTree(featureList,labelList)
      
  • 意思決定の木が可視化展示

    1. ジニ係数は設立に基づいた決定の木

  1. ジニ係数は設立に基づいた決定树2

  2. 情報を増益に基づいた決定の木

针の上の生成の意思決定の木の画像の何时に说明:

  1. ジニ係数の生成に基づいた決定の木は二つ、why ?
  2. 図の方法を読んで、1枚の写真は例の前身の解明は初めてノードのsamples = 17、このサンプル数を17の説明

【完全ソースコード】

'''
4.3 试编程实现基于信息熵进行划分选择的决策树算法,并为表4.3中数据生成一棵决策树
'''

import csv
from sklearn.feature_extraction import DictVectorizer
from sklearn import preprocessing
from sklearn import tree

def is_number(n):
    is_number = True
    try:
        num = float(n)
        # 检查 "nan"
        is_number = num == num   # 或者使用 `math.isnan(num)`
    except ValueError:
        is_number = False
    return is_number

def loadData(filename):
    data=open(filename,'r',encoding='GBK')
    reader = csv.reader(data)
    headers = next(reader)

    featureList = []
    labelList = []

    for row in reader:
        labelList.append(row[len(row)-1])
        rowDict = {}
        for i in range(1,len(row)-1):
            if is_number(row[i]) == True:
                rowDict[headers[i]] = float(row[i])
            else:
                rowDict[headers[i]]=row[i]
        featureList.append(rowDict)

    print(featureList)
    print(labelList)

    return featureList,labelList

def createDTree(featureList,labelList):
    vec = DictVectorizer()
    dummyX = vec.fit_transform(featureList).toarray()
    # print("dummyX:"+str(dummyX))
    # print(vec.get_feature_names())
    # print("labelList:"+str(labelList))

    lb = preprocessing.LabelBinarizer()
    dummyY = lb.fit_transform(labelList)
    # print("dummyY: ",str(dummyY))

    clf = tree.DecisionTreeClassifier(criterion='gini')
    clf = clf.fit(dummyX,dummyY)
    print("clf: ",str(clf))
    print(vec.get_feature_names())
    print(dummyX)
    print(dummyY)
    target_name=['不是好瓜','是好瓜']

    with open("DecisionTree_gini.dot",'w') as f:
        f = tree.export_graphviz(clf,feature_names=vec.get_feature_names(),class_names=target_name,out_file=f)


filename='西瓜数据集3.0.csv'
featureList,labelList=loadData(filename)
createDTree(featureList,labelList)


跋文

内容が多いコードの過ちがあれば適時書き込みに连络してください、このコードに合わない性の题目に要求の使用方法で、考慮さコードの复雑さと任務量

ソースネットワーク 戻る