DAY04随机森林演算法(续1)

昨天,我们把基尼系数算完,那今天,我打算建立bagging算法函数:
对於有n个资料的资料集,我们取出m个资料(m<=n),这m个资料采用:自助抽样法
(也就是每次从n笔资料中取出一笔,取完之後直接放资料里那代表该资料有机会再次被选取)
而重复这件事m次,就会得到一个子资料集m1
而再重复这件事,就会得到资料集m1,m2…mk当成训练集,再针对训练集下去做模型来取得k个模型後,再针对这k个模型去做取平均值、取多数票等方法,如图:

https://ithelp.ithome.com.tw/upload/images/20210918/201416542G5UWbDjp9.pnghttps://ithelp.ithome.com.tw/upload/images/20210918/20141654KghSKtyYvV.png
所以以下是关於bagging的程序码实际执行:基本上会设定m和k,但在随机森林里,我们想要建立随机树,而树的特徵也是随机选取,所以再筛选树的特徵时, 我们要用随机方式选取d个特徵,程序码如下(我先不用dataFrame来写(比较好理解),在後面完整实作时,再改用dataFrame):

import random as rd
#一个5维资料,共5笔,data(第0维为y)
data=[[1,"a",0.852,5,1.5],[2,"b",0.31,8,8.1],[1,"b",0.589,9,5.6],[1,"c",0.01,8,2.3],[2,"c",0.258,10,1.1]]
#预设m=4:表示重复抽资料4次;k=5:表示5组资料;d=3:随机选三个特徵
def bagging_k(data,m=4,k=5,d=3):
    n=len(data)
    #建立放全部资料的data_k
    data_k=[]
    for j in range(k):
        data_use1=[]
        #选取除目标以外d个特徵
        features = rd.sample(range(1,n), d)
        #把目标加回去
        features.insert(0,0) 
        features.sort()
        print("第",j+1,"组特徵:",features)
        for r in range(n):    
            data_use2=[]
            for q in features:
                data_use2.extend([data[r][q]])
            data_use1.append(data_use2)
        #data_use1其实就是data资料-->只是只选择特徵下的资料
        data_m=[]
        #重复抽样过程
        for i in range(m):
            rows=rd.randint(0, len(data_use1)-1)
            data_m.append(data_use1[rows])
        print("第",j+1,"组数据:",data_m)
        data_k.append(data_m)
    return data_k
print("全部数据:",bagging_k(data)) 

结果如下:

第 1 组特徵: [0, 1, 3, 4]
第 1 组数据: [[2, 'b', 8, 8.1], [2, 'b', 8, 8.1], [1, 'a', 5, 1.5], [1, 'b', 9, 5.6]]
第 2 组特徵: [0, 2, 3, 4]
第 2 组数据: [[1, 0.01, 8, 2.3], [1, 0.01, 8, 2.3], [2, 0.31, 8, 8.1], [2, 0.31, 8, 8.1]]
第 3 组特徵: [0, 1, 2, 3]
第 3 组数据: [[1, 'c', 0.01, 8], [2, 'c', 0.258, 10], [2, 'b', 0.31, 8], [1, 'b', 0.589, 9]]
第 4 组特徵: [0, 1, 2, 4]
第 4 组数据: [[2, 'b', 0.31, 8.1], [2, 'c', 0.258, 1.1], [2, 'c', 0.258, 1.1], [1, 'a', 0.852, 1.5]]
第 5 组特徵: [0, 1, 2, 4]
第 5 组数据: [[1, 'b', 0.589, 5.6], [2, 'c', 0.258, 1.1], [1, 'c', 0.01, 2.3], [2, 'b', 0.31, 8.1]]
全部数据: [[[2, 'b', 8, 8.1], [2, 'b', 8, 8.1], [1, 'a', 5, 1.5], [1, 'b', 9, 5.6]], [[1, 0.01, 8, 2.3], [1, 0.01, 8, 2.3], [2, 0.31, 8, 8.1], [2, 0.31, 8, 8.1]], [[1, 'c', 0.01, 8], [2, 'c', 0.258, 10], [2, 'b', 0.31, 8], [1, 'b', 0.589, 9]], [[2, 'b', 0.31, 8.1], [2, 'c', 0.258, 1.1], [2, 'c', 0.258, 1.1], [1, 'a', 0.852, 1.5]], [[1, 'b', 0.589, 5.6], [2, 'c', 0.258, 1.1], [1, 'c', 0.01, 2.3], [2, 'b', 0.31, 8.1]]]

好,今天实作部分就到这,明天再开始做分类动作

苍蝇飞到了小屋内,停留在灯泡上,灯泡光芒慢慢的变亮,啪啦一声,灯泡瞬间破裂并刺穿了苍蝇的身体,一瞬间,苍蝇化成了一摊红水,洒向了地面,地面上突然冒出了一只红色手,正试图拨开土,往外爬,但在那只手碰触到掉在地板玻璃碎片时,那只手突然停了下来 

				--|你走了,我却未曾离开过 |--     CS.MM

<<:  缺乏计画的目标,只能叫做愿望。----目标设定篇(上)

>>:  2. 工程师不只是工程师

Powershell 入门参数属性(2)

前面我们讲了怎么通过参数的属性限制参数的个数和长度。今天我们来看看,通过参数的属性,限制参数的格式以...

[01] 笔记走向

大家好,这边是个人制作telegram时研究api和开发文件之後整理起来的文件 telegram 有...

SQL 语言和你 SAY HELLO!!

第三十天 各位点进来的朋友,你们好阿 小的不才只能做这个系列的文章,但还是希望分享给点进来的朋友,知...

Day 11:94. Binary Tree Inorder Traversal

今日题目 题目连结:94. Binary Tree Inorder Traversal 题目主题:S...

Day 22 -资料库应用小程序 前言

我们前面认识完资料库端的技巧後,我们就可以来准备实际开发一个小程序来玩玩把所学应用上,是我觉得最有成...