我的数据经筛选后是96行7列,神经网络建模的时候怎么寻找最佳参数?
现在建模的效果很差很差,怎么进行调整
数据概况,第一列为y,601个特征筛选后还有7个特征用于神经网络建模
#MSC处理后进行特征波段筛选
###1.数据读入
#导入pandas读取数据
import warnings
warnings.filterwarnings("ignore")
import pandas as pd
import numpy as np
from sklearn import metrics
from sklearn.neural_network import MLPRegressor
from sklearn.model_selection import train_test_split,GridSearchCV
from sklearn.preprocessing import StandardScaler
#读取数据
data = pd.read_excel("./data/XZQ集装箱3-1MSC.xlsx")
#print(data[:5]) #前五行
###2.数据分离
#m * n
#print("数据矩阵 data.shape:",data.shape)
#50个样本,600个波段第一列是桃子糖度值,需要分离开
X = data.values[:,1:] #切片,得x,行全要,列从第二列开始
y = data.values[:,0] #切片,得y,行全要,列拿第一列
#print(f"X.shape:{X.shape}, y.shape:{y.shape}")
###3.导入SPA
#导入SPA包
import SPA
#导入spa对象
spa = SPA.SPA()
#print(X[1,:5]) #随便拿取数据看看效果,X得第二行前五列数据
#print(X_[1,:5])
#建模集测试集分割
#若存在运行后出现波段选择为最小值可适当调整建模集与测试集比例,test_size值0.3 - 0.5
Xcal, Xval, ycal, yval = train_test_split(X, y, test_size=0.3, random_state=0)
#print(Xcal.shape,Xval.shape)
###4.建模筛选
#m_max默认为50(Xcal样本大于52),如果Xcal(m*n) m < 50 m_max=m-2
var_sel, var_sel_phase2 = spa.spa(
Xcal, ycal, m_min=2, m_max=28,Xval=Xval, yval=yval, autoscaling=1)
###5.导出波段
#导出筛选光谱波段
#spa返回的是列号,并不是光谱数据
#获取波段列表
absorbances = data.columns.values[1:]
#print("波段(前5个)",absorbances[:5])
#spa筛选出的波段
print("spa 筛选出的波段:",absorbances[var_sel])
#导出筛选波段光谱数据
X_select = X[:,var_sel]
print("X_select.shape:",X_select.shape)
#print(X_select)
#建立神经网络预测模型
#划分训练测试集
train_x,test_x,train_y,test_y = train_test_split(X_select,y,test_size=0.3, random_state=1)
#没有标准化
mlpr1 = MLPRegressor(solver='sgd',learning_rate="adaptive",max_iter=1000,alpha=1e-5, hidden_layer_sizes=(5,2), random_state=1)
mlpr1.fit(train_x,train_y)
#计算在训练集和测试集上的预测均方根误差
mlpr1_lab = mlpr1.predict(train_x)
mlpr1_pre = mlpr1.predict(test_x)
print("训练集上的均方根误差:",metrics.mean_squared_error(train_y,mlpr1_lab))
print("测试集上的均方根误差:",metrics.mean_squared_error(test_y,mlpr1_pre))
print(metrics.r2_score(test_y,mlpr1_pre))
#有标准化
std = StandardScaler()
train_x_s = std.fit_transform(train_x)
test_x_s = std.transform(test_x)
mlpr2 = MLPRegressor(solver='sgd',learning_rate="adaptive",max_iter=1000,alpha=1e-5, hidden_layer_sizes=(5,2), random_state=1)
mlpr2.fit(train_x_s,train_y)
#计算均方根误差
mlpr2_lab = mlpr2.predict(train_x_s)
mlpr2_pre = mlpr2.predict(test_x_s)
print("训练集上的均方根误差:",metrics.mean_squared_error(train_y,mlpr2_lab))
print("测试集上的均方根误差:",metrics.mean_squared_error(test_y,mlpr2_pre))
print(metrics.r2_score(test_y,mlpr2_pre))
目前的效果
当我使用标准化后的数据进行网格搜索时,一直提示“ConvergenceWarning: Stochastic Optimizer: Maximum iterations (800) reached a...”模型未收敛。第一次使用神经网络,不知道怎么初设参数
###网格搜索
# pipe_MLPR = Pipeline([
# ("MLPR",MLPRegressor())]) #KNN分类操作
# hid1 = np.arange(2,52,2)
# hid2 = np.arange(2,52,2)
# xx,yy = np.meshgrid(hid1,hid2)
# hls = [(x,y) for x,y in zip(xx.flatten(),yy.flatten())]
# para_grid = [{
# "MLPR__solver":['sgd','adam','lbfgs'],
# "MLPR__activation":['identity', 'logistic', 'tanh', 'relu'],
# "MLPR__learning_rate":['constant','invscaling', 'adaptive'],
# "MLPR__max_iter":[4000,5000,6000],
# "MLPR__hidden_layer_sizes":hls,
# "MLPR__batch_size":[32,64,128]
# }]
# gs_MLPR_ir = GridSearchCV(estimator=pipe_MLPR,param_grid=para_grid,cv=5,n_jobs=4) #模型
# gs_MLPR_ir.fit(train_x_s,train_y)
# print(gs_MLPR_ir.best_params_)
# HEIHEIHEI = gs_MLPR_ir.best_estimator_ #获取最好的模型并保存
# prey = HEIHEIHEI.predict(test_x_s)
# print("R2:",metrics.r2_score(test_y,prey))
来自GPT的回答:
要寻找神经网络回归模型的最佳参数,可以尝试以下方法:
网格搜索(Grid Search):使用GridSearchCV函数进行参数网格搜索。指定要搜索的参数范围,然后通过交叉验证评估每个参数组合的性能。选择使性能最好的参数组合作为最佳参数。
例如,可以使用GridSearchCV函数搜索神经网络的隐藏层大小和学习率等参数,如下所示:
python
Copy code
parameters = {'hidden_layer_sizes': [(5, 2), (10, 2), (5, 5)], 'learning_rate': ['constant', 'adaptive']}
mlpr = MLPRegressor(solver='sgd', max_iter=1000, alpha=1e-5, random_state=1)
grid_search = GridSearchCV(mlpr, parameters)
grid_search.fit(train_x, train_y)
best_params = grid_search.best_params_
print("最佳参数:", best_params)
随机搜索(Randomized Search):与网格搜索类似,但是随机搜索在给定的参数范围内随机选择一组参数组合进行评估,而不是遍历所有可能的组合。
可以使用RandomizedSearchCV函数进行随机搜索,使用方法类似于网格搜索。
调整隐藏层大小和层数:尝试不同的隐藏层大小和层数的组合。增加隐藏层大小和层数可能会增加模型的复杂度,提高拟合能力,但也可能导致过拟合。通过尝试不同的组合,找到适合数据集的最佳参数。
调整学习率和迭代次数:尝试不同的学习率和迭代次数的组合。较小的学习率可以使模型收敛得更慢,但可能会获得更好的性能。较大的学习率可能会导致模型不稳定。适当调整学习率和迭代次数,找到最佳参数。
特征标准化:对输入特征进行标准化,可以使模型更稳定和收敛更快。可以使用StandardScaler等工具对特征进行标准化。
通过尝试不同的参数组合和调整模型的复杂度,你可以找到适合你的数据集的最佳参数组合。注意,参数搜索可能是一个耗时的过程,因此可以考虑使用并行化技术(如多线程或分布式计算)来加快搜索过程。
数据缺失值,异常值有没有检查过,还有特征与目标变量的关系,增加交叉验证,数据集可以再多一点
提高表格数据上的建模效果给你点建议:
建议你调整下
我们知道输出一个值的结果时,y是对象每个属性的线性组合。当输出结果为向量y时,y的每个分量,是对象每个属性的线性组合。而对象属性组合成y 的每个分量时的权重系数是相互独立的。所以在输出结果为向量时,也就是先求出组合成y的第一个分量的系数,再求出第2个分量的组合系数。只是多做了几遍求解罢了。所以你看教程中看到的基本都是输出单个值y的情况。
当输出结果y为向量时,是使用矩阵同时对多组系数进行求解,而不是使用向量一个分量一个分量的求解。
回答部分参考、引用ChatGpt以便为您提供更准确的答案: 根据您的描述,您正在使用Python神经网络回归模型进行建模,并希望找到最佳参数。您的数据经过特征筛选后,包括96行和7列,其中第一列为目标变量(y),剩下的7个特征用于神经网络建模。目前建模效果很差,您想了解如何调整数据以改善结果。
在寻找最佳参数和调整数据以优化神经网络回归模型的效果时,可以考虑以下几点:
根据您提供的代码,您已经开始了模型的构建和评估过程。您可以尝试以上提到的方法来调整参数、处理数据和评估模型的性能,以改善模型的效果。