请问可不可以用sklearn的MLPRegressor神经网络结合scikit-opt优化算法库建立回归模型

sklearn的神经网络模型代码如下

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn.metrics import mean_squared_error,mean_absolute_error,r2_score
from sklearn import preprocessing
from sklearn.neural_network import MLPRegressor
plt.rcParams['font.sans-serif']='SimHei'
plt.rcParams['axes.unicode_minus']=False
def inverse_transform_col(scaler,y,n_col):
    y = y.copy()
    y -= scaler.min_[n_col]
    y /= scaler.scale_[n_col]
    return y
x_variables = pd.read_excel("D:\\pythonProject3\\learning\\特征提取和降维\\data\\SPA\\TZ-789-SPA.xlsx")
#print(type(x_variables))
samples = x_variables.values[:,:]
#print(samples.shape,type(samples))
#对x,y归一化
min_max_scaler = preprocessing.MinMaxScaler()
norm = min_max_scaler.fit_transform(samples)
#print(norm,norm.shape,type(norm))
#切片 训练集测试集xy均已被归一化
train_x = norm[:60,1:]
train_y = norm[:60,0]
test_x = norm[60:,1:]
test_y = norm[60:,0]
#print(train_x.shape)
mlpr = MLPRegressor(hidden_layer_sizes=(10,10),#隐藏层设置,两层,每层10个神经元
                          activation="relu", #激活函数
                          solver="lbfgs", #梯度下降方法
                          learning_rate="invscaling", #学习率递减
                          max_iter=20000
                          )
#训练集训练
mlpr.fit(train_x,train_y)
#训练集预测
train_y_pred = mlpr.predict(train_x)
#反归一化
y_pre = inverse_transform_col(min_max_scaler,train_y_pred,n_col=0)
y_train = inverse_transform_col(min_max_scaler,train_y,n_col=0)
print("训练集的RMSE:",np.sqrt(mean_squared_error(y_true=y_train,y_pred=y_pre)))
print("训练集的R2:",r2_score(y_true=y_train,y_pred=y_pre))
#测试集预测
test_y_pred = mlpr.predict(test_x)
y_pre2 = inverse_transform_col(min_max_scaler,test_y_pred,n_col=0)
y_test = inverse_transform_col(min_max_scaler,test_y,n_col=0)
print("测试集的RMSE:",np.sqrt(mean_squared_error(y_true=y_test,y_pred=y_pre2)))
print("测试集的R2:",r2_score(y_true=y_test,y_pred=y_pre2))
#作图:预测曲线
fig=plt.figure(figsize=(10,8),dpi=100)
#训练集
ax1=fig.add_subplot(2,1,1)
idx = np.arange(0,60,1)
plt.plot(idx,y_train,'b-',idx,y_pre,'r-')
plt.legend(('real', 'predict'),loc='upper right',fontsize='15')
plt.title("Train Data",fontsize='30')
plt.xlabel("样本")
plt.ylabel("虫量")
#预测集
ax2=fig.add_subplot(2,1,2)
idx = np.arange(0,24,1)
plt.plot(idx,y_test,'b-',idx,y_pre2,'r-')
plt.legend(('real', 'predict'),loc='upper right',fontsize='15')
plt.title("Test Data",fontsize='30')
plt.xlabel("样本")
plt.ylabel("虫量")
fig.tight_layout()
plt.show()

最近刚学到还有一个优化算法库,里边有粒子群优化算法、遗传算法等等。貌似是可以对神经网络的权重和偏置的初始值进行优化,下面是学习的一个例子,不知道怎么能将这两个库结合运用起来

from sko.PSO import PSO
import matplotlib.pyplot as plt
def demo_func(x):
   x1, x2, x3 = x
   return x1 ** 2 + (x2 - 0.05) ** 2 + x3 ** 2
pso = PSO(func=demo_func, n_dim=3, pop=40, max_iter=150, lb=[0, -1, 0.5], ub=[1, 1, 1],
          w=0.8, c1=0.5, c2=0.5)
