目录
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
实作多数决
- 物件导向实作分类器投票
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
- 数据集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酒分类
流程
- 重编码=>切分训练数据80/20
- 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)
- 精度
.fit => .predict => accuracy_score(y_train, y_train_pred) - 用np.meshgrid(xy轴写反)
Boosting
概念:弱分类器集合起来变为强分类器
与committee method & bagging的差别:
依序训练的过程traind in squeuence。训练第一个分类器,分类错误点权重大,做第二次训练,分类错误点权重大。每次训练会记录alpha.
AdaBoost
-
起始值:所有样本同权重 n = 1 ,2 …N
-
for m = 1, 2…M:
极小化分错误的点的权重
-
调整权重
-
新权重
-
预测
举个例子
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