python - 为什么每当我刷新我的随机森林回归器时。MSE 和 MAE 变化?为什么它会有所不同并取决于什么?
问题描述
我正在使用 jupyter notebook,所以我可以尽可能频繁地刷新块以适应/预测/评估。每次我刷新时,MSE/MAE/RMSE 都会返回一个不同的值,即使训练数据没有被打乱。为什么呢?
我已经尝试查找问题,但这似乎没有帮助,所以我想知道是因为我的代码还是我缺乏理解
我经常刷新这个块
rf1 = SklearnExtra(clf = RandomForestRegressor(), seed = Seed, params = tune)
rf1.fit(x_train, y_train)
evaluate(rf1, x_test, y_test)
print('Test MAPE '+ str(mean_absolute_percentage_error(rf1, y_test, x_test)))
def evaluate(model, test_features, test_labels):
predictions = model.predict(test_features)
errors = metrics.mean_absolute_error(test_labels, predictions)
MSerrors = metrics.mean_squared_error(test_labels, predictions)
RMSE = np.sqrt(metrics.mean_squared_error(test_labels, predictions))
RMSLE = np.sqrt(np.mean(np.power(np.log1p(predictions) - np.log1p(test_labels), 2)))
print('Model Perfomance')
print('MAE Error: {:0.4f} degrees. '.format(errors))
print('Average MSE Error: {:0.4f} degrees. '.format(MSerrors))
print('Average RMS Error: {:0.4f} degrees. '.format(RMSE))
print('Average RMSLE Error: {:0.4f} degrees. '.format(RMSLE))
return 'end of test'
class SklearnExtra(object):
def __init__(self, clf, seed = 0, params = None):
params['random_state'] = seed
self.clf = clf
def train(self, x, y):
self.clf.fit(x, y)
def predict(self, x):
return self.clf.predict(x)
def fit(self, x, y):
return self.clf.fit(x,y)
def feature_importances(self, x, y):
clf2 = self.clf.fit(x,y)
return (clf2.feature_importances_)
def name(self):
return str(self.clf)
Test Data
Model Perfomance
MAE Error: 26.3329 degrees.
Average MSE Error: 1950.4288 degrees.
Average RMS Error: 44.1637 degrees.
Average RMSLE Error: 0.3016 degrees.
Test MAPE 24.11994617834992
#next refresh
Test Data
Model Perfomance
MAE Error: 29.7638 degrees.
Average MSE Error: 2479.5202 degrees.
Average RMS Error: 49.7948 degrees.
Average RMSLE Error: 0.3129 degrees.
Test MAPE 25.520876708239378
解决方案
每棵树都建立在数据的随机部分(引导程序)和/或所有特征的子样本上,因此模型每次都不同。这是一个随机森林;-)
您可以使用 关闭引导采样RandomForestRegressor(bootstrap=False)
,但每次从特征采样中得到的结果仍会略有不同。
但是randon_state
,如果您希望每次都获得相同的结果,您可以将参数设置为固定值,例如RandomForestRegressor(random_state=42)
. :-)
这是 Sycorax 在 CrossValidated 上的一个很好的解释。
推荐阅读
- javascript - 如何将类方法设置为事件处理程序?
- android - 保存单选按钮android的状态
- angular - 如何在规范文件中创建构造函数的二维数组(带有 2 个参数)
- prolog - Prolog:为谓词中的变量赋值
- javascript - 我找不到我的不和谐机器人中的错误
- javascript - 为什么在php中使用cropper js上传图像时需要不工作
- vue.js - 同源策略不允许读取远程资源(原因:缺少 CORS 标头“Access-Control-Allow-Origin”)
- authentication - 无法对 Azure AD 中的自定义 API 进行身份验证(JWT 令牌问题)
- java - Comparator.comparing() 函数使用 lambda 和方法引用返回不同的结果
- android - 尝试使用自定义相机应用程序拍照时获取 E/Camera:错误 2 和 E/Camera:错误 1