pso.run()
print('best_x is ', pso.gbest_x, 'best_y is', pso.gbest_y)
plt.plot(pso.gbest_y_hist)
plt.show()

用sklearn的神经网络模型主要也是因为可以设置梯度下降方法、激活函数等参数,比较方便。优化算法库又提供了多种算法,若能结合起来感觉非常完美了!
如有帮助 必定采纳!

引用 皆我百晓生 小程序回复内容作答:

可以用scikit-opt的优化算法库结合sklearn的MLPRegressor神经网络模型建立回归模型。下面是一个示例代码:

from sko.PSO import PSO
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn import preprocessing
from sklearn.neural_network import MLPRegressor


def inverse_transform_col(scaler, y, n_col):
    y = y.copy()
    y -= scaler.min_[n_col]
    y /= scaler.scale_[n_col]
    return y


x_variables = pd.read_excel("D:\\pythonProject3\\learning\\特征提取和降维\\data\\SPA\\TZ-789-SPA.xlsx")

samples = x_variables.values[:, :]
min_max_scaler = preprocessing.MinMaxScaler()
norm = min_max_scaler.fit_transform(samples)

train_x = norm[:60, 1:]
train_y = norm[:60, 0]
test_x = norm[60:, 1:]
test_y = norm[60:, 0]

mlpr = MLPRegressor(hidden_layer_sizes=(10, 10),
                    activation="relu",
                    solver="lbfgs",
                    learning_rate="invscaling",
                    max_iter=20000)

def mlp_regressor_loss(params):
    mlpr.set_params(**params)
    mlpr.fit(train_x, train_y)
    train_y_pred = mlpr.predict(train_x)
    train_y_pred_inverse = inverse_transform_col(min_max_scaler, train_y_pred, n_col=0)
    train_y_inverse = inverse_transform_col(min_max_scaler, train_y, n_col=0)
    return mean_squared_error(train_y_inverse, train_y_pred_inverse)

pso = PSO(func=mlp_regressor_loss, n_dim=9, pop=30, max_iter=50,
          lb=[0, 0, 0, 0, 0, 0, 0, 0, 0], ub=[10, 10, 1, 1, 1, 1, 1, 1, 1],
          w=0.8, c1=0.5, c2=0.5)
pso.run()
best_params = pso.gbest_x
mlpr.set_params(**best_params)
mlpr.fit(train_x, train_y)
test_y_pred = mlpr.predict(test_x)
test_y_pred_inverse = inverse_transform_col(min_max_scaler, test_y_pred, n_col=0)
test_y_inverse = inverse_transform_col(min_max_scaler, test_y, n_col=0)

print("测试集的RMSE:", np.sqrt(mean_squared_error(y_true=test_y_inverse, y_pred=test_y_pred_inverse)))
print("测试集的R2:", r2_score(y_true=test_y_inverse, y_pred=test_y_pred_inverse))

fig = plt.figure(figsize=(10, 8), dpi=100)
ax = fig.add_subplot(1, 1, 1)
idx = np.arange(0, 24, 1)
plt.plot(idx, test_y_inverse, 'b-', idx, test_y_pred_inverse, 'r-')
plt.legend(('real', 'predict'), loc='upper right', fontsize='15')
plt.title("Test Data", fontsize='30')
plt.xlabel("样本")
plt.ylabel("虫量")
plt.show()

在这个示例中,我们将MLPRegressor的参数设置为可变参数,并通过PSO算法搜索最优的参数组合。在每次迭代中,我们根据当前的参数组合训练MLPRegressor模型,并计算训练集的均方根误差。PSO算法将根据这个误差来更新粒子群的位置,以寻找更优的参数组合。在PSO算法运行结束后,我们将最优的参数应用到MLPRegressor模型,并在测试集上进行评估和预测。

需要注意的是,这个示例中的参数组合仅供参考,您可能需要根据具体情况进行调整。另外,为了使用PSO算法,您需要安装scikit-opt库。

