บางทีแต่ทราบว่านี่คือหนึ่งในกรณีที่การเรียนรู้เครื่องไม่ได้คำตอบ มีแนวโน้มที่จะลองและการเรียนรู้ของเครื่องรองเท้าในกรณีที่จริงโซลูชั่นตามมาตรฐานกฎบึงจะเร็วขึ้นง่ายขึ้นและโดยทั่วไปก็เป็นทางเลือกที่เหมาะสม: 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% ของเวลา ฉันไม่สงสัยเลยว่ามันจะดีขึ้น แต่เมื่อฉันบอกว่านี่ไม่ใช่ usecase ฉันอยากจะแนะนำสำหรับ ML
แก้ไข 2 : จริง ๆ แล้วฉันวิ่งอีกครั้งในเช้านี้โดยใช้ RandomForestClassifier แบบสุ่มของ sklearn และมันทำงานได้ดีกว่ามาก
# 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% ของตัวอย่างที่มีการระบุค่าสูงสุดอย่างถูกต้องซึ่งค่อนข้างดีแน่นอน