Neural network 如何处理MLPREGESSOR中简单(X,Y)数据的过拟合

Neural network 如何处理MLPREGESSOR中简单(X,Y)数据的过拟合,neural-network,perceptron,gridsearchcv,Neural Network,Perceptron,Gridsearchcv,解决 处理少量数据,以及处理带折叠的过度拟合[GridSearchCV] 如何从我的模型中得到更好的估计,我完全被难住了。似乎当我试图运行代码时,我得到了负精度。我如何提高交叉分数或测试分数,或任何你想称之为交叉分数或测试分数的东西,以便我能够更可靠地预测值 我尝试添加更多数据(从50到200+) 我尝试了随机参数(并意识到这是一种幼稚的方法) 我还尝试在功能上使用StandardScaler清理数据 有人有什么建议吗 from sklearn.neural_network import MLP

解决

处理少量数据,以及处理带折叠的过度拟合[GridSearchCV]

如何从我的模型中得到更好的估计,我完全被难住了。似乎当我试图运行代码时,我得到了负精度。我如何提高交叉分数或测试分数,或任何你想称之为交叉分数或测试分数的东西,以便我能够更可靠地预测值

我尝试添加更多数据(从50到200+)

我尝试了随机参数(并意识到这是一种幼稚的方法)

我还尝试在功能上使用StandardScaler清理数据

有人有什么建议吗

from sklearn.neural_network import MLPRegressor
from sklearn import preprocessing
import requests
import json
from calendar import monthrange
import numpy as np
from sklearn.model_selection import cross_val_score, GridSearchCV
from sklearn.preprocessing import scale


r =requests.get('https://www.alphavantage.co/query?function=TIME_SERIES_WEEKLY_ADJUSTED&symbol=W&apikey=QYQ2D6URDOKNUGF4')

#print(r.text)

y = json.loads(r.text)
#print(y["Monthly Adjusted Time Series"].keys())

keysInResultSet = y["Weekly Adjusted Time Series"].keys()
#print(keysInResultSet)

featuresListTemp = []
labelsListTemp = []

count = 0;

for i in keysInResultSet: 
    #print(i)
    count = count + 1;
    #print(y["Monthly Adjusted Time Series"][i])
    tmpList = []
    tmpList.append(count)
    featuresListTemp.append(tmpList)
    strValue = y["Weekly Adjusted Time Series"][i]["5. adjusted close"]
    numValue = float(strValue)
    labelsListTemp.append(numValue)


print("TOTAL SET")
print(featuresListTemp)
print(labelsListTemp)
print("---")

arrTestInput = []
arrTestOutput = []


print("SCALING SET")
X_train = np.array(featuresListTemp)
scaler = preprocessing.StandardScaler().fit(X_train)

X_train_scaled = scaler.transform(X_train)
print(X_train_scaled)


product_model = MLPRegressor()
#10.0 ** -np.arange(1, 10)

#todo : once found general settings, iterate through some more seeds to find one that can be used on the training

parameters = {'learning_rate': ['constant','adaptive'],'solver': ['lbfgs','adam'], 'tol' : 10.0 ** -np.arange(1, 4), 'verbose' : [True], 'early_stopping': [True], 'activation' : ['tanh','logistic'], 'learning_rate_init': 10.0 ** -np.arange(1, 4), 'max_iter': [4000], 'alpha': 10.0 ** -np.arange(1, 4), 'hidden_layer_sizes':np.arange(1,11), 'random_state':np.arange(1, 3)}
clf = GridSearchCV(product_model, parameters, n_jobs=-1)
clf.fit(X_train_scaled, labelsListTemp)
print(clf.score(X_train_scaled, labelsListTemp))
print(clf.best_params_)

best_params = clf.best_params_


newPM = MLPRegressor(hidden_layer_sizes=((best_params['hidden_layer_sizes'])), #try reducing the layer size / increasing it and playing around with resultFit variable
                                     batch_size='auto',
                                     power_t=0.5,
                                     activation=best_params['activation'],
                                     solver=best_params['solver'], #non scaled input
                                     learning_rate=best_params['learning_rate'],
                                     max_iter=best_params['max_iter'],
                                     learning_rate_init=best_params['learning_rate_init'],
                                     alpha=best_params['alpha'],
                                     random_state=best_params['random_state'],
                                     early_stopping=best_params['early_stopping'],
                                     tol=best_params['tol'])

scores = cross_val_score(newPM, X_train_scaled, labelsListTemp, cv=10, scoring='neg_mean_absolute_error')
print("Accuracy: %0.2f (+/- %0.2f)" % (scores.mean(), scores.std() * 2))

print(scores)
第63行及以下的输出

0.9142644531564619{‘激活’:‘逻辑’,‘阿尔法’:0.001,‘早期停止’:真,‘隐藏层大小’:7,‘学习率’: “常数”、“学习速率初始值”:0.1,“最大值”:4000, 'random_state':2,'solver':'lbfgs','tol':0.01,'verbose':True}

准确度:-21.91(+/-58.89)[-32.87854574-105.0632913
-22.89836453-7.33154414-22.387733819-3.3786339-1.7658796-3.78002866-4.78734308-14.81212738]


{'activation':'logistic','alpha':0.01','early_stopping':True,'hidden_layer_size':30,'learning_rate':'constant','learning_rate_init':0.1,'max_iter':4000,'random_state':2,'solver':'lbfgs','tol':0.1,'verbose':True}

{'activation':'tanh','alpha':0.01','early_stopping':True,'hidden_layer_size':99,'learning_rate':'constant','learning_rate_init':0.1,'max_iter':4000,'random_state':1,'solver':'lbfgs','tol':0.01,'verbose':True}

上述两种配置都适用于样本集。谢谢大家,如果有任何问题,请告诉我。这可以通过缩小所有其他参数来解决,即,不要使用10.0**-np.arange(1,3)而使用10.0**-np.arange(1,2)

到一个更有限的集合。开始删除您知道是正确的参数(很难做到,但可以学习_rate='constant',因为我注意到,我的所有最佳拟合都会导致学习速率保持不变,而不管其他参数如何

这主要用于时间优化,但在增加网络中的节点数时也有助于过度拟合。其思想是,在执行第一次网格搜索后,希望在不损失太多真函数的泛化属性的情况下,将拟合度提高N度

您应该开始网格搜索,确保隐藏节点的#介于输入节点的#和输出节点的#之间

找到合适的拟合后,可以通过增加节点数来改善拟合。您必须注意不要添加太多节点,以免失去true函数的泛化能力。在开始考虑放大之前,您必须开始降低参数的复杂性,以便在第二次网格搜索时,您将在更多的节点上执行该搜索,同时使用更通用的参数

上文描述了参数的泛化,第二次网格搜索考虑了初始搜索中更一般的参数,同时增加了网络节点

我知道这让人困惑,但正是它帮助我恰当地适应了这一点

对于任何挣扎的人,我都会努力 0)在执行搜索并获得合适的模型后进行概括 1) 在增加节点的第二次搜索中使用泛化 2) 放大时使用alpha参数(可以概括的其他参数) 3) 根据情况添加一些不同的种子或移除它们 4) 虽然改变tol将改变拟合,但它也高度依赖于迭代次数。因此,根据具体情况,合理的数字可能是.01或.001(合理的数字取决于您希望等待给定结果/机会收敛的迭代次数)。如果tol设置得太低,您将耗尽迭代次数,因为每个历元都不会有机会提前停止