隨機森林(random forest):
隨機森林是乙個最近比較火的演算法,它有很多的優點:
隨機森林最早由leo breiman與adele cutler提出,
隨機森林顧名思義,是用隨機的方式建立乙個森林,森林裡面有很多的決策樹組成,隨機森林的每一棵決策樹之間是沒有關聯的(跟adaboost相反,adaboost的每個基學習器互相相關。)。在得到森林之後,當有乙個新的輸入樣本進入的時候,就讓森林中的每一棵決策樹分別進行一下判斷,看看這個樣本應該屬於哪一類(對於分類演算法),然後看看哪一類被選擇最多,就**這個樣本為那一類。
在建立每一棵決策樹的過程中,有兩點需要注意 - 取樣與完全**。首先是兩個隨機取樣的過程,random forest對輸入的資料要進行行的取樣(即樣本的取樣)和列的取樣(特徵的取樣)。對於行取樣,採用有放回的方式,也就是在取樣得到的樣本集合中,可能有重複的樣本。假設輸入樣本為n個,那麼取樣的樣本也為n個。這樣使得在訓練的時候,每一棵樹的輸入樣本都不是全部的樣本,使得相對不容易出現over-fitting,這種方法也叫作re-sampling,通常情況下,隨機抽取得到的n個樣本中,只出現輸入樣本的60~70%的樣本,剩下的樣本不在re-sampling後的樣本中出現。
然後進行列取樣(特徵取樣),從m個feature中,選擇m個(一般選擇m=log2m)。之後就是對取樣之後的資料根據cart進行分類。注意:在基學習器深度大於1的情況,要對每個結點都從該點的特徵集合中重新選取k個特徵,並且根據gini係數進行判斷,從而將決策樹繼續展開。這樣決策樹的某乙個葉子節點要麼是無法繼續**的(更傾向於這種,這種方法就是設定基學習器cart的高度),要麼裡面的所有樣本的都是指向的同乙個分類(可能每個學習器都需要很多迭代,不推薦)。一般很多的決策樹演算法都乙個重要的步驟 - 剪枝,但是這裡不這樣幹,由於之前的兩個隨機取樣的過程保證了隨機性,所以就算不剪枝,也不會出現over-fitting。
按這種演算法得到的隨機森林中的每一棵都是很弱的,但是大家組合起來就很厲害了。我覺得可以這樣比喻隨機森林演算法:每一棵決策樹就是乙個精通於某乙個窄領域的專家(因為我們從m個feature中選擇m讓每一棵決策樹進行學習),這樣在隨機森林中就有了很多個精通不同領域的專家,對乙個新的問題(新的輸入資料),可以用不同的角度去看待它,最終由各個專家,投票得到結果。
下面是隨機森林最簡單實現的python**:
'''
samuel gao
2017.4.19
隨機森林
離散屬性
1、基學習器深度取為1 ,因為我這裡
只隨機取1個進行決策樹分析,
沒有用到cart決策樹,按gini係數比較。對特徵多的可以加上。
ps:要對每個基學習器的節點隨機抽取乙個特徵進行分叉,除非像我一樣
,將每棵樹的高度設為1.
2、基學習器可以並行生成,有興趣的可以用threading或multiprocessing模組
來實現,還是不太難的。這裡沒有寫出
'''# from sklearn.ensemble import randomforestclassifier
import numpy as np
import pandas as pd
import random
from threading import thread
from collections import counter
def xunlian(data, number):
featurechoice = int(np.random.randint(0, number-1, 1))
features = list(data[featurechoice].unique())
# features為['清脆', '沉悶']的形式
categorys = list(data[featurechoice])
dicts = {}
cc = 0
for ll in features:
dicts[ll] =
for m in categorys:
for j in features:
if m == j:
cc += 1
for i in features:
lst = dicts.get(i)
new_lst =
if len(lst) > 0:
for k in lst:
jieguo = counter(new_lst).most_common(1)[0][0]
dicts[i] = jieguo
return dicts
# dicts 為 的形式
class randomforest():
def __init__(self, n_estimators = 3):
self.estimators = n_estimators
@staticmethod
def assemble(inputs, labels):
n = len(labels)
for i in range(n):
data = np.vstack(inputs)
return data
def train(self, inputs, labels):
n = len(inputs[0]) # 特徵個數
data = randomforest.assemble(inputs, labels)
data = pd.dataframe(data)
sum_dicts = {}
rows = int(data.shape[0])
rcounts = rows - 1
for i in range(self.estimators):
df = pd.dataframe()
for m in range(rows):
j = random.randint(0, int(rcounts))
sum_dicts[i] = xunlian(df, n)
return sum_dicts
# 多執行緒並行生成基學習器方式:以後有時間完善
# threads =
# for i in range(self.estimators):
# ti = thread(target=xunlian, args=(data, n,))
## for t in threads:
# t.setdeamon(true)
# t.start()
def predict(self, input, model):
n = len(model)
# n為基學習器的個數
predicts = list()
for i in range(n):
categoryes = model[i]
for j in input:
if j in categoryes.keys():
prediction = counter(predicts).most_common(1)
print(prediction)
if prediction[0][0] == 0:
print("**結果為:壞瓜")
else:
print("**結果為:好瓜")
if __name__ == "__main__":
ex = randomforest() # 預設為3個基學習器
a0 = ['淺綠', '清脆', '中']
a1 = ['深綠', '沉悶', '大']
a2 = ['薄白', '清脆', '小']
a3 = ['淺綠', '清脆', '小']
a4 = ['深綠', '沉悶', '中']
lst = [a0, a1, a2, a3, a4]
y = [0, 1, 0, 1, 1] # 0壞 1好
model = ex.train(lst, y)
ex.predict(['淺綠', '清脆', '小'], model)
機器學習基礎 機器學習基礎引入
機器學習 是人工智慧的核心研究領域之一,其最初的研究動機是為了讓計算機系統具有人的學習能力以便實現人工智慧。事實上,由於 經驗 在計算機系統中主要是以資料的形式存在的,因此機器學習需要設法對資料進行分析,這就使得它逐漸成為智慧型資料分析技術的創新源之一。機器學習是構建複雜系統的一種方法,也許依靠我們...
機器學習基礎學習筆記 機器學習基礎介紹
概念 多領域交叉學科,設計概率論 統計學 逼近論 凸分析 演算法複雜度理論等多門學科。專門研究計算機怎樣模擬或實現人類的學習行為,以獲取新的知識或技能,重新組織已有的知識結構使之不斷改善自身的效能。學科定位 人工智慧 artificial intelligence,ai 的核心,是是計算機具有智慧型...
機器學習 二 機器學習基礎
機器學習基礎概念 關於資料 監督學習 機器學習的基本任務,具體可以做什麼?結果是乙個連續數字的值,而非乙個類別 回歸任務可以劃分成分類任務。給機器的訓練資料擁有 標記 或者 答案 例如 1.影象已經擁有了標定資訊 2.銀行已經積累了一定的客戶資訊和他們信用卡的信用情況 3.醫院已經積累了一定的病人資...