第二种集成策略(stacking)
对应python中的mlxtend库,其中做法如下(注意:这里面都是针对同一套数据集)
举例如下:一批样本,有三种特征,分别用如下的学习器去预测
新的特征然后再用一个学习器进行学习(比如:LR),最后得到预测结果
python实践(stacking):
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
data=pd.read_table('D:/MSG/fruit_data_with_colors.txt')
data_name_dict=dict(zip(data['fruit_label'],data['fruit_name']))
#划分数据集
X=data[['mass','width','height','color_score']]
y=data['fruit_label']
X_train,X_test,y_train,y_test=train_test_split(X,y,
test_size=0.2,random_state=0)
from sklearn.preprocessing import MinMaxScaler
scaler=MinMaxScaler()
X_train_scaled=scaler.fit_transform(X_train)
X_test_scaled=scaler.transform(X_test)
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.svm import SVC
from mlxtend.classifier import StackingClassifier
clf1=KNeighborsClassifier()
clf2=SVC()
clf3=DecisionTreeClassifier()
clf4=LogisticRegression()
sclf=StackingClassifier(classifiers=[clf1,clf2,clf3],
meta_classifier=clf4)
clf1.fit(X_train_scaled,y_train)
clf2.fit(X_train_scaled,y_train)
clf3.fit(X_train_scaled,y_train)
sclf.fit(X_train_scaled,y_train)
print('KNN的准确率:{:.3f}'.format(clf1.score(X_test_scaled, y_test)))
print('SVM的准确率:{:.3f}'.format(clf2.score(X_test_scaled, y_test)))
print('DT的准确率:{:.3f}'.format(clf3.score(X_test_scaled, y_test)))
print('stacking的准确率:{:.3f}'.format(sclf.score(X_test_scaled, y_test)))
由此可以看出,stacking的集成策略虽然由于SVM,但是未必会好过所有的学习器,其实,集成之后的结果会出现以下三种情况(见周志华老师的西瓜书)
由上图可以看出
因此好的学习器不仅要求学习器要有一定的准确性(比随机性要大),还要有多样性
个体学习器不存在强依赖关系,可同时生成的并行化方法(bagging)
个体学习器存在强依赖关系,串行生成的序列化方法(boosting)
分类说明
boosting
1 从初始训练集训练出一个基学习器
2 根据学习器表现对训练样本分布进行调整,使得错误样本得到更多关注
3 根据调整后的样本分布训练下一个基学习器
4 学习器数目达到预设值T,对这T个基学习器进行加权结合
常见的代表:adaboost(其中ada表示自适应)
公式:
举一个例子描述工作过程,
第二种boost集成方式
Gradient Boosted(ing)
GradientBoost是一个框架,可以套入不同的模型,与传统boosting的区别在于每次计算是为了减少上一次的残差,为消除残差,在残差减少的梯度方向上建立新的模型,其中最常见的属于Gradient boosting decision tree
Gradient boosting decision tree的做法
构造一系列决策树,每棵树尝试去纠正之前的错误
每棵树学习的是之前所有树的结论和残差,拟合一个当前的树
GBDT做的是回归(每个节点的值加起来求平均)
学习率决定新的树去纠正错误的程度
高学习率:复杂的树
低学习率:生成简单的树
GBDT的一个例子
python测试
AdaBoost
from sklearn.ensemble import AdaBoostClassifier
from sklearn.model_selection import GridSearchCV
parameters = {'n_estimators': [20, 40, 60, 80, 100, 120, 140]}
clf = GridSearchCV(AdaBoostClassifier(), parameters, cv=3, scoring='accuracy')
clf.fit(X_train_scaled, y_train)
print('最优参数:', clf.best_params_)
print('验证集最高得分:', clf.best_score_)
print('测试集准确率:{:.3f}'.format(clf.score(X_test_scaled, y_test)))
GBDT的测试结果
未完待续……
领取专属 10元无门槛券
私享最新 技术干货