python實現決策樹

来源:http://www.cnblogs.com/928pjy/archive/2016/03/30/5337631.html
-Advertisement-
Play Games

1.決策樹的簡介 http://www.cnblogs.com/lufangtao/archive/2013/05/30/3103588.html 2.決策是實現的偽代碼 3.python數據結構設計 1.數據集:用於存儲二維的訓練數據training_data 二維的list數組,對於二維的lis ...


1.決策樹的簡介

  http://www.cnblogs.com/lufangtao/archive/2013/05/30/3103588.html

2.決策是實現的偽代碼

“讀入訓練數據”
“找出每個屬性的可能取值”

“遞歸調用建立決策樹的函數”
    “para:節點,剩餘樣例,剩餘屬性”

    if “剩餘屬性個數為0"
        return most_of_result
    else if “剩餘樣例都屬於同一個分類(yes/no)"    
        return yes/no
    else:
           ”對於每一個剩餘屬性,計算該屬性的熵增“,並找到熵增最大的對應的屬性,即為最佳分類屬性”
        “按照最佳分類屬性分類,對於每個分支,遞歸調用建立函數,最終得到整個決策樹”

3.python數據結構設計

  1.數據集:用於存儲二維的訓練數據training_data

    二維的list數組,對於二維的list要取得某一列的數據,可以用zip(*dataset)[num]

  2.屬性集合:用於存儲屬性的名稱attri_name_set

    一維的list

  3.屬性的可能取值:存儲各個屬性的可能取值狀態

    dict+set:dict的key是屬性的名稱,value是set類型,這樣可以保證不會有重覆
    新建set類型:attri[i] = set()

  4.

 

 

4.code

# -*- coding: utf-8 -*-
from __future__ import division
import  math

