一次生成输出时在python中实现机器学习算法
Posted
技术标签:
【中文标题】一次生成输出时在python中实现机器学习算法【英文标题】:Implementing a machine learning algorithm in python when output is generated one-at-a-time 【发布时间】:2022-01-24 06:14:34 【问题描述】:我有一个大型的黑盒模型,我正在尝试对其进行校准,并且我正在尝试实施一个基本的机器学习算法来协助校准,但我遇到了困难。
对于这种情况,模型接受一个输入,称为scalar
,并生成一个输出,该输出是一个浮点值列表,称为y_pred
。
我正在尝试调整 scalar
以使输出 y_pred
尽可能接近称为 y_true
的一组已知值。
我正在通过均方误差测量 y_pred
和 y_true
之间的差异。
因此,我的输入是scalar
,我想最小化均方误差
我一直用来解决这个问题的方法如下:
from sklearn.metrics import mean_squared_error
y_true = [1, 2, 3, 4]
list_of_scalars = []
list_of_results = []
for i in range(0, 2, 0.01):
scalar = i
list_of_scalars.append(scalar)
y_pred = BlackBox.run(scalar)
mse = mean_squared_error(y_true, y_pred)
list_of_results.append(mse)
best_value = min(mse)
best_value_index = list_of_mse.index(best_value)
the_best_input = list_of_scalars[best_value_index]
这似乎是一个不好的方法,因为它总是花费相同的时间,并且预先假设我知道scalar
将占据的最佳范围。我可以通过尝试拟合一条线并检索最小值来微调此方法,但我仍然会遇到这些问题。
似乎某种机器学习算法在这里会是更好的方法。但是,我不确定哪种算法适合这个问题?我的直觉说梯度下降,但我还没有看到以这种方式实现的。我见过的示例在运行下降之前有一个数据集,而不是动态生成的数据。
我最好的猜测是,这样的算法需要知道当前 mean_squared_error 和之前的 mean_squared_error 之间的梯度,然后调整标量会增加或减少多少来响应这一点。
我对此的最佳猜测如下:
from sklearn.metrics import mean_squared_error
y_true = [1, 2, 3, 4]
scalar = 0.01 # Some arbitrarily small scalar value
mse = 9999999 # Some arbitrarily large mse
gradient = 2 # Some arbitrarily large gradient
threshold = 0.001 # The threshold under which the while loop will end
def some_algorithm(gradient, scalar) -> float:
'''
Takes the current gradient, and the current scalar, and determines how much to
adjust the scalar by
'''
...
return adjustment_factor
while gradient > threshold:
y_pred = BlackBox(scalar)
current_mse = mean_squared_error(y_true, y_pred)
gradient = current_mse / mse
adjustment_factor = some_algorithm(gradient, scalar)
scalar *= adjustment_factor
我很高兴使用开箱即用的解决方案,例如 sklearn
类,但这是我遇到的问题。
【问题讨论】:
看看 optuna 【参考方案1】:ML 的问题是创建一个模型,该模型可以在给定一些测试数据集的情况下进行更好的预测。但是在您的情况下,您已经有了一个模型,正如您所说“我有一个大型的黑盒模型,我正在尝试对其进行校准......”
要创建更好的模型,请尝试以下算法。
-
定义初始 best_mse 为 0,初始模型为 best_model=None。
创建模型(创建模型有不同的方法)比如说 current_model。
使用测试数据集测试模型并将 mse 测量为 current_mse。
这是您尝试做的,但需要更正。
y_true = [1, 2, 3, 4]
x_test = [0.1, 0.2, 0.3, 0.4] # your input
y_pred = model(x_test)
current_mse = mean_squared_error(y_true, y_pred)
mse 或 mean_squared_error 背后的基本思想。
样本 y_pred 结果:
y_pred = [0.9, 1.8, 4.5, 2.8]
error = [1-0.9, 2-1.8, 3-4.5, 4-2.8] # 1, 2, 3 and 4 are from y_true
error = [0.1, 0.2, -1.5, 1.2]
squared_error = [0.01, 0.04, 2.25, 1.44] # 0.1*0.1, 0.2*0.2 (-1.5)*(-1.5) ...
mean_squared_error = sum(squared_error) / len(squared_error) # get average, mean is just an everage.
mean_squared_error = 3.74/4 = 0.935
如果你真的想一次输入一个。
all_error = []
for testv, truev in zip(x_test, y_true):
pred = BlackBox.run(testv)
error = truev - pred
squared_error = error * error
all_error.append(squared_error)
mse = sum(all_error) / len(all_error)
如果 current_mse 优于 best_mse,请将 best_mse 设置为 current_mse 或
if best_model is None: # first time
best_mse = current_mse
best_model = current_model
elif current_mse < best_mse:
best_mse = current_mse
best_model = current_model
最后你会得到 best_model 和 best_mse。
【讨论】:
以上是关于一次生成输出时在python中实现机器学习算法的主要内容,如果未能解决你的问题,请参考以下文章
浏览器中实现深度学习?有人分析了7个基于JS语言的DL框架,发现还有很长的路要走