2017-07-18 462 views
0

我有一个数据集(可在此链接中找到:https://drive.google.com/open?id=0B2Iv8dfU4fTUY2ltNGVkMG05V00)以下格式。scikit-learn:如何以百分比计算均方根误差(RMSE)?

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预测(即预测根据X以前的100个滚动值的Y当前值。对于这一点,我已经使用random forest regression model以下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),并得到了RMSE19.57。从我从文档中读到的内容,它说平方误差与响应具有相同的单位。是否有任何方法来表示该值RMSE的百分比是多少?例如,说这个百分比的预测是正确的,这是多么的错误。

check_arraycheck_array函数用于计算mean absolute percentage error (MAPE)在最近的sklearn版本中,但它似乎不像以前的版本一样工作,当我尝试它时,如下所示。

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函数只返回single value,与以前的版本不同。

有没有什么办法来提供RMSE的百分比或计算MAPE使用sklearnPython

回答

2

您的calculate_mape的实施不起作用,因为您期待check_arrays函数,该函数在sklearn 0.16中被删除。 check_array不是你想要的。

This StackOverflow答案给出了一个工作实现。

+0

为什么投票呢?我已经看到,在我发布我的问题之前,但也没有为我工作。 –

+1

不要问我,我不是一个低调!你能解释链接的答案不起作用吗?你有错误吗? – Imran

+0

我做了一些改动,重新运行,现在得到了'0.064'的MAPE值,但是,我不知道这是错误还是准确性。 –