优化sklearn模型的预测(例如RandomForestRegressor)

时间:2019-11-22 07:02:05

标签: scikit-learn mathematical-optimization pyomo nonlinear-optimization scipy-optimize

有人在拟合的sklearn模型上使用任何优化模型吗?

我想做的是基于火车数据的拟合模型,并使用该模型尝试找到参数的最佳组合,该模型可以预测出最大的价值。

一些示例,简化的代码:

import pandas as pd

df = pd.DataFrame({
    'temperature': [10, 15, 30, 20, 25, 30],
    'working_hours': [10, 12, 12, 10, 30, 15],
    'sales': [4, 7, 6, 7.3, 10, 8]
})

from sklearn.ensemble import RandomForestRegressor
model = RandomForestRegressor()
X = df.drop(['sales'], axis=1)
y = df['sales']
model.fit(X, y);

我们的基线是一个简单的循环,可以预测变量的所有组合:

results = pd.DataFrame(columns=['temperature', 'working_hours', 'sales_predicted'])
import numpy as np
for temp in np.arange(1,100.01,1):
    for work_hours in np.arange(1,60.01,1):
        results = pd.concat([
            results, 
            pd.DataFrame({
                'temperature': temp, 
                'working_hours': work_hours, 
                'sales_predicted': model.predict(np.array([temp, work_hours]).reshape(1,-1))
            }
            )
        ]
        )

print(results.sort_values(by='sales_predicted', ascending=False))

使用这种方式很难或不可能: *快速执行(粗略方法) *对两个或多个变量相关性实施约束

我们尝试了PuLP库和PyOmo库,但都不允许将model.predict函数作为返回错误的目标函数:

TypeError: float() argument must be a string or a number, not 'LpVariable'

有人知道我们如何摆脱循环并使用其他东西吗?

1 个答案:

答案 0 :(得分:0)

当人们谈论优化拟合的sklearn模型时,它们通常意味着最大化准确性/性能指标。因此,如果您想最大化您的预测值,则可以肯定地改进您的代码以更有效地实现它,如下所示。

您正在收集大型results数据框中的所有预测,然后按升序对其进行排序。相反,您可以使用简单的if逻辑即时搜索目标变量(sales_predicted)的增加。因此,只需将您的循环更改为此:

max_sales_predicted = 0

for temp in np.arange(1, 100.01, 1):
    for work_hours in np.arange(1, 60.01, 1):
        sales_predicted = model.predict(np.array([temp, work_hours]).reshape(1, -1))
        if sales_predicted > max_sales_predicted:
            max_sales_predicted = sales_predicted
            desired_temp = temp
            desired_work_hours = work_hours

因此,您只能考虑产生超出当前目标的预测g的任何规范,否则不执行任何操作。

我的代码的结果与您的代码相同,即max_sales_predicted的值为9.2。此外,desired_tempdesired_work_hours现在为您提供了产生该最大值的规范。希望这会有所帮助。