精华内容
下载资源
问答
  • 以主成分值为输入,房屋安全程度的量化值为输出,建立路堑开挖爆破对邻近民房安全危害的随机森林预测模型.利用18组工程实例数据为训练样本,另外4组数据为检验样本,进行了模型的预测实验.实验结果表明:基于主成分分析的...
  • RF_regressor 使用sklearn随机森林回归器的预测模型
  • 随机森林模型代码

    2018-07-19 16:11:29
    随机森林预测模型代码,相互学习。里面包含视频和ppt的学习资源。
  • 引入RFR(random forest regression,随机森林回归)算法,分析气象条件、大气污染物浓度和季节所包含的22项特征因素,通过调整参数的最优组合,设计出一种新的PM2.5浓度预测模型——RFRP模型。同时,收集了西安市...
  • 随机森林气温预测数据+代码 随机森林回归模型 万事俱备,我们可以来建立随机森林模型啦,首先导入工具包,先建立1000个树试试吧,其他参数先用默认值,之后我们会再深入到调参任务中: # 导入算法 from sklearn....

    随机森林气温预测数据+代码

    随机森林回归模型

    万事俱备,我们可以来建立随机森林模型啦,首先导入工具包,先建立1000个树试试吧,其他参数先用默认值,之后我们会再深入到调参任务中:

    # 导入算法
    from sklearn.ensemble import RandomForestRegressor
    
    # 建模
    rf = RandomForestRegressor(n_estimators= 1000, random_state=42)
    
    # 训练
    rf.fit(train_features, train_labels)
    

    由于数据样本量还是非常小的,所以很快就可以得到结果了,这里我们先用MAPE指标来进行评估,也就是平均绝对百分误差,其实对于回归任务,评估方法还是比较多,给大家列出来几种,很简单就可以实现出来,也可以选择其他指标来进行评估:
    在这里插入图片描述

    测试

    # 预测结果
    predictions = rf.predict(test_features)
    
    # 计算误差
    errors = abs(predictions - test_labels)
    
    # mean absolute percentage error (MAPE)
    mape = 100 * (errors / test_labels)
    
    print ('MAPE:',np.mean(mape))
    
    MAPE: 6.011244187972058
    

    可视化展示树

    # 导入所需工具包
    from sklearn.tree import export_graphviz
    import pydot #pip install pydot
    
    # 拿到其中的一棵树
    tree = rf.estimators_[5]
    
    # 导出成dot文件
    export_graphviz(tree, out_file = 'tree.dot', feature_names = feature_list, rounded = True, precision = 1)
    
    # 绘图
    (graph, ) = pydot.graph_from_dot_file('tree.dot')
    
    # 展示
    graph.write_png("somefile.png")
    

    在这里插入图片描述

    print('The depth of this tree is:', tree.tree_.max_depth)
    
    The depth of this tree is: 15
    

    执行完上述代码,会在指定的目录下(如果只指定其名字,会在代码所在路径下)生成一个tree.png文件,这就是绘制好的一棵树的模型,如图 所示。树模型看起来有点太大,观察起来不太方便,可以使用参数限制决策树的规模, 预剪枝方案在这里可以派上用场。

    预剪枝

    # 限制一下树模型 n_estimators棵树采用的数据集都是独立自助采样的,最大深度和随机数种子
    rf_small = RandomForestRegressor(n_estimators=10, max_depth = 3, random_state=42)
    rf_small.fit(train_features, train_labels)
    
    # 提取一颗树
    tree_small = rf_small.estimators_[8]
    
    # 保存
    export_graphviz(tree_small, out_file = 'small_tree.dot', feature_names = feature_list, rounded = True, precision = 1)
    
    (graph, ) = pydot.graph_from_dot_file('small_tree.dot')
    
    graph.write_png('small_tree.png')
    

    在这里插入图片描述
    对生成的树模型中各项指标的含义进行了标识,看起来还是比较好理解,其中非叶子节点中包括 4项指标∶ 所选特征与切分点、评估结果、此节点样本数量、节点预测结果(回归中就是平均)。

    特征重要性

    讲解随机森林算法的时候,曾提到使用集成算法很容易得到其特征重要性,在sklearn工具包中也有现成的函数,调用起来非常容易∶

    # 得到特征重要性
    importances = list(rf.feature_importances_)
    
    # 转换格式
    feature_importances = [(feature, round(importance, 2)) for feature, importance in zip(feature_list, importances)]
    
    # 排序
    feature_importances = sorted(feature_importances, key = lambda x: x[1], reverse = True)
    
    # 对应进行打印
    [print('Variable: {:20} Importance: {}'.format(*pair)) for pair in feature_importances]
    

    在这里插入图片描述
    上述输出结果分别打印了当前特征及其所对应的特征重要性,绘制成图表分析起来更容易∶

    上述代码可以可以明显发现,temp_1和average这两个特征的重要性占据总体的绝大部分,其他特征的重要性看起来微乎其微。

    # 转换成list格式
    x_values = list(range(len(importances)))
    
    # 绘图
    plt.bar(x_values, importances, orientation = 'vertical')
    
    # x轴名字
    plt.xticks(x_values, feature_list, rotation='vertical')
    
    # 图名
    plt.ylabel('Importance'); plt.xlabel('Variable'); plt.title('Variable Importances'); 
    

    在这里插入图片描述

    那么,只用最厉害的特征来建模,其效果会不会更好呢?其实并不能保证效果一定更好,但是速度肯定更快,先来看一下结果∶

    # 选择最重要的那两个特征来试一试
    rf_most_important = RandomForestRegressor(n_estimators= 1000, random_state=42)
    
    # 拿到这俩特征
    important_indices = [feature_list.index('temp_1'), feature_list.index('average')]
    train_important = train_features[:, important_indices]
    test_important = test_features[:, important_indices]
    
    # 重新训练模型
    rf_most_important.fit(train_important, train_labels)
    
    # 预测结果
    predictions = rf_most_important.predict(test_important)
    
    errors = abs(predictions - test_labels)
    
    # 评估结果
    
    mape = np.mean(100 * (errors / test_labels))
    
    print('mape:', mape)
    
    
    6.229055723613811
    

    从损失值上观察,并没有下降,反而上升了,说明其他特征还是有价值的,不能只凭特征重要性就否定部分特征数据,一切还要通过实验进行判断。
    但是,当考虑时间效率的时候,就要好好斟酌一下是否应该剔除掉那些用处不大的特征以加快构建模型的速度。到目前为止,已经得到基本的随机森林模型,并可以进行预测,下面来看看模型的预测值与真实值之间的差异∶

    # 日期数据
    months = features[:, feature_list.index('month')]
    days = features[:, feature_list.index('day')]
    years = features[:, feature_list.index('year')]
    
    # 转换日期格式
    dates = [str(int(year)) + '-' + str(int(month)) + '-' + str(int(day)) for year, month, day in zip(years, months, days)]
    dates = [datetime.datetime.strptime(date, '%Y-%m-%d') for date in dates]
    
    # 创建一个表格来存日期和其对应的标签数值
    true_data = pd.DataFrame(data = {'date': dates, 'actual': labels})
    
    # 同理,再创建一个来存日期和其对应的模型预测值
    months = test_features[:, feature_list.index('month')]
    days = test_features[:, feature_list.index('day')]
    years = test_features[:, feature_list.index('year')]
    
    test_dates = [str(int(year)) + '-' + str(int(month)) + '-' + str(int(day)) for year, month, day in zip(years, months, days)]
    
    test_dates = [datetime.datetime.strptime(date, '%Y-%m-%d') for date in test_dates]
    
    predictions_data = pd.DataFrame(data = {'date': test_dates, 'prediction': predictions}) 
    
    # 真实值
    plt.plot(true_data['date'], true_data['actual'], 'b-', label = 'actual')
    
    # 预测值
    plt.plot(predictions_data['date'], predictions_data['prediction'], 'ro', label = 'prediction')
    plt.xticks(rotation = '60'); 
    plt.legend()
    
    # 图名
    plt.xlabel('Date'); plt.ylabel('Maximum Temperature (F)'); plt.title('Actual and Predicted Values');
    

    在这里插入图片描述
    通过上述输出结果的走势可以看出,模型已经基本能够掌握天气变化情况,接下来还需要深入数据,考虑以下几个问题。

    1. 如果可利用的数据量增大,会对结果产生什么影响呢?
    2. 加入新的特征会改进模型效果吗?此时的时间效率又会怎样?
    展开全文
  • 该内容共包含四部分代码,包含用python的sklearn包实现对kaggle上面泰坦尼克号的生存预测
  • matlab软件随机森林法回归模型代码,可直接matlab打开运行!精简版,包括数据导入、模型建立、误差计算、保存模型,绘制对比图的多个功能!
  • 主要通过sklearn中来实现随机森林回归模型对波士顿房价进行回归预测
  • R语言 随机森林回归

    2017-08-30 19:13:07
    主要利用R语言进行随机森林回归,还有其他两种回归, library(lattice) library(grid) library(DMwR) library(rpart) library(ipred) library(randomForest) #回归树,装袋算法,随机森林三大回归 #前二种算法可以...
  • 随机森林预测

    千次阅读 2020-12-20 18:12:52
    当涉及到预测数据(时间序列或其他类型的序列)时,人们会关注基本回归、ARIMA、ARMA、GARCH,甚至Prophet,但不排除使用随机森林预测数据。随机森林通常被认为是一种分类技术,但回归问题绝对是随机森林可以处理的...

    Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发。

    当涉及到预测数据(时间序列或其他类型的序列)时,人们会关注基本回归、ARIMA、ARMA、GARCH,甚至Prophet,但不排除使用随机森林来预测数据。

    随机森林通常被认为是一种分类技术,但回归问题绝对是随机森林可以处理的。

    在本文中,我打算使用在网上找到的一个数据集,叫做温莎市房屋销售价格。出于写作的目的,我将只使用价格(price)和批量(lotsize)列。注:在以后的文章中,我打算摒弃这些数据,并对随机森林进行多元回归。

    为了开始,先让我们导入项目开始所需的所有库。和往常一样,你可以在这里使用jupyter笔记本来运行这个分析。

    现在来加载数据:

    同样,我们只使用数据集中的两列—价格(price)和批量(lotsize)。让我们把这些数据画出来,直观地看一看,用批量(lotsize)来预测价格(price)是否有意义。

    从数据来看,使用批量来预测价格似乎是一个不错的猜测。

    现在,让我们准备好数据集来训练和测试数据。

    在上面,我们把随机森林回归量设置为X和y,然后设置我们的训练和测试数据。对于训练数据,我们将取前400个数据点来进行随机森林训练,然后对最后146个数据点进行测试。

    现在,让我们运行随机森林回归模型。首先,我们需要从sklearn中导入Random Forest regression:

    现在是时候让我们来运行随机森林回归看看会得到什么。

    让我们可视化价格(price)和预测价格(predicted_price)。

    对于批量(lotsize)预测价格(price)这个大胆的猜测来说,结果确实差强人意。从视觉上,它看起来相当不错(尽管肯定有错误)。

    让我们看看基本级别的错误。首先,快速地画出两者之间的“区别”。

    这里的错误相当大。我们来看一些值,比如R的平方(R-Squared )和均方误差(Mean Squared Error)。首先,让我们从sklearn导入适当的函数。

    现在,让我们来看看R的平方(R-Squared):

    R-Squared是0.6976,也就是0.7。对于随机猜测来说,结果不是很好,但也不是很糟糕。0.7(或70%)是为了告诉你,大约70%的“信号”变化是由用作预测器的变量解释的。从全局来看,这还不错。

    我可以继续进行其他错误的计算,但这篇文章的重点不是展示“准确性”,而是展示如何使用随机森林进行预测的“过程”。

    英文原文:https://pythondata.com/forecasting-with-random-forests/

    译者:任宇は神様

    展开全文
  • 随机森林随机回归预测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...

    随机森林随机回归预测

    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, and possibly national happiness for governments. I found Random Forest (RF) to be the simplest and most efficient package, so let’s get started!

    为什么我们要尝试预测幸福? 能够预测幸福意味着我们能够操纵或尝试改善某些组成部分,以增加我们自己的幸福,甚至可能增加政府的国民幸福。 我发现随机森林(RF)是最简单,最有效的软件包,所以让我们开始吧!

    内容: (Contents:)

    1. The Data

      数据
    2. Random Forest Model

      随机森林模型
    3. Data Cleaning

      数据清理
    4. Training and Testing

      培训与测试
    5. Feature Importances

      功能重要性
    6. Modifying number of variables

      修改变量数
    7. Evaluating the Model

      评估模型

    数据:(The Data:)

    The data obtained from the #WorldValuesSurvey contains >290 questions & consist of ~69k responses after removing missing data for happiness levels. It is a cross-national survey across the years, and the questionnaire can be found on the website. In particular, we will be looking at the 2017–2020 data set. The size of the data set makes it optimal for machine learning.

    #WorldValuesSurvey获得的数据包含超过290个问题,并在删除幸福水平缺失的数据后包含约69k响应。 这是多年来的跨国调查,其问卷可以在网站上找到。 特别是,我们将研究2017-2020年的数据集。 数据集的大小使其最适合机器学习。

    随机森林模型: (Random Forest Model:)

    To start with, we will be using the RF classifier* since we would like the machine to predict the level of happiness in groups (Very happy, Quite happy, Not very happy, Not at all happy).*side-note, a RF regressor is used when looking for a number that can take a range of values e.g any value between 0 and 1.

    首先,我们将使用RF分类器*,因为我们希望机器预测小组中的幸福程度(非常高兴,非常高兴,不太高兴,根本不高兴)。 *旁注,当寻找一个可以取值范围(例如0到1之间的任何值)的数字时,将使用RF回归器。

    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    from sklearn.ensemble import RandomForestClassifier
    from sklearn.model_selection import train_test_split
    from sklearn import metrics

    数据清理:选择数据 (Data cleaning: Selecting the data)

    Let’s start by getting the columns of only the questions and removing negative values* in the responses to Q46 that asks about happiness levels.

    让我们从仅获得问题的列开始,并在对Q46的询问中询问幸福水平的答案中删除负值*。

    var="Q46"
    df=df[df.columns[32:349]]
    df=df[df[var]>0]

    *Negative values are either respondents saying they don’t know, have no answer, were not asked or the response was missing. These values would make it harder for the machine to classify them, since it increases the number of categories and are not what we are looking for.

    *负值是指受访者表示他们不知道,没有答案,没有被要求或答案丢失。 这些值会使机器更难以对其进行分类,因为这会增加类别的数量,而这并不是我们要寻找的。

    The data set remaining is shown below:

    剩余的数据集如下所示:

    Image for post

    进一步的数据清理: (Further data cleaning:)

    The next concern is that we would have to deal with missing values in other columns. There are 3 options to consider:

    下一个需要考虑的问题是,我们将不得不处理其他列中缺失的值。 有3个选项可供考虑:

    1. Replace the missing values with 0

      将缺失的值替换为0
    2. Replace the missing values with the mean

      用均值替换缺失值
    3. Drop the rows with missing values (data set becomes empty).

      删除缺少值的行(数据集为空)。

    Since the third option is not viable, we will have to check which option, 1 or 2, would give the highest accuracy. In this case, I found that replacing with 0 makes it more accurate.

    由于第三个选项不可行,我们将必须检查哪个选项1或2将提供最高的准确性。 在这种情况下,我发现用0代替会使它更准确。

    df.fillna(0, inplace=True)

    准备火车标签: (Prepare train labels:)

    Now we set the ‘label’ for the machine to recognize the feature that I want it to predict and split the data into train and test sets.

    现在,我们为机器设置“标签”,以识别我希望它预测和将数据分为训练和测试集的功能。

    train_labels = pd.DataFrame(df[var])
    train_labels = np.array(df[var])
    train_features= df.drop(var, axis = 1)
    feature_list = list(train_features.columns)
    train_features = np.array(train_features)
    train_features, test_features, train_labels, test_labels = train_test_split(train_features, train_labels, test_size = 0.25, random_state = 42)

    训练和测试模型: (Train and Test the Model:)

    The process of training and testing is simple. To improve the predictive power and/or model speed, we can simply modify the parameters within the RF classifier.

    培训和测试的过程很简单。 为了提高预测能力和/或模型速度,我们可以简单地在RF分类器中修改参数。

    精度提高: (Increasing accuracy:)

    n_estimators — number of trees the algorithm builds before majority voting

    n_estimators-算法在多数表决之前构建的树数

    max_features — maximum number of features random forest considers to split a node

    max_features —随机森林考虑拆分节点的最大特征数

    min_sample_leaf — the minimum number of leafs required to split an internal node.

    min_sample_leaf —拆分内部节点所需的最小叶子数。

    提高速度: (Increasing speed:)

    n_jobs — number of processors it is allowed to use. If = 1, only use one processor. If =-1, no limit

    n_jobs-允许使用的处理器数量。 如果= 1,则仅使用一个处理器。 如果= -1,则没有限制

    random_state — makes the model’s output replicable i.e always produce the same results given the same hyperparameters and training data

    random_state —使模型的输出可复制,即在给定相同的超参数和训练数据的情况下始终产生相同的结果

    oob_score: random forest cross-validation method

    oob_score:随机森林交叉验证方法

    rf=RandomForestClassifier(n_estimators = 1000, oob_score = True, n_jobs = -1,random_state =42,max_features = “auto”, min_samples_leaf = 12)
    rf.fit(train_features, train_labels)
    predictions = rf.predict(test_features)
    print(metrics.accuracy_score(test_labels, predictions))

    The model takes 1.3 minutes to train ~52k training rows and >290 columns, and 1 second to test. The accuracy was 63.70%. If we had chosen to fill the missing values with the mean, the accuracy would be 63.55%. But what’s important is finding out what influences the machine’s prediction, since those would be the variables that we want to look at. We certainly cannot expect everyone to answer 290+ questions, or try to work on all 290 aspects to improve happiness (that’s going to cost a lot). So we’ll be looking at the feature importances.

    该模型需要1.3分钟来训练约52k训练行和> 290列,并且需要1秒进行测试。 准确度是63.70% 。 如果我们选择用平均值填充缺失值,则准确度将为63.55% 。 但是重要的是找出影响机器预测的因素,因为这就是我们要查看的变量。 当然,我们当然不能期望每个人都能回答290多个问题,或者尝试在290个方面进行工作以提高幸福感(这将花费很多)。 因此,我们将研究功能的重要性。

    功能重要性: (Feature Importances:)

    If you recall, feature_list contains the columns of all other variables except Q46. The goal is to understand which are the variables that influence the prediction.

    回想一下,feature_list包含除Q46之外的所有其他变量的列。 目的是了解哪些因素会影响预测。

    importances = list(rf.feature_importances_)
    feature_importances = [(feature, round(importance, 2)) for feature, importance in zip(feature_list, importances)]
    feature_importances = sorted(feature_importances, key = lambda x: x[1], reverse = True)
    [print('Variable: {:20} Importance: {}'.format(*pair)) for pair in feature_importances]
    x_values = list(range(len(importances)))# Make a bar chart
    plt.bar(x_values, importances, orientation = 'vertical', color = 'r', edgecolor = 'k', linewidth = 1.2)
    # Tick labels for x axis
    plt.xticks(x_values, feature_list, rotation='vertical')
    # Axis labels and title
    plt.ylabel('Importance'); plt.xlabel('Variable'); plt.title('Variable Importances');
    Image for post

    Feature importances sum to 1 and what we notice is that certain variables have a greater influence over the prediction compared to the others, and almost every variable has some form of influence, albeit extremely small because there are just too many variables. The next thing is to continue improving our model to allow us to better understand happiness.

    特征重要性的总和为1,我们注意到,与其他变量相比,某些变量对预测的影响更大,并且几乎每个变量都有某种形式的影响,尽管由于变量太多而影响很小。 接下来的事情是继续改进我们的模型,以使我们更好地了解幸福。

    修改变量数: (Modifying the number of variables:)

    Let’s take the top 20 features, and set up a new model using just these 20 variables (+ var itself). We’ll repeat the data cleaning and same RF model. I got an accuracy of 64.47%. If we had chosen to replace missing values with the mean, the accuracy would be 64.41%. What is surprising here is that with smaller number of variables, the model becomes more accurate (from 63.70% to 64.47%). This is likely because the other variables were generating noise in the model and causing it to be less accurate.

    让我们采用前20个功能,并仅使用这20个变量(+ var本身)来建立新模型。 我们将重复数据清理和相同的RF模型。 我的准确度是64.47%。 如果我们选择用均值代替缺失值,则准确度将为64.41% 。 令人惊讶的是,变量数量越少,模型变得越准确(从63.70%64.47% )。 这可能是因为其他变量在模型中产生了噪音,并导致其准确性降低。

    让我们再次看一下功能重要性: (Let’s look at the Feature Importances again:)

    This time, it is clearer to tell which variables were more important. You may refer to the questionnaire found on WVS for more detailed information. I will give a summary of the topics that the questions covered.

    这次,更清楚地指出哪些变量更重要。 您可以参考WVS上的调查表以获取更多详细信息。 我将总结这些问题涉及的主题。

    Image for post

    评估模型: (Evaluating the model:)

    Let’s look at the graph of actual vs predicted values for the first 200 test values. For greater visibility of the whole test set, let’s also do a simple count for the difference in values of predicted and actual (predicted minus actual).

    让我们看一下前200个测试值的实际值与预测值的关系图。 为了更好地了解整个测试集,我们还对预期值和实际值(预期值减去实际值)之间的差进行简单计数。

    Image for post
    Image for post

    The model appears to be slightly more negative than positive in predicting the happiness levels, but would still be considered otherwise balanced!

    在预测幸福水平时,该模型似乎比肯定模型更具负面性,但在其他方面仍然可以认为是平衡的!

    见解: (Insights:)

    What I have done is to examine the key questions out of >290 in the WVS that is more relevant to happiness levels. This would mean that we can try to focus specifically on these aspects when examining happiness.

    我要做的是研究WVS中超过290个与幸福感水平更相关的关键问题。 这意味着我们在检查幸福时可以尝试着重于这些方面。

    Looking at the questionnaire, we would also notice that Q261 and Q262 are the same thing (age and year born), so we could remove 1 of them to include another feature. For Q266,267,268 (country of birth of the respondent and parents) they appear to be repeats, but are not exactly the same thing since immigration/cross-cultural marriage may occur. Nonetheless, we could consider removing 2 of them since the occurrence is minimal.

    通过问卷调查,我们还会注意到Q261和Q262是相同的东西(年龄和出生年份),因此我们可以删除其中的一个以包括另一个功能。 对于Q266,267,268(受访者和父母的出生国家),它们似乎是重复的,但由于可能发生移民/跨文化婚姻,因此并非完全相同。 尽管如此,由于发生的可能性很小,我们可以考虑删除其中的2个。

    常规主题是: (The general topics are:)

    Individual level:Life satisfaction, health, finances, freedom, age, safety, religion, marriage, and family.National level:country, perception of corruption, democracy/political influence, national pride

    个人层面:生活满意度,健康,财务,自由,年龄,安全,宗教,婚姻和家庭。 国家层面:国家,对腐败的看法,民主/政治影响,民族自豪感

    In particular, health, finances and age were the top features that were deemed as important by the machine. In this sense, the individual level factors has a greater influence on one’s happiness level compared to the national level factors.

    特别是,健康,财务和年龄是机器认为重要的重要功能。 从这个意义上说,个人水平因素比国家水平因素对一个人的幸福水平影响更大。

    However, I noticed that the WVS did not have data on sleep hours, which was a key element that was observed in my earlier post. Nonetheless, it is still very much useful as we can consider those aspects for further analysis! I’ll be back with more insights into the correlation between those aspects and happiness, to determine how we can improve our happiness levels. Until then, remember to stay happy!

    但是,我注意到WVS没有睡眠时间的数据,这是我早先文章中观察到的关键因素。 但是,它仍然非常有用,因为我们可以考虑对这些方面进行进一步分析! 我将在这些方面与幸福之间的相关性方面提供更多见解,以确定我们如何提高幸福水平。 在此之前,请记住保持快乐!

    翻译自: https://towardsdatascience.com/predicting-happiness-using-random-forest-1e6477affc24

    随机森林随机回归预测

    展开全文
  • 之前对比分析的主要是数据和特征层面,还有另一部分非常重要的工作等着大家去做,就是模型调参问题,在实验的最后,看一下对于树模型来说,应当如何进行参数调节。 调参是机器学习必经的一步,很多方法和经验并不是...

    之前对比分析的主要是数据和特征层面,还有另一部分非常重要的工作等着大家去做,就是模型调参问题,在实验的最后,看一下对于树模型来说,应当如何进行参数调节。

    调参是机器学习必经的一步,很多方法和经验并不是某一个算法特有的,基本常规任务都可以用于参考。

    先来看看那些参数可供选择

    from sklearn.ensemble import RandomForestRegressor
    
    rf = RandomForestRegressor(random_state = 42)
    
    from pprint import pprint
    
    # 打印所有参数
    pprint(rf.get_params())
    

    关于参数的解释,在决策树算法中已经作了介绍,当使用工具包完成任务的时候,最好先查看其API文档,每一个参数的意义和其输入数值类型一目了然

    在这里插入图片描述

    随机参数选择

    调参路漫漫,参数的可能组合结果实在太多,假设有5个参数待定,每个参数都有10种候选值,那么一共有多少种可能呢(可不是5×10这么简单)?这个数字很大吧,实际业务中,由于数据量较大,模型相对复杂,所花费的时间并不少,几小时能完成一次建模就不错了。那么如何选择参数才是更合适的呢?如果依次遍历所有可能情况,那恐怕要到地老天荒了。

    首先登场的是RandomizedSearchCV(见图9-14),这个函数可以帮助大家在参数空间中,不断地随机选择一组合适的参数来建模,并且求其交叉验证后的评估结果。

    在这里插入图片描述
    为什么要随机选择呢?按顺序一个个来应该更靠谱,但是实在耗不起遍历寻找的时间,随机就变成一种策略。相当于对所有可能的参数随机进行测试,差不多能找到大致可行的位置,虽然感觉有点不靠谱,但也是无奈之举。该函数所需的所有参数解释都在API文档中有详细说明,准备好模型、数据和参数空间后,直接调用即可。

    from sklearn.model_selection import RandomizedSearchCV
    
    # 建立树的个数
    n_estimators = [int(x) for x in np.linspace(start = 200, stop = 2000, num = 10)]
    # 最大特征的选择方式
    max_features = ['auto', 'sqrt']
    # 树的最大深度
    max_depth = [int(x) for x in np.linspace(10, 20, num = 2)]
    max_depth.append(None)
    # 节点最小分裂所需样本个数
    min_samples_split = [2, 5, 10]
    # 叶子节点最小样本数,任何分裂不能让其子节点样本数少于此值
    min_samples_leaf = [1, 2, 4]
    # 样本采样方法
    bootstrap = [True, False]
    
    # Random grid
    random_grid = {'n_estimators': n_estimators,
                   'max_features': max_features,
                   'max_depth': max_depth,
                   'min_samples_split': min_samples_split,
                   'min_samples_leaf': min_samples_leaf,
                   'bootstrap': bootstrap}
    

    在这个任务中,我们只给大家举例来进行说明,考虑到时间问题,所选的参数的候选值并没有给出太多。这里值得注意的是每一个候选参数的参数空间需要我们好好把控,因为如果这个取值范围给定的不恰当,最好的结果肯定也不会太好,这里可以参考一些经验值或者不断通过实验结果来改变参数空间,这是一个反复的过程,并不是说我们机器学习建模任务就是从前往后的进行,有了实验结果之后,都需要再回过头来反复来对比不同参数,不同预处理方案的。

    调参也是一个反复
    的过程,并不是说机器学习建模任务就是从前往后进行,实验结果确定之后,需要再回过头来反复对比不同的参数、不同的预处理方案。

    # 随机选择最合适的参数组合
    rf = RandomForestRegressor()
    
    rf_random = RandomizedSearchCV(estimator=rf, param_distributions=random_grid,
                                  n_iter = 100, scoring='neg_mean_absolute_error', 
                                  cv = 3, verbose=2, random_state=42, n_jobs=-1)
    
    # 执行寻找操作
    rf_random.fit(train_features, train_labels)
    

    这里给大家解释一下RandomizedSearchCV中常用的参数,其实在API文档中都给出了说明,还是建议大家养成这个查阅文档的习惯。

    • Estimator:RandomizedSearchCV这个方法是一个通用的,并不是专为随机森林设计的,所以我们需要指定选择的算法模型是什么。
    • Distributions:参数的候选空间,我们之间已经用字典格式给出了所需的参数分布。
    • n_iter:随机寻找参数组合的个数,比如在这里我们赋值了100代表接下来要随机找100组参数的组合,在其中找到最好的一个。
    • Scoring:评估方法,按照该方法去找到最好的参数组合
    • Cv:交叉验证,咱们之前已经唠过了。
    • Verbose:打印信息的数量,看自己的需求了。
    • random_state:随机种子,为了使得咱们的结果能够一致,排除掉随机成分的干扰,一般我们都会指定成一个值,用你自己的幸运数字就好。
    • n_jobs:多线程来跑这个程序,如果是-1就会用所有的,但是可能会有点卡。即便我把n_jobs设置成了-1,程序运行的还是很慢,因为我们建立100次模型来选择参数,并且还是带有3折交叉验证的,那就相当于300个任务.

    RandomizedSearch 结果中显示了任务执行过程中时间和当前的次数,如果数据较大,需要等待一段时间,只需简单了解中间的结果即可,最后直接调用rf random.best_params_,就可以得到在这100次随机选择中效果最好的那一组参数∶

    rf_random.best_params_
    

    100次随机选择后,还可以得到其他实验结果,在其API文档中给出了说明,这里就不——演示了,接下来,对比经过随机调参后的结果和用默认参数结果的差异,所有默认参数在 API中都有说明,例如n_estimators∶ integer,optional(default=10),表示在随机森林模型中,默认要建立树的个数是10。

    一般情况下,参数都会有默认值,并不是没有给出参数就不需要它,而是代码中使用其默认值。

    既然要进行对比分析,还是先给出评估标准,这与之前的实验一致∶

    def evaluate(model, test_features, test_labels):
        predictions = model.predict(test_features)
        errors = abs(predictions - test_labels)
        mape = 100 * np.mean(errors / test_labels)
        accuracy = 100 - mape
    
        print('平均气温误差.',np.mean(errors))
        print('Accuracy = {:0.2f}%.'.format(accuracy))
    
    # 老模型
    base_model = RandomForestRegressor( random_state = 42)
    base_model.fit(train_features, train_labels)
    evaluate(base_model, test_features, test_labels)
    
    
    平均气温误差. 3.829032846715329
    Accuracy = 93.56%.
    
    best_random = rf_random.best_estimator_
    evaluate(best_random, test_features, test_labels)
    
    
    平均气温误差. 3.714395841
    Accuracy = 93.56%.
    

    从上述对比实验中可以看到模型的效果提升了一些,原来误差为 3.92,调参后的误差下降到3.71。但是这是上限吗?还有没有进步空间呢?之前讲解的时候,也曾说到随机参数选择是找到一个大致的方向,但肯定还没有做到完美,就像是警察抓捕犯罪嫌疑人,首先得到其大概位置,然后就要进行地毯式搜索。

    展开全文
  • 随机森林matlab代码

    2018-04-10 14:39:08
    随机森林matlab代码,决策树类型算法的常用算法之一。
  • 我们如何使用random forest来预测模型?我想训练一个模型,最后使用three column dataset的random forest model in Python来预测一个真值(单击链接下载完整的CSV-数据集,格式如下所示t_stamp,X,Y0.000543,0,100....
  • 针对传统煤自燃温度预测模型预测精度较差、基于支持向量机(SVM)的预测模型对参数的选取要求较高和基于神经网络的预测模型测试时易出现过拟合的问题,提出了一种基于随机森林算法的煤自燃温度预测模型。利用煤自燃...
  • 答:随机森林中每棵决策树的权重都是一样的,如果这个袋子中有 10 棵决策树(或者其他模型),那每棵树给出的预测结果的权重便是 1/10,这是随机森林的特性。如果权重不一样的话,便是后续推文会提及的Adaboost等集成...
  • 本文中将针对树模型的参数进行优化 数据预处理 前面已经做过好几次数据预处理了,这里直接上代码 得到数据 # 导入工具包 import pandas as pd import numpy as np from sklearn.model_selection import train_test_...
  • 随机森林模型详解

    万次阅读 多人点赞 2019-03-17 21:43:57
    决策树+bagging=随机森林随机森林是一种比较新的机器学习模型(非线性基于树的模型)集成学习方法。上世纪八十年代Breiman等人发明分类树算法,通过反复二分数据进行分类或回归,计算量大大降低,2001年Breiman把...
  • 随机森林模型预测和交叉验证

    千次阅读 2019-11-28 02:37:30
    使用随机森林模型来训练和交叉验证数据集。 数据矩阵:allmatrix 标签:target randomforest training preliminary trainning >>> from sklearn.ensemble import RandomForestClassifier >>> ...
  • 随机森林 在自助聚合的基础上, 每次构建决策树模型时, 不仅随机选择部分样本, 而且还随机选择部分特征(树的高度不同), 这样的集合算法, 不仅规避了强势样本对预测结果的影响, 而且也削弱了强势特征的影响, 是模型...
  • os.chdir(r'C:\Users\A3\Desktop\2:项目\项目\项目19:基于随机森林算法的房屋价格预测模型\房屋价格预测') data_train = pd.read_csv('train.csv') data_test = pd.read_csv('test.csv') print(data_train.head())...
  • 随机森林可以实现很多的分类问题,我这里面使用的是Iris的数据集,来判断Iris的类别。
  • 随机森林既可以进行分类也可以进行回归预测,这里通过随机森林(RFC)模型对汽油辛烷值RON进行特征提取与模型优化。 一、导入相关的数据库 import matplotlib.pyplot as plt from sklearn.ensemble import ...
  • 人工智能选股之随机森林模型主要讲解如何应用随机森林模型与股票交易市场;
  • 机器学习 - 随机森林算法模型

    千次阅读 2019-01-22 14:02:43
    随机森林是一种比较新的机器学习模型。经典的机器学习模型是神经网络,有半个多世纪的历史了。神经网络预测精确,但是计算量很大。上世纪八十年代Breiman等人发明分类树的算法(Breiman et al. 1984),通过反复二分...
  • 该数据集用于决策树随机森林天气预测数据集,利用前一天和历史最高平均气温,实现气温预测随机森林模型
  • 预测股票市场价格 预测股票价格-线性回归vs随机森林对于这个项目,我使用了包含指数价格的csv文件。 文件中的每一行都包含1950年至2015年间S&P500... 我将使用该数据集来开发利用线性回归和随机森林算法的预测模型
  • # 预测 baseline_predictions = rf.predict(original_test_features) # 结果 baseline_errors = abs(baseline_predictions - test_labels) print('平均温度误差:', round(np.mean(baseline_errors), 2), 'degrees.'...
  • 将python随机森林模型保存到文件

    千次阅读 2020-10-09 08:40:48
    你说的问bai题叫模型持久化,就是把学习好的模型保du存起来zhi,以后只要调用这个文件就可以了。 每个框dao架都应该有模型持久化函数,以sklearn为例: from sklearn.externals import joblib joblib.dump(clf, ...

空空如也

空空如也

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

随机森林预测模型