机器学习:随机森林算法及其实现
生活随笔
收集整理的這篇文章主要介紹了
机器学习:随机森林算法及其实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 隨機森林算法描述:
- 如何對features進行bootstrap?
- 算法代碼實現:
隨機森林算法描述:
如何對features進行bootstrap?
我們需要一個feature_bound參數,每次把可以選擇的features打亂,從種選出log(d)個,每次選擇feature劃分時都是這么選擇。
原來的決策樹代碼,是在結點的可選node維度列表里選取:
現在修改加入隨機性:
feat_len = len(self.feats) # 默認沒有隨機性 if feature_bound is None:indices = range(0, feat_len) elif feature_bound == "log":# np.random.permutation(n):將數組打亂后返回indices = np.random.permutation(feat_len)[:max(1, int(log2(feat_len)))] else:indices = np.random.permutation(feat_len)[:feature_bound] tmp_feats = [self.feats[i] for i in indices] for feat in tmp_feats:實際上這個是拉斯維加斯隨機算法,把確定性算法的某一步修改成隨機概率方式。
算法代碼實現:
# 導入我們自己實現的決策樹模型 # 導入我們自己實現的決策樹模型 from c_CvDTree.Tree import * import numpy as np class RandomForest(ClassifierBase):# 建立一個決策樹字典,以便調用_cvd_trees = {"id3": ID3Tree,"c45": C45Tree,"cart": CartTree}def __init__(self):super(RandomForest, self).__init__()self._trees = []# 實現計算的函數@staticmethoddef most_appearance(arr):u, c = np.unique(arr, return_counts=True)return u[np.argmax(c)]# 默認使用 10 棵 CART 樹、默認 k = log(d)def fit(self, x, y, sample_weight=None, tree="cart", epoch=10, feature_bound="log",*args, **kwargs):x, y = np.atleast_2d(x), np.array(y)n_sample = len(y)for _ in range(epoch):tmp_tree = RandomForest._cvd_trees[tree](*args, **kwargs)# 每次選取n_sample個樣本_indices = np.random.randint(n_sample, size=n_sample)if sample_weight is None:_local_weight = Noneelse:_local_weight = sample_weight[_indices]_local_weight /= _local_weight.sum()# 針對樣本進行訓練,生成樹tmp_tree.fit(x[_indices], y[_indices],sample_weight=_local_weight, feature_bound=feature_bound)# 把生成的樹放入森林列表self._trees.append(deepcopy(tmp_tree))# 對個體決策樹進行簡單組合# 把10棵樹的判斷的類別放入列表里,這里可能是多個樣本所以是matrix,# 把每個樣本的類別出現次數最多的類別,即為輸出結果def predict(self, x):_matrix = np.array([_tree.predict(x) for _tree in self._trees]).Treturn np.array([RandomForest.most_appearance(rs) for rs in _matrix])總結
以上是生活随笔為你收集整理的机器学习:随机森林算法及其实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 机器学习:集成学习(ensemble),
- 下一篇: 机器学习:AdaBoost算法及其实现