精华内容
下载资源
问答
  • 点击上方“Python爬虫与数据挖掘”,进行关注回复“书籍”即可获赠Python从入门到进阶共10本电子书今日鸡汤寒梅最堪恨,长作去年花。前言组合算法也叫集成学习,在金融行业或非图像识别...

    点击上方“Python爬虫与数据挖掘”,进行关注

    回复“书籍”即可获赠Python从入门到进阶共10本电子书

    寒梅最堪恨,长作去年花。

    前言

    组合算法也叫集成学习,在金融行业或非图像识别领域,效果有时甚至比深度学习还要好。能够理解基本原理并将代码用于实际的业务案例是本文的目标,本文将详细介绍如何利用Python实现集成学习中随机森林这个经典的方法来预测宽带客户的流失,主要将分为两个部分:

    • 详细原理介绍

    • Python代码实战

    集成学习

    本文的主角是随机森林,所以我们将以随机森林所属的分支 —— 装袋法 入手,深入浅出该集成学习方法的原理步骤。装袋法流程如下

    乍一看图中的步骤可能有些复杂,现在来逐步拆解。装袋法中的装袋二字是精髓,顾名思义即将多个模型装入同一个袋子后,让这个袋子作为一个新的模型来实现预测需求,仅此而已。换句话说,即把多个模型组合起来形成一个新的大模型,这个大模型最终给出的预测结果是由这多个小模型综合决定的,决定方式为少数服从多数。

    假设有10万条原始数据,用这些数据来做十棵决策树(当然也可以是其他模型),最后这10棵树将被装进了同一个袋子中。这时候取其中一条数据放入这个袋子,便会得出10个预测值(每棵树各一个),假如其中三棵树给出的预测值为0,剩余的七棵给出的为1,那我们便可知道这个袋子对这个数据的预测结果为 0 的概率是 3/10。

    为了更深入的理解装袋法,下面将回答三个与装袋法有关的常见问题

    问:袋子中的每个模型使用的样本量范围应为多少合适?

    答:如果是上面的例子,袋子里面有十棵树,源数据总量为 10万 条,则每棵树取用的样本量的最小值为最少是1w个(10w/10棵 = 1w/棵),因为至少要保证不能浪费样本,但每棵树最多可取用多少样本呢?其实在样本量已知,同一袋子中模型个数为n的情况下,样本的选择比例为1/n ~ 0.8最好。每个小模型取用 100% 的样本是绝对没有意义的,那就跟没抽是一样的,这样也就没有体现出装袋,只有每个模型用到的数据都有一定的不同,组合起来后每个的投票(预测结果)也才有意义。

    问:袋中模型们之间的相关性会影响最后的决策结果吗?

    答:装袋法思路最重要的一点:袋子中每个模型之间不能相关,越不相关越好,这里的不相关主要体现在用于训练每个模型的样本不一样。其次,每个模型的精度越高越好,这样它的投票才更有价值。

    PS:训练模型的样本不一样这一点可以理解为总统选举,抽 10 波选民来投票,这 10 波选民的差异性越大越好,这样一来,只有在选民千差万别的情况下你依然脱颖而出,才足以说明你的实力,如果这10波选民中每一波之间的差异性都很小,比如都是本来就偏袒于总统候选人,那投票结果的说服力就会大减。

    问:上面所说的模型精度高是不是哪怕模型很复杂也可以,如果每个模型的精度高但都过度拟合怎么办?

    答:在装袋法中,模型是越精确越好,哪怕是过度拟合的也没有关系。因为一个模型要想在训练集上做到越精确越好,而精确程度与模型的复杂度大多是成正比的,所以出现过拟合的情况也是正常且情有可原的。复杂和过度拟合只是对袋子中每个模型而言,因为最后都会被加权,所以整个袋子(整体)并不会出现过度拟合的情况。

    随机森林

    随机森林的实现步骤如下:


    有关随机森林算法,本文说明以下几个问题

    问:为什么在列上也要随机抽样?

    答:在引入笔者最最喜欢的一个比喻之前,先来看一个实际的业务场景,来自某城市商业银行。我们有一大个电子表格存着大量的历史数据,大概50多个变量(50多列),变量们来自几个不同的公司如人行,电信等(同一个客户在不同公司),最后希望预测的是该客户是否会违约。电子表格组成如下:

    而根据基础的业务知识可知,与银行有关的数据中往往会存在许多缺失值,以上图为例,通常情况下只有待预测的变量这一列的数据是齐全的,毕竟客户们是否违约这个行为的历史数据很容易查找,但蓝框和绿框这两部分的缺失值往往较多,而且较随意,具体随意程度参见下图:

    红框表示数据缺失,这里只展示了部分行和部分列数据,如果这份数据表的规模为 4万行 * 50列,那这数据缺失的分布得有多随意啊 ??????所以,到底该如何充分利用这残次不齐的数据就成了呈待解决的关键问题。这时候就可以祭出超级生动形象的 “岛屿 - 湖泊 - 椰子树”比喻了:

    • 整个表格看成一座巨大的岛屿,岛屿的长和宽分别对应电子表格横轴长和纵轴的长度

    • 表中缺失的数据段看成一个个分布随意的小湖泊,有数据的地方看成陆地

    • 整个小岛地底埋藏着巨大的价值(数据价值),通过在随意的种树(用装袋法在行列上进行随机抽样)来吸取地底的养分,毕竟湖泊上种不了树,所以只要足够随机,就总能充分的利用陆地。

    正因为是行列都随机,才能够做到真正的把整个数据表随机切分成多份,每个模型使用一份,只要模型的数量足够,总有模型能够在最大程度上获取数据集的价值。而且因变量的分类往往又是极不平衡的,可以参考原理+代码|手把手教你使用Python实战反欺诈模型至于如何将这些种好的树的信息又再收集,便可以将陆地上比较近的几棵树上面再弄一个收集器,把这几棵树从陆地上收集到的养分再递进一层汇总,最终实现陆地养分汇总于树木,树木养分汇总于收集器,收集器养分汇总于更上层的另一个收集器,最终实现整片数据海洋中多个岛屿的信息汇总,这便是周志华团队和蚂蚁金服的合作的用分布式深度随机森林算法检测套现欺诈

    随机森林第一步之后的操作完全可以参照集成学习——装袋法中提及的步骤。

    问:既然每个模型给出的预测结果最后都会被加权,所以随机森林中每棵决策树的权重是多少?

    答:随机森林中每棵决策树的权重都是一样的,如果这个袋子中有 10 棵决策树(或者其他模型),那每棵树给出的预测结果的权重便是 1/10,这是随机森林的特性。如果权重不一样的话,便是后续推文会提及的Adaboost等集成学习中的提升分支了。

    问:装袋法中袋子中的模型越多越好吗?袋中用来训练每个模型的源数据比例也是越多越好吗?

    答:袋子中模型多一点好,袋中用来训练每个模型的源数据比例小一点好,但这并不代表越多越好与越小越好,还得结合数据集特性和一些深层次的模型算法知识。

    装袋法的优势如下:

    • 准确率明显高于组合中任何单个分类器

    • 对于较大的噪音,表现不至于很差,并且具有鲁棒性

    • 不容易过度拟合

    随机森林算法的优点

    • 准确率有时可以和神经网络媳美,比逻辑回归高

    • 对错误和离群点更加鲁棒性

    • 决策树容易过度拟合的问题会随着森林的规模而削弱

    • 大数据情况下速度快(分布式),性能好

    Python实战

    数据探索

    本次实战目标为演示随机森林的用法和调优方法。因为集成学习与神经网络一样,都属于解释性较差的黑盒模型,所以我们无需过分探究数据集中每个变量的具体含义,只需关注最后一个变量broadband即可,争取通过如年龄,使用时长,支付情况以及流量和通话情况等变量对宽带客户是否会续费做出一个较准确的预测

    import pandas as pd
    import numpy as np
    
    df = pd.read_csv('broadband.csv') # 宽带客户数据
    df.head(); df.info()

    参数说明

    本代码文件只为演示随机森林的用法和调优方法,所以数据参数我们只需关注最后一个broadband 即可0-离开,1-留存。其他自变量意思可不做探究,毕竟真实工作中的数据集也完全不一样,首先将列名全部小写

    df.rename(str.lower, axis='columns', inplace=True)

    现在查看因变量broadband分布情况,看是否存在不平衡

    from collections import Counter
    print('Broadband: ', Counter(df['broadband'])) 
    ## Broadband:  Counter({0: 908, 1: 206}) 比较不平衡。
    ## 根据原理部分,可知随机森林是处理数据不平衡问题的利器

    接着拆分测试集与训练集,客户id没有用,故丢弃cust_id,

    y = df['broadband'] 
    X = df.iloc[:, 1:-1] 
    from sklearn.model_selection import train_test_split
    X_train, X_test, y_train, y_test = train_test_split(X, y, 
                                        test_size=0.4, random_state=12345)

    决策树建模

    我们先进行完整的决策树建模来和随机森林进行对比

    import sklearn.tree as tree
    
    # 直接使用交叉网格搜索来优化决策树模型,边训练边优化
    from sklearn.model_selection import GridSearchCV
    # 网格搜索的参数:正常决策树建模中的参数 - 评估指标,树的深度,
     ## 最小拆分的叶子样本数与树的深度
    param_grid = {'criterion': ['entropy', 'gini'],
                 'max_depth': [2, 3, 4, 5, 6, 7, 8],
                 'min_samples_split': [4, 8, 12, 16, 20, 24, 28]} 
                    # 通常来说,十几层的树已经是比较深了
    
    clf = tree.DecisionTreeClassifier()  # 定义一棵树
    clfcv = GridSearchCV(estimator=clf, param_grid=param_grid, 
                                scoring='roc_auc', cv=4) 
            # 传入模型,网格搜索的参数,评估指标,cv交叉验证的次数
          ## 这里也只是定义,还没有开始训练模型
          
    clfcv.fit(X=X_train, y=y_train)
    
    # 使用模型来对测试集进行预测
    test_est = clfcv.predict(X_test)
    
    # 模型评估
    import sklearn.metrics as metrics
    
    print("决策树准确度:")
    print(metrics.classification_report(y_test,test_est)) 
            # 该矩阵表格其实作用不大
    print("决策树 AUC:")
    fpr_test, tpr_test, th_test = metrics.roc_curve(y_test, test_est)
    print('AUC = %.4f' %metrics.auc(fpr_test, tpr_test))
    

    AUC 大于0.5是最基本的要求,可见模型精度还是比较糟糕的,决策树的调优技巧就不再过多展开,我们将在随机森林调优部分展示

    随机森林建模

    随机森林建模一样是使用网格搜索,有关Python实现随机森林建模的详细参数解释可以看代码的注释

    param_grid = {
        'criterion':['entropy','gini'],
        'max_depth':[5, 6, 7, 8],    # 深度:这里是森林中每棵决策树的深度
        'n_estimators':[11,13,15],  # 决策树个数-随机森林特有参数
        'max_features':[0.3,0.4,0.5],
         # 每棵决策树使用的变量占比-随机森林特有参数(结合原理)
        'min_samples_split':[4,8,12,16]  # 叶子的最小拆分样本量
    }
    
    import sklearn.ensemble as ensemble # ensemble learning: 集成学习
    
    rfc = ensemble.RandomForestClassifier()
    rfc_cv = GridSearchCV(estimator=rfc, param_grid=param_grid,
                          scoring='roc_auc', cv=4)
    rfc_cv.fit(X_train, y_train)
    
    # 使用随机森林对测试集进行预测
    test_est = rfc_cv.predict(X_test)
    print('随机森林精确度...')
    print(metrics.classification_report(test_est, y_test))
    print('随机森林 AUC...')
    fpr_test, tpr_test, th_test = metrics.roc_curve(test_est, y_test)
         # 构造 roc 曲线
    print('AUC = %.4f' %metrics.auc(fpr_test, tpr_test))

    可以看到,模型的精度大大提升

    为什么要打印梯度优化给出的最佳参数?打印梯度优化结果的最佳参数的目的是为了判断这个分类模型的各种参数是否在决策边界上,简言之,我们不希望决策边界限制了这个模型的效果。(通常这时候会先把复杂度放一边)

    不难发现,参数max_depth, min_samples_split, 和n_estimators 这三个参数的范围设置可能有限制模型精度的可能,所以需要适当调整

    """
    {'criterion': 'gini',
     'max_depth': 8,  在最大值边界上,所以这个参数的最大值范围应该再调大
     'max_features': 0.5,  也在最大值边界上,说明这个参数的最小值范围应该再调大
     'min_samples_split': 4, 同理,在最小边界上,可考虑把范围调小
     'n_estimators': 15 同理,在最大边界上,可以适当调大范围
     """
     # 调整结果
     param_grid = {
        'criterion':['entropy','gini'],
        'max_depth':[7, 8, 10, 12], 
        # 前面的 5,6 也可以适当的去掉,反正已经没有用了
        'n_estimators':[11, 13, 15, 17, 19],  #决策树个数-随机森林特有参数
        'max_features':[0.4, 0.5, 0.6, 0.7],
         #每棵决策树使用的变量占比-随机森林特有参数
        'min_samples_split':[2, 3, 4, 8, 12, 16]  # 叶子的最小拆分样本量

    现在来查看再次建模的结果

    此时都在决策边界内了,但其实调整参数是门技术活,并不只是通过决策边界这一单一指标来调整,后续推文会陆续更新。

    小结

    最后总结一下:随机森林是集成学习中非常经典的一种方法,基础原理简单,实现优雅,可即学即用。而且随机森林应用十分广泛,并不只是局限于常见的金融领域,只要数据不平衡或者随机缺失严重,都值得尝试

    ------------------- End -------------------

    往期精彩文章推荐:

    欢迎大家点赞,留言,转发,转载,感谢大家的相伴与支持

    想加入Python学习群请在后台回复【入群

    万水千山总是情,点个【在看】行不行

    /今日留言主题/

    随便说一两句吧~~

    展开全文
  • 主要介绍了用Python实现随机森林算法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 简单的随机森林预测Python

    千次阅读 2020-07-23 15:49:56
    squared_error score = mean_squared_error(test_y, answer_y) 1-score 查看预测错误的(有6个) answer_y=pd.DataFrame(answer_y) pred=pd.DataFrame(test_y.tolist()) sco=pd.concat([answer_y,pred],axis=1) sco...
    import pandas as pd
    import numpy as np
    from sklearn.ensemble import RandomForestClassifier
    import matplotlib.pyplot as plt
    
    train=pd.read_excel('E:/project_6.18/train.xlsx')
    train_f=pd.read_excel('E:/project_6.18/train_nan.xlsx')
    test=pd.read_excel('E:/project_6.18/test.xlsx')
    

    特征处理
    非尖货–1 尖货–0
    价格力等级 低–0 中–1 高–2

    #处理是否尖货
    train_f['是否尖货']=(train_f['是否尖货']=='非尖货').astype('int')
    #处理价格力等
    labels=train_f['价格力等级'].unique().tolist()#显示唯一的值
    train_f['价格力等级']=train_f['价格力等级'].apply(lambda x : labels.index(x))
    train_f.drop(['商品id'],axis=1,inplace=True)
    

    在这里插入图片描述

    #对叶子类目做二值化分列处理
    train_f = train_f.join(pd.get_dummies(train_f.叶子类目, prefix= '叶子类目'))
    #建模特征
    train_f_y=train_f['价格力等级']
    train_f_x=train_f.drop(['叶子类目','价格力等级'],axis=1)
    

    在这里插入图片描述
    测试集

    #处理是否尖货
    test['是否尖货']=(test['是否尖货']=='非尖货').astype('int')
    #处理价格力等
    test['价格力等级']=test['价格力等级'].apply(lambda x : labels.index(x))
    
    test.drop(['商品id'],axis=1,inplace=True)
    #对叶子类目做二值化分列处理
    test= test.join(pd.get_dummies(test.叶子类目, prefix= '叶子类目'))
    #建模特征
    answer_y=test['价格力等级']
    test_x=test.drop(['叶子类目','价格力等级'],axis=1)
    
    

    建模(训练集得分)

    forest=RandomForestClassifier(n_estimators=100,random_state=0,n_jobs=-1)
    forest.fit(train_f_x,train_f_y)
    test_y=forest.predict(test_x)
    train_score=forest.score(train_f_x,train_f_y)
    print(train_score)
    

    在这里插入图片描述

    特征重要性

    feature_imp_sorted_rf = pd.DataFrame({'feature': list(train_f_x), 'importance': forest.feature_importances_}).sort_values('importance', ascending=False)
    feature_imp_sorted_rf
    

    在这里插入图片描述
    测试集得分
    方1

    test_score=forest.score(test_x,answer_y)
    test_score
    

    方2

    from sklearn.metrics import mean_squared_error
    score = mean_squared_error(test_y, answer_y)
    1-score 
    

    在这里插入图片描述
    查看预测错误的(有6个)

    answer_y=pd.DataFrame(answer_y)
    pred=pd.DataFrame(test_y.tolist())
    sco=pd.concat([answer_y,pred],axis=1)
    sco['cha']=sco['价格力等级']-sco[0]
    sco[sco['cha']!=0]
    

    在这里插入图片描述

    展开全文
  • 竞赛时写的一个python小程序,得了0.93分,思路如下,1读取训练集、2数据预处理、3上模型、4将模型应用到预测及、5生成预测结果
  • 随机森林 在自助聚合的基础上, 每次构建决策树模型时, 不仅随机选择部分样本, 而且还随机选择部分特征(树的高度不同), 这样的集合算法, 不仅规避了强势样本对预测结果的影响, 而且也削弱了强势特征的影响, 是模型...
    自助聚合

    每次从总样本矩阵中以有放回抽样的方式,随机抽取部分样本构建决策树, 这样形成多颗包含不同训练本的决策树. 以削弱某些强势样本对模型预测结果的影响. 提高模型的泛化特性.

    随机森林

    在自助聚合的基础上, 每次构建决策树模型时, 不仅随机选择部分样本, 而且还随机选择部分特征(树的高度不同), 这样的集合算法, 不仅规避了强势样本对预测结果的影响, 而且也削弱了强势特征的影响, 是模型的预测能力更加泛化.

    随机森林相关API:

    import sklearn.ensemble as se
    # 构建随机森林回归器模型
    model = se.RandomForestRegressor(
        max_depth=4, 		# 最大深度
        n_estimators=1000, 	# 构建1000棵决策树
        # 子表中最小样本数 若<=这个数字则不再继续划分
    	min_samples_slit=2  
    )
    

    案例: 分析共享单车的需求, 从而判断如何投放.

    """
    demo02_bike.py  共享单车案例   随机森林
    """
    import numpy as np
    import sklearn.utils as su
    import sklearn.ensemble as se
    import sklearn.metrics as sm
    import matplotlib.pyplot as mp
    
    data = np.loadtxt('../ml_data/bike_day.csv', 
    	delimiter=',', unpack=False, 
    	dtype='U20')
    # 获取输入集与输出集
    header = data[0, 2:13]
    x = np.array(data[1:, 2:13], dtype=float)
    y = np.array(data[1:, -1], dtype=float)
    # 打乱数据集
    x, y = su.shuffle(x, y, random_state=7)
    # 拆分训练集,测试集
    train_size = int(len(x)*0.9)
    train_x, test_x, train_y, test_y = \
    	x[:train_size], x[train_size:], \
    	y[:train_size], y[train_size:]
    # 随机森林模型训练
    model=se.RandomForestRegressor(max_depth=10, 
    	n_estimators=1000, min_samples_split=2)
    model.fit(train_x, train_y)
    pred_test_y = model.predict(test_x)
    # 使用r2得分验证预测结果
    print(sm.r2_score(test_y, pred_test_y))
    # 输出特征重要性
    fi_day = model.feature_importances_
    print(fi_day)
    print(header)
    
    # 绘制特征重要性柱状图
    mp.figure('Bike', facecolor='lightgray')
    mp.subplot(211)
    mp.title('Day', fontsize=16)
    mp.ylabel('Importances', fontsize=12)
    mp.tick_params(labelsize=8)
    mp.grid(linestyle=':')
    pos = np.arange(fi_day.size)
    sorted_i = fi_day.argsort()[::-1]
    mp.xticks(pos, header[sorted_i])
    mp.bar(pos, fi_day[sorted_i], 
    	   color='dodgerblue', label='Bike_Day')
    mp.legend()
    
    
    data = np.loadtxt('../ml_data/bike_hour.csv', 
    	delimiter=',', unpack=False, 
    	dtype='U20')
    # 获取输入集与输出集
    header = data[0, 2:14]
    x = np.array(data[1:, 2:14], dtype=float)
    y = np.array(data[1:, -1], dtype=float)
    # 打乱数据集
    x, y = su.shuffle(x, y, random_state=7)
    # 拆分训练集,测试集
    train_size = int(len(x)*0.9)
    train_x, test_x, train_y, test_y = \
    	x[:train_size], x[train_size:], \
    	y[:train_size], y[train_size:]
    # 随机森林模型训练
    model=se.RandomForestRegressor(max_depth=10, 
    	n_estimators=1000, min_samples_split=2)
    model.fit(train_x, train_y)
    pred_test_y = model.predict(test_x)
    # 使用r2得分验证预测结果
    print(sm.r2_score(test_y, pred_test_y))
    # 输出特征重要性
    fi_hour = model.feature_importances_
    print(fi_hour)
    print(header)
    
    mp.subplot(212)
    mp.title('Hour', fontsize=16)
    mp.ylabel('Importances', fontsize=12)
    mp.tick_params(labelsize=8)
    mp.grid(linestyle=':')
    pos = np.arange(fi_hour.size)
    sorted_i = fi_hour.argsort()[::-1]
    mp.xticks(pos, header[sorted_i])
    mp.bar(pos, fi_hour[sorted_i], 
    	   color='orangered', label='Bike Hour')
    mp.legend()
    mp.show()
    
    0.8926334392300549
    [0.06638183 0.28997887 0.02826374 0.00304802 0.01460011 0.00411691
     0.01753458 0.33964001 0.14297167 0.06249903 0.03096522]
    ['season' 'yr' 'mnth' 'holiday' 'weekday' 'workingday' 'weathersit' 'temp'
     'atemp' 'hum' 'windspeed']
    0.9186105067675527
    [0.02229112 0.08663297 0.00830193 0.64513701 0.00145209 0.00705756
     0.06023155 0.01646287 0.12005369 0.01383168 0.01587423 0.0026733 ]
    ['season' 'yr' 'mnth' 'hr' 'holiday' 'weekday' 'workingday' 'weathersit'
     'temp' 'atemp' 'hum' 'windspeed']
    

    在这里插入图片描述

    展开全文
  • 随机森林的原理及Python代码实现

    千次阅读 2018-06-15 00:52:00
    最近在做kaggle的时候,发现随机森林这个算法在分类问题上效果十分的好,大多数情况下效果远要比svm,log回归,knn等算法效果好。因此想琢磨琢磨这个算法的原理。要学...

    最近在做kaggle的时候,发现随机森林这个算法在分类问题上效果十分的好,大多数情况下效果远要比svm,log回归,knn等算法效果好。因此想琢磨琢磨这个算法的原理。


    要学随机森林,首先先简单介绍一下集成学习方法和决策树算法。

    Bagging和Boosting 概念及区别

    Bagging和Boosting都是将已有的分类或回归算法通过一定方式组合起来,形成一个性能更加强大的分类器,更准确的说这是一种分类算法的组装方法。即将弱分类器组装成强分类器的方法。

    首先介绍Bootstraping,即自助法:它是一种有放回的抽样方法(可能抽到重复的样本)。

    1、Bagging (bootstrap aggregating)

    Bagging即套袋法,其算法过程如下:

    A)从原始样本集中抽取训练集。每轮从原始样本集中使用Bootstraping的方法抽取n个训练样本(在训练集中,有些样本可能被多次抽取到,而有些样本可能一次都没有被抽中)。共进行k轮抽取,得到k个训练集。(k个训练集之间是相互独立的)

    B)每次使用一个训练集得到一个模型,k个训练集共得到k个模型。(注:这里并没有具体的分类算法或回归方法,我们可以根据具体问题采用不同的分类或回归方法,如决策树、感知器等)

    C)对分类问题:将上步得到的k个模型采用投票的方式得到分类结果;对回归问题,计算上述模型的均值作为最后的结果。(所有模型的重要性相同)

     

    2、Boosting

    其主要思想是将弱分类器组装成一个强分类器。在PAC(概率近似正确)学习框架下,则一定可以将弱分类器组装成一个强分类器。

    关于Boosting的两个核心问题:

    1)在每一轮如何改变训练数据的权值或概率分布?

    通过提高那些在前一轮被弱分类器分错样例的权值,减小前一轮分对样例的权值,来使得分类器对误分的数据有较好的效果。

    2)通过什么方式来组合弱分类器?

    通过加法模型将弱分类器进行线性组合,比如AdaBoost通过加权多数表决的方式,即增大错误率小的分类器的权值,同时减小错误率较大的分类器的权值。

    而提升树通过拟合残差的方式逐步减小残差,将每一步生成的模型叠加得到最终模型。

     

    3、Bagging,Boosting二者之间的区别

    Bagging和Boosting的区别:

    1)样本选择上:

    Bagging:训练集是在原始集中有放回选取的,从原始集中选出的各轮训练集之间是独立的。

    Boosting:每一轮的训练集不变,只是训练集中每个样例在分类器中的权重发生变化。而权值是根据上一轮的分类结果进行调整。

    2)样例权重:

    Bagging:使用均匀取样,每个样例的权重相等

    Boosting:根据错误率不断调整样例的权值,错误率越大则权重越大。

    3)预测函数:

    Bagging:所有预测函数的权重相等。

    Boosting:每个弱分类器都有相应的权重,对于分类误差小的分类器会有更大的权重。

    4)并行计算:

    Bagging:各个预测函数可以并行生成

    Boosting:各个预测函数只能顺序生成,因为后一个模型参数需要前一轮模型的结果。

     

    4、总结

    这两种方法都是把若干个分类器整合为一个分类器的方法,只是整合的方式不一样,最终得到不一样的效果,将不同的分类算法套入到此类算法框架中一定程度上会提高了原单一分类器的分类效果,但是也增大了计算量。

    下面是将决策树与这些算法框架进行结合所得到的新的算法:

    1)Bagging + 决策树 = 随机森林

    2)AdaBoost + 决策树 = 提升树

    3)Gradient Boosting + 决策树 = GBDT

    集成学习通过构建并结合多个分类器来完成学习任务。集成学习通过将多个学习器进行结合,常可获得比单一学习器更好的泛化性能。

    考虑一个简单例子:在二分类任务中,假定三个分类器在三个测试样本上的表现如下图,其中√表示分类正确,×表示分类错误,集成学习的结果通过投票法产生,即“少数服从多数”。如下图,在(a)中,每个分类器都只有66.6%的精度,但集成学习却达到了100%;在(b)中,三个分类器没有差别,集成之后性能没有提高;在(c)中,每个分类器的精度都只有33.3%,集成学习的结果变得更糟。这个简单地例子显示出:要获得好的集成,个体学习器应“好而不同”,即个体学习器要有一定的“准确性”,即学习器不能太差,并且要有“多样性”,即学习器间具有差异。

     640?wx_fmt=png

    根据个体学习器的生成方式,目前的集成学习方法大致可分为两大类,即个体学习器之间存在强依赖关系,必须串行生成的序列化方法,以及个体学习器间不存在强依赖关系,可同时生成的并行化方法;前者的代表是Boosting,后者的代表是Bagging和“随机森林”(Random Forest)

    Bagging与随机森林

    要得到泛化性能强的集成,集成中的个体学习器应尽可能相互独立,虽然这在现实任务中很难做到,但我们可以设法使基学习器尽可能具有较大的差异。

    在我的实验中,使用“自助采样法”:给定包含m个样本的数据集,我们先随机取出一个样本放入采样集中,再把该样本放回初始数据集,使得下次采样时该样本仍有可能被选中,这样,经过m次随机操作,我们得到含m个样本的采样集,初始训练集中有的样本在采样集里多次出现,有的则从未出现。

    按照这种方法,我们可以采样出T个含m个训练样本的采样集,然后基于每个采样集训练处一个基学习器,再将这些基学习器进行结合,这就是Bagging的基本流程。在对预测输出进行结合时,Bagging通常对分类任务使用简单投票法,对回归任务使用简单平均法。

    随机森林是Bagging的一个扩展。随机森林在以决策树为基学习器构建Bagging集成的基础上,进一步在决策树的训练过程中引入了随机属性选择(即引入随机特征选择)。传统决策树在选择划分属性时时在当前节点的属性集合(假定有d个属性)中选择一个最优属性;而在随机森林中,对基决策树的每个节点,先从该节点的属性集合中随机选择一个包含k个属性的子集,然后再从这个子集中选择一个最优属性用于划分。这里的参数k控制了随机性的引入程度:若令k=d,则基决策树的构建与传统决策树相同;若令k=1,则是随机选择一个属性进行划分。

    在这篇文章中,我们只讲随机森林的分类部分。随机森林用于分类时,即采用n个决策树分类,将分类结果用简单投票法得到最终分类,提高分类准确率。

    对于决策树不太了解的童鞋,可以看上一篇:

    python机器学习:决策树ID3、C4.5

    简单来说,随机森林就是对决策树的集成,但有两点不同:

    (1)采样的差异性:从含m个样本的数据集中有放回的采样,得到含m个样本的采样集,用于训练。这样能保证每个决策树的训练样本不完全一样。

    (2)特征选取的差异性:每个决策树的n个分类特征是在所有特征中随机选择的(n是一个需要我们自己调整的参数)

    随机森林需要调整的参数有:

    (1)    决策树的个数

    (2)    特征属性的个数

    (3)    递归次数(即决策树的深度)

     

    下面,讲一下如何用代码实现随机森林。

    代码实现流程:

    (1)    导入文件并将所有特征转换为float形式

    (2)    将数据集分成n份,方便交叉验证

    (3)    构造数据子集(随机采样),并在指定特征个数(假设m个,手动调参)下选取最优特征

    (4)    构造决策树

    (5)    创建随机森林(多个决策树的结合)

    (6)    输入测试集并进行测试,输出预测结果

    (1)    导入文件并将所有特征转换为float形式

    640?wx_fmt=png

    (2)    将数据集分成n份,方便交叉验证

    640?wx_fmt=png

    3)    构造数据子集(随机采样),并在指定特征个数(假设m个,手动调参)下选取最优特征


    640?wx_fmt=png

    (4)    构造决策树

    640?wx_fmt=png

    (5)    创建随机森林(多个决策树的结合)

    640?wx_fmt=png

    (6)    输入测试集并进行测试,输出预测结果

    640?wx_fmt=png

    对以上代码的一点总结:

    训练部分:假设我们取dataset中的m个feature来构造决策树,首先,我们遍历m个feature中的每一个feature,再遍历每一行,通过spilt_loss函数(计算分割代价)来选取最优的特征及特征值,根据是否大于这个特征值进行分类(分成left,right两类),循环执行上述步骤,直至不可分或者达到递归限值(用来防止过拟合),最后得到一个决策树tree。

    测试部分:对测试集的每一行进行判断,决策树tree是一个多层字典,每一层为一个二分类,将每一行按照决策树tree中的分类索引index一步一步向里层探索,直至不出现字典时探索结束,得到的值即为我们的预测值。转自: datayx

    感谢您的阅读,祝您一天好心情!



    长按二维码,关注我们

    640?wx_fmt=jpeg

    展开全文
  • 模型也是基于电商的一些历史数据进行销量的建模、预测。 2.获取数据 本数据是模拟数据,分为两部分数据: 训练数据集:data_train.xlsx 测试数据集:data_test.xlsx 在实际应用中,根据自己的数据进行替换...
  • 定义:随机森林指的是利用多棵决策树对样本进行训练并预测的一种分类器。可回归可分类。所以随机森林是基于多颗决策树的一种集成学习算法,常见的决策树算法主要有以下几种:1. ID3:使用信息增益g(D,A)进行特征选择...
  • 说明:这是一个机器学习实战项目(附带数据+... 预测结果数据如下: 本次机器学习项目实战所需的资料,项目资源如下: 基于Python实现随机森林分类模型(RandomForestClassifier)项目实战-Python文档类资源-CSDN下载
  • 随机森林 分类模型iris_rForest.py from sklearn import datasets from sklearn.metrics import confusion_matrix,accuracy_score from sklearn.model_selection import train_test_split from sklearn import ...
  • 随机森林的代码实现和相应的数据集 (python代码)

    千次下载 热门讨论 2017-03-20 21:39:45
    本文件包括随机森林的代码实现和相应的数据集,以及详尽的中文注释,已调试通过。代码有两份,一份是在网上下载的,另一份是自己整理后编写的。编程环境为Python2.7。因为只是用来学习随机森林算法,所以在调参方法...
  • 学了差不多10多天的入门机器学习,突然发现学好数学是多么的重要,以前上学时还觉得数学只要学会加减乘除就可以了,什么导数,回归方程都没什么用,这段时间真后悔死,看了好多模型原理推导,有好多的数学符号都不...
  • 数学建模_随机森林分类模型详解Python代码 随机森林需要调整的参数有: (1) 决策树的个数 (2) 特征属性的个数 (3) 递归次数(即决策树的深度)''' from numpy import inf from numpy import zeros import ...
  • 随机森林气温预测数据+代码 随机森林回归模型 万事俱备,我们可以来建立随机森林模型啦,首先导入工具包,先建立1000个树试试吧,其他参数先用默认值,之后我们会再深入到调参任务中: # 导入算法 from sklearn....
  • 随机森林 kaggle 数据挖掘 categories: 数据挖掘 mathjax: true 文章目录前言:1 数据预处理1.1 读入数据1.2 训练集与数据集1.2.1 查看数据完整性1.2.2 查看训练数据描述信息1.3.1 年龄数据简化分组2 数据可视化2.1...
  • python3.7 -*- coding: UTF-8 -*- @Project -> File :Code -> Stock @IDE :PyCharm @Author :YangShouWei @USER: 296714435 @Date :2021/3/18 15:52:15 @LastEditor: ''' import tushare as ts # 引入...
  • 该内容共包含四部分代码,包含用python的sklearn包实现对kaggle上面泰坦尼克号的生存预测
  • 该数据集用于决策树随机森林天气预测数据集,利用前一天和历史最高平均气温,实现气温预测随机森林模型
  • 预测股票市场价格 预测股票价格-线性回归vs随机森林对于这个项目,我使用了包含指数价格的csv文件。 文件中的每一行都包含1950年至2015年间S&P500... 我将使用该数据集来开发利用线性回归和随机森林算法的预测模型
  • Python实现随机森林回归

    万次阅读 多人点赞 2020-11-02 13:19:38
    1 介绍 使用Scikit-Learn模块在Python实现任何机器学习算法都比较简单,并且不需要了解所有...集成学习是一种学习类型,可以多次加入不同类型的算法或相同算法,以形成更强大的预测模型随机森林结合了多个相同类型的
  • 随机森林随机回归预测Why do we try to predict happiness? Being able to predict happiness means that we are able to manipulate or try to improve certain components in order to increase our own happiness...
  • python中实现随机森林Random forest is a highly versatile machine learning method with numerous applications ranging from marketing to healthcare and insurance. It can be used to model the impact of ...
  • 简单通俗又全面的随机森林预测实战
  • python3】基于随机森林的气温预测

    千次阅读 多人点赞 2021-05-03 19:58:49
    前言 这个项目实战系列主要是跟着网络上的教程来做的,主要参考《跟着迪哥学习机器学习》中的思路...基于随机森林的气温预测 … 思路 随机森林建模->特征选择->效率对比->参数调优 import pandas as pd fea
  • 之前对比分析的主要是数据和特征层面,还有另一部分非常重要的工作等着大家去做,就是模型调参问题,在实验的最后,看一下对于树模型来说,应当如何进行参数调节。 调参是机器学习必经的一步,很多方法和经验并不是...
  • 本文将介绍如何使用Python构建和使用随机森林。我们不只是简单地展示代码,而会尽力解释模型的工作方式。我们将从一个解决简单问题的单个决策树开始,然后逐渐深入,最终完成一个针对某个真实世界数据科学问题的随机...
  • 随机森林理解及Python调包实现 随机森林算法原理 = 决策树 + bagging原理 + 随机 随机森林和决策树一样既可以做分类又可以做回归(更多用来做分类问题) 随机森林是使用集成学习的思想将多颗决策树集成一种学习器的...
  • Python随机森林调参红酒品质预测

    千次阅读 2020-05-18 23:04:33
    Python随机森林调参红酒品质预测 本节的数据来源是2009年UCI库中的Wine Quality Data Set的数据,大家可以在(http://archive.ics.uci.edu/ml/datasets/Wine+Quality)网址进行下载。 1.引入所需模块 import pandas ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,323
精华内容 4,929
关键字:

随机森林预测模型python

python 订阅