何喆379 2022-02-05 14:20 采纳率: 100%
浏览 28
已结题

sklearn集成学习 关于 算法准确率的两个问题

在学习sklearn中的集成学习中遇到了两个问题:

  1. 集成学习中soft voting的准确率低于hard voting。
    代码如下:
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
x,y = datasets.make_moons(n_samples = 500,noise = 0.3, random_state = 42)
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test = train_test_split(x,y,random_state = 42)
from sklearn.ensemble import VotingClassifier
voting_clf = VotingClassifier(estimators = [
    ('log_clf',LogisticRegression()),
    ('svm_clf',SVC()),
    ('dt_clf',DecisionTreeClassifier())
],voting = 'hard')
voting_clf.fit(x_train,y_train)
voting_clf.score(x_test,y_test)
voting_clf2 = VotingClassifier(estimators = [
    ('log_clf',LogisticRegression()),
    ('svm_clf',SVC(probability = True)), #修改SVC参数
    ('dt_clf',DecisionTreeClassifier(random_state = 666))],voting = 'soft')
voting_clf2.fit(x_train,y_train)
voting_clf2.score(x_test,y_test)# soft 与hard 的结果都是0.904 很奇怪

  1. 集成学习中采用决策树的数量增多,准确率并没有提高。
    代码如下:
    import numpy as np
    import matplotlib.pyplot as plt
    from sklearn import datasets
    x,y = datasets.make_moons(n_samples = 500,noise = 0.3, random_state = 42)
    from sklearn.model_selection import train_test_split
    x_train,x_test,y_train,y_test = train_test_split(x,y,random_state = 42)
    bagging_clf = BaggingClassifier(DecisionTreeClassifier(),
                                n_estimators =500, max_samples = 100,bootstrap = True)
    # n_estimator 多少个子模型 max_samples看多少样本 bootstrap是否放回
    %%time
    bagging_clf.fit(x_train,y_train)# 500个决策树
    bagging_clf.score(x_test,y_test)
    single_dec_tree = DecisionTreeClassifier()
    single_dec_tree.fit(x_train,y_train)# 1个决策树
    single_dec_tree.score(x_test,y_test)
    bagging_clf5000 = BaggingClassifier(DecisionTreeClassifier(),
                                    n_estimators = 5000,max_samples = 100,bootstrap = True)
    # 5000个决策树
    %%time
    bagging_clf5000.fit(x_train,y_train)
    bagging_clf5000.score(x_test,y_test)
    # 单个决策树的准确率为0.88,500个是0.928,5000个是0.912
    

这两个问题类似,因为从算法的原理上讲,soft的结果至少不会比hard的差,为啥结果会这样呢?
第二个问题中,子模型的数目增多,一定会使得整体的准确率提高,但是为啥决策树的数目增多,准确率不升反降?
难道存在一些子模型的准确率低于平均准确率吗?很奇怪

展开全部

  • 写回答

1条回答 默认 最新

  • zkhll 2022-02-07 02:32
    关注

    第一个问题:
    根据soft voting和hard voting的定义来看,soft是将所有模型预测样本为某一类别的概率的平均值作为标准,概率最高的对应的类型为最终的预测结果;而hard是根据少数服从多数来定最终结果。
    如果某一子模型在这个问题上表现不好,那使用soft就会将这个子模型的结果也考虑进去,这就会大大影响整个集成模型的效果。此时如果使用hard,那就会直接忽略掉这个效果不好的子模型,从而使整个集成模型的效果变好。

    第二个问题:
    在这个问题中,楼主可能对模型存在一定误解,认为模型越多就越好,其实不然。举个简单的例子,当你的数据集较少时,你的决策树子树个数增加,这可能导致不同子树使用到的数据是相似甚至是相似的,这种情况下,增加子树就没有任何意义,甚至会出现过拟合现象。

        对于模型而言,没有绝对的谁好谁坏,需要针对不同的数据集,不同的特征来选取合适的模型,这样才能得到比较好的效果。
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
编辑
预览

报告相同问题?

问题事件

  • 系统已结题 2月23日
  • 已采纳回答 2月16日
  • 修改了问题 2月6日
  • 创建了问题 2月5日

悬赏问题

  • ¥15 STS/eclipse导入gradle项目时报错如下
  • ¥15 centos7.6进不去系统,卡在数字7界面
  • ¥15 Tensorflow采用interpreter.allocate_tensors()分配内存出现ValueError: vector too long报错
  • ¥15 使用CGenFF在线生成血红素辅基拓扑结构遇到问题
  • ¥15 在fragment使用okhttp同步上传文件,能不能在fragment销毁后还可以继续上传文件?
  • ¥20 matlab代码实现可达矩阵形成骨骼矩阵
  • ¥15 关于地板的木纹和图库中的匹配的
  • ¥30 机器学习预测疾病模型流程疑问
  • ¥50 2048Python实现
  • ¥15 使用ads进行低噪放仿真没有结果且不报错
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部