chelseaNB1 2023-08-28 21:36 采纳率: 75.7%
浏览 18
已结题

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

  • 写回答

8条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2023-08-28 22:55
    关注

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

    可以用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库。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 8月29日
  • 修改了问题 8月28日
  • 创建了问题 8月28日

悬赏问题

  • ¥20 数据分析出错了,希望有能人看看,解决一下
  • ¥15 尝试访问%1服务的windows注册表时遇到问题。必须先解决此问题,然后才能运行安装过程。(请确认您正在使用管理员权限运行)373
  • ¥15 (关键词-运算放大器)
  • ¥15 关于#游戏策划#的问题:当浏览器输入兑换码,疯狂点击领取按钮,邮箱马上到账几十个兑换码礼包
  • ¥15 虚拟机打不开,怎么解决
  • ¥15 为什么游戏兑换码能被重复领取
  • ¥30 (急!)java实现二叉链表构建二叉树,实现相关功能
  • ¥15 C#tekloa节点插件小项
  • ¥20 脑电信号的局部场电位分析
  • ¥30 Diodes 霍尔开关AH337已经obselete,他的升级替代料【不改变现有电路图】