结合GPT给出回答如下请题主参考
可以使用sklearn的MLPRegressor神经网络结合scikit-opt优化算法库建立回归模型。scikit-opt是一个优化算法库,其中包含了许多常用的优化算法,可以用于神经网络的参数优化,从而提高模型的性能。

下面是使用scikit-opt对MLPRegressor神经网络模型的参数进行优化的代码示例:

from skopt import gp_minimize
from sklearn.neural_network import MLPRegressor
from sklearn.metrics import mean_squared_error

# 定义神经网络模型
def create_model(params):
    model = MLPRegressor(hidden_layer_sizes=params[0], activation=params[1], solver=params[2], alpha=params[3], learning_rate=params[4])
    return model

# 定义优化目标函数
def objective(params):
    model = create_model(params)
    model.fit(X_train, y_train)
    y_pred = model.predict(X_test)
    mse = mean_squared_error(y_test, y_pred)
    return mse

# 定义参数空间
space = [(10, 100), ('identity', 'logistic', 'tanh', 'relu'), ('lbfgs', 'sgd', 'adam'), (0.0001, 0.1), ('constant', 'invscaling', 'adaptive')]

# 进行参数优化
result = gp_minimize(objective, space, random_state=0, n_random_starts=10, n_calls=50)

# 输出最优参数
print('Best Parameters: {}'.format(result.x))

在这个示例中,我们首先定义了一个create_model函数来创建MLPRegressor神经网络模型,然后定义了一个objective函数作为优化的目标函数,该函数计算测试集上的均方误差。然后我们定义了一个参数空间,包含了神经网络模型所需要的参数。最后,我们使用gp_minimize函数对目标函数进行优化,得到最优的参数组合。

需要注意的是,使用scikit-opt进行参数优化可能会需要较长的时间,取决于参数空间的大小和数据集的大小。因此,我们可以调整参数空间的大小和n_calls的数量来平衡优化的时间和模型性能。


from sko.PSO import PSO
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn import preprocessing
from sklearn.neural_network import MLPRegressor
def inverse_transform_col(scaler, y, n_col):
    y = y.copy()
    y -= scaler.min_[n_col]
    y /= scaler.scale_[n_col]
    return y
x_variables = pd.read_excel("D:\\pythonProject3\\learning\\特征提取和降维\\data\\SPA\\TZ-789-SPA.xlsx")
samples = x_variables.values[:, :]
min_max_scaler = preprocessing.MinMaxScaler()
norm = min_max_scaler.fit_transform(samples)
train_x = norm[:60, 1:]
train_y = norm[:60, 0]
test_x = norm[60:, 1:]
test_y = norm[60:, 0]
mlpr = MLPRegressor(hidden_layer_sizes=(10, 10),
                    activation="relu",
                    solver="lbfgs",
                    learning_rate="invscaling",
                    max_iter=20000)
def mlp_regressor_loss(params):
    mlpr.set_params(**params)
    mlpr.fit(train_x, train_y)
    train_y_pred = mlpr.predict(train_x)
    train_y_pred_inverse = inverse_transform_col(min_max_scaler, train_y_pred, n_col=0)
    train_y_inverse = inverse_transform_col(min_max_scaler, train_y, n_col=0)
    return mean_squared_error(train_y_inverse, train_y_pred_inverse)
pso = PSO(func=mlp_regressor_loss, n_dim=9, pop=30, max_iter=50,
          lb=[0, 0, 0, 0, 0, 0, 0, 0, 0], ub=[10, 10, 1, 1, 1, 1, 1, 1, 1],
          w=0.8, c1=0.5, c2=0.5)
pso.run()
best_params = pso.gbest_x
mlpr.set_params(**best_params)
mlpr.fit(train_x, train_y)
test_y_pred = mlpr.predict(test_x)
test_y_pred_inverse = inverse_transform_col(min_max_scaler, test_y_pred, n_col=0)
test_y_inverse = inverse_transform_col(min_max_scaler, test_y, n_col=0)
print("测试集的RMSE:", np.sqrt(mean_squared_error(y_true=test_y_inverse, y_pred=test_y_pred_inverse)))
print("测试集的R2:", r2_score(y_true=test_y_inverse, y_pred=test_y_pred_inverse))
fig = plt.figure(figsize=(10, 8), dpi=100)
ax = fig.add_subplot(1, 1, 1)
idx = np.arange(0, 24, 1)
plt.plot(idx, test_y_inverse, 'b-', idx, test_y_pred_inverse, 'r-')
plt.legend(('real', 'predict'), loc='upper right', fontsize='15')
plt.title("Test Data", fontsize='30')
plt.xlabel("样本")
plt.ylabel("虫量")
plt.show()

