文章目录

  • 1.集成学习简介
  • 2.Voting
    • 1)Voting能够提高准确度的原因
    • 2)Voting的原理
    • 3)代码实现
  • 3.Bagging与随机森林
    • 代码实现
  • 4.Boosting-AdaBoost
    • 1)原理
    • 2)计算举例
    • 3)代码实现
  • 5.Boosting-GBDT
    • 1)GBDT之提升和提升树
    • 2)代码实现
    • 3)梯度提升树
  • 6.Boosting-XGBoost
    • 1)简介、目标函数、正则项
    • 2)XGBoost求解
    • 3)XGBoost树结构生成
    • 4)代码实现
  • 7.Stacking
    • 代码实现

1.集成学习简介


2.Voting

1)Voting能够提高准确度的原因

2)Voting的原理

硬投票分类器

软投票分类器

3)代码实现

# Voting代码的实现-硬、软投票分类器
from sklearn.datasets import make_moons
from sklearn.ensemble import VotingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.tree import DecisionTreeClassifier# 加载数据集
# n_samples表示样本点,noise表示噪声
X, y = make_moons(n_samples=7000, noise=0.1)
# plt.scatter(X[:,0],X[:,1])
# plt.show()# 数据集的分割
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.75, random_state=42)# 定义三个基本分类器
# 逻辑回归、决策树、SVM
lr = LogisticRegression()
dt = DecisionTreeClassifier()
# probability=True表示可以输出概率值
svm = SVC(probability=True)# 定义投票分类器
# 软投票分类器要求基分类器都可以输入概率值
voting = VotingClassifier(estimators=[('lr', lr), ('dt', 'dt'), ('svm', svm)],voting='soft'# voting = 'hard'
)# 输出各个分类器的准确率
for clf in (lr, dt, svm,voting):clf.fit(X_train, y_train)y_hat = clf.predict(X_test)print(clf.__class__.__name__, '=', accuracy_score(y_test, y_hat))

3.Bagging与随机森林


代码实现

from sklearn.datasets import load_iris
from sklearn.ensemble import BaggingClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
from sklearn.svm import SVC
from sklearn.tree import DecisionTreeClassifier# 加载数据集
iris = load_iris()
# 目标值与特征值
X = iris.data
y = iris.target# bootstrap = True 为bagging,bootstrap=False为pasting
# max_samples设置为整数表示的就是采样的样本数,设置为浮点数表示的是max_samples*x.shape[0]
# 当样本数量N趋近于无穷大时,1-(1-(1/N))**N = 1-(e)**(-1) = 0.37表示bagging会有一部分数据取不到,这部分数据作为测试集
bag_clf = BaggingClassifier(SVC(),n_estimators=500,bootstrap=True,max_samples=1.0,oob_score=True
)bag_clf.fit(X, y)
# y_hat = bag_clf.predict(X)
# print(bag_clf.__class__.__name__, '=',accuracy_score(y,y_hat))          # BaggingClassifier 0.9733333333333334
# 用测试集得出的准确率,oob_score_
print(bag_clf.oob_score_)  # 0.9733333333333334# 基分类器是决策树,那么就是随机森林
bag_clf = BaggingClassifier(DecisionTreeClassifier(),n_estimators=500,bootstrap=True,max_samples=1.0,
)bag_clf.fit(X, y)
y_hat = bag_clf.predict(X)
# 训练集的准确率
print(bag_clf.__class__.__name__, '=', accuracy_score(y, y_hat)) # sklearn对于随机森林也提供了直接实现随机森林的API
rnd_clf = RandomForestClassifier(n_estimators=500)
rnd_clf.fit(X, y)
y_hat = rnd_clf.predict(X)
print(rnd_clf.__class__.__name__, '=', accuracy_score(y_hat, y))
0.96
BaggingClassifier = 1.0
RandomForestClassifier = 1.0

4.Boosting-AdaBoost

1)原理


2)计算举例



3)代码实现

