有人在拟合的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'
有人知道我们如何摆脱循环并使用其他东西吗?
答案 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_temp
和desired_work_hours
现在为您提供了产生该最大值的规范。希望这会有所帮助。