【发布时间】:2018-12-14 18:21:57
【问题描述】:
我正在尝试使用来自 scikit learn 的 MLPregressor,以便对一组 260 个示例(X,Y)进行非线性回归。一个示例由 X 的 200 个特征和 Y 的 1 个特征组成。
如果直接绘制在一起,X 和 Y 之间的联系并不明显,但如果我们绘制 x=log10(sum(X)) 和 y=log10(Y),两者之间的联系几乎是线性的。 作为第一种方法,我尝试将我的神经网络直接应用于 X 和 Y,但没有成功。
我已经读到缩放会改善回归。在我的例子中,Y 包含的数据范围很广(从 10e-12 到 10e-5)。在计算误差时,当然 10e-5 比 10e-12 重得多。但我希望我的神经网络能够正确地近似两者。使用线性缩放时,假设来自 scikit learn 的 preprocessing.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 和 1 之间。然后,在对数刻度中出现错误会极大地增加正常刻度中的误差。我期待 scikit learn 有一些工具,但我找不到。
标签: python scikit-learn