为何用train_test_split训练的MLP分类结果全为100%?
人体活动识别模型异常完美分类结果的疑问
我用Sklearn的train_test_split和MLPClassifier做人体活动识别,数据集是包含6个数值特征(加速度计a_x、a_y、a_z,陀螺仪g_x、g_y、g_z)和activity标签(run、sit、walk)的DataFrame,共1469469行。
代码如下:
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))
输出的训练集和测试集classification_report各项指标全是1.00,不管调整训练集比例(0.1、0.25等),甚至只用加速度计特征,结果依旧完美。但手动拆分数据集时,测试集分类结果并非完美。作为机器学习新手,我疑惑为什么只用10%数据训练也会出现这种情况,是train_test_split使用有误吗?
问题排查方向
train_test_split本身的使用没有错误,出现这种极端完美的分类结果,大概率是数据或拆分逻辑的问题,具体可以从这几个方向排查:
- 特征与标签存在强区分性:不同活动的特征数值可能有绝对分界,比如
sit状态下的加速度z轴数值稳定在重力加速度附近,而run/walk的波动极大;或者陀螺仪在sit时几乎无变化,其他活动有明显波动。这种情况下哪怕用简单模型,也能轻松100%分类,和训练集大小无关。 - 手动拆分的逻辑有问题:
train_test_split默认会对数据做随机打乱再拆分,而你手动拆分时可能没做随机处理。比如数据集是按活动顺序排列的(先全是sit,再全是walk),手动取前10%当训练集就只包含sit样本,测试集是walk和run,模型自然无法正确分类;但随机拆分后训练集包含所有类别的样本,模型就能学好。 - 验证手动拆分的类别分布:确认手动拆分时是否保证了训练集和测试集的类别分布和随机拆分一致,有没有出现类别缺失、样本分布极端倾斜的情况。
内容的提问来源于stack exchange,提问作者JP1990
相关产品推荐
相关产品推荐

