scikit-learn:如何以百分比计算均方根误差(RMSE)?
scikit-learn: How to calculate root-mean-square error (RMSE) in percentage?
我有以下格式的数据集(在 link: 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
的预测(即根据 X
的前 100 个滚动值预测 Y
的当前值。为此,我有以下 python
使用 random forest regression model
.
的脚本工作
#!/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
计算mean absolute percentage error (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
函数returns只有一个single value,不像之前的版本。
有什么方法可以用百分比表示 RMSE
或使用 sklearn
计算 MAPE
得到 Python
?
您的 calculate_mape
实现无效,因为您需要 check_arrays
函数,该函数已在 sklearn 0.16
中删除。 check_array
不是你想要的。
Whosebug 答案给出了一个可行的实现。
我有以下格式的数据集(在 link: 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
的预测(即根据 X
的前 100 个滚动值预测 Y
的当前值。为此,我有以下 python
使用 random forest regression model
.
#!/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
计算mean absolute percentage error (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
函数returns只有一个single value,不像之前的版本。
有什么方法可以用百分比表示 RMSE
或使用 sklearn
计算 MAPE
得到 Python
?
您的 calculate_mape
实现无效,因为您需要 check_arrays
函数,该函数已在 sklearn 0.16
中删除。 check_array
不是你想要的。