iT邦幫忙

2021 iThome 鐵人賽

DAY 9
0
AI & Data

數據分析方法研究和理解演算法系列 第 9

DAY09隨機森林演算法(回歸方法)

  • 分享至 

  • xImage
  •  

昨天,我們已建立完隨機森林,那今天,我打算使用回歸方法去看他得出來結果,所以會跟基尼係數預測類別方法,有些不同:
這邊會列出不太一樣的地方第一個是分割不採用基尼係數,而是採用MSE最小,作為最佳分割點:
我把原本基尼係數程式保留以做為參考

def Best_Feature_reg(data):
    #1為最大(效果最差)
    #best_Gini_cofe = 1
    #利用MSE最小值作為劃分值
    best_R2 = float('inf')
    #位置最小為0,先設定-1
    best_feature_col = -1
    #因為數值有可能正或負,所以先設定None
    best_split_value = None
    #第i個特徵

    for l in data.columns:
        # print("第",i,"個特徵")
        if l==0:
            continue
        feat_list = [k for k in data[l]]
        sortfeats = sorted(list(set(feat_list)))
        #print("排序好特徵資料:",sortfeats)
        split_list = []

        if len(sortfeats)==1:
            splitList=sortfeats
        else:
            for j in range(len(sortfeats) - 1):
                split_list.append(np.round((sortfeats[j] + sortfeats[j + 1]) / 2,5))
        #print("節點:",split_list)
        #每個劃分點都測試
        for split_value in split_list:   

            subdata1, subdata2 = split_Data_Set(data, l, split_value)
            lenLeft, lenRight = len(subdata1), len(subdata2)
            # 防止其中一邊為空
            if lenLeft == 0 and lenRight != 0:
                rightMean = np.mean(subdata1)
                R2 = np.mean([(x - rightMean)**2 for x in subdata1])
            elif lenLeft != 0 and lenRight == 0:
                leftMean = np.mean(subdata2)
                R2 = np.mean([(x - leftMean) ** 2 for x in subdata2])
            else:
                leftMean, rightMean = np.mean(subdata2), np.mean(subdata1)
                leftR2 = np.mean([(x - leftMean)**2 for x in subdata2])
                rightR2 = np.mean([(x - rightMean)**2 for x in subdata1])
                #把MSE相加
                R2 = leftR2 + rightR2

            if R2 < best_R2:
                best_R2 = R2
                best_feature_col = l
                best_split_value = split_value
            # new_Gini = Gini_cofe(subdata1, subdata2)
            
            # #如果基尼係數較小代表比較好
            # if new_Gini < best_Gini_cofe:
            #     best_Gini_cofe = new_Gini
            #     best_feature_col = l
            #     best_split_value = split_value
    return best_feature_col, best_split_value
best_feature_col, best_split_value=Best_Feature_reg(data)    
print("最佳分割特徵為: 第",best_feature_col,"特徵")
print("最佳分割特徵數值為:",best_split_value)

結果如下:

最佳分割特徵為: 第 2 特徵
最佳分割特徵數值為: 0.4495

除了這個還有就是如果是特徵都分完還不能分類-->就用資料平均值
下去做即可

import random as rd
def one_feature_check_reg(data):
    if len(data[0])==1:   
        return np.mean(data)
    else:
        return False

-->其餘方法基本上都相同,所以就不再贅述
好,今天隨機森林算是完成了,明天就開始研究支持向量機

男孩看了桌上娃娃,他突然覺得心情悲傷了起來,而且感覺有東西卡在喉嚨裡,男孩掐住自己喉嚨試圖把東西吐出來,但毫無作用,緊接著東西不小心被他吞了下去,男孩發現他的胸口自己發出了聲音,而那聲音正是剛剛聽到的歌聲,男孩看了一下桌子,發現娃娃和桌子都消失不見,只剩下空蕩蕩的屋子,和不斷發出歌聲的胸口
		--|一部份是我,一部份是你,只是你想不起來|--  MS.CM

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

尚未有邦友留言

立即登入留言