• 集成学习(随机森林)


    目录

    一、集成学习概念

     二、Bagging集成原理

    三、随机森林

     四、例子(商品分类)


    一、集成学习概念

    集成学习通过建⽴⼏个模型来解决单⼀预测问题。它的⼯作原理是⽣成多个分类器/模型,各⾃独⽴地学习和作出预 测。这些预测最后结合成组合预测,因此优于任何⼀个单分类的做出预测。

    只要单分类器的表现不太差,集成学习的结果总是要好于单分类器的 

     二、Bagging集成原理

    分类圆形和长方形

    三、随机森林

    在机器学习中,随机森林是⼀个包含多个决策树的分类器,并且其输出的类别是由个别树输出的类别的众数⽽定。随机森林 = Bagging + 决策树

    列如: 如果你训练了5个树, 其中有4个树的结果是True, 1个树的结果是False, 那么最终投票结果就是True 

     1、随机森林够造过程中的关键步骤(M表示特征数⽬):

    1)⼀次随机选出⼀个样本,有放回的抽样,重复N次(有可能出现重复的样本)

    2) 随机去选出m个特征, m <M

    如果不进⾏随机抽样,每棵树的训练集都⼀样,那么最终训练出的树分类结果也是完全⼀样的

    如果不是有放回的抽样,那么每棵树的训练样本都是不同的,都是没有交集的,这样每棵树都是“有偏的”,都是绝对“⽚⾯的”(当然这样说可能不对),也就是说每棵树训练出来都是有很⼤的差异的;⽽随机森 林最后分类取决于多棵树(弱分类器)的投票表决。

    2.包外估计

    在随机森林构造过程中,如果进⾏有放回的抽样,我们会发现,总是有⼀部分样本我们选不到。

    由于基分类器是构建在训练样本的⾃助抽样集上的,只有约 63.2% 原样本集出现在中,⽽剩余的 36.8% 的数据作为包 外数据,可以⽤于基分类器的验证集。 

    3.bagging集成优点

    Bagging + 决策树/线性回归/逻辑回归/深度学习… = bagging集成学习⽅法

    经过上⾯⽅式组成的集成学习⽅法:

    1. 均可在原有算法上提⾼约2%左右的泛化正确率

    2. 简单, ⽅便, 通⽤ 

     四、例子(商品分类)

    1. import numpy as np
    2. import pandas as pd
    3. import matplotlib.pyplot as plt
    4. import seaborn as sns
    5. from imblearn.under_sampling import RandomUnderSampler
    6. from sklearn.preprocessing import LabelEncoder
    7. from sklearn.model_selection import train_test_split
    8. from sklearn.ensemble import RandomForestClassifier
    9. from sklearn.metrics import log_loss
    10. from sklearn.preprocessing import OneHotEncoder
    11. data = pd.read_csv("F:\\数学建模\\机器学习\\数据\\train.csv")
    12. # print(data)
    13. # print(data.describe())
    14. # print(data.shape)
    15. # sns.countplot(data.target)
    16. # plt.show() #该数据类别不均衡
    17. #数据基本处理(数据已经经过脱敏,不在需要特殊处理)
    18. # new1_data=data[:10000] #取前一万行
    19. # print(new1_data)
    20. #使用上述方法不可行,使用随机欠采样获取响应数据
    21. y=data["target"]
    22. x=data.drop(["id","target"],axis=1)
    23. rus=RandomUnderSampler(random_state=0)
    24. x_sample,y_sample=rus.fit_resample(x,y)
    25. print(x_sample)
    26. print(y_sample)
    27. sns.countplot(y_sample) #样本均衡了
    28. plt.show()
    29. #将目标值的属性转化为数字
    30. le=LabelEncoder()
    31. y_sample=le.fit_transform(y_sample)
    32. print(y_sample)
    33. #分割数据
    34. x_train,x_test,y_train,y_test = train_test_split(x_sample,y_sample,random_state=22,test_size=0.2) #测试集合训练集每类样本不均衡的问题
    35. rf=RandomForestClassifier(oob_score=True) #包外估计
    36. rf.fit(x_train,y_train)
    37. y_pre=rf.predict(x_test)
    38. print(y_pre)
    39. # print(rf.score(x_test,y_test))
    40. # print(rf.oob_score_)
    41. #使用logloss模型评估
    42. # log_loss(y_test,y_pre,eps=1e-15,normalize=True)
    43. #log_loss使用中y_test,y_pre需要用one—hot表示
    44. one_hot=OneHotEncoder(sparse=False)
    45. y_test1=one_hot.fit_transform(y_test.reshape(-1,1))
    46. y_pre1=one_hot.fit_transform(y_pre.reshape(-1,1))
    47. print(y_test1)
    48. print(y_pre1)
    49. print(log_loss(y_test1,y_pre1,eps=1e-15,normalize=True))
    50. #改变预测值的输出模式,让输出结果为百分比,降低logloss
    51. y_pre_proba=rf.predict_proba(x_test)
    52. print(y_pre_proba)
    53. print(log_loss(y_test1,y_pre_proba,eps=1e-15,normalize=True))
    54. #参数调优(n_estimators=one_parameter,
    55. # max_depth=10,max_features=10,min_samples_leaf=10) 通过正确率和损失图来一个一个确定
    56. tuned_parameters=range(10,200,10)
    57. accuracy_t=np.zeros(len(tuned_parameters))
    58. error_t=np.zeros(len(tuned_parameters))
    59. # print(accuracy_t) [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
    60. for j,one_parameter in enumerate(tuned_parameters):
    61. rf2=RandomForestClassifier(n_estimators=one_parameter,
    62. max_depth=10,max_features=10,min_samples_leaf=10,oob_score=True,random_state=0,n_jobs=-1)
    63. rf2.fit(x_train,y_train)
    64. accuracy_t[j]=rf2.oob_score_ #输出精确度
    65. y_pre=rf2.predict_proba(x_test)
    66. error_t[j]=log_loss(y_test,y_pre,eps=1e-15,normalize=True)
    67. # print(error_t)
    68. plt.plot(tuned_parameters,accuracy_t)
    69. plt.xlabel("n_estimators")
    70. plt.ylabel("accuracy")
    71. plt.grid(True)
    72. plt.show()

     

  • 相关阅读:
    UI设计公司成长日记2:修身及持之以恒不断学习是要务
    12.3 实现模拟鼠标录制回放
    优秀的项目经理如何寻找到价值贡献点?如何成为价值型项目经理?
    c++ unordered_set
    Linux网络设计之协程原理
    联发科技2023届提前批IC笔试(题目)
    echarts散点图的圆点设置成不同的自定义图片且使用本地静态资源图片的写法
    Angular 路由无缝导航的实现与应用(六)
    使用boost封装一个websocketserver类
    Dijkstra --- 数组实现(在此基础上可直接改为STL的Queue实现)
  • 原文地址:https://blog.csdn.net/herry57/article/details/125439533