我有一个输入,它是一个列表,输出是输入列表中元素的最大值。
机器学习是否可以学习始终选择输入中存在的最大输入元素的功能?
这似乎是一个非常基本的问题,但它可能使我对机器学习通常可以做什么有所了解。谢谢!
我有一个输入,它是一个列表,输出是输入列表中元素的最大值。
机器学习是否可以学习始终选择输入中存在的最大输入元素的功能?
这似乎是一个非常基本的问题,但它可能使我对机器学习通常可以做什么有所了解。谢谢!
Answers:
也许可以,但是请注意,这是机器学习不能解决问题的情况之一。有一种趋势可以尝试将鞋拔式机器学习应用于真正基于标准规则的沼泽解决方案更快,更简单并且通常只是正确选择的情况:P
仅仅因为你可以,并不意味着你应该
编辑:我最初将其写为“是,但请注意...”,但随后开始怀疑自己,从未见过如此。我今天下午试用了它,当然可以实现:
import numpy as np
from keras.models import Model
from keras.layers import Input, Dense, Dropout
from keras.utils import to_categorical
from sklearn.model_selection import train_test_split
from keras.callbacks import EarlyStopping
# Create an input array of 50,000 samples of 20 random numbers each
x = np.random.randint(0, 100, size=(50000, 20))
# And a one-hot encoded target denoting the index of the maximum of the inputs
y = to_categorical(np.argmax(x, axis=1), num_classes=20)
# Split into training and testing datasets
x_train, x_test, y_train, y_test = train_test_split(x, y)
# Build a network, probaly needlessly complicated since it needs a lot of dropout to
# perform even reasonably well.
i = Input(shape=(20, ))
a = Dense(1024, activation='relu')(i)
b = Dense(512, activation='relu')(a)
ba = Dropout(0.3)(b)
c = Dense(256, activation='relu')(ba)
d = Dense(128, activation='relu')(c)
o = Dense(20, activation='softmax')(d)
model = Model(inputs=i, outputs=o)
es = EarlyStopping(monitor='val_loss', patience=3)
model.compile(optimizer='adam', loss='categorical_crossentropy')
model.fit(x_train, y_train, epochs=15, batch_size=8, validation_data=[x_test, y_test], callbacks=[es])
print(np.where(np.argmax(model.predict(x_test), axis=1) == np.argmax(y_test, axis=1), 1, 0).mean())
输出为0.74576,因此它正确地找到了最多74.5%的时间。我毫不怀疑可以对此进行改进,但是正如我说的那样,这不是我为ML建议的用例。
编辑2:实际上,今天早上我今天早上使用sklearn的RandomForestClassifier重新运行,它的性能明显更好:
# instantiation of the arrays is identical
rfc = RandomForestClassifier(n_estimators=1000, verbose=1)
rfc.fit(x_train, y_train)
yhat_proba = rfc.predict_proba(x_test)
# We have some annoying transformations to do because this .predict_proba() call returns the data in a weird format of shape (20, 12500, 2).
for i in range(len(yhat_proba)):
yhat_proba[i] = yhat_proba[i][:, 1]
pyhat = np.reshape(np.ravel(yhat_proba), (12500,20), order='F')
print(np.where(np.argmax(pyhat, axis=1) == np.argmax(y_test, axis=1), 1, 0).mean())
此处的分数是正确识别出的最大样本的94.4%,这的确是相当不错的。
@
,如中所述@Marco13
)。关于这个问题:我认为您的陈述“机器学习不是答案”清楚明了。我主要担心的是,太多的人在使用 ML / DL / NN 时没有进行适当的审查,特别是当他们遇到看起来像它的东西可以“解决他们的问题”时,却不理解为什么这样做,因此无法识别“解决方案”何时仅是一个不太了解的过程的人工产物。
是。 非常重要的是,您决定机器学习解决方案的体系结构。体系结构和培训过程不会自己编写;必须对它们进行设计或模板化,然后进行培训,作为发现适合一组数据点的体系结构参数化的一种方法。
您可以构建一个非常简单的体系结构,该体系结构实际上包括一个最大功能:
net(x) = a * max(x) + b * min(x)
其中a和b是学习的参数。
给定足够的训练样本和合理的训练例程,此非常简单的体系结构将很快学习将任务的a设置为1,将b设置为零。
机器学习通常采取以下形式:招待有关输入数据点特征化和变换的多个假设,并学习仅保留与目标变量相关的那些假设。假设在参数化算法中可用的体系结构和子功能中明确编码,或者在“无参数”算法中作为假设编码。
例如,香草神经网络ML中常见的使用点积和非线性的选择有些随意。它表达了一个包含性的假设,即可以使用线性变换和阈值函数的预定组成网络结构来构建函数。该网络的不同参数化体现了关于使用哪种线性变换的不同假设。可以使用任何功能工具箱,并且机器学习者的工作是通过区分或反复试验或某种其他可重复的信号来发现,其阵列中的功能或特征可以最大程度地减少错误度量。在上面给出的例子中,学习的网络只是简单地减少到最大功能本身,而未分化的网络可以替代地“学习”最小功能。这些函数可以通过其他方式表示或近似,如在另一个答案中的线性或神经网络回归函数中。总之,这实际上取决于ML体系结构工具箱中具有哪些功能或乐高积木。
max()
(从标记的数据中)找到(/学习/推断)类似的功能。他们没有说“ 鉴于您已经具有max()
构建基础”
是的-机器学习可以学习在数字列表中找到最大值。
这是学习查找最大值索引的简单示例:
import numpy as np
from sklearn.tree import DecisionTreeClassifier
# Create training pairs where the input is a list of numbers and the output is the argmax
training_data = np.random.rand(10_000, 5) # Each list is 5 elements; 10K examples
training_targets = np.argmax(input_data, axis=1)
# Train a descision tree with scikit-learn
clf = DecisionTreeClassifier()
clf.fit(input_data, targets)
# Let's see if the trained model can correctly predict the argmax for new data
test_data = np.random.rand(1, 5)
prediction = clf.predict(test_data)
assert prediction == np.argmax(test_data) # The test passes - The model has learned argmax
这是我的评论的扩展。首先,@ DanScally绝对正确,因为没有理由使用ML来查找列表的最大值。但是我认为您的“它可能使我大致了解机器学习可以做什么”是研究此问题的充分理由。
在排序列表中。要完成argmax,只需设置此层的阈值即可。
在这一点上,如果我们可以相乘,我们将很容易获得实际的最大值。本文中的解决方案是使用数字的二进制表示形式,此时二进制乘法与阈值加法相同。仅获取argmax,只要有一个简单的线性函数就可以将第个指标乘以并求和。我我
最后,对于接下来的问题:我们能否将NN训练到这种状态。@DanScally让我们开始了;也许知道理论架构可以帮助我们欺骗解决方案?(请注意,如果我们可以学习/近似上述特定权重,则该网络实际上将在训练样本范围之外表现良好。)
稍微改变一下,我会获得更好的测试分数(0.838),甚至在原始训练范围之外的样本上进行测试也可以获得不错的分数(0.698)。使用缩放为输入测试分数最高为0.961,超出范围的分数为0.758。但是,我使用与@DanScally相同的方法来评分,这似乎有点不诚实:身份函数将在该指标上得分完美。我还打印了一些系数,以查看是否有任何与上述精确拟合相近的东西出现(不是真的)。以及一些原始输出,这表明模型在预测最大值时过于胆小,而在预测输入都不是最大值的方面就犯了错误。也许修改目标可能会有所帮助,但是到目前为止,我已经花了太多时间。如果有人愿意改进这种方法,请随时玩(如果愿意,可以在Colab中玩),并告诉我。