来自钉钉个人版AI 制杖回答:
当然可以。使用sklearn的MLPRegressor可以快速创建一个基于神经网络的回归模型,而scikit-opt则提供了许多高效的优化算法来调整模型的参数。通过这两个库的结合,您可以建立一个准确度高且性能强大的回归模型。不过,请注意,这需要您具备一定的机器学习和Python编程经验,因为这涉及到大量的代码实现和模型调整。如果您是新手,建议您先学习相关知识,然后再尝试使用这两个库来构建回归模型。

是的,您可以结合scikit-opt的优化算法库和sklearn的MLPRegressor神经网络模型来进行回归模型的建立和优化。下面是一个示例代码,展示如何结合这两个库进行操作:

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
from sklearn import preprocessing
from sklearn.neural_network import MLPRegressor
from sko.PSO import PSO

def inverse_transform_col(scaler, y, n_col):
    y = y.copy()
    y -= scaler.min_[n_col]
    y /= scaler.scale_[n_col]
    return y

# 读取数据和归一化步骤省略...

# 定义神经网络模型
mlpr = MLPRegressor(hidden_layer_sizes=(10, 10),
                    activation="relu",
                    solver="lbfgs",
                    learning_rate="invscaling",
                    max_iter=20000)

# 定义优化目标函数
def objective_func(x):
    # 设置神经网络模型的参数
    mlpr.set_params(hidden_layer_sizes=(int(x[0]), int(x[1])),
                    learning_rate_init=x[2])
    
    # 训练模型并预测
    mlpr.fit(train_x, train_y)
    train_y_pred = mlpr.predict(train_x)
    train_y_pred = inverse_transform_col(min_max_scaler, train_y_pred, n_col=0)
    y_train = inverse_transform_col(min_max_scaler, train_y, n_col=0)
    
    # 返回均方根误差作为优化目标值
    return np.sqrt(mean_squared_error(y_true=y_train, y_pred=train_y_pred))

# 创建PSO优化算法对象
pso = PSO(func=objective_func, n_dim=3, pop=40, max_iter=150, lb=[5, 5, 0.001], ub=[20, 20, 0.1],
          w=0.8, c1=0.5, c2=0.5)

# 运行PSO算法进行优化
pso.run()
best_params = pso.gbest_x
print('Best parameters:', best_params)

# 使用最优参数重新训练模型
mlpr.set_params(hidden_layer_sizes=(int(best_params[0]), int(best_params[1])),
                learning_rate_init=best_params[2])
mlpr.fit(train_x, train_y)

# 预测并反归一化
test_y_pred = mlpr.predict(test_x)
test_y_pred = inverse_transform_col(min_max_scaler, test_y_pred, n_col=0)
y_test = inverse_transform_col(min_max_scaler, test_y, n_col=0)

# 计算评估指标
rmse = np.sqrt(mean_squared_error(y_true=y_test, y_pred=test_y_pred))
r2 = r2_score(y_true=y_test, y_pred=test_y_pred)
print('Test RMSE:', rmse)
print('Test R2:', r2)

# 绘制预测曲线等其他步骤省略...

在上述代码中,我们首先定义了一个目标函数objective_func,该函数接受神经网络模型的参数作为输入,使用这些参数训练神经网络模型,并计算训练集的均方根误差作为优化目标值。然后,我们使用PSO算法对该目标函数进行优化,得到最优的神经网络模型参数。
最后,我们使用最优参数重新训练模型并进行预测,然后计算测试集的评估指标(如均方根误差和R2分数)。您可以根据需要进行额外的步骤,如绘制预测曲线等。

