iT邦幫忙

2021 iThome 鐵人賽

DAY 6
0

昨天,我們把分類函數算法算完,那今天,我打算建立決策樹:
有了第一個最佳分類點和數值後,接下來就要找那個子集的下一個最佳分類點,上次程式只是找尋最佳分割點,並未找到分割資料,所以現在要建立函數來分割資料:

#一個5維資料,共5筆, ,data(第0維為y)
data=[[1,1.01,0.852,5,1.5],[2,2.01,0.31,8,8.1],[1,3.01,0.589,9,5.6],[1,3.01,0.01,8,2.3],[2,4.01,0.258,10,1.1]]
import copy
def split_Data(data, best_feature_col, best_split_value):
    new_data = copy.deepcopy(data)
    #去除特徵點資料
    for i in range(len(new_data)):
        new_data[i].remove(data[i][best_feature_col])
    leftData, rightData = [], []
    leftDataindex,rightDataindex = [], []
    #去除特徵後分類資料
    for j in range(len(data)):
        if data[j][best_feature_col] <= best_split_value:
            leftData.append(new_data[j])
            leftDataindex.append(j)
        else:
            rightData.append(new_data[j])
            rightDataindex.append(j)
    return new_data,leftData,leftDataindex,rightData,rightDataindex, best_feature_col
new_data,leftData,leftDataindex,rightData,rightDataindex, best_feature_col=split_Data(data,best_feature_col,best_split_value)
print("去除特徵後資料:",new_data)
print("去除特徵後左資料:",leftData)
print("左資料在原始資料序列:",leftDataindex)
print("去除特徵後右資料:",rightData)
print("右資料在原始資料序列:",rightDataindex)
print("被去除特徵點:第",split_Data(data, best_feature_col,"位")

這樣子就會得到資料:

去除特徵後資料: [[1, 1.01, 5, 1.5], [2, 2.01, 8, 8.1], [1, 3.01, 9, 5.6], [1, 3.01, 8, 2.3], [2, 4.01, 10, 1.1]]
去除特徵後左資料: [[2, 2.01, 8, 8.1], [1, 3.01, 8, 2.3], [2, 4.01, 10, 1.1]]
左資料在原始資料序列: [1, 3, 4]
去除特徵後右資料: [[1, 1.01, 5, 1.5], [1, 3.01, 9, 5.6]]
右資料在原始資料序列: [0, 2]
被去除特徵點:第 2 位

接著剩餘資料再帶回上次說的分類,就會得到一組決策樹,當然依據資料特性會做出下列限制:

  1. 全部都分成同一類就是該類別
  2. 特徵剩1個,但資料還沒分類完採多數
  3. 可能分類為空資料要捨棄
    以下為程式碼範例:
#確認是否為同一類別
def one_data_check(data):
    count = 0
    #拿第一筆值當範例
    check = data[0][0]
    for i in range(len(data)):
        #check所有資料
        if data[i][0]==check:
            count+=1
    if count==len(data):
        return [check]
    else:
        return False
#確認是否為空
def no_data_check(data):
    if len(data)==0:
        return True
    else:
        return False
#類別都分類完
import random as rd
def one_feature_check(data):
    count_use={}
    if len(data[0])==1:
        new_data=[]
        for i in range(len(data)):
            new_data.append(data[i][0])
        for i in new_data:
            if i in count_use.keys():
                count_use[i]+=1
            else:
                count_use[i]=1
        #確認最大值
        max_check=max(count_use, key=count_use.get)
        #確認類別是否一樣多
        the_same=[]
        for key,value in count_use.items():
            if(value == max(count_use.values())):
                the_same.append(key)
        #如果有一樣就隨機取
        return rd.sample(the_same,1)
    else:
        return False
#示範有可能是0或1 
print(one_feature_check([[0],[0],[1],[1]]))

這樣子就成功設定好條件
好,今天實作部分就到這,明天再開始做建立樹的後半段動作

當男孩往森林走去時,小屋裡那隻紅色的手,正摸著地上的燈泡碎片,然後像是憤怒一般,他把所有的燈泡碎片全部用手敲碎,奇怪的是,敲擊時完全沒有發出任何聲音,當他敲碎所有碎片後,碎片留下的殘渣在一瞬間變成黑色後,就消失得無影無蹤,這時小屋內的土地開始崩塌,手的主人露了出來,他是一個高高瘦瘦的男人,看起來跟一般人沒有差別,只是他的雙手和雙腳卻有如鮮血般紅潤 

				--|你在哪裡?到底在哪?在~哪~裡? |--     CS.MM

上一篇
DAY05隨機森林演算法(續2)
下一篇
DAY07隨機森林演算法(續5)
系列文
數據分析方法研究和理解演算法30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言