Python随机森林算法预测实例,随机森林回归算法原理

  Python随机森林算法预测实例,随机森林回归算法原理

  文章前言:随机森林回归机参数介绍;数据介绍;数据介绍;关键代码;特征集和标签集的获取;数据集划分;随机森林模型的训练;预测结果的可视化;特征重要性的选择和可视化;和完整的代码摘要。

  前言我为什么写这个博客?

  答:为sklearn库记录自己的学习过程和学习方法,以便以后重复使用。

  这篇文章主要讲的是什么?

  这篇文章是我用sklearn的随机森林对你正在研究的数据进行处理和分析的过程,包括一些相应的方法。详见目录。

  森林随机入门?

  随机森林是一种统计学习理论,其随机性有两个方面:首先,在每一轮训练中,从原始样本集中返回固定数量的样本点,形成k个不同的样本集。第二点是:对于每棵决策树,从总属性中随机选取一定数量的属性作为分裂属性集,这对于K树分类器是不同的。随机森林由K棵随机生成的决策树组成。

  对于每一棵决策树来说,它的分裂属性是不断选择信息增益最大的属性进行排列。整个随机森林建立后,最终的分类标准采用投票机制,以获得尽可能高的结果。

  一、随机森林回归机sklearn参数介绍。合奏。随机森林回归机(n _ estimators= warn ,#迭代次数,即森林中决策树的数量准则=mse ,#用于分裂节点的准则,可选“gini”和“熵”,默认“Gini”max _ depth=none,#树的最大深度min_samples_split=2,#分裂内部节点所需的最小样本数min_samples_leaf=1,#叶节点所需的最小样本数。Min_weight_fraction_leaf=0.0,#所有叶节点(所有输入样本)的权重和中最小的加权分数。Max_features=auto ,#搜索最佳分段时要考虑的特征数max_leaf_nodes=None,#最大叶节点数,整数,默认值为none min _ impendence _ decline=0.0,#如果拆分索引的减少量大于该值,则拆分。Min _ imprudence _ split=none,#决策树生长的最小纯度。不建议使用bootstrap=True,#是否有随机选取的样本oob_score=False,#是否使用袋外样本评估模型。建议Truen_jobs=None,#并行计数。默认值为无。一般选择-1,根据计算机核心数自动选择random _ state=none。#控制引导的随机性和所选样本的随机性。一般数字都是一样的,方便调整verbose=0,#控制拟合和预测时的细节层次。默认值为0。Warm_start=False#如果设置为True,您可以重用已训练的模型并向其添加更多基础学习者。)所有参数、属性和接口都与随机森林分类器一致。唯一不同的是回归树和分类树不同,不纯指标和参数判据不一致。

  RF框架特征

  n_estimators:是弱学习器的最大迭代次数,或弱学习器的最大数量。一般来说,n_estimators太小,所以很容易欠拟合。如果n_estimators太大,计算量就会太大。n _估计量达到一定数量后,通过增加n _估计量获得的模型改善会很小,所以一般选择一个适中的值。默认值为100。

  oob_score即是否使用袋外样本评估模型。阻截假动作。个人推荐设置为True,是因为自付分反映了一个模型拟合后的泛化能力。

  criterion:是CART树划分时特征的评价标准。分类模型和回归模型的损失函数是不同的。RF分类对应的CART分类树默认是基尼系数,另一个备选标准是信息增益。RF回归对应的CART回归树默认为mse,另一个可选标准是绝对值差mae。一般来说,选择默认标准就好。

  RF决策树参数

  RF划分时考虑的最大特征数max_features:可以使用多种类型的值。默认值为“auto”,这意味着分区时最多应考虑N \sqrt{N} N个功能。如果是‘log2’,说明划分时要考虑l o g 2N log 2N的最大特征数;If sqrt 或 auto 表示分区时最多应考虑N \sqrt{N} N个功能。如果它是一个整数,它表示所考虑的特性的绝对数量。如果是浮点数,则表示考虑的特性的百分比,即(percentage xN)四舍五入后的特性数。其中n是样本的总特征数。通常,我们可以使用默认的“自动”。如果特征的数量非常大,我们可以灵活地使用刚才描述的其他值来控制划分时要考虑的最大特征数量,从而控制决策树的生成时间。

  决策树最大深度max_depth:可以默认为空。如果不输入,决策树在构建子树时不会限制子树的深度。一般来说,当数据或特征较少时,可以忽略该值。如果模型的样本量和特征比较大,建议限制这个最大深度,具体数值取决于数据的分布。常用值可以在10到100之间。

  内部节点再划分所需最小样本数min_samples_split:该值限制了子树继续分区的条件。如果一个节点的样本数小于min_samples_split,它将不会继续尝试选择用于分区的最佳特征。默认值为2。如果样本量不大,就不需要在意这个值。如果样本量很大,建议增加这个值。

  叶子节点最少样本数min_samples_leaf:该值限制叶节点的最小样本数。如果一个叶子节点的数目小于样本数,它将和它的兄弟节点一起被修剪。默认值为1。您可以输入最小样本数的整数或最小样本数占总样本数的百分比。如果样本量不大,就不需要在意这个值。如果样本量很大,建议增加这个值。

  叶子节点最小的样本权重和min_weight_fraction_leaf:该值限制叶节点所有样本的权重和的最小值。如果小于该值,它将与同级节点一起被修剪。默认值为0,即不考虑重量问题。一般来说,如果我们缺失值的样本较多,或者分类树样本的分布类别偏差较大,我们会引入样本权重,然后要关注这个值。

  最大叶子节点数max_leaf_nodes:通过限制叶节点的最大数量,可以防止过拟合。默认值为“无”,即不限制叶节点的最大数量。如果添加限制,算法将在最大数量的叶节点内建立最优决策树。如果特征不多,这个值可以忽略,但是如果特征多,可以限制,具体值可以通过交叉验证得到。

  节点划分最小不纯度min_impurity_split:的值限制了决策树的增长。如果一个节点的杂质(基于基尼系数,均方差)小于这个阈值,该节点将不再生成子节点。即叶节点。一般不建议更改默认值1e-7。

  random——state:这里的random_state是为了保证程序每次运行时划分相同的训练集和测试集。否则,同一个算法模型对不同的训练集和测试集产生不同的效果。

  上述决策树最重要的参数包括最大特征数max_features、最大深度max_depth、内部节点细分的最小样本数min_samples_split和叶节点的最小样本数min_samples_leaf。

  调谐链接参考

  二、实际数据1。数据简介本数据采用处理后的滑行轨迹数据,共有15万条数据。

  特点:

  最短驾驶距离、OD _ speed、OD _ speed CV、备用路径数、OD _ distance CV、交叉道路CV、平均交叉道路、速度和速度CV标签:

  RG:相对盖

  2.重点代码2.1特征集和标签集获取df=PD。read _ CSV(r traval _ merge _ RP _ od20 _ dis 4000 cv _ cro _ road。txt ,sep=\t ,encoding= gbk )df=df。dropna(axis=0,how=any) #将缺失值的行丢弃col=[最短行驶路程, OD_speed , OD_speedcv ,备选路径数, OD_distancecv , crossroadcv , speed , speedcv , mean_crossroad]#取得特征X=df[col].价值观#取得标签Y=df.loc[: RG].价值观2.2数据集划分#进行数据集划分,70%作为训练, 30作为测试x_train,x_test,y_train,y_test=train_test_split(X,Y,test_size=0.3) 2.3随机森林模型训练#利用随机森林进行训练forest=RandomForestRegressor(n _ estimators=1000,random_state=1,n_jobs=-1)forest.fit(x_train,y_train) 2.4预测结果可视化#score=forest.score(x_test,y _ test)结果=forest。预测(x测试)PLT。图()#只取前一百条可视化,因为数据太多了plt.plot(np.arange(100),y_test[:100], go-,label= True value )PLT。剧情(NP。arange(100),result[:100], ro-,label=预测值)PLT。标题(f random forest-score:{ score } )PLT。图例(loc= best )PLT。显示()可视化结果(分数是稀有方)

  2.5 特征重要性选择及可视化# 下面对训练好的随机森林,完成重要性评估# feature_importances_可以调取关于特征重要程度重要性=森林。feature _ importances _ print(重要性:,importances)x _ columns=[ OD _ distance , OD_speed , route_num , OD_distancecv , crossroadcv , speed , speedcv , mean_crossroad]#返回数组从大到小的索引值指数=NP。范围(x _ train)中f的arg sort(importances)[:-1]。形状[1]): #对于最后需要逆序排序,我认为是做了类似决策树回溯的取值,从叶子收敛# 到根,根部重要程度高于叶子print(-) %-*s %f % (f 1,30,col[indexes[f]],importances[indexes[f]])#筛选变量(选择重要性比较高的变量)阈值=0.15x_selected=x_train[:重要性阈值]#可视化图形(figsize=(10,6))图形。标题(日期集中特征的重要性,font size=18)PLT。y标签(导入级别,fontsize=15,rotation=90)x _ columns 1=[x _ columns[I]for I in indexes(len(x _ columns)):PLT。bar(I,importances[indexes[I]],color=orange ,align= center )PLT。x滴答(NP。arange(len(x _ columns)).结果

  3.完整代码#判断是否有空值def jud _ array(x):print(NP。伊斯南(x)).any())# traval _ merge _ RP _ od20 _ dis 4000 cv _ cro _ road。txt df=PD。read _ CSV(r traval _ merge _ RP _ od20 _ dis 4000 cv _ cro _ road。txt ,sep=\t ,encoding= gbk )df=df。dropna(axis=0,how=any)col=[最短行驶路程, OD_speed , OD_speedcv ,备选路径数, OD_distancecv , crossroadcv , speed , speedcv , mean_crossroad]X=df[col]#取得特征X=df[col].价值观#取得标签Y=df.loc[: RG].价值观#进行数据集划分x_train,x_test,y_train,y_test=train_test_split(X,Y,test_size=0.3)#利用随机森林进行训练forest=RandomForestRegressor(n _ estimators=100,random_state=1,n_jobs=-1)forest.fit(x_train,y_train)#预测结果可视化score=forest.score(x_test,y _ test)结果=forest。预测(x测试)PLT。图()PLT。剧情(NP。arange(100),y_test[:100], go-,label= True value )PLT。剧情(NP。arange(100),result[:100], ro-,label=预测值)PLT。title(f random forest-score:{ score } )PLT。图例(loc= best )分数y_pred=forest.predict(x_test)#下面对训练好的随机森林,完成重要性评估# feature_importances_可以调取关于特征重要程度重要性=森林。feature _ importances _ print(重要性:,importances)x _ columns=[ OD _ distance , OD_speed , route_num , OD_distancecv , crossroadcv , speed , speedcv , mean_crossroad]#返回数组从大到小的索引值指数=NP。范围(x _ train)中f的arg sort(importances)[:-1]。形状[1]): #对于最后需要逆序排序,我认为是做了类似决策树回溯的取值,从叶子收敛# 到根,根部重要程度高于叶子print(-) %-*s %f % (f 1,30,col[indexes[f]],importances[indexes[f]])#筛选变量(选择重要性比较高的变量)阈值=0.15x_selected=x_train[:重要性阈值]#可视化图形(figsize=(10,6))图形。标题(日期集中特征的重要性,font size=18)PLT。y标签(导入级别,fontsize=15,rotation=90)x _ columns 1=[x _ columns[I]for I in indexes(len(x _ columns)):PLT。bar(I,importances[indexes[I]],color=orange ,align= center )PLT。x滴答(NP。arange(len(x _ columns)).总结目前这个博客还不够完善,后续我会继续添加缺失值处理以及调参过程。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: