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