如何使用随机森林训练和预测模型?

Posted

技术标签:

【中文标题】如何使用随机森林训练和预测模型?【英文标题】:How to train and predict a model using Random Forest? 【发布时间】:2017-12-15 07:45:10 【问题描述】:

我们如何使用random forest 预测模型?我想训练一个模型,最后使用three column dataset 的random forest model in Python 预测一个真值(点击链接下载完整的CSV-dataset,格式如下

t_stamp,X,Y
0.000543,0,10
0.000575,0,10
0.041324,1,10
0.041331,2,10
0.041336,3,10
0.04134,4,10
0.041345,5,10
0.04135,6,10
0.041354,7,10

我想使用X 使用random forest model 使用X 的最后一个(例如:5、10、100、300、1000 等)数据点来预测Y 的当前值(真实值) sklearn 中的 Python。意思是将X 列的[0,0,1,2,3] 作为第一个窗口的输入——我想预测Y 的第5 行值,该值是在Y 的先前值上训练的。类似地,使用简单的rolling OLS regression model,我们可以按照以下方式进行操作,但我想使用random forest model 进行操作。

import pandas as pd

df = pd.read_csv('data_pred.csv')
model = pd.stats.ols.MovingOLS(y=df.Y, x=df[['X']], 
                               window_type='rolling', window=5, intercept=True)

我用random forest 解决了这个问题,得到df

t_stamp     X    Y     X_t1    X_t2     X_t3    X_t4    X_t5
0.000543    0   10      NaN     NaN     NaN     NaN     NaN
0.000575    0   10      0.0     NaN     NaN     NaN     NaN
0.041324    1   10      0.0     0.0     NaN     NaN     NaN
0.041331    2   10      1.0     0.0     0.0     NaN     NaN
0.041336    3   10      2.0     1.0     0.0     0.0     NaN
0.041340    4   10      3.0     2.0     1.0     0.0     0.0
0.041345    5   10      4.0     3.0     2.0     1.0     0.0
0.041350    6   10      5.0     4.0     3.0     2.0     1.0
0.041354    7   10      6.0     5.0     4.0     3.0     2.0
 .........................................................   
[ 10.  10.  10.  10. .................................]
MSE: 1.3273548431

这似乎适用于范围 5、10、15、20、22。但是,它似乎不适用于大于 23 的范围(它打印 MSE: 0.0),这是因为,你可以从dataset 看到,Y 的值从第 1 行到第 23 行是固定的(10),然后从第 24 行更改为另一个值(20,依此类推)。我们如何训练和预测这种情况的模型基于最后的数据点?

【问题讨论】:

对于大于 10 的范围,我得到的值较低。但它不是 0。MSE 应该降低,它是预测误差的一种度量。那么有什么问题呢? 我认为我们得到一个小的MSE 的原因可能是因为模型正在记住Y 的单个值(当Y 的值保持不变时(具有常数值) - 例如从第 1 行到第 23 行)。 【参考方案1】:

似乎使用现有代码,在调用dropna 时,您会截断X 而不是y。您还可以对相同的数据进行训练和测试。

修复此问题将提供非零 MSE。

代码:

import pandas as pd
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split

df = pd.read_csv('/Users/shivadeviah/Desktop/estimated_pred.csv')

df1 = pd.DataFrame( 'X_%d'%i : df['X'].shift(i) for i in range(25))
df1['Y'] = df['Y']
df1 = df1.sample(frac=1).reset_index(drop=True)
df1.dropna(inplace=True)

X = df1.iloc[:, :-1].values
y = df1.iloc[:, -1].values

x = int(len(X) * 0.66)

X_train = X[:x]
X_test = X[x:]
y_train = y[:x]
y_test = y[x:]

reg = RandomForestRegressor(criterion='mse')
reg.fit(X_train, y_train)

modelPred = reg.predict(X_test)

print(modelPred)
print("Number of predictions:",len(modelPred))

meanSquaredError = mean_squared_error(y_test, modelPred)

print("MSE:", meanSquaredError)
print(df1.size)
df2 = df1.iloc[x:, :].copy()


df2['pred'] = modelPred

df2.head()

输出:

[ 267.7     258.26608241  265.07037249 ...,  267.27370169  256.7     272.2 ]
Number of predictions: 87891
MSE: 1954.9271256
6721026

        X_0       pred
170625  48  267.700000
170626  66  258.266082
170627  184 265.070372
170628  259 294.700000
170629  271 281.966667

【讨论】:

@Mahsolid 好吧,那是因为您正在使用相同的数据进行训练和测试! @Mahsolid 暂时忘记 OLS。让我们看看这个。我对我的代码进行了一些更改。看来MSE现在已经飙升。还并排显示了预测。 @Mahsolid 我没有 Anaconda,也不想安装它。我希望这足以让你自己开始。祝你好运,对不起,我不能提供更多帮助。 :) @Mahsolid 再次感谢我的朋友。我现在距离 10k 只差 40 岁! @Mahsolid 我很乐意回答,只要我不必安装 conda。干杯!

以上是关于如何使用随机森林训练和预测模型?的主要内容,如果未能解决你的问题,请参考以下文章

如何将经过训练和测试的随机森林模型应用于 tidymodels 中的新数据集?

基于随机森林算法完成鸢尾花卉品种预测任务 代码+数据

十大经典预测算法七---随机森林

如何在 Sklearn 的随机森林分类器中将训练模型用于另一个数据集?

基于随机森林算法进行硬盘故障预测

使用随机森林模型提高预测新数据的速度