精华内容
下载资源
问答
  • matlab软件随机森林回归模型代码,可直接matlab打开运行!精简版,包括数据导入、模型建立、误差计算、保存模型,绘制对比图的多个功能!
  • 主要通过sklearn中来实现随机森林回归模型对波士顿房价进行回归预测
  • 引入RFR(random forest regression,随机森林回归)算法,分析气象条件、大气污染物浓度和季节所包含的22项特征因素,通过调整参数的最优组合,设计出一种新的PM2.5浓度预测模型——RFRP模型。同时,收集了西安市...
  • RF_regressor 使用sklearn随机森林回归器的预测模型
  • R语言 随机森林回归

    2017-08-30 19:13:07
    主要利用R语言进行随机森林回归,还有其他两种回归, library(lattice) library(grid) library(DMwR) library(rpart) library(ipred) library(randomForest) #回归树,装袋算法,随机森林三大回归 #前二种算法可以...
  • 随机森林回归模型 万事俱备,我们可以来建立随机森林模型啦,首先导入工具包,先建立1000个树试试吧,其他参数先用默认值,之后我们会再深入到调参任务中: # 导入算法 from sklearn.ensemble import ...

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

    随机森林回归模型

    万事俱备,我们可以来建立随机森林模型啦,首先导入工具包,先建立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. 加入新的特征会改进模型效果吗?此时的时间效率又会怎样?
    展开全文
  • 随机森林随机回归预测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

    随机森林随机回归预测

    展开全文
  • 随机森林回归matlab代码,可用于回归和分类,简单易用
  • 模型也是基于电商的一些历史数据进行销量的建模、预测。 2.获取数据 本数据是模拟数据,分为两部分数据: 训练数据集:data_train.xlsx 测试数据集:data_test.xlsx 在实际应用中,根据自己的数据进行替换...

    说明:这是一个机器学习实战项目(附带数据+代码),如需数据+完整代码可以直接到文章最后获取。

     

     1.定义问题

    在电子商务领域,现在越来越多的基于历史采购数据、订单数据等,进行销量的预测;本模型也是基于电商的一些历史数据进行销量的建模、预测。

    2.获取数据

    本数据是模拟数据,分为两部分数据:

    训练数据集:data_train.xlsx

    测试数据集:data_test.xlsx

    在实际应用中,根据自己的数据进行替换即可。

    特征数据:x1、x2、x3、x4、x5、x6、x7、x8、x9、x10

    标签数据:y

    3.数据预处理 

    1)数据描述性分析:

    data_train.describe()

     2)数据完整性、数据类型查看:

    data_train.info()

     3)数据缺失值个数:

    4)缺失值数据比例:


     

     

    5)缺失值填充:这里通过业务上分析:填充0比较合适:

     

     

    6)哑变量处理

    data_train.loc[data_train['x10'] == '类别1', 'x10'] = 1
    data_train.loc[data_train['x10'] == '类别2', 'x10'] = 2
    a = pd.get_dummies(data_train['x10'], prefix="x10")
    frames = [data_train, a]
    data_train = pd.concat(frames, axis=1)

    特征变量中x10的数值为文本类型:类型1、类型2,不符合机器学习数据要求,需要进行哑特征处理,变为0 1数值。

    处理后,数据如下:

     4.探索性数据分析

    1)目标数据销量分析:

    print(data_train['y'].describe())

     

     

     2)特征变量x1和标签变量y关系的散点图:

    var = 'x1'
    data = pd.concat([data_train['y'], data_train[var]], axis=1)
    data.plot.scatter(x=var, y='y')

     3)特征变量x5和标签变量y关系的散点图:

    var0 = 'x5'
    data0 = pd.concat([data_train['y'], data_train[var0]], axis=1)
    data0.plot.scatter(x=var0, y='y')

     

    4)相关性分析

     

     5.特征工程 

    1)特征数据和标签数据拆分,y为标签数据,除y之外的为特征数据;

    2)训练集拆分,分为训练集和验证集,80%训练集和20%验证集;

    特征工程还有很多其他内容,例如数据标准化、降维等等,这个根据实际情况来,本次建模不需要。

    6.机器建模 

    1)建立随机森林回归模型,模型参数如下:

    编号

    参数

    1

    n_estimators=100

    2

    random_state=1

    3

    n_jobs=-1

    其它参数根据具体数据,具体设置。

    forest = RandomForestRegressor(
        n_estimators=100,
        random_state=1,
        n_jobs=-1)
    forest.fit(X_train, Y_train)

    2)验证集结果输出与比对:一方面是生成excel表格数据;一方面是生成折线图。

    plt.figure()
    plt.plot(np.arange(1000), Y_validation[:1000], "go-", label="True value")
    plt.plot(np.arange(1000), y_validation_pred[:1000], "ro-", label="Predict value")
    plt.title("True value And Predict value")
    plt.legend()

    3)生成决策树

    with open('./wine.dot','w',encoding='utf-8') as f:
        f=export_graphviz(pipe.named_steps['regressor'].estimators_[0], out_file=f)

    由于树比较多 一下子全部转为图片 导致图片看不清晰,所以生成的格式为.dot格式,大家可以根据具体需要把dot转为图片。

    不分展示:总共200多页。

    7.模型评估

    1)评估指标主要采用准确率分值、MAE、MSE、RMSE

    score = forest.score(X_validation, Y_validation)
    print('随机森林模型得分: ', score)
    print('Mean Absolute Error:', metrics.mean_absolute_error(Y_validation, y_validation_pred))
    print('Mean Squared Error:', metrics.mean_squared_error(Y_validation, y_validation_pred))
    print('Root Mean Squared Error:', np.sqrt(metrics.mean_squared_error(Y_validation, y_validation_pred)))

    编号

    评估指标名称

    评估指标值

    1

    准确率分值

    0.9769

    2

    MAE

    9.9431

    3

    MSE

    2625.5679

    4

    RMSE

    51.2402

    通过上述表格可以看出,此随机森林模型效果良好。

    2)模型特征重要性:一方面是输出到excel;一方面是生成柱状图。

    col = list(X_train.columns.values)
    importances = forest.feature_importances_
    x_columns = ['x1', 'x2', 'x3', 'x4', 'x5', 'x6', 'x7', 'x8', 'x9', 'x10_类别1', 'x10_类别2']
    # print("重要性:", importances)
    # 返回数组从大到小的索引值
    indices = np.argsort(importances)[::-1]
    list01 = []
    list02 = []
    for f in range(X_train.shape[1]):
        # 对于最后需要逆序排序,我认为是做了类似决策树回溯的取值,从叶子收敛
        # 到根,根部重要程度高于叶子。
        print("%2d) %-*s %f" % (f + 1, 30, col[indices[f]], importances[indices[f]]))
        list01.append(col[indices[f]])
        list02.append(importances[indices[f]])
    
    from pandas.core.frame import DataFrame
    
    c = {"columns": list01, "importances": list02}
    data_impts = DataFrame(c)
    data_impts.to_excel('data_importances.xlsx')
    
    importances = list(forest.feature_importances_)
    feature_list = list(X_train.columns)
    
    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)
    
    import matplotlib.pyplot as plt
    
    x_values = list(range(len(importances)))
    print(x_values)
    plt.bar(x_values, importances, orientation='vertical')
    plt.xticks(x_values, feature_list, rotation=6)
    plt.ylabel('Importance')
    plt.xlabel('Variable')
    plt.title('Variable Importances')

    8.实际应用

    根据最近一周的特征数据,来预测销量(这里的数据,是提前准备好的没有标签的数据)。预测结果如下;

     

    可以根据预测的销量进行备货。

    本次机器学习项目实战所需的资料,项目资源如下:https://download.csdn.net/download/weixin_42163563/21093418

    展开全文
  • 回归和分类随机森林

    2018-02-17 20:16:02
    matlab 实现的随机森林,核心代码用C语言实现,是微软大牛的手笔,里面有分类也有回归,学术或者实用都很好
  • GDP_and_Employment_Rates_Prediction:一种机器学习回归模型,使用Python中的随机森林回归预测国家的GDP和就业率
  • 用Python实现随机森林回归

    万次阅读 多人点赞 2020-11-02 13:19:38
    这里就对如何进行随机森林回归在算法上进行概述,在参数上进行详述。希望对你的工作有所帮助。 这里,将介绍如何在Python中构建和使用Random Forest回归,而不是仅仅显示代码,同时将尝试了解模型的工作原理。 1.1 ...

    1 介绍

    使用Scikit-Learn模块在Python实现任何机器学习算法都比较简单,并且不需要了解所有细节。这里就对如何进行随机森林回归在算法上进行概述,在参数上进行详述。希望对你的工作有所帮助。
    这里,将介绍如何在Python中构建和使用Random Forest回归,而不是仅仅显示代码,同时将尝试了解模型的工作原理。

    1.1 随机森林概述

    随机森林是一种基于集成学习的监督式机器学习算法。集成学习是一种学习类型,可以多次加入不同类型的算法或相同算法,以形成更强大的预测模型。随机森林结合了多个相同类型的算法,即多个决策的树木,故名“随机森林”。

    1.2 理解决策树

    决策树是随机森林的构建块,它本身就是个直观的模型。我们可以将决策树视为询问有关我们数据问题的流程图。这是一个可解释的模型,因为它决定了我们在现实生活中的做法:在最终得出决定之前,我们会询问有关数据的一系列问题。

    随机森林是由许多决策树组成的整体模型。通过对每个决策树的预测平均来进行预测。就像森林是树木的集合一样,随机森林模型也是决策树模型的集合。这使随机森林成为一种强大的建模技术,它比单个决策树要强大得多。
    随机森林中的每棵树都在对数据子集进行训练。其背后的基本思想是在确定最终输出时组合多个决策树,而不是依赖于各个决策树。每个决策树都有很高的方差,但是当我们将所有决策树并行组合在一起时,由于每个决策树都针对特定样本数据进行了完美的训练,因此结果方差很低,因此输出不依赖于一个决策树而是多个决策树木。对于回归问题,最终输出是所有决策树输出的平均值。

    1.3 随机森林工作过程概述

    1. 从数据集中随机选择N个样本子集。
    2. 基于这N个样本子集构建决策树。
    3. 选择算法中所需树的棵数,然后重复步骤1和2。

    对于回归问题,森林中的每棵树都将预测Y值(输出)。通过取森林中所有决策树预测值的平均值来计算最终值。

    1.4 Bootstrapping&Bagging

    Bootstrapping

    Bootstrapping算法,指的就是利用有限的样本资料经由多次重复抽样。如:在原样本中有放回的抽样,抽取n次。每抽一次形成一个新的样本,重复操作,形成很多新样本。
    随机森林就是采用在每个随机样本上训练决策树。尽管每棵树相对于一组特定的训练数据可能有很大的差异,但总体而言,整个森林的方差都很小。

    Bagging

    随机森林在不同的随机选择的样本子集上训练每个决策树,然后对预测取平均以进行整体预测。这个过程被称为Bagging。

    2 随机森林优缺点

    2.1 随机森林回归的优点

    在机器学习领域,随机森林回归算法比其他常见且流行的算法更适合回归问题。

    1. 要素和标签之间存在非线性或复杂关系。
    2. 它对训练集中噪声不敏感,更利于得到一个稳健的模型。随机森林算法比单个决策树更稳健,因为它使用一组不相关的决策树。
    3. 避免产生过拟合的模型。

    2.2 随机森林的缺点

    1. 随机森林的主要缺点在于其复杂性。由于需要将大量决策树连接在一起,因此它们需要更多的计算资源。
    2. 由于其复杂性,与其他同类算法相比,它们需要更多的时间进行训练。

    2.3 随机森林的过拟合问题

    欠拟合、合适与过拟合,如下图所示。当出现过拟合情况时候,对于训练数据模型表现良好,测试数据模型表现肯定较差。机器学习是比较容易出现过拟合的。对于随机森林的过拟合问题分为两派,会产生过拟合与不会过拟合。

    在这里插入图片描述
    不会过拟合:
    在Leo Breiman(随机森林算法的创建者)论文《Random Forests》中的表述:
    在这里插入图片描述
    在这里插入图片描述
    会过拟合:
    问题描述,一部分数据(数据的90%)作为训练样本,一部分(10%)作为测试样本,发现训练样本的R2一直在0.85,而测试样本R2都只有0.5几,高的也就0.6几。
    对于这个问题,也很有可能是自变量与因变量之间本身关系就很低产生了过拟合假象。

    3 使用随机森林回归实践

    在本节中,我们将研究如何使用Scikit-Learn将随机森林用于解决回归问题。

    3.1 问题描述

    根据汽油税(美分),人均收入(美元),高速公路(以英里为单位)和人口所占比例来预测美国48个州的汽油消耗量(百万加仑)。
    为了解决这个回归问题,采用Scikit-Learn 中的随机森林算法。

    3.2 样本数据

    例子数据集可在以下位置获得(需要KeXueShangWang才可以打开):
    https://drive.google.com/file/d/1mVmGNx6cbfvRHC_DvF12ZL3wGLSHD9f_/view
    在这里插入图片描述

    3.3 代码

    相关的解释说明都在代码中进行了注释

    import pandas as pd
    import numpy as np
    
    # 导入数据,路径中要么用\\或/或者在路径前加r
    dataset = pd.read_csv(r'D:\Documents\test_py\petrol_consumption.csv')
    
    # 输出数据预览
    print(dataset.head())
    
    # 准备训练数据
    # 自变量:汽油税、人均收入、高速公路、人口所占比例
    # 因变量:汽油消耗量
    X = dataset.iloc[:, 0:4].values
    y = dataset.iloc[:, 4].values
    
    # 将数据分为训练集和测试集
    from sklearn.model_selection import train_test_split
    
    X_train, X_test, y_train, y_test = train_test_split(X,
                                                        y,
                                                        test_size=0.2,
                                                        random_state=0)
    
    # 特征缩放,通常没必要
    # 因为数据单位,自变量数值范围差距巨大,不缩放也没问题
    from sklearn.preprocessing import StandardScaler
    
    sc = StandardScaler()
    X_train = sc.fit_transform(X_train)
    X_test = sc.transform(X_test)
    
    # 训练随机森林解决回归问题
    from sklearn.ensemble import RandomForestRegressor
    
    regressor = RandomForestRegressor(n_estimators=200, random_state=0)
    regressor.fit(X_train, y_train)
    y_pred = regressor.predict(X_test)
    
    # 评估回归性能
    from sklearn import metrics
    
    print('Mean Absolute Error:', metrics.mean_absolute_error(y_test, y_pred))
    print('Mean Squared Error:', metrics.mean_squared_error(y_test, y_pred))
    print('Root Mean Squared Error:',
          np.sqrt(metrics.mean_squared_error(y_test, y_pred)))
    
    

    输出结果

      Petrol_tax  Average_income  Paved_Highways  Population_Driver_licence(%)  Petrol_Consumption
    0         9.0            3571            1976                         0.525                 541
    1         9.0            4092            1250                         0.572                 524
    2         9.0            3865            1586                         0.580                 561
    3         7.5            4870            2351                         0.529                 414
    4         8.0            4399             431                         0.544                 410
    Mean Absolute Error: 48.33899999999999
    Mean Squared Error: 3494.2330150000003
    Root Mean Squared Error: 59.112037818028234
    

    4 Sklearn随机森林回归参数详解

    要了解sklearn.ensemble.RandomForestRegressor每个参数的意义,我们需要从函数定义入手,具体介绍还得看官网介绍:

    sklearn.ensemble.RandomForestRegressor(
    n_estimators=100, *, 				# 树的棵树,默认是100
    criterion='mse', 					# 默认“ mse”,衡量质量的功能,可选择“mae”。
    max_depth=None, 					# 树的最大深度。
    min_samples_split=2, 				# 拆分内部节点所需的最少样本数:
    min_samples_leaf=1, 				# 在叶节点处需要的最小样本数。
    min_weight_fraction_leaf=0.0, 		# 在所有叶节点处的权重总和中的最小加权分数。
    max_features='auto', 				# 寻找最佳分割时要考虑的特征数量。
    max_leaf_nodes=None, 				# 以最佳优先方式生长具有max_leaf_nodes的树。
    min_impurity_decrease=0.0, 			# 如果节点分裂会导致杂质的减少大于或等于该值,则该节点将被分裂。
    min_impurity_split=None, 			# 提前停止树木生长的阈值。
    bootstrap=True, 					# 建立树木时是否使用bootstrap抽样。 如果为False,则将整个数据集用于构建每棵决策树。
    oob_score=False, 					# 是否使用out-of-bag样本估算未过滤的数据的R2。
    n_jobs=None, 						# 并行运行的Job数目。
    random_state=None, 					# 控制构建树时样本的随机抽样
    verbose=0, 							# 在拟合和预测时控制详细程度。
    warm_start=False, 					# 设置为True时,重复使用上一个解决方案,否则,只需拟合一个全新的森林。
    ccp_alpha=0.0,
    max_samples=None)					# 如果bootstrap为True,则从X抽取以训练每个决策树。
    

    5 随机森林可视化

    5.1 代码

    import sklearn.datasets as datasets
    import pandas as pd
    from sklearn.model_selection import train_test_split
    from sklearn.preprocessing import StandardScaler
    from sklearn.pipeline import Pipeline
    from sklearn.ensemble import RandomForestRegressor
    from sklearn.decomposition import PCA
    
    # 导入数据,路径中要么用\\或/或者在路径前加r
    dataset = pd.read_csv(r'D:\Documents\test_py\petrol_consumption.csv')
    
    # 输出数据预览
    print(dataset.head())
    
    # 准备训练数据
    # 自变量:汽油税、人均收入、高速公路、人口所占比例
    # 因变量:汽油消耗量
    X = dataset.iloc[:, 0:4].values
    y = dataset.iloc[:, 4].values
    
    # 将数据分为训练集和测试集
    X_train, X_test, y_train, y_test = train_test_split(X,
                                                        y,
                                                        test_size=0.2,
                                                        random_state=0)
    regr = RandomForestRegressor()
    # regr = RandomForestRegressor(random_state=100,
    #                              bootstrap=True,
    #                              max_depth=2,
    #                              max_features=2,
    #                              min_samples_leaf=3,
    #                              min_samples_split=5,
    #                              n_estimators=3)
    pipe = Pipeline([('scaler', StandardScaler()), ('reduce_dim', PCA()),
                     ('regressor', regr)])
    pipe.fit(X_train, y_train)
    ypipe = pipe.predict(X_test)
    
    from six import StringIO
    from IPython.display import Image
    from sklearn.tree import export_graphviz
    import pydotplus
    import os
    
    # 执行一次
    # os.environ['PATH'] = os.environ['PATH']+';'+r"D:\CLibrary\Graphviz2.44.1\bin\graphviz"
    dot_data = StringIO()
    export_graphviz(pipe.named_steps['regressor'].estimators_[0],
                    out_file=dot_data)
    graph = pydotplus.graph_from_dot_data(dot_data.getvalue())
    graph.write_png('tree.png')
    Image(graph.create_png())
    
    
    

    5.2 GraphViz’s executables not found报错解决方案

    参考博文
    在这里插入图片描述

    5.3 InvocationException: GraphViz’s executables not found 解决方案

    参考博文

    在这里插入图片描述

    5.4 随机森林可视化

    X[0], X[1], X[2], X[3], X[4]…分别为对应的自变量。 从结构化可以看到mse逐渐减小。这里一共是12层树,实际工作中可能远大于这里的例子。
    在这里插入图片描述

    5.5 变量重要性

    通过变量重要性评价,可以删除那些不重要的变量,并且性能不会受到影响。另外,如果我们使用不同的机器学习方法(例如支持向量机),则可以将随机森林特征重要性用作一种特征选择方法。

    为了量化整个随机森林中所有变量对模型的贡献,我们可以查看变量的相对重要性。 Skicit-learn中返回的重要性表示包含特定变量可以提高预测。 重要性的实际计算超出了本文的范围,这里仅对模型输出重要性数值进行使用。

    # Get numerical feature importances
    importances = list(regr.feature_importances_)
    # List of tuples with variable and importance
    print(importances)
    
    # Saving feature names for later use
    feature_list = list(dataset.columns)[0:4]
    
    feature_importances = [(feature, round(importance, 2)) for feature, importance in zip(feature_list, importances)]
    # Sort the feature importances by most important first
    feature_importances = sorted(feature_importances, key = lambda x: x[1], reverse = True)
    # Print out the feature and importances 
    # [print('Variable: {:20} Importance: {}'.format(*pair)) for pair in feature_importances];
    
    # Import matplotlib for plotting and use magic command for Jupyter Notebooks
    
    import matplotlib.pyplot as plt
    # Set the style
    # plt.style.use('fivethirtyeight')
    # list of x locations for plotting
    x_values = list(range(len(importances)))
    print(x_values)
    # Make a bar chart
    plt.bar(x_values, importances, orientation = 'vertical')
    # Tick labels for x axis
    plt.xticks(x_values, feature_list,rotation=6)
    # Axis labels and title
    plt.ylabel('Importance'); plt.xlabel('Variable'); plt.title('Variable Importances');
    plt.show()
    
    

    在这里插入图片描述

    参考
    https://stackabuse.com/random-forest-algorithm-with-python-and-scikit-learn/
    https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestRegressor.html
    https://towardsdatascience.com/random-forest-in-python-24d0893d51c0
    添加链接描述

    展开全文
  • 随机森林随机回归预测 数据集 (The Data Set) In order to demonstrate a random forest regression, a data set of e-commerce sales from popular online retailer, Wish, will be used. The data comes from ...
  • sklearn实现随机森林回归预测

    千次阅读 2020-05-14 15:55:10
    sklearn实现随机森林回归预测 import numpy as np import matplotlib.pyplot as plt from sklearn import ensemble def gen_data(x1, x2): # 生成数据 y = np.sin(x1) * 0.1 + np.cos(x2) * 0.4 + 0.1 * x1 ...
  • 本文中将针对树模型的参数进行优化 数据预处理 前面已经做过好几次数据预处理了,这里直接上代码 得到数据 # 导入工具包 import pandas as pd import numpy as np from sklearn.model_selection import train_test_...
  • MATLAB随机森林回归模型

    千次阅读 2016-03-06 17:36:00
    MATLAB随机森林回归模型: 调用matlab自带的TreeBagger.m T=textread('E:\datasets-orreview\discretized-regression\10bins\abalone10\matlab\test_abalone10.2'); X=textread('E:\datasets-orreview\...
  • R语言随机森林详细解析(基于randomforest包和varSelRF包)随机森林 基于R你即将从这里看到你不会看到 研究如何用R去实现随机森林也有三个月的时间了,从一开始的完全不理解,到现在的游刃有余,我似乎花了过多的...
  • 随机森林可以实现很多的分类问题,我这里面使用的是Iris的数据集,来判断Iris的类别。
  • R包randomForest的随机森林回归模型以及对重要变量的选择​mp.weixin.qq.comR包randomForest的随机森林回归模型以及对重要变量的选择关于随机森林(random forest),前文“随机森林分类以及对重要变量的选择”中已经...
  • 利用随机森林解决基本的回归预测问题
  • 预测股票市场价格 预测股票价格-线性回归vs随机森林对于这个项目,我使用了包含指数价格的csv文件。 文件中的每一行都包含1950年至2015年间S&P500... 我将使用该数据集来开发利用线性回归随机森林算法的预测模型
  • 本文我们讲讲R语言的决策树和随机森林回归分析。【R语言进行数据挖掘】决策树和随机森林1、使用包party建立决策树这一节学习使用包party里面的函数ctree()为数据集iris建立一个决策树。属性Sepal.Length(萼片长度)...
  • 随机森林回归简单示例

    千次阅读 2020-07-24 16:37:03
    # 5 模型评估 # 随机森林回归模型评估 print("随机森林回归的默认评估值为:", rfr.score(x_test, y_test)) print("随机森林回归的R_squared值为:", r2_score(y_test, rfr_y_predict)) print("随机森林回归的均方...
  • 使用随机森林(R语言)做回归

    千次阅读 2021-01-16 18:00:41
    是一种基于分类树( classification tree) 的算法,它可以用于分类和回归,本文在这里以广西地区1990-2014共25年的GDP数据作为因变量,以INV投资、CON消费、NEX净出口为三个自变量,运用R语言软件做随机森林回归,...
  • 本代码含随机森林的分类、回归代码,代码功能相当全面,性能良好,能够支撑项目开发和科研需要。---------
  • 对大量分类树的汇总提高了模型预测精度 是取代神经网络等传统机器学习方法的新的模型 随机森林的运 算速度很快 在处理大数据时表现优异 随机森林不需要顾虑一般回归分析面临的多元共线性的问题 不用做变 量选择 ...
  • Matlab实现随机森林回归的方式很多,Matlab最新版基于内置函数fitrensemble和TreeBagger可以实现预测目标。 方法应用 训练回归集成 创建一个回归集成,在给定气缸数、气缸排量、马力和重量的情况下预测汽车的燃油...
  • 机器学习:Python实现随机森林回归

    千次阅读 2020-12-22 20:49:53
    随机森林(Random forests)或随机决策森林(Random decision forests)是一种用于分类、回归和其他任务的集成学习方法,通过在训练时构建大量决策树并输出作为单个树的类(分类)或平均预测(回归)模式的类(class)来操作。...
  • 随机森林回归原理应用到了预测领域,构建了基于随机森林的预测模型,以及预测结果的评价,测试数据对算法进行验证,结果表明,将随机森林算法运用到预测领域可以为相关问题提供参考价值。 运行环境Matlab2018b; ...
  • 训练随机森林回归模型 RandomForestRegressor bootstrap 表示是够有放回抽样,还是不放回抽样 # 训练随机森林回归模型 RandomForestRegressor from sklearn.ensemble import RandomForestRegressor from sklearn ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 24,561
精华内容 9,824
关键字:

随机森林回归预测模型