__author__ = 'Jiayin'
#date:2016-3-28
#決策樹的實現,從test.txt中讀入訓練數據,
#全局變數 training_data = [] #數據集(二維list表) attri = {} #屬性集(dict+set) attri_name_set = [] class Dtree_node(object): def __init__(self): self.attriname = None self.sub_node = {} #子節點為dict類型 root = Dtree_node() #輸入數據 def get_input(): #屬性集合 屬性是dict結構,key為屬性名(str),value是該屬性可以取到的值類型為set #第一個屬性通常為編號,最後一個屬性通常為決策結果,取值只有yes/no global attri global attri_name_set file_read = open("test.txt") line = file_read.readline().split() attri_name_set = line[:] #print line for i in line: attri[i] = set() line = file_read.readline().split() #讀入數據,並計算每個屬性的可能取值 while line: training_data.append(line) for i in range(1,len(line)-1): attri[attri_name_set[i]].add(line[i]) line = file_read.readline().split() #取most_of _result def getmost(dataset_result): p = 0 n = 0 for i in dataset_result: if i == 'yes': p+=1 else: n+=1 return 'yes' if p>n else 'no' #計算熵 def cal_entropy(dataset_result): num_yes = 0 num_no = 0 for i in dataset_result: if i == 'yes': num_yes +=1 else: num_no += 1 if num_no == 0 or num_yes == 0: return 0 total_num = num_no +num_yes per_yes = num_yes/total_num per_no = num_no/total_num return -per_yes*math.log(per_yes,2)-per_no*math.log(per_no,2) #計算某個屬性的熵增 #參數 :數據集和屬性名,初始熵 def cal_incr_entr_attri(data_set,attriname,init_entropy): global attri global attri_name_set incr_entr = init_entropy attri_index = attri_name_set.index(attriname) #將該屬性的不同取值提取出來,並分別計算熵,求出熵增 for i in attri[attriname]: #new_data = data_set[:] new_data = filter(lambda x: True if x[attri_index] == i else False ,data_set) if len(new_data)==0: continue num = cal_entropy(zip(*new_data)[-1]) incr_entr -= len(new_data)/len(data_set)*num return incr_entr #判斷是否剩餘數據集都是一個結果 def if_all_label(dataset_result, result): #result = dataset_result[0] for i in range(0,len(dataset_result)): if dataset_result[i] <> result: break return False if dataset_result[i]<>result else True #建立決策樹 #參數:root:節點 dataset:剩下的數據集 attriset:剩下的屬性集 def create_Dtree(root_node , data_set , attri_set): global attri global attri_name_set ''' #如果當前數據集為空,應該返回上一層的most_of_result,此處要修改 if len(data_set)==0: return None''' #考慮如果剩餘屬性集為空,則返回most_of_result if len(attri_set) == 0: print zip(*data_set) root_node.attriname = getmost(zip(*data_set)[-1]) #zip(*dataset)[-1]表示取出最後一列,也就是yes/no那一列 return None #考慮如果剩餘的數據集都是一個結果的話,返回這個結果 elif if_all_label(zip(*data_set)[-1],'yes'): root_node.attriname = 'yes' return None elif if_all_label(zip(*data_set)[-1],'no'): root_node.attriname = 'no' return None #print zip(*data_set) init_entropy = cal_entropy(zip(*data_set)[-1])#計算初始熵 max_entropy = 0 for i in attri_set: entropy = cal_incr_entr_attri(data_set,i,init_entropy) if entropy > max_entropy: max_entropy = entropy best_attri = i new_attri = attri_set[:] root_node.attriname = best_attri attri_index = attri_name_set.index(best_attri) for attri_value in attri[best_attri]: #new_data = data_set[:] new_data = filter(lambda x: True if x[attri_index] == attri_value else False ,data_set) root_node.sub_node[attri_value] = Dtree_node() #如果該分支下麵的數據集個數為0,則採用父節點的most_of_result if len(new_data)==0: root_node.sub_node[attri_value].attriname = getmost(zip(*data_set)[-1]) else: create_Dtree(root_node.sub_node[attri_value],new_data,new_attri) def print_Dtree(Root_node,layer): print Root_node.attriname count = 1 if len(Root_node.sub_node) > 0: for sub in Root_node.sub_node.keys(): for i in range(layer): print "| ", print "|----%10s---"%sub, assert isinstance(layer, object) print_Dtree(Root_node.sub_node[sub] , layer+1) #count += 1 def main(): global root global attri_name_set get_input()#輸入 attri_set = attri_name_set[1:-1]#提取出要分類的屬性 create_Dtree(root,training_data,attri_set)#創建決策樹 print_Dtree(root,0)#列印決策樹 main()

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 刪除XML 使用方式http://localhost:8081/api/home?$format=jsonhttp://localhost:8081/api/home?$format=xml 參考資料:https://code.msdn.microsoft.com/Support-format-in ...
  • private void listbox1_MouseClick(object sender, MouseEventArgs e) { textbox1.Visible = false; textbox1.Text = lsbSearchItem.SelectedItem.ToString(); t ...
  • 1.本地變數 一看這個標題你可能會一愣,這是個什麼東東。看個小例子: static void main(){ int a=10; MyClass mc=new MyClass();} 呵呵,這裡的a與mc就是本地變數,它和欄位一樣,也保存數據。欄位通常保存和對象狀態有關的數據,而創建本地變數經常用於 ...
  • 註意:這裡的跨域指不到同一功能變數名稱下,包括一級與二級功能變數名稱,這裡也認為不在同域下 從A網站把信息以Post的方式發送到B網站,這種過程叫做跨域POST,相類的,A網站把B網站的信息獲取回來,一般稱為跨域GET請求,而對於後者可以通過非同步方式實現,在jq里封裝了jsonp,用它來實現非同步跨域請求;而非同步跨域 ...
  • 1. Requirements: when we use the sql like "select * from targetTable", we get all records of the table, but we usually just need one page of records(a ...
  • 項目地址:https://github.com/dianping/cat 編譯步驟: 這個項目比較另類,把編譯需要的jar包,單獨放在git分支mvn-repo里了,而且官方文檔里給了一個錯誤的命令提示: 當你直接把這條命令貼到terminal里執行時,會直接提示命令無效,正確的姿勢如下: 1、先安 ...
  • 1 設計思路 為了設計一套具有較強可擴展性的用戶認證管理,需要建立用戶、角色和許可權等資料庫表,並且建立之間的關係,具體實現如下。 1.1 用戶 用戶僅僅是純粹的用戶,用來記錄用戶相關信息,如用戶名、密碼等,許可權是被分離出去了的。用戶(User)要擁有對某種資源的許可權,必須通過角色(Role)去關聯。 ...
  • 0x 00 前言 ZoomEye 的 API 在前幾天正式對外部開發,這對網路滲透人員來說是一件開心的事 可以說“媽媽再也不用擔心批量測(x)試(zhan)沒有資源了。” 官方的 API 幫助文檔在下麵: https://www.zoomeye.org/api/ 看了下,使用方法是先提交賬戶,密碼獲 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...