机器学习实战:集成学习与随机森林
目录
集成学习(ensemble learning)
定义:
使用一系列学习器进行学习,并使用某种规则把各个学习结果进行整合从而获得比单个学习器更好的学习效果的一种机器学习方法。
集成学习方式:
- bagging- (RF)
- boosting - (GBDT/Adaboost/ XGBOOST)
- stacking
集成学习分类(ensemble learning classification)
集成学习:
- Bagging:基于Bagging的Random Forest
- Boosting:
1) 基于Boosting的AdaBoost
2) Gradient Boosting Machines(GBM)梯度推进机
3) Gradient Boosting Regression Trees(GBRT)梯度提升回归树 - Stacking
Bagging:训练对个学习器,投票决定。
- Bagging又叫自助聚集,是一种根据均匀概率分布从数据中重复抽样(有放回)的技术。
- 每个抽样生成的自助样本集上,训练一个基分类器;对训练过的分类器进行投票,将测试样本指派到得票最高的类中。
- 每个自助样本集都和原数据一样大。
- 有放回抽样,一些样本可能在同一训练集中出现多次,一些可能被忽略。
有没有可能样本始终没被取到?
每次大约有36.8%的数据没有被抽到。
- (1-1/n)^m
- limit [(1-1/n)^m]
Boosting:从基学习期开始加强,通过加权进行训练。
Boosting有很多种,比如AdaBoost(Adaptive Boosting)、radient Boosting等。
Boosting也是集合了多个决策树,但是Boosting的每棵树是顺序生成的,每一棵树都依赖于前一颗树。
- boosting是一个迭代的过程,用于自适应地改变训练样本的分布,使得基分类器聚焦在那些很难分的样本上
- boosting会给每个训练样本赋予一个权值,而且可以在每轮提升过程结束时自动地调整权值。
Adaboost:
Stacking:聚合多个分类和回归模型(可分阶段做)。
随机森林(Random forest)
决策树回归:
“随机”和“森林:”
步骤:
- 从样本集中通过重采样的方式产生n个样本。
- 建设样本特征数目为a,对n个样本选择a中的k个特征,用建立决策树的方式获得最佳分割点。
- 重复m次,产生m棵决策树。
- 多数投票机制进行预测。
随机性体现:
➢随机采样:随机森林在计算每棵树时,从全部训练样本(样本数为n)中选取一个可能有重复的、大小同样为n的数据集进行训练(即booststrap采样)。
➢特征选取的随机性 :在每个节点随机选取所有特征的一个子集,用来计算最佳分割方式。
两种随机过程( bagging和RF区别) :
- 样本随机
- 特征随机
随机森林优缺点:
-
训练可以高度并行化,对于大数据时代的大样本训练速度有优势。
-
由于采用了随机采样,泛化能力强。
-
对部分特征缺失不敏感。
-
对于噪音较大的样本,容易过拟合
-
可解释性较决策树弱
随机的艺术:
特征选择
- 被选择频次
- 离根节点更近
异常检验(Isolation Forest)
- 较早被分出来的最有可能是异常值
Isolation Forest(孤立森林)
算法评价
优点:
➢训练速度快,容易做成并行化方法(训练时,树与树之间是相互独立的)。
➢在训练过程中,能够检测到feature之间的影响。
➢随机森林抗过拟合能力比较强
➢解决分类和回归问题上,表现比较好
➢可以处理不均衡数据集
缺点:
➢对于小数据或者低维数据(特征较少的数据),可能不能产 生很好的分类。
➢对于许多统计建模者来说,随机森林给人的感觉就像一个黑盒子,你无法控制模型内部的运行。
➢执行数据虽然比boosting等快(随机森林属于bagging),但比单只决策树慢多了。
【实战】
Bagging.py
# Bagging:训练对个学习器,投票决定。
# Import All the required packages from sklearn
import numpy as np
from sklearn import model_selection
from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris
#Load data
iris = load_iris()
X = iris.data
Y = iris.target
#Split data in training and testing set
X_fit, X_eval, y_fit, y_test= model_selection.train_test_split( X, Y, test_size=0.30, random_state=1 )
# Create random sub sample to train multiple models
seed = 7
kfold = model_selection.KFold(n_splits=10, random_state=seed)
# Define a decision tree classifier
cart = DecisionTreeClassifier()
num_trees = 100
# Create classification model for bagging
model = BaggingClassifier(base_estimator=cart, n_estimators=num_trees, random_state=seed)
# Train different models and print their accuracy
results = model_selection.cross_val_score(model, X_fit, y_fit,cv=kfold)
for i in range(len(results)):
print("Model: "+str(i)+" Accuracy is: "+str(results[i]))
print("Mean Accuracy is: "+str(results.mean()))
model.fit(X_fit, y_fit)
pred_label = model.predict(X_eval)
nnz = np.shape(y_test)[0] - np.count_nonzero(pred_label - y_test)
acc = 100*nnz/np.shape(y_test)[0]
print('accuracy is: '+str(acc))
Boosting.py
# Boosting:从基学习期开始加强,通过加权进行训练。
# Import All the required packages from sklearn
from sklearn import model_selection
from sklearn.datasets import load_iris
from sklearn.ensemble import AdaBoostClassifier # Boosting Algorithm
from sklearn.tree import DecisionTreeClassifier
import numpy as np
# Load data
iris = load_iris()
X = iris.data
Y = iris.target
# Split data in training and testing set
X_fit, X_eval, y_fit, y_test= model_selection.train_test_split( X, Y, test_size=0.20, random_state=1 )
# Define a decision tree classifier
cart = DecisionTreeClassifier()
num_trees = 25
# Create classification model for bagging
model = AdaBoostClassifier(base_estimator=cart, n_estimators=num_trees, learning_rate = 0.1)
# Train Classification model
model.fit(X_fit, y_fit)
# Test trained model over test set
pred_label = model.predict(X_eval)
nnz = np.float(np.shape(y_test)[0] - np.count_nonzero(pred_label - y_test))
acc = 100*nnz/np.shape(y_test)[0]
# Print accuracy of the model
print('accuracy is: '+str(acc))
Stacking.py
# Stacking:聚合多个分类和回归模型(可分阶段做)。
from sklearn import datasets
from sklearn.ensemble import RandomForestClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.naive_bayes import GaussianNB
from sklearn.neighbors import KNeighborsClassifier
import numpy as np
iris = datasets.load_iris()
X, y = iris.data[:, 1:3], iris.target
def CalculateAccuracy(y_test,pred_label):
nnz = np.shape(y_test)[0] - np.count_nonzero(pred_label - y_test)
acc = 100*nnz/float(np.shape(y_test)[0])
return acc
clf1 = KNeighborsClassifier(n_neighbors=2)
clf2 = RandomForestClassifier(n_estimators=2, random_state=1)
clf3 = GaussianNB()
lr = LogisticRegression()
clf1.fit(X, y)
clf2.fit(X, y)
clf3.fit(X, y)
f1 = clf1.predict(X)
acc1 = CalculateAccuracy(y, f1)
print("accuracy from KNN: "+str(acc1) )
f2 = clf2.predict(X)
acc2 = CalculateAccuracy(y, f2)
print("accuracy from Random Forest: "+str(acc2) )
f3 = clf3.predict(X)
acc3 = CalculateAccuracy(y, f3)
print("accuracy from Naive Bays: "+str(acc3) )
f = [f1, f2, f3]
f = np.transpose(f)
lr.fit(f, y)
final = lr.predict(f)
acc4 = CalculateAccuracy(y, final)
print("accuracy from Stacking: "+str(acc4) )