# AdaBoost代码实现
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import AdaBoostClassifier
from sklearn.metrics import accuracy_score
from sklearn.preprocessing import StandardScaler
# 加载数据
data = np.loadtxt('data/wine.data', delimiter=',')
# 特征值与目标值
X = data[:, 1:]
y = data[:, 0:1]# 数据量级不同时,一般作归一化,不过使用决策树作为基分类器,不归一化也可以,但诸如逻辑回归、SVM事先一定要做一下归一化
X = StandardScaler().fit_transform(X)
# print(X)# 分割数据集
X_train, X_test, y_train, y_test = train_test_split(X, y.ravel(), train_size=0.8, random_state=0)# 定义弱(基)分类器
rf = DecisionTreeClassifier()# 定义AdaBoost分类器
model = AdaBoostClassifier(base_estimator=rf,n_estimators=50,learning_rate=0.5
)model.fit(X_train,y_train)
y_train_hat = model.predict(X_train)
print('train_accuarcy =',accuracy_score(y_train,y_train_hat))   # train_accuarcy = 1.0
y_test_hat = model.predict(X_test)
print('test_accuracy =',accuracy_score(y_test_hat,y_test))      # test_accuracy = 0.9722222222222222

5.Boosting-GBDT

1)GBDT之提升和提升树


2)代码实现

import matplotlib.pyplot as plt
import numpy as np
from sklearn.ensemble import GradientBoostingRegressor
# 回归问题
from sklearn.tree import DecisionTreeRegressor# 加载数据-回归问题
def loaddata():data = np.loadtxt('data/data1.txt', delimiter=',')# 特征数n = data.shape[1] - 1X = data[:, 0:n]y = data[:, -1].reshape(-1, 1)return X, yif __name__ == '__main__':X, y = loaddata()plt.scatter(X, y)plt.show()# 根据算法原理手动实现GBDT# 让新的预测器针对前一个树的残差进行拟合# 1.定义第一棵树(最大深度为5),并进行训练tree_regl = DecisionTreeRegressor(max_depth=5)tree_regl.fit(X, y)# 2.计算残差,并把残差当做目标值训练第二棵树y2 = y - tree_regl.predict(X).reshape(-1, 1)tree_reg2 = DecisionTreeRegressor(max_depth=5)tree_reg2.fit(X, y2)# 3.继续计算残差,并训练第三棵树y3 = y2 - tree_reg2.predict(X).reshape(-1, 1)tree_reg3 = DecisionTreeRegressor(max_depth=5)tree_reg3.fit(X, y3)# 4.测试前5条数据X_new = X[0:5, :]y_hat_1 = tree_regl.predict(X_new)y_hat_2 = tree_reg2.predict(X_new)y_hat_3 = tree_reg3.predict(X_new)# y_pred = tree_regl.predict(X_new)+tree_reg2.predict(X_new)+tree_reg3.predict(X_new)y_pred = sum(tree.predict(X_new) for tree in (tree_regl, tree_reg2, tree_reg3))print(y_pred)# [17.61560196  9.15380196 12.831       4.57199973  6.68971688]# 直接使用sklearn提供的GradientBoostingRegressorgbrt = GradientBoostingRegressor(max_depth=5, n_estimators=3, learning_rate=1.0)gbrt.fit(X, y.ravel())print(gbrt.predict(X_new))      # [17.61560196  9.15380196 12.831       4.57199973  6.68971688]

3)梯度提升树

提升树是梯度提升树的一种特例

import matplotlib.pyplot as plt
import numpy as np
from sklearn.ensemble import GradientBoostingRegressor
# 回归问题
from sklearn.tree import DecisionTreeRegressor# 加载数据-回归问题
def loaddata():data = np.loadtxt('data/data1.txt', delimiter=',')# 特征数n = data.shape[1] - 1X = data[:, 0:n]y = data[:, -1].reshape(-1, 1)return X, yif __name__ == '__main__':X, y = loaddata()plt.scatter(X, y)plt.show()gbrt = GradientBoostingRegressor(max_depth=5, n_estimators=3, learning_rate=1.0)gbrt.fit(X, y.ravel())print(gbrt.predict(X_new))      # [17.61560196  9.15380196 12.831       4.57199973  6.68971688]

6.Boosting-XGBoost

比赛常用,用到了二阶导数

1)简介、目标函数、正则项


目标函数

正则项

论文中正则项如上式:
gamma表示用户指定的参数
T表示叶子节点数
lamda表示用户的参数
w是叶子节点的权值,即预测值

2)XGBoost求解



3)XGBoost树结构生成


4)代码实现

