集成学习 Ensemble Learing(???)

集成学习 Ensemble Learing

之前学习的决策树之类的学习方法都是单一的,独立的。
整体表现比较差的学习器,在一些样本上的表现是否有可能会超过“最好”的学习器。
在这里插入图片描述

bagging

在这里插入图片描述
举个栗子:
从十个数之中有放回的抽取十个数字,组成不同的几个数据集。
在这里插入图片描述
在这里插入图片描述
第二张图是集成学习的学习曲线。
在这里插入图片描述

from sklearn import neighbors
from sklearn import datasets
from sklearn.ensemble import BaggingClassifier
from sklearn import tree
from sklearn.model_selection import train_test_split
import numpy as np
import matplotlib.pyplot as plt

iris = datasets.load_iris()
x_data = iris.data[:,:2]
y_data = iris.target

x_train,x_test,y_train,y_test = train_test_split(x_data,y_data)

#建立knn的模型
knn = neighbors.KNeighborsClassifier()
knn.fit(x_train,y_train)

def plot(model):
    x_min,x_max = x_data[:,0].min() - 1,x_data[:,0].max() + 1
    y_min,y_max = x_data[:, 1].min() - 1, x_data[:, 1].max() + 1
    # 生成网格矩阵
    xx,yy = np.meshgrid(np.arange(x_min,x_max,0.02),
                        np.arange(y_min,y_max,0.02))
    z = model.predict(np.c_[xx.ravel(),yy.ravel()])
    z = z.reshape(xx.shape)
    #等高线图
    cs = plt.contourf(xx,yy,z)

plot(knn)
#样本散点图
plt.scatter(x_data[:,0],x_data[:,1],c=y_data)
plt.show()
#准确率
print(knn.score(x_test,y_test))

#画决策树(决策树特别容易出现过拟合,所以准确率有点低)
dtree = tree.DecisionTreeClassifier()
dtree.fit(x_train,y_train)
plot(dtree)
plt.scatter(x_data[:,0],x_data[:,1],c=y_data)
plt.show()
print(dtree.score(x_test,y_test))

#集成学习模型
#n_estimators=100有放回的抽样进行100次,则会建立100次knn的模型
bagging_knn = BaggingClassifier(knn,n_estimators=100)

bagging_knn.fit(x_train,y_train)
plot(bagging_knn)

plt.scatter(x_data[:,0],x_data[:,1],c=y_data)
plt.show()

print(bagging_knn.score(x_test,y_test))

我运行后得到的答案总是knn和knn集成相同,有、、疑惑,难道现在knn训练已经准确到无论分成多少次最后都一样了吗?感觉不应该啊!还出现了集成学习比直接学习正确率更低的情况,还有knn和决策树的学习正确率在同一次运行时出现了同一种效果也比较疑惑。并且我发现在运行多次后,knn或决策树或时两种集成学习,它们会出现同样的正确率。似乎就是那么几个数字在来回变换。在同一次练习之中,他们会不会出现互相影响的情况呢?
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

随机森林Random Forest

RF = 决策树 + Bagging + 随机属性选择
在这里插入图片描述
RF算法流程
在这里插入图片描述散点图:
在这里插入图片描述决策树等高线图:
在这里插入图片描述
随机森林等高线图:
在这里插入图片描述
多次运行时决策树和随机森林的正确率:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
代码如下:

from sklearn.ensemble import RandomForestClassifier
from sklearn import tree
from sklearn.model_selection import train_test_split
import numpy as np
import matplotlib.pyplot as plt

data = np.genfromtxt("LR-testSet2.txt",delimiter=',')
x_data = data[:,:-1]
y_data = data[:,-1]
plt.scatter(x_data[:,0],x_data[:,1],c=y_data)
plt.show()

x_train,x_test,y_train,y_test =train_test_split(x_data,y_data,test_size=0.5)