请注意,这只是一个示例代码,您可能需要根据您的数据和具体需求进行适当的修改和调整。希望这可以帮助您结合sklearn的神经网络模型和scikit-opt的优化算法库建立回归模型。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

参考一下

from sklearn.neural_network import MLPRegressor
from sko.GA import GA

# 构建神经网络回归模型
model = MLPRegressor(hidden_layer_sizes=(10, 5), activation='relu', solver='adam')

# 准备你的输入数据和目标数据
X_train = ...
y_train = ...

# 训练模型
model.fit(X_train, y_train)

# 定义优化目标函数(损失函数)
def optimize_function(params):
    # 设置神经网络模型的超参数
    hidden_layer_sizes = (int(params[0]), int(params[1]))
    activation = 'relu'
    solver = 'adam'
    
    # 构建模型并训练
    model = MLPRegressor(hidden_layer_sizes=hidden_layer_sizes, activation=activation, solver=solver)
    model.fit(X_train, y_train)
    
    # 返回模型的评估指标,比如均方误差(MSE)
    y_pred = model.predict(X_train)
    mse = mean_squared_error(y_train, y_pred)
    return mse

# 使用遗传算法进行参数优化
ga = GA(func=optimize_function, n_dim=2, size_pop=50, max_iter=100, lb=[1, 1], ub=[50, 50])
best_params = ga.run()
print("Best Parameters:", best_params)


链接:https://pan.baidu.com/s/1ord5SuVGqVuzA2OD1sLEpQ
提取码:1234
这个是数据链接

援引讯飞星火:
是的,你可以将scikit-learn的MLPRegressor神经网络模型与scikit-opt优化算法库结合使用。首先,你需要将神经网络模型的权重和偏置初始化为随机值。然后,你可以使用优化算法库中的粒子群优化(PSO)或其他优化算法来优化这些权重和偏置。

以下是一个示例,展示了如何将MLPRegressor与PSO结合使用:

from sklearn.neural_network import MLPRegressor
from sko.PSO import PSO
import numpy as np

# 定义一个函数,用于评估神经网络模型的性能
def demo_func(weights, biases):
    mlpr = MLPRegressor(hidden_layer_sizes=(10, 10), activation="relu", solver="lbfgs", learning_rate="invscaling", max_iter=20000)
    mlpr.coefs_ = [weights[:10], weights[10:20], weights[20:30]]
    mlpr.intercepts_ = [biases]
    y_pred = mlpr.predict(X_test)
    return mean_squared_error(y_test, y_pred)

# 初始化权重和偏置
n_particles = 40
n_iterations = 150
lb = [np.zeros(10), -1, 0.5]
ub = [np.ones(10), 1, 1]
w = 0.8
c1 = 0.5
c2 = 0.5

pso = PSO(func=demo_func, n_dim=3, pop=n_particles, max_iter=n_iterations, lb=lb, ub=ub, w=w, c1=c1, c2=c2)
pso.run()

# 获取优化后的权重和偏置
best_weights = pso.gbest_pos_
best_biases = pso.gbest_v_

# 使用优化后的权重和偏置创建并训练MLPRegressor模型
mlpr.coefs_ = best_weights[:10]
mlpr.intercepts_ = best_biases
mlpr.fit(X_train, y_train)

# 评估模型性能
train_predictions = mlpr.predict(X_train)
test_predictions = mlpr.predict(X_test)
print("Train RMSE:", np.sqrt(mean_squared_error(y_true=y_train, y_pred=train_predictions)))
print("Test RMSE:", np.sqrt(mean_squared_error(y_true=y_test, y_pred=test_predictions)))

在这个示例中,我们首先定义了一个名为demo_func的函数,该函数接受神经网络的权重和偏置作为输入,并返回模型在测试集上的性能。然后,我们使用PSO算法来优化这些权重和偏置,以最小化demo_func函数的值。最后,我们使用优化后的权重和偏置创建并训练MLPRegressor模型,并评估其在训练集和测试集上的性能。