DAY06随机森林演算法(续3)

昨天,我们把分类函数算法算完,那今天,我打算建立决策树:
有了第一个最佳分类点和数值後,接下来就要找那个子集的下一个最佳分类点,上次程序只是找寻最佳分割点,并未找到分割资料,所以现在要建立函数来分割资料:

#一个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

<<:  [Lesson5] BottomNavigationView

>>:  6 用 GenServer 做 server?

[Day18] NLP会用到的模型(二)-GRU

一. LSTM的问题 LSTM虽然非常强大,但LSTM也是有一个问题,就是计算时间较久导致执行速度较...

D3JsDay23 三枪侠的电磁炮,三个变数的气泡—气泡图(上)

气泡图介绍 昨天已经介绍完散布图了,大致上与散布图的作法大同小异,差别在於气泡本身也就是circle...

D-27-变数 variable ? int ? string

认识变数 variable 在昨天的历程中小光学习到如何透过dotnet cli来产生专案跟方案,并...

Swift纯Code之旅 Day24. 「各个TableViewHeader下的Cell显示(1)」

前言 我们已经将TableView的Header给设置完毕了,那可以看到IPhone内建的画面: 两...

Rapid Prototyping for Product Development

Did you have a brilliant concept for a product but...