def plot(model):
    x_min,x_max = x_data[:,0].min() - 1,x_data[:,0].max() + 1
    y_min,y_max = x_data[:, 1].min() - 1, x_data[:, 1].max() + 1
    # 生成网格矩阵
    xx,yy = np.meshgrid(np.arange(x_min,x_max,0.02),
                        np.arange(y_min,y_max,0.02))
    z = model.predict(np.c_[xx.ravel(),yy.ravel()])
    z = z.reshape(xx.shape)
    #等高线图
    cs = plt.contourf(xx,yy,z)
    plt.scatter(x_data[:, 0], x_data[:, 1], c=y_data)
    plt.show()
dtree = tree.DecisionTreeClassifier()
dtree.fit(x_train,y_train)
plot(dtree)
print(dtree.score(x_test,y_test))

RF = RandomForestClassifier(n_estimators=50)
RF.fit(x_train,y_train)
plot(RF)
print(RF.score(x_test,y_test))

Boosting

AdaBoost是英文“Adaptive Boosting”(自适应增强)的缩写,它的自适应在于:前一个基本分类器被错误分类的样本的权值会增大,而正确分类的样本的权值会减小,并再次用来训练下一个基本分类器。同时,在每一轮迭代中,加入一个新的弱分类器,直到达到某个预定的足够小的错误率或达到预先指定的最大迭代次数才确定最终的强分类器。

直觉:将学习器的重点放在“容易”出错的样
本上。可以提升学习器的性能。
在这里插入图片描述
Adaboost算法可以简述为三个步骤:
(1)首先,是初始化训练数据的权值分布D1。假设有N个训练样本数据,则每一个训练样本最开始时,都被赋予相同的权值:w1=1/N。
(2)然后,训练弱分类器hi。具体训练过程中是:如果某个训练样本点,被弱分类器hi准确地分类,那么在构造下一个训练集中,它对应的权值要减小;相反,如果某个训练样本点被错误分类,那么它的权值就应该增大。权值更新过的样本集被用于训练下一个分类器,整个训练过程如此迭代地进行下去。
(3)最后,将各个训练得到的弱分类器组合成一个强分类器。各个弱分类器的训练过程结束后,加大分类误差率小的弱分类器的权重,使其在最终的分类函数中起着较大的决定作用,而降低分类误差率大的弱分类器的权重,使其在最终的分类函数中起着较小的决定作用。换而言之,误差率低的弱分类器在最终分类器中占的权重较大,否则较小。

Adaboost

训练过程:
在这里插入图片描述判断过程:
在这里插入图片描述算法流程:
在这里插入图片描述

所得结果:
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
这种集成学习的效果要好的多。

Stacking 和 Voting介绍和使用

使用多个不同的分类器对训练集进预测,把预测得到的结果作为一个次级分类器的输入。次级分类器的输出是整个模型的预测结果。
在这里插入图片描述
在这里插入图片描述
Stacking:

from sklearn import datasets
from sklearn import model_selection
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from mlxtend.classifier import StackingClassifier
import numpy as np

import warnings
warnings.filterwarnings("ignore")

iris = datasets.load_iris()
#只要第1、2列的特征,iris数据集一行有四个数据,每一个数据标签如下,target是分类的结果
#['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)'],
x_data,y_data = iris.data[:,1:3],iris.target

#定义三个不同的分类器
clf1 = KNeighborsClassifier(n_neighbors=1)
clf2 = DecisionTreeClassifier()
clf3 = LogisticRegression()

#定义一个次分类器
lr = LogisticRegression()
sclf = StackingClassifier(classifiers=[clf1,clf2,clf3],
                          meta_classifier=lr)
for clf,label in zip([clf1,clf2,clf3,sclf],
                     ['KNN','Decision Tree','LogisticRegression','StackingClassifier']) :
    scores = model_selection.cross_val_score(clf,x_data,y_data,cv=3,scoring='accuracy')
    print("Accuracy:%0.2f[%s]"%(scores.mean(),label))

在这里插入图片描述

总结:

在这里插入图片描述

Kaggle

网址:https://www.kaggle.com/

举个栗子:泰坦尼克号船员获救预测项目

数据:(可以到kaggle官网下载)
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值