在scikit学习中扩展范围广泛的数据

时间:2018-12-06 10:41:36

标签: python scikit-learn

我正在尝试使用scikit learning中的MLPregressor,以便对一组260个示例(X,Y)进行非线性回归。一个示例由200个X要素和1个Y要素组成。

File containing X

File containing 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()

结果:

enter image description here 感谢您的帮助。

2 个答案:

答案 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之间)。 我得到了更好的结果,现在我的主要问题是选择正确的参数(层数,公差等),但这是另一个问题。