[7-31]集成分类器

2 篇文章 0 订阅

Learning with ensembles

分类器是採用多数决投票決定分哪类:
假设有三个分类器,正确率:0.7,0.7. 03
则:集成后分类正确率
1. 全部都分类正确0.7
2. 只有一个0.7,其他0.3 = C3取1* 0.720.3
以上用数学表达为
在这里插入图片描述
就结果来看錯誤率会小于单个分类器的0.3
代码实现

def ensemble_error(n_classifier, error):
	# 找出大於一半的最小整數
    k_start = int(math.ceil(n_classifier / 2.))  
    #C n取k
    probs = [comb(n_classifier, k) * error**k * (1-error)**(n_classifier - k)
             for k in range(k_start, n_classifier + 1)]
    return sum(probs)

以11个分类器位例画出下图,可看出只要正确率大于0.5,集成效果会好于单个。
在这里插入图片描述
为什么要集成分类器

Combining classifiers via majority vote

实作多数决

  1. 物件导向实作分类器投票
from sklearn.base import BaseEstimator
# 里面有.get_paems
from sklearn.base import ClassifierMixin
# 可以直接用Mixin class而不需要parents继承
from sklearn.preprocessing import LabelEncoder
from sklearn.base import clone
# 用同样的超参数=>clone(分类器)
from sklearn.pipeline import _name_estimators
import numpy as np
import operator
  1. 数据集iris = datasets.load_iris()

Implementing a simple majority vote classifier

sklearn.ensemble.VotingClassifier

Using the majority voting principle to make predictions

在这里插入图片描述

Evaluating and tuning the ensemble classifier

三种分类器加上集成分类器的roc曲线
在这里插入图片描述
在这里插入图片描述

多数决

  • 微调超参数 ➡ 格状搜寻
    若想对集成分类器做超参数的调整就必须用格状搜寻找到里面的参数,目的是为了找最佳参数组合。
def get_params(self, deep=True):
        """ Get classifier parameter names for GridSearch"""
        if not deep:
            return super(MajorityVoteClassifier, self).get_params(deep=False)
        else:
            out = self.named_classifiers.copy()
            for name, step in self.named_classifiers.items():
                for key, value in step.get_params(deep=True).items():#再繼續遞迴挖下去
                    out['%s__%s' % (name, key)] = value
            return out

OR

grid.cv_results_

最佳表现:

print('Best parameters: %s' % grid.best_params_)
print('Accuracy: %.2f' % grid.best_score_)

袋状(Bagging)

若遇到样本数不够,利用抽样的方式选取训练样本。因此可以根据不同分类器预测,在利用多数决方法决定最终预测结果。
dataset酒分类
流程

  1. 重编码=>切分训练数据80/20
  2. bagging
    bootstrap=True抽出在放回
bag = BaggingClassifier(base_estimator=tree,
                        n_estimators=500, 
                        max_samples=1.0, 
                        max_features=1.0, 
                        bootstrap=True, 
                        bootstrap_features=False, 
                        n_jobs=1, 
                        random_state=1)
  1. 精度
    .fit => .predict => accuracy_score(y_train, y_train_pred)
  2. 用np.meshgrid(xy轴写反)在这里插入图片描述

Boosting

概念:弱分类器集合起来变为强分类器
与committee method & bagging的差别:
依序训练的过程traind in squeuence。训练第一个分类器,分类错误点权重大,做第二次训练,分类错误点权重大。每次训练会记录alpha.

AdaBoost

在这里插入图片描述

  1. 起始值:所有样本同权重 n = 1 ,2 …N

  2. for m = 1, 2…M:
    极小化分错误的点的权重
    在这里插入图片描述

  3. 调整权重
    在这里插入图片描述

  4. 新权重
    在这里插入图片描述

  5. 预测 在这里插入图片描述
    举个例子
    在这里插入图片描述
    在这里插入图片描述

ada = AdaBoostClassifier(base_estimator=tree,
                         n_estimators=500, 
                         learning_rate=0.1,
                         random_state=1)

梯度提升

scikit learn
由依序極小化誤差函數看AdaBoost與Gradient Boost
CatBoost vs. Light GBM vs. XGBoost

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用集成学习的分类器的 Python 代码示例,其中使用了 VotingClassifier 和 BaggingClassifier: ```python from sklearn.ensemble import VotingClassifier, BaggingClassifier from sklearn.tree import DecisionTreeClassifier from sklearn.linear_model import LogisticRegression from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split # 生成一个示例数据集 X, y = make_classification(n_samples=1000, n_features=4, n_informative=2, n_redundant=0, random_state=0, shuffle=False) # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) # 定义三个基础模型 model1 = DecisionTreeClassifier(max_depth=4) model2 = LogisticRegression(random_state=0) model3 = DecisionTreeClassifier(max_depth=2) # 定义投票分类器 voting_clf = VotingClassifier(estimators=[('dt', model1), ('lr', model2), ('dt2', model3)], voting='hard') # 定义 Bagging 分类器 bagging_clf = BaggingClassifier(base_estimator=model1, n_estimators=100, random_state=0) # 训练投票分类器 voting_clf.fit(X_train, y_train) # 训练 Bagging 分类器 bagging_clf.fit(X_train, y_train) # 测试投票分类器 print(voting_clf.score(X_test, y_test)) # 测试 Bagging 分类器 print(bagging_clf.score(X_test, y_test)) ``` 在这个示例中,我们使用 scikit-learn 库中的 `VotingClassifier` 和 `BaggingClassifier` 类来定义一个投票分类器和一个 Bagging 分类器。在训练模型之后,我们使用 `score` 方法来评估模型的性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值