一次生成输出时在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_predy_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框架,发现还有很长的路要走

Python机器学习(二十一)随机森林算法

哪种机器学习算法更适合这种情况

在 Tensorflow 中实现自定义损失函数会导致“ValueError:必须在循环之前定义‘输出’。”

(笔记)斯坦福机器学习第五讲--生成学习算法

使用 Hadoop 的机器学习框架 [关闭]