【问题标题】:ANN: keras/sklearn doesn't scale wellANN:keras/sklearn 不能很好地扩展
【发布时间】:2018-06-21 08:15:35
【问题描述】:

我不知道为什么我获得的结果不能很好地扩展。 正如您在下面的图片中看到的那样,缩放存在问题。

有两个问题:

  • 没有负值
  • 最大值预测存在问题

我不知道我为什么会遇到这些问题。 你知道我该如何解决这个问题吗?

非常感谢您的帮助

代码:

# Read inputs
X = dataset.iloc[0:20000, [1, 4, 10]].values
# Read output
y = dataset.iloc[0:20000, 5].values

# Splitting the dataset into the Training set and Test set
from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 0)

# Output matrix conversion
y_train = y_train.reshape(-1, 1)
y_test = y_test.reshape(-1, 1)

# Feature Scaling
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)

y_train = sc.fit_transform(y_train) 
y_test = sc.transform(y_test)

# Import the Keras libraries and package
from keras.models import Sequential
from keras.layers import Dense

# building model
classifier = Sequential()
classifier.add(Dense(activation="sigmoid", input_dim=3, units=64, kernel_initializer="uniform"))
classifier.add(Dense(activation="sigmoid", units=32, kernel_initializer="uniform"))
classifier.add(Dense(activation="sigmoid", units=16, kernel_initializer="uniform"))
classifier.add(Dense(activation="sigmoid", units=1, kernel_initializer="uniform"))
classifier.compile(optimizer='adam', loss='mean_squared_error', metrics=['accuracy'])

# Fitting the ANN to the training set
results = classifier.fit(X_train, y_train, batch_size=16, epochs=25)

# Predicting the Test set results
y_pred = classifier.predict(X_test)

【问题讨论】:

  • 您好,欢迎来到 StackOverflow。这个问题是关于分类问题而不是编程问题。 datascience.stackexchange.com 您可能会取得更大的成功
  • @Kirk 不错。有时间试试[so] (Stack Overflow)! ;-)

标签: python machine-learning keras scikit-learn neural-network


【解决方案1】:

如果您的蓝色曲线显示您的初始输出y,而您的橙色曲线显示您的模型的输出(您不想澄清这一点......),那么这里没有什么奇怪的......

最大值预测有问题

更仔细地查看您的代码,您会发现您实际上并没有将初始的y 输入到您的网络中,而是将其缩放 版本,即sc.transform() 的结果;因此,您的输出也会被缩放,您应该使用inverse_transform 方法将其恢复到初始比例:

y_final = sc.inverse_transform(y_pred)

顺便说一句,这现在会起作用,但一般来说,对两个不同的数据集(即您的 X 和 y)使用相同的缩放器(此处为 sc)并不是一个好主意 - 您应该定义两个不同的缩放器而是说sc_Xsc_y

没有负值

这是因为您在输出层中用作激活的sigmoid function 仅在 [0, 1] 中取正值,因此您可能希望将其更改为能够提供所需值范围的其他值(linear 是候选人),并且可能还将您的其他 sigmoid 更改为 tanh

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-27
    • 2010-11-28
    • 2015-10-13
    • 2011-11-18
    • 1970-01-01
    • 2015-09-19
    • 1970-01-01
    相关资源
    最近更新 更多