我正在尝试使用scikit learning中的MLPregressor,以便对一组260个示例(X,Y)进行非线性回归。一个示例由200个X要素和1个Y要素组成。
如果直接绘制在一起,X和Y之间的链接并不明显,但是如果绘制x = log10(sum(X))和y = log10(Y),则两者之间的链接几乎是线性的。 作为第一种方法,我尝试将神经网络直接应用到X和Y上,但没有成功。
我读到缩放会改善回归。就我而言,Y包含范围很广的值(从10e-12到10e-5)的数据。计算误差时,当然10e-5的权重比10e-12的权重大得多。但是我希望我的神经网络能够正确地将两者近似。当使用线性缩放时,可以说preprocessing.scikit的MinMaxScaler学习10e-8〜-0.99和10e-12〜-1。因此,我失去了目标的所有信息。
我的问题是:我可以使用哪种缩放比例来获得一致的结果? 我发现的唯一解决方案是应用log10(Y),但错误当然会成倍增加。
我能得到的最好的是下面的代码:
from sklearn.neural_network import MLPRegressor
from sklearn.svm import SVR
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams["figure.figsize"]=(20,10)
freqIter=[]
for i in np.arange(0,0.2,0.001):
freqIter.append([i,i+0.001])
#############################################################################
X = np.zeros((len(learningFiles),len(freqIter)))
Y = np.zeros(len(learningFiles))
# Import X: loadtxt()
# Import Y: loadtxt
maxy = np.amax(Y)
Y *= 1/maxy
Y = Y.reshape(-1, 1)
maxx = np.amax(X)
X *= 1/maxx
#############################################################################
reg = MLPRegressor(hidden_layer_sizes=(8,2), activation='tanh', solver='adam', alpha=0.0001, learning_rate='adaptive', max_iter=10000, verbose=False, tol = 1e-7)
reg.fit(X, Y)
#############################################################################
plt.scatter([np.log10(np.sum(kou*maxx)) for kou in X],Y*maxy,label = 'INPUTS',color='blue')
plt.scatter([np.log10(np.sum(kou*maxx)) for kou in X],reg.predict(X)*maxy,label='Predicted',color='red')
plt.grid()
plt.legend()
plt.show()
结果:
感谢您的帮助。
答案 0 :(得分:0)
您可能想看看FunctionTransformer
。给出的示例将对数转换用作预处理的一部分。您也可以对任意数学函数执行此操作。
如果您对数扩展,我还建议尝试使用ReLU激活功能。转换后,您的数据看起来相当线性,因此收敛速度可能会更快一些-但这只是预感。
答案 1 :(得分:0)
我终于找到了一些有趣的东西,可以很好地解决我的问题。 首先,我对Y使用了对数缩放。我认为,当值的范围非常大时(例如我的(从10e-12到10e-5)),这是最适合的缩放。然后目标在-5到-12之间。 其次,我关于缩放X的错误是对所有要素应用相同的缩放。假设我的X包含200个特征,然后除以所有示例的所有特征的最大值。我在这里的解决方案是在所有示例中按最大Feature1的最大比例缩放feature1,然后对所有功能重用它。对于所有示例,这使我的Feature1在0到1之间,而不是以前的更少(在我以前的缩放比例下,feature1可以介于0和0.0001之间)。 我得到了更好的结果,现在我的主要问题是选择正确的参数(层数,公差等),但这是另一个问题。