前言
假设你已经训练了一些分类器,每一个都达到了80%的准确率。这些分类器分别是一个逻辑回归分类器,一个支持向量机分类器,一个随机森林分类器,一个k近邻分类器,也许还有其他。
有一种非常简单的方法来创建更好的分类器,这个方法就是聚合每个分类器的预测,并将获得最多投票的类作为自己的预测。这种多数投票分类器被称为硬投票分类器。软投票是基于分类标签概率投票,将所有模型预测样本为某一类别的概率的平均值作为标准,概率最高的对应的类型为最终的预测结果;
这种投票分类器往往比单个的最佳分类器获得更高的准确率。事实上,即使每个分类器都是一个弱的学习者(意味着它只比随机猜测稍微好一点),如果有足够多的弱学习者并且他们足够多样化,那么最终集成得到的投票分类器仍然可以是一个强学习者(达到高精度)。
注意事项:当预测器尽可能地相互独立时,集成方法的效果最好。获得独立分类器的一种方法是使用不同的算法在相同的训练集上训练它们。这增加了他们犯不同类型错误的机会,提高了集成的准确性(另一种方法是同一种算法在不同的训练集上训练)。
获得独立分类器的方法:
方法 |
|
---|---|
针对输入数据 | 使用采样的方法得到不同的样本(比如bagging方法采用自助法进行抽样) |
针对特征 | 对特征进行抽样 |
针对算法本身 | a、个体学习器来自不同的模型 b、个体学习器来自于同一个模型的不同超参数,例如学习率η不同 c、算法本身具有随机性,例如用不同的随机种子来得到不同的模型 |
针对输出 | 对输出表示进行操纵以增强多样性: a、如将多分类转化为多个二分类任务来训练单模型 b、将分类输出转化为回归输出等 |
代码
from sklearn.ensemble import RandomForestClassifier#随机森林分类器(该分类器本身就是集合而来)
from sklearn.ensemble import VotingClassifier #投票分类器
from sklearn.linear_model import LogisticRegression#逻辑回归分类器
from sklearn.svm import SVC #支持向量机分类器
from sklearn.ensemble import GradientBoostingClassifier #梯度提升树分类器
from sklearn.ensemble import AdaBoostClassifier #Ada分类器
from lightgbm import LGBMClassifier
from sklearn.naive_bayes import GaussianNB #贝叶斯分类器
from sklearn.neighbors import KNeighborsClassifier #K近邻分类器
from xgboost import XGBClassifier #XGB分类器
from sklearn.datasets import make_moons
from sklearn.model_selection import train_test_split
X,y = make_moons(n_samples=500, noise=0.3,random_state=42)
#划分训练集测试集
X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=42)
#各模型实例化
rnd_clf = RandomForestClassifier()
gdbt_clf = GradientBoodtingClassifier()
ada_clf = AdaBoostClassifier()
lgbm_clf = LGBMClassifier()
xgb_clf = XGBClassifier()
voting_clf = VotingClassifier(estimators=[('rf',rnd_clf ),('gdbt',gdbt_clf ),('ada',ada_clf ),('lgbm',lgbm_clf ),('xgb',xgb_clf )],#estimators:子分类器
voting='hard') #参数voting代表你的投票方式,hard,soft
# 训练模型,输出各模型准确率
from sklearn.metrics import accuracy_score
for clf in (log_clf,rnd_clf,svm_clf,voting_clf):
clf.fit(X_train,y_train)
y_pre = clf.predict(X_test)
print(clf.__class__,accuracy_score(y_pre,y_test))
如果所有的分类器都能够估计类概率(即sklearn中它们都有一个predict_proba()方法),那么可以求出类别的概率平均值,投票分类器将具有最高概率的类作为自己的预测。这称为软投票。在代码中只需要两处做更改,在支持向量机中,需要将参数probablity设置为True,使支持向量机具备预测类概率的功能。投票分类器中需要把voting设置为soft
#soft voting
svm_clf1 = SVC(probability=True)
voting_clf = VotingClassifier(estimators=[('lf',log_clf),('svc',svm_clf1),('rf',rnd_clf)],
voting='soft')
for clf in (log_clf, rnd_clf, svm_clf1, voting_clf):
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
print(clf.__class__.__name__,accuracy_score(y_pred, y_test))
一般soft比hard表现的更出色!