簡體   English   中英

有人可以幫助解釋為什么我的 MLP 不斷獲得完美的分類報告嗎?

[英]Can someone help explain why my MLP keeps on getting a perfect classification report?

我正在使用 Sklearn.train_test_split 和 sklearn.MLPClassifier 進行人類活動識別。 下面是我在 pandas df 中的數據集:


a_x a_y a_z g_x g_y g_z activity
0   3.058150    5.524902    -7.415221   0.001280    -0.022299   -0.009420   sit
1   3.065333    5.524902    -7.422403   -0.003514   -0.023764   -0.007289   sit
2   3.065333    5.524902    -7.422403   -0.003514   -0.023764   -0.007289   sit
3   3.064734    5.534479    -7.406840   -0.016830   -0.025628   -0.003294   sit
4   3.074910    5.548246    -7.408038   -0.023488   -0.025495   -0.001963   sit
... ... ... ... ... ... ... ...
246886  8.102990    -1.226492   -4.559391   -0.511287   0.081455    0.109515    run
246887  8.120349    -1.218711   -4.595306   -0.516480   0.089179    0.110047    run
246888  8.126933    -1.209732   -4.619848   -0.521940   0.096636    0.109382    run
246889  8.140102    -1.199556   -4.622840   -0.526467   0.102761    0.108183    run
246890  8.142496    -1.199556   -4.648580   -0.530728   0.109818    0.108050    run
1469469 rows × 7 columns

我正在使用 6 個數字列(來自加速度計和陀螺儀的 x、y、z)來預測活動(跑、坐、走)。 我的代碼看起來像

mlp=MLPClassifier(hidden_layer_sizes=(10,), activation='relu', solver='adam', learning_rate='adaptive', 
                 early_stopping=True, learning_rate_init=.001)

X=HAR.drop(columns='activity').to_numpy()
y=HAR['activity'].to_numpy()

X_train, X_test, y_train, y_test=train_test_split(X,y, train_size=0.10)

mlp.fit(X_train, y_train)
predictions_train=mlp.predict(X_train)
predictions_test=mlp.predict(X_test)

print("Fitting of train data for size (10,): \n",classification_report(y_train,predictions_train))
print("Fitting of test data for size (10,): \n",classification_report(y_test,predictions_test))

Output 是:

Fitting of train data for size (10,): 
               precision    recall  f1-score   support

         run       1.00      1.00      1.00     49265
         sit       1.00      1.00      1.00     49120
        walk       1.00      1.00      1.00     48561

    accuracy                           1.00    146946
   macro avg       1.00      1.00      1.00    146946
weighted avg       1.00      1.00      1.00    146946

Fitting of test data for size (10,): 
               precision    recall  f1-score   support

         run       1.00      1.00      1.00    441437
         sit       1.00      1.00      1.00    442540
        walk       1.00      1.00      1.00    438546

    accuracy                           1.00   1322523
   macro avg       1.00      1.00      1.00   1322523
weighted avg       1.00      1.00      1.00   1322523

我對 ML 比較陌生,但我想我理解過度擬合的概念,所以我想這就是這里發生的事情,但我不明白當它只在 10% 的數據集上接受訓練時它是如何過度擬合的? 此外,大概分類報告對於 X_train 數據應該始終是完美的,因為這就是 model 正在接受培訓的內容,對嗎?

無論我做什么,它總是為 X_test 數據生成完美的 classification_report,無論我訓練它的數據有多少(在本例中為 10,但我已經完成 25、5、33 等)。 我什至刪除了陀螺儀數據,只在加速度計數據上對其進行訓練,它仍然為每個精度、召回率和 F1 給出了完美的 1。

當我任意將原始數據集切成兩半並使用生成的 arrays 作為訓練和測試數據時,X_test 的預測並不完美,但每次我使用 sklearn.train_test_split 時,它都會返回一個完美的分類報告....所以我假設我我使用 train_test_split 的方式有問題嗎?

(這真的應該是一個評論,但我還沒有允許評論的聲譽。)

如果無法訪問數據進行嘗試,很難說。

我想知道在數據本身中,class 的分離是否真的很清楚,以至於分類器可以輕松區分。 (看起來只是看到你打印的值。如果你 plot 它們的分布非常不同並且分離得很好。所以公平地說,神經網絡是矯枉過正的,即使通過視覺繪圖我們也能夠清楚地區分不同的活動。)

您是否嘗試過較小的隱藏層大小,比如只有 1 或 2 個節點,或其他一些更簡單的分類器? 例如,設置了max_depth的決策樹小於 4,或者只是邏輯回歸 model。

你也試過分層: train_test_split(X,y, train_size=0.10, stratify=y)

我猜,我認為這只是一個非常簡單的數據集,因此分類器表現非常好,因為 class 分離非常清晰。 所以這與過度擬合無關。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM