在scikit learn中扩展宽范围数据

2024-10-04 01:36:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用scikit learn中的MLPrepressor对一组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重很多。但我希望我的神经网络能正确地逼近两者。当使用线性缩放时预处理.MinMaxScaler从scikit学习,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 谢谢你的帮助。你知道吗


Tags: inimport示例forlennppltscikit
2条回答

你可能想看看^{}。给出的例子应用对数变换作为预处理的一部分。你也可以对任意的数学函数这样做。你知道吗

我还建议尝试一个ReLU激活函数,如果你按对数缩放。在转换之后,你的数据看起来相当线性,所以它可能会收敛得更快一些,但这只是一种预感。你知道吗

我终于找到了一些有趣的东西,对我的案子很有效。 首先,我对Y使用了对数缩放,我认为当值的范围很宽(从10e-12到10e-5)时,它是最适合的缩放。目标在-5到-12之间。 其次,我关于缩放X的错误是对所有特征应用相同的缩放。假设我的X包含200个特征,然后除以所有例子中所有特征的最大值。我在这里的解决方案是,通过所有的例子,用所有feature1的最大值来缩放feature1,然后对所有的feature重新重复它。这给了我所有例子的feature1介于0和1之间,而不是以前少得多的(feature1可以在0和0.0001之间,我以前的缩放)。 我得到更好的结果,我现在的主要问题是选择正确的参数(层数,公差,…),但这是另一个问题。你知道吗

相关问题 更多 >