决策树模型测试准确率达100%,咨询潜在问题排查方向
决策树测试集准确率100%的问题排查
可能的问题及排查方向:
数据泄露导致的虚高准确率
你当前代码在划分训练/测试集之前就对整个数据集做了StandardScaler的拟合与转换,这会让测试集的统计信息(均值、方差)参与到特征缩放的计算中,相当于模型提前“看到”了测试集的信息,直接导致测试集预测结果失真。
同时要检查特征列里是否存在和目标变量depre_score强关联甚至直接决定标签的特征——比如如果某特征是抑郁评分的组成项,模型自然能完美预测。数据集本身存在异常
查看你打印的y_test和y_pred输出,确认测试集的标签是否为单一类别:如果是二分类任务,测试集全是0或全是1,准确率100%没有任何参考价值,这时候看recall_sensitivity和recall_specificity会出现一个为1、另一个无意义的情况。
另外检查数据集是否存在重复样本,若训练集和测试集包含完全相同的样本,决策树会直接记住这些样本,导致预测全对。决策树过拟合
默认参数的DecisionTreeClassifier没有任何剪枝操作,会完全拟合训练集的所有细节(包括噪声)。如果训练集和测试集分布高度相似,模型会把训练集的模式完全复制到测试集,从而得到100%准确率。可以尝试添加剪枝参数(如max_depth、min_samples_split)后重新训练,观察准确率变化。
修正后的代码示例(解决数据泄露+添加剪枝):
#split dataset in features and target variable feature_cols = ['RIAGENDR_0', 'RIDAGEYR', 'RIDRETH3_2', 'RIDRETH3_3', 'RIDRETH3_4', 'RIDRETH3_6', 'RIDRETH3_7', 'INDFMPIR', 'DMDMARTZ_1.0', 'DMDMARTZ_2.0', 'DMDMARTZ_3.0', 'DMDMARTZ_4.0', 'DMDMARTZ_6.0', 'DMDEDUC2', 'RFXT010', 'BMXWT', 'BMXBMI', 'URXUMA', 'LBDHDD', 'LBXFER', 'LBXGH', 'LBXBPB', 'LBXBCD', 'LBXBSE', 'LBXBMN', 'URXUBA', 'URXUCD', 'URXUCO', 'URXUCS', 'URXUMO', 'URXUMN', 'URXUPB', 'URXUSB', 'URXUSN', 'URXUTL', 'URXUTU'] X = data[feature_cols] # Features y = data['depre_score'] # Target variable # 先划分数据集,再做特征缩放 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1) # 70% training and 30% test scale = StandardScaler() X_train = scale.fit_transform(X_train) # 仅用训练集拟合scaler X_test = scale.transform(X_test) # 用训练集的scaler转换测试集 # 添加剪枝参数,避免过拟合 clf = DecisionTreeClassifier(max_depth=5, min_samples_split=10) clf = clf.fit(X_train,y_train) y_pred = clf.predict(X_test) print(y_test) print(y_pred) confusion = metrics.confusion_matrix(y_test, y_pred) print(confusion) print("Accuracy:",metrics.accuracy_score(y_test, y_pred)) recall_sensitivity = metrics.recall_score(y_test, y_pred, pos_label=1) recall_specificity = metrics.recall_score(y_test, y_pred, pos_label=0) print(recall_sensitivity, recall_specificity)
内容的提问来源于stack exchange,提问作者Xinrui Liu
相关产品推荐
相关产品推荐

