我正在研究生产优化问题;与 Vegard Flovik How to use machine learning for production optimization所描述的想法非常相似。下图取自引用的帖子,很好地总结了它:
第一步很明显,我确实有一个机器学习或神经网络模型形式的模型。我将如何进行第二步?我如何使用经过训练的模型作为函数评估器,通过 Scipy、贝叶斯优化等进行进一步的多维非线性优化(例如最大化)?
我似乎找不到一个实际的例子。以封闭形式的分析函数作为优化问题的目标是公认的。Tirthajyoti Sarkar的文章Optimization with SciPy and application ideas to machine learning给出了一些使用 Scipy 的示例,并介绍了使用绑定约束等进行优化的包。然而例子非常简单(一个封闭形式的数学函数),他只是掩盖了这种想法的扩展以使用 NN 作为目标函数,我引用:
你可以自由选择一个分析函数,一个深度学习网络(也许是一个回归模型),甚至是一个复杂的模拟模型,把它们一起扔进优化的坑里。
任何线索/提示/链接表示赞赏!
[附录]
为了有一个具体的例子,让我们假设我们有一个虚拟数据集,其中包含一组特征和一个虚构的 ProductionYield,它是输入变量的非线性组合:
import numpy as np
import pandas as pd
df = pd.DataFrame(columns=['Pressure','Temprerature','Speed','ProductionYield'])
df['Pressure'] = np.random.randint(low= 2, high=10, size=2000)
df['Temprerature'] = np.random.randint(10, 30, size=2000)
df['Speed'] = np.random.weibull(2, size=2000)
df['ProductionYield'] = (df['Pressure'])**2 + df['Temprerature'] * df['Speed'] + 10
df['ProductionYield']= df['ProductionYield'].clip(0, 100)
Pressure Temprerature Speed ProductionYield
0 7 20 1.810557 95.211139
1 2 29 0.674221 33.552409
2 8 17 0.537533 83.138065
3 3 24 1.945914 65.701938
4 6 23 0.514679 57.837610
1.Predictive Algorithm(一个简单的神经网络):
## Train/Test Split
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(df[['Pressure','Temprerature','Speed']].values, df['ProductionYield'].values, test_size=0.33, random_state=42)
## Build NN Model
import tensorflow as tf
from tensorflow.keras import layers
def build_model():
# create model
model = tf.keras.Sequential()
model.add(layers.Dense(64, input_dim=3, kernel_initializer='normal', activation='relu'))
model.add(layers.Dense(128, kernel_initializer='normal', activation='relu'))
model.add(layers.Dense(1, kernel_initializer='normal'))
# Compile model
model.compile(loss='mean_squared_error', optimizer='adam')
return model
model = build_model()
model.fit(x_train, y_train,
validation_split=0.2,
verbose=0, epochs=1000)
2.优化【问题核心】:
问题出在此处,当训练 ML/NN 时,我看不到(按我的意愿导出)函数的数学形式(在此示例中为 NN)及其变量(应该是我的特征变量)要做优化就像我们对封闭式显式数学函数所做的那样。
[更新 15.01.2021 ]:
根据 Valentin 的出色回答,我在一个实际示例中将各个部分组合在一起,展示了如何使用 ML/NN 模型作为输入函数,使用附录中显示的虚拟数据集进行进一步优化(此处通过 scipy.optimize)。有关详细信息,请参阅此笔记本。