import xgboost as xgb
import matplotlib.pyplot as plt
from sklearn.metrics import accuracy_score# XGBoost中数据形式可以是libsvm的,libsvm作用是对稀疏特征进行优化,看个例子:
# 1 101:1.2 102:0.03
# 0 1:2.1 10001:300 10002:400
# 0 2:1.2 1212:21 7777:2
# 每行表示一个样本,每行开头0,1表示标签,而后面的则是特征索引:数值,其他未表示都是0.
# 我们以判断蘑菇是否有毒为例子来做后续的训练。其中蘑菇有22个属性,将这些原始的特征加工后得到126维特征,并保存为libsvm格式,标签是表示蘑菇是否有毒。# 读取数据-有专门的数据类型
data_train = xgb.DMatrix('data/agaricus.txt.train')
data_test = xgb.DMatrix('data/agaricus.txt.test')# 设置参数
# eta:可看成学习率learning_rate,控制学习速度。典型值一般设置为:0.01-0.2
# gamma:分裂节点时,损失函数减小值只有大于等于gamma才分裂,gamma值越大,算法越保守,越不容易过拟合,但性能就不一定能保证,需要平衡。
# objective
#     - reg:linear:线性回归
#     - reg:logistic:逻辑回归
#     - binary:logistic 二分类的逻辑回归,返回预测的概率
#     - binary:logitraw:二分类逻辑回归,输出是逻辑为0/1的前一步的分数
#     - multi:softmax:用于Xgboost 做多分类问题,需要设置num_class(分类的个数)
#     - multi:softprob:和softmax一样,但是返回的是每个数据属于各个类别的概率。
#     - rank:pairwise:让Xgboost 做排名任务,通过最小化(Learn to rank的一种方法)
# max_depth:决策树最大深度
# silent:0 (silent), 1 (warning), 2 (info), 3 (debug)
# evals表示评价的时候选取什么
param = {'max_depth': 3, 'eta': 0.3, 'silent': 1, 'objective': 'binary:logistic'}
n_round = 6
watchlist = [(data_test, 'eval'), (data_train, 'train')]
model = xgb.train(param, data_train, num_boost_round=n_round, evals=watchlist)# 计算准确率
y_hat = model.predict(data_test)
# 把概率转换成0、1分类
y_pred = y_hat.copy()
y_pred[y_pred >= 0.5] = 1
y_pred[y_pred < 0.5] = 0
# 获取实际标签
y = data_test.get_label()
print('accuracy_score =', accuracy_score(y, y_pred))# 采用to_graphviz法绘制树图
# num_trees表示树的数量
digraph = xgb.to_graphviz(model, num_trees=0)
digraph.format = 'png'
digraph.view('./xgb_view')# T2、采用plot_tree法绘制树图
fig = plt.figure(figsize=(10, 10))
ax = fig.subplots()
xgb.plot_tree(model, num_trees=1, ax=ax)
plt.show()
import xgboost as xgb
import matplotlib.pyplot as plt
from sklearn.metrics import accuracy_score
from sklearn.datasets import load_svmlight_file
from sklearn.model_selection import GridSearchCV,train_test_split# 读取数据并自动做一个分割(把libsvm格式读取成以前我们常用的二维数组形式)
X_train,y_train = load_svmlight_file('data/agaricus.txt.train')
X_test,y_test = load_svmlight_file('data/agaricus.txt.test')
print(X_train.toarray().shape)              # (6513, 126)# 定义模型并设置参数,然后fit数据
model = xgb.XGBClassifier(max_depth=3,learning_rate=0.3,n_estimators=6,silent=True,objective='binary:logistic')
model.fit(X_train,y_train)# 计算准确率
# 训练集上的准确率
train_preds = model.predict(X_train)
print('Train Accuary:%.2f%%'%(accuracy_score(y_train,train_preds)*100))     # Train Accuary:99.88%
# 测试集上的准确率
test_preds = model.predict(X_test)
print('Test Accuary:%.2f%%'%(accuracy_score(y_test,test_preds)*100))            # Test Accuary:100.00%# GridSearchCV搜索最优参数
model = xgb.XGBClassifier(learning_rate=0.1,objective='binary:logistic')
param_grid = {'n_estimators': range(1, 51, 1),'max_depth': range(1, 10, 1)
}
clf = GridSearchCV(model,param_grid=param_grid,scoring='accuracy',cv=5)
clf.fit(X_train,y_train)print(clf.best_params_)         # {'max_depth': 2, 'n_estimators': 30}
print(clf.best_score_)          # 0.9841860859908541# early-stop及早停止
# 设置验证valid集,当我们迭代过程中发现在验证集上错误率增加,则提前停止迭代。
X_train_part,X_validate,y_train_part,y_validate = train_test_split(X_train,y_train,train_size=0.7,random_state=0)# 设置boosting迭代计算次数
num_round = 100
bst = xgb.XGBClassifier(max_depth=2,learning_rate=0.1,n_estimators=num_round,silent = True,objective="binary:logistic")
# 验证集
eval_set = [(X_validate,y_validate)]
# early_stopping_rounds
# eval_metric表示评价指数-错误率
bst.fit(X_train_part,y_train_part,early_stopping_rounds=10,eval_metric='error',eval_set=eval_set,verbose=True)results = bst.evals_result()
print(results)# 将上面的错误率进行可视化,方便观察
epochs = len(results['validation_0']['error'])
x_axis = range(0,epochs)
plt.plot(x_axis,results['validation_0']['error'],label ='test')
plt.ylabel('Error')
plt.xlabel('Round')
plt.title('XGBoost Early Stop')
plt.show()# 学习曲线
num_round = 100
bst = xgb.XGBClassifier(max_depth=2,learning_rate=0.1,n_estimators=num_round,silent = True,objective="binary:logistic")
# 验证集
eval_set = [(X_train_part,y_train_part),(X_validate,y_validate)]
# eval_metric=['error','logloss']表示两个评价指标,一个错误率,一个是损失
bst.fit(X_train_part,y_train_part,eval_set =eval_set,eval_metric=['error','logloss'],verbose=True)
results = bst.evals_result()
print(results)# 画图
epochs = len(results['validation_0']['error'])
x_axis = range(0,epochs)fig,ax = plt.subplots()
ax.plot(x_axis,results['validation_0']['logloss'],label = 'Train')
ax.plot(x_axis,results['validation_1']['logloss'],label = 'Test')
# ax.legend()表示给图形添加图例
ax.legend()
plt.ylabel('Log Loss')
plt.title('XGBoost Log Loss')
plt.show()fig,ax = plt.subplots()
ax.plot(x_axis,results['validation_0']['error'],label = 'Train')
ax.plot(x_axis,results['validation_1']['error'],label = 'Test')
ax.legend()
plt.ylabel('Classification Error')
plt.title('XGBoost Classification Error')
plt.show()

