机器学习_sklearn-集成学习(1)

集成学习的目的是同个几个若分类器以提升或者并行投票的方式得到一个强的集成分类器。

一、简单集成

可以用 moons 数据集制造数据对这个数据分别用LogisticdecisionTreesvm 进行分类, 再用VotingClassifier 集成这几个分类器

make_moons 生成随机数据后:

def Vot_clf(voting_type):
    log_clf = LogisticRegression()
    tree_clf = DecisionTreeClassifier(random_state = 42,max_depth = 3)
    svm_clf = SVC(kernel = 'linear' ,probability = True)
    return VotingClassifier([('lr', log_clf), 
                             ('tree', tree_clf),
                             ('svc', svm_clf)],
                             voting = voting_type)

如果所有分类器都能预测类别的概率,那就可以让sklearn以最高的类概率来预测这个类, 平均在所有的分类器上,该方法为软投票。
这种方法,经常会比硬投票表现的更好,因为他给与搞自信的投票权权重更大。
由于SVC 一般不会输出概率, 所以需要对修改超参数 probability = True 。这样会使得SVC 使用交叉验证去预测类别概率,降低训练速度,但会添加
predict_proba()方法
比较弱分类器和集成分类器的效果


def Acc_of_clf(x, y, x_t, y_t, voting_type):
    log_clf = LogisticRegression()
    tree_clf = DecisionTreeClassifier(random_state = 42,max_depth = 3)
    svm_clf = SVC(kernel = 'linear' ,probability = True) # 用以软投票
    vot_clf = Vot_clf(voting_type)
    for clf in (log_clf, tree_clf, svm_clf, vot_clf):
        clf.fit(x, y)
        print(clf.__class__.__name__, "准确率%.4f" %(clf.score(x_t, y_t)))
       

def plot_moom(m_x, m_y):
    x_1 = [ m_x[i][0] for i in range(len(m_x))]
    x_2 = [ m_x[i][1] for i in range(len(m_x))]
    plt.scatter(x_1, x_2, c = m_y)

if __name__ == '__main__' :
    x, y, x_t, y_t = get_moons_data()
    Acc_of_clf(x, y, x_t, y_t,'soft')
    plot_moom(x, y)
    plt.show()  
 
""" 
hard:
LogisticRegression 准确率0.8700
DecisionTreeClassifier 准确率0.8600
SVC 准确率0.8700
VotingClassifier 准确率0.8700

soft:
LogisticRegression 准确率0.8700
DecisionTreeClassifier 准确率0.8600
SVC 准确率0.8700
VotingClassifier 准确率0.8800

"""

在这里插入图片描述

由上述的结果中可以看出集成分类器的效果更佳

二、Bagging

from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier
if __name__ == '__main__' :
    x, y, x_t, y_t = get_moons_data()
    dec_clf = DecisionTreeClassifier(random_state = 42,max_depth = 3)
    bag_clf = BaggingClassifier(dec_clf, #大小为[n_samples,n_features]
                                n_estimators=500, ## 500个基分类器
                                max_samples=100,  ##
                                bootstrap=True,   ## Fasle 即为Pasting
                                n_jobs=-1)
    bag_clf.fit(x, y)
    y_prd = bag_clf.predict(x_t)
    plt.subplot(121)
    plot_moom(x_t,y_t); plt.title("The real Class")
    plt.subplot(122)
    plot_moom(x_t, y_prd); plt.title("The predicted Class")
    plt.show()

从圈起来的地方还是可以看出Bagging的分类具有一定优势。
在这里插入图片描述

对于Bagging 来说,一些实例可能会被一些分类器重复采样,但是其他的可能不被采用。算法默认为(boostrap = True) 即有放回的采样m个实例,其中m是训练集的大小,这就说明仅仅63%的样本进入了分类器,剩余的37%未被采用,这些实例叫做Out of Bag (每个分类器的37%均不同),因此可以拿分类器的oob 来评估集成本身。

if __name__ == '__main__' :
    x, y, x_t, y_t = get_moons_data()
    dec_clf = DecisionTreeClassifier(random_state = 42,max_depth = 3)
    bag_clf = BaggingClassifier(dec_clf, #大小为[n_samples,n_features]
                                n_estimators=500, ## 500个基分类器
                                max_samples=100,  ##
                                bootstrap=True,   ## Fasle 即为Pasting
                                n_jobs=-1, oob_score=True)
    bag_clf.fit(x, y)
    print('Out-of-Bag 分值为:%.4f'% bag_clf.oob_score_)
    ##预测
    y_prd = bag_clf.predict(x_t)
    print('模型准确率为:%.4f' % accuracy_score(y_t, y_prd))

Out-of-Bag 分值为:0.8875
模型准确率为:0.8600

随机切片与子空间

BaggingClassifier 支持采样实例和特征——随机切片

  1. max_samplebootstrap 是针对样本
  2. max_featuresbootstrap_features 是针对特征

当处理的样本维度较多的时候 特征的采样就较为重要了。
当保留所有的训练样本(比如bootstrap = Truemax_sample = 1.0), 但切片特征(booststap_features = True 并且/或者 max_features 小于 1.0)的时候——随机子空间。
采集特征导致更多的预测多样性, 用高偏差换低方差

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值