Vielleicht , aber beachten Sie, dass dies einer der Fälle ist, in denen maschinelles Lernen nicht die Antwort ist . Es besteht die Tendenz, maschinelles Lernen in Fällen zu versuchen, in denen regelbasierte Standardlösungen tatsächlich schneller, einfacher und im Allgemeinen genau die richtige Wahl sind: P
Nur weil Sie können, heißt das nicht, dass Sie sollten
Bearbeiten : Ich schrieb ursprünglich als "Ja, aber beachten Sie, dass ...", aber dann fing an, mich selbst zu bezweifeln, da ich es noch nie gesehen hatte. Ich habe es heute Nachmittag ausprobiert und es ist auf jeden Fall machbar:
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())
Die Ausgabe ist 0.74576, sodass die maximalen 74,5% der Zeit korrekt ermittelt werden. Ich habe keinen Zweifel, dass dies verbessert werden könnte, aber da ich sage, dass dies kein nützlicher Fall ist, würde ich ML empfehlen.
EDIT 2 : Eigentlich habe ich heute Morgen mit dem RandomForestClassifier von sklearn erneut gestartet und es lief deutlich besser:
# 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())
Und hier sind es 94,4% der Proben, bei denen das Maximum korrekt identifiziert wurde, was in der Tat ziemlich gut ist.