7.Stacking

代码实现

import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.linear_model import LogisticRegression
from mlxtend.classifier import StackingClassifier
from sklearn.metrics import accuracy_score# 加载数据
data = np.loadtxt('data/wine.data',delimiter=',')
X = data[:,1:]
y = data[:,0:1]
X_train,X_test,y_train,y_test = train_test_split(X,y.ravel(),train_size=0.75,random_state=0)# 定义基分类器
clf1 = KNeighborsClassifier(n_neighbors=5)
clf2 = RandomForestClassifier(random_state=1)
clf3 = GaussianNB()# 定义最后用的逻辑回归分类器
lr = LogisticRegression()
# 定义堆叠集成
# use_probas表示是否使用概率输出
sclf = StackingClassifier(classifiers= [clf1,clf2,clf3],meta_classifier=lr,use_probas=True)# 对每一个模型分别进行评价
for model in [clf1,clf2,clf3,sclf]:model.fit(X_train,y_train)y_test_hat = model.predict(X_test)print(model.__class__.__name__,',test accuarcy:',accuracy_score(y_test,y_test_hat))
KNeighborsClassifier ,test accuarcy: 0.7333333333333333
RandomForestClassifier ,test accuarcy: 0.9777777777777777
GaussianNB ,test accuarcy: 0.9333333333333333
StackingClassifier ,test accuarcy: 0.9777777777777777

