学习
实践
活动
工具
TVP
写文章

集成学习日记

第二种集成策略(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的测试结果

未完待续……

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180506G177W100?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码关注腾讯云开发者

领取腾讯云代金券