我正在做一个典型的机器学习回归问题。有800个数据点和6个特征。最佳模型Extra Trees Regressor返回的均方根误差为30。我采用对数变换来减少极端数据的影响。对数变换将右偏数据变为正态分布。误差仅为0.54,为什么会有如此巨大的变化
log(30) = 1.4 我知道我的统计学知识不是最好的,但这对我来说似乎相当奇怪。我还没有对参数进行任何调整。
话虽如此,我应该相信哪个误差?每一个的解释是什么?
对预测值取对数
pricing['runtime.min'] = np.log(pricing['runtime.min'])
评估模型的函数
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)) print('模型性能') print('平均绝对误差: {:0.4f} 度。'.format(errors)) print('平均均方误差: {:0.4f} 度。'.format(MSerrors)) print('平均均方根误差: {:0.4f} 度。'.format(RMSE)) return '测试结束'
Extra trees回归器
et_params = {'n_estimators': 1000, 'max_features':2}et = SklearnExtra(clf = ExtraTreesRegressor(), seed = Seed, params = et_params)et.fit(x_train, y_train)base_models = [rf, et, gb, ada, xg]for i in base_models: print('模型 ' + i.name()) print('训练: '+str(evaluate(i, x_train, y_train))) print('') print('模型 ' + i.name()) print('测试: '+ str(evaluate(i, x_test, y_test))) print('测试MAPE '+ str(mean_absolute_percentage_error(i, y_test, x_test)))
模型 ExtraTreesRegressor(bootstrap=False, criterion='mse', max_depth=None, max_features='auto', max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, min_samples_leaf=1, min_samples_split=2, min_weight_fraction_leaf=0.0, n_estimators=10, n_jobs=None, oob_score=False, random_state=None, verbose=0, warm_start=False)模型性能平均绝对误差: 0.0165 度。平均均方误差: 0.0079 度。平均均方根误差: 0.0887 度。训练: 测试结束模型性能平均绝对误差: 0.3572 度。平均均方误差: 0.2957 度。平均均方根误差: 0.5438 度。测试: 测试结束
回答:
我们无法告诉你你应该做什么,你必须决定这对数据是否有意义。
但这就是为什么我在评论中询问了关于变换和统计的问题,如果你改变了目标的尺度,你就不能使用两个模型之间的绝对差异进行分析。如果你的初始模型的RMSE为30,但预测值的范围是0到100,标准偏差是20(例如),那就不太好。但在你的新模型中,如果数据范围是0到10,标准偏差是3.5,那么0.5的RMSE可能会更好。
正确的答案有点主观,但归结为以下几点:如果你使用这个模型对现实世界的数据进行预测,误差指标是否在手头任务的可接受容差范围内?对于你的初始模型,你的业务案例是否允许30(秒?分钟?)或运行时间预测与实际之间的差异是“足够接近”的?对于第二个模型,0.54对数毫秒是否足以使你的预测变得无用?
参见“有用”部分的“所有模型都是错误的,但有些是有用的”