机器学习8-集成学习相关推荐

  1. 【机器学习】集成学习与模型融合方法举例

    [机器学习]集成学习与模型融合方法举例 文章目录 1 概述1.1 什么是集成学习 2 CrossValidation 交叉验证 3 stacking 4 Voting投票器 5 Bagging 1 概 ...

  2. 【机器学习】集成学习—Boosting—GBM(Gradient Boosting Machine)解析

    [机器学习]集成学习-Boosting-GBM(Gradient Boosting Machine)解析 文章目录 [机器学习]集成学习-Boosting-GBM(Gradient Boosting ...

  3. 【机器学习】集成学习投票法:投票回归器(VotingRegressor) 投票分类器(VotingClassifier)

    前言 投票回归器和投票分类器都属于集成学习.在[机器学习]集成学习基础概念介绍中有提到过,集成学习的结合策略包括: 平均法.投票法和学习法.sklearn.ensemble库中的Voting Clas ...

  4. 机器学习之集成学习(一)

    详细参考:https://www.cnblogs.com/pinard/p/6131423.html 首先明确集成学习它本身不是一个单独的机器学习算法,而是通过构建并结合多个机器学习器来完成学习任务. ...

  5. 【机器学习】集成学习知识点总结一

    集成学习算法概述 严格意义上来说,集成学习算法不算是一种机器学习算法,而更像是一种优化手段或策略,它通常是结合多个简单的弱机器学习算法,去做更可靠的决策.有人把它称为机器学习中的"屠龙刀&q ...

  6. 【机器学习】集成学习(Ensemble Learning)介绍

    1. 概述 在机器学习的有监督学习算法中,我们的目标是学习出一个稳定的且在各个方面表现都较好的模型,但实际情况往往不这么理想,有时我们只能得到多个有偏好的模型(弱监督模型,在某些方面表现的比较好).集 ...

  7. 机器学习之集成学习概述

    目录 集成方法概述 学习器生成策略(串行)--boosting 学习器生成策略(并行)-- bagging.Random Forest 结合策略之学习法--堆叠法(Stacking) 传送门 集成方法 ...

  8. 百面机器学习 之 集成学习

    问题1. 什么是Boosting和Bagging,他们各自有什么特点 Boosting的主要思想就是 将基分类器层层叠加,每一层训练的时候对前一层基分类器分错的样本给予更高的权重进行训练,每个分类器之 ...

  9. 基于机器学习中集成学习的stacking方式进行的金线莲质量鉴别研究(python进行数据处理并完成建模,对品种进行预测)

    1.前言 金线莲为兰科开唇兰属植物,别名金丝兰.金丝线.金耳环.乌人参.金钱草等,是一种名贵中药材,国内主要产地为较低纬度地区如:福建.台湾.广东.广西.浙江.江西.海南.云南.四川.贵州以及西藏南部 ...

  10. 机器学习-机器学习之集成学习(ensemble learning)

    前面我们说了很多算法模型,当然有的时候我们为了让模型能有更好的泛化效果,我们会采用模型融合的方式来进行对模型的融合.先来讲讲基础: 什么是集成学习?集成学习就是通过多个个体学习器集合起来通过某种策略来 ...

最新文章

  1. 【Linux系统】基础总结
  2. KTV歌曲推荐-深入浅出协同过滤
  3. Heka:Go编写,来自Mozilla,高效、灵活的插件式数据挖掘工具(转)
  4. A - Junk-Mail Filter HDU - 2473
  5. 十一、案例:TabBar的封装
  6. C++学习之路 | PTA乙级——1092 最好吃的月饼 (20 分)(精简)
  7. nginx php-cgi php
  8. 让你每天抽出两小时陪小孩子读书,你能坚持吗?
  9. Jsoup实现java模拟登陆
  10. 栈和堆(Stack Heap)
  11. 开课吧Java课堂:什么是ArrayList类
  12. 迅捷PDF虚拟打印机怎么保存文件
  13. webex无法用计算机呼叫,CiscoWebExMeetingsServer疑难解答指引.PDF
  14. 支持向量机SVM、支持向量回归SVR详细推导
  15. Redis中文翻译系列---Redis文档
  16. 写了这么久的业务连异常都不知道怎么处理吗
  17. Unity3d Platformer Pro 2D游戏开发框架使用教程
  18. 努力工作,却永不升职,是种怎样的体验?
  19. 逆向工程学习笔记#1——概况篇
  20. TexturePacker的免费key获取方式

热门文章

  1. 【Yeoman】热部署web前端开发环境
  2. ASP.NET MVC3书店--第二节 控制器(转)
  3. C# winform 上传文件 (多种)
  4. 【模块】【通信】---http模块中req和res 常用的属性介绍
  5. 算法:两条线段求交点
  6. R学习-小白笔记08
  7. 谈一谈chrome浏览器使用
  8. vss 6.0配置VS2005、VS2008 ---- 图文
  9. 实例开发:ASP.NET创建网络相册
  10. C++编程语言中接收用户输入参数的方法