ensemble learning 1—— bagging and Random Forset

當做重要決定時,大家可能都會考慮吸取多個專家而不只是一個人的意見。集成學習也是如此。集成學習就是組合多個學習器,最後可以得到一個更好的學習器。
When making important decisions, everyone may consider drawing from multiple experts rather than just one person. The same is true for ensemble learning. Ensemble learning is to combine multiple learners, and finally a better learner can be obtained.

集成學習算法:
1.個體學習器之間不存在強依賴關係,裝袋(bagging)
2.隨機森林(Random Forest)
3.個體學習器之間存在強依賴關係,提升(boosting)
4.Stacking

Here I explain the bagging and RF.
1. bagging也叫做bootstrap aggregating,是在原始數據集選擇S次後得到S個新數據集的一種技術。是一種有放回抽樣。
在這裏插入圖片描述
code

#bagging的思想是對並行分類器的選擇
# 導入算法包以及數據集
from sklearn import neighbors
from sklearn import datasets
from sklearn.ensemble import BaggingClassifier
from sklearn import tree
from sklearn.model_selection import train_test_split
import numpy as np
import matplotlib.pyplot as plt

iris = datasets.load_iris()
x_data = iris.data[:,:2]
y_data = iris.target

x_train,x_test,y_train,y_test = train_test_split(x_data, y_data)

knn = neighbors.KNeighborsClassifier()
knn.fit(x_train, y_train)

def plot(model):
    # 獲取數據值所在的範圍
    x_min, x_max = x_data[:, 0].min() - 1, x_data[:, 0].max() + 1
    y_min, y_max = x_data[:, 1].min() - 1, x_data[:, 1].max() + 1

    # 生成網格矩陣
    xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02),
                         np.arange(y_min, y_max, 0.02))

    z = model.predict(np.c_[xx.ravel(), yy.ravel()])# ravel與flatten類似,多維數據轉一維。flatten不會改變原始數據,ravel會改變原始數據
    z = z.reshape(xx.shape)
    # 等高線圖
    cs = plt.contourf(xx, yy, z)

# 畫圖
plot(knn)
# 樣本散點圖
plt.scatter(x_data[:, 0], x_data[:, 1], c=y_data)
plt.show()
# 準確率
knn.score(x_test, y_test)

dtree = tree.DecisionTreeClassifier()
dtree.fit(x_train, y_train)

# 畫圖
plot(dtree)
# 樣本散點圖
plt.scatter(x_data[:, 0], x_data[:, 1], c=y_data)
plt.show()
# 準確率
dtree.score(x_test, y_test)

bagging_knn = BaggingClassifier(knn, n_estimators=100)
# 輸入數據建立模型
bagging_knn.fit(x_train, y_train)
plot(bagging_knn)
# 樣本散點圖
plt.scatter(x_data[:, 0], x_data[:, 1], c=y_data)
plt.show()
bagging_knn.score(x_test, y_test)

bagging_tree = BaggingClassifier(dtree, n_estimators=100)
# 輸入數據建立模型
bagging_tree.fit(x_train, y_train)
plot(bagging_tree)
# 樣本散點圖
plt.scatter(x_data[:, 0], x_data[:, 1], c=y_data)
plt.show()
bagging_tree.score(x_test, y_test)


2. Random Forset(RF)
在這裏插入圖片描述
···
(1) 樣本的隨機:從樣本集中用bagging的方式,隨機選
擇n個樣本。
(2) 特徵的隨機:從所有屬性d中隨機選擇k個屬性(k<d),
然後從k個屬性中選擇最佳分割屬性作爲節點建立
CART決策樹。
(3)重複以上兩個步驟m次,建立m棵CART決策樹。
(4)這m棵CART決策樹形成隨機森林,通過投票表決結
果,決定數據屬於哪一類。
···
code:

from sklearn import tree
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
import numpy as np
import matplotlib.pyplot as plt

# 載入數據
data = np.genfromtxt("LR-testSet2.txt", delimiter=",")
x_data = data[:,:-1]
y_data = data[:,-1]

plt.scatter(x_data[:,0],x_data[:,1],c=y_data)
plt.show()


x_train,x_test,y_train,y_test = train_test_split(x_data, y_data, test_size = 0.5)

def plot(model):
    # 獲取數據值所在的範圍
    x_min, x_max = x_data[:, 0].min() - 1, x_data[:, 0].max() + 1
    y_min, y_max = x_data[:, 1].min() - 1, x_data[:, 1].max() + 1

    # 生成網格矩陣
    xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02),
                         np.arange(y_min, y_max, 0.02))

    z = model.predict(np.c_[xx.ravel(), yy.ravel()])# ravel與flatten類似,多維數據轉一維。flatten不會改變原始數據,ravel會改變原始數據
    z = z.reshape(xx.shape)
    # 等高線圖
    cs = plt.contourf(xx, yy, z)
    # 樣本散點圖
    plt.scatter(x_test[:, 0], x_test[:, 1], c=y_test)
    plt.show()
#決策樹分類器
dtree = tree.DecisionTreeClassifier()
dtree.fit(x_train, y_train)
plot(dtree)
dtree.score(x_test, y_test)
#建立RF模型,對數據進行訓練及評價
RF = RandomForestClassifier(n_estimators=50)
RF.fit(x_train, y_train)
plot(RF)
RF.score(x_test, y_test)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章