scikit-learn:如何以百分比计算均方根误差(RMSE)?

4

我有一个数据集(在此链接中找到:https://drive.google.com/open?id=0B2Iv8dfU4fTUY2ltNGVkMG05V00),格式如下。

 time     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
  ...
9.987735  55 239
9.987739  56 239
9.987744  57 239
9.987749  58 239
9.987938  59 239

我的数据集中的第三列(Y)是我的真实值 -也就是我想要预测(估计)的值。我想要对Y进行预测(根据前100个滚动的X值预测当前的Y值)。为此,我使用以下python脚本工作,并使用随机森林回归模型进行预测。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""

@author: deshag
"""

import pandas as pd
import numpy as np
from io import StringIO
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error
from math import sqrt



df = pd.read_csv('estimated_pred.csv')

for i in range(1,100):
    df['X_t'+str(i)] = df['X'].shift(i)

print(df)

df.dropna(inplace=True)


X=pd.DataFrame({ 'X_%d'%i : df['X'].shift(i) for i in range(100)}).apply(np.nan_to_num, axis=0).values


y = df['Y'].values


reg = RandomForestRegressor(criterion='mse')
reg.fit(X,y)
modelPred = reg.predict(X)
print(modelPred)

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

meanSquaredError=mean_squared_error(y, modelPred)
print("MSE:", meanSquaredError)
rootMeanSquaredError = sqrt(meanSquaredError)
print("RMSE:", rootMeanSquaredError)

最后,我测量了均方根误差(RMSE),得到了一个RMSE为19.57。根据文档所说,平方误差与响应的单位相同。有没有办法将RMSE的值表示为百分比?例如,说这个预测的百分之多少是正确的,百分之多少是错误的。

在最近版本的sklearn中,有一个check_array函数用于计算平均绝对百分比误差(MAPE),但是当我像下面这样尝试时,它似乎不能按照以前的版本那样工作。

import numpy as np
from sklearn.utils import check_array

def calculate_mape(y_true, y_pred): 
y_true, y_pred = check_array(y_true, y_pred)

    return np.mean(np.abs((y_true - y_pred) / y_true)) * 100

calculate_mape(y, modelPred)

这里返回了一个错误:ValueError: not enough values to unpack (expected 2, got 1)。看起来最近版本中check_array函数只会返回单个值,而不像之前版本一样返回两个值。
是否有任何方法可以以百分比形式显示RMSE或使用sklearn计算MAPE?该问题是关于Python的IT技术相关内容。
1个回答

6
你的calculate_mape实现不起作用,因为你期望使用已在sklearn 0.16中删除的check_arrays函数。 check_array不是你想要的东西。 这个 StackOverflow 答案提供了一个可行的实现。

为什么要踩我呢?在我发布问题之前,我已经看到过类似的内容,但对我也没有用。 - Desta Haileselassie Hagos
1
不要问我,我不是那个给你点踩的人!你能解释一下为什么链接的答案不起作用吗?你有收到错误吗? - Imran
我做了一些更改,重新运行后,MAPE的值为0.064,但我无法确定这是误差还是准确度。 - Desta Haileselassie Hagos
1
这是一个错误,并且它也超出了链接实现中的1。如果您想要像之前一样将其转换为100,则需要将结果乘以100。 - Imran
1
是的,我相信如此,语法变更应该没问题。 - Imran

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接