iteration - 每个数据的 Scipy.optimize.minimize
问题描述
我有 2 个模型的 1000 个预测结果和它们的真实值。对于每个数据,我必须在这个等式中找到 b0 和 b1: sqrt((w[i]**(b0+b1*MODEL1[i])*MODEL1[i]+(1-w[i])**(b0+b1*MODEL1[i])*MODEL2[i]-TRUE[i])**2)
在我的模型中,我从外部带来 w[i] 值。对于每个数据,我还有所有 ADB[i] (MODEL1)、RF[i] (MODEL2) 和 test_y[i] (TRUE)。下面的代码只能解决数据集中的一个数据。但是,我必须为 1000 个数据找到它,所以在优化结束时有 1000 b0 和 1000 b1。
def objective(b):
b0 = b[0]
b1 = b[1]
return sqrt((w1[0]**(b0+b1*ADB[0])*ADB[0]+(1-w1[0])**(b0+b1*ADB[0])*RF[0]-test_y[0])**2)
bi = [1,1]
sol= minimize(objective, bi, method='SLSQP')
sol
提前致谢。
解决方案
我的完整示例:
from sklearn.datasets import make_regression
import pandas as pd
import numpy as np
from scipy.optimize import minimize
from sklearn.ensemble import RandomForestRegressor
from sklearn.ensemble import AdaBoostRegressor
from sklearn.metrics import mean_squared_error
from math import sqrt
# generate 2d regression dataset
X, y = make_regression(n_samples=1100,n_features=2, noise=0.7)
# split into train and test
n_train = 100
train_x, test_x = X[:n_train, :], X[n_train:, :]
train_y, test_y = y[:n_train], y[n_train:]
print(train_x.shape, test_x.shape)
### building the regressors
rgs = []
rfr = RandomForestRegressor(n_estimators=10, random_state=4141, n_jobs=-1)
rfr.fit(train_x, train_y)
print('RF RMSE {score}'.format(score= sqrt(mean_squared_error(test_y,
rfr.predict(test_x)))))
rgs.append(rfr)
RF = rfr.predict(test_x)
### AdaBoost
ADA = AdaBoostRegressor()
ADA.fit(train_x, train_y)
print('ADA RMSE {score}'.format(score= sqrt(mean_squared_error(test_y, ADA.predict(test_x)))))
rgs.append(ADA)
ADB= ADA.predict(test_x)
# generate random floating point values for w[i]
from numpy.random import seed
from numpy.random import rand
# seed random number generator
seed(511)
# generate random numbers between 0-1
w1 = rand(1000)
仅针对一个数据进行优化:
def objective(b):
b0 = b[0]
b1 = b[1]
return sqrt((w1[0]**(b0+b1*ADB[0])*ADB[0]+(1-w1[0])**(b0+b1*ADB[0])*RF[0]-test_y[0])**2)
bi = [1,0]
sol= minimize(objective, bi, method='SLSQP')
sol
我试图制作循环,但它给出了ValueError: Objective function must return a scalar
loss_es = list()
def objective(b):
b0 = b[0]
b1 = b[1]
for i in range(1000):
loss = sqrt(((w1[i]**(b0+b1*ADB[i]))*ADB[i]+((1-w1[i])**(b0+b1*ADB[i]))*RF[i]-test_y[i])**2)
loss_es.append(loss)
return loss_es
bi = [1,0]
for loss in range(1000):
sol = minimize(objective, bi, method='SLSQP' )
推荐阅读
- firefox-addon - 开发插件/扩展来查看 PDF
- testing - 嵌入式系统 HMI 测试的机器人框架支持
- javascript - vue-agile 滑块 - 无法读取未定义的属性“classList”
- python - 使用 Nginx + Gunicorn 提供的 Flask 应用程序上的无限页面重新加载
- tfsbuild - TFS 中的 CI 管道,用于一个管道中的两个不同项目
- javascript - 将文本附加到同一单元格后,表格单元格中的 Indesign 字形消失了
- c# - 等待 client.queryasync 耗时太长
- ruby-on-rails - 如何在开发模式下检测与 Active Record 的名称冲突错误
- python - 切片 PySpark DataFrame 中列的所有值
- python - 将python pandas数据框转换为数组