测试不同机器学习模型时预测结果完全一致的问题求助
嘿,我一看你的问题和代码片段,首先想到几个最可能的原因,咱们一步步来排查:
最可能的元凶:你在用训练集做预测
看你代码里的这行:
predictedDTC_Dog = modelDTC_Dog.predict(df_Dog_X)
你用的是训练模型时的同一套数据df_Dog_X来做预测!对于决策树来说,它会完美拟合训练数据(除非你加了深度、样本分割数这类限制);如果逻辑回归和随机森林也用训练集预测,再加上如果你的数据标签分布极端,很容易出现所有模型预测结果完全一致的情况。
解决办法:立刻拆分训练集和测试集
用train_test_split把数据分成「训练用的子集」和「测试用的独立子集」,模型在训练集上学规律,在测试集上验证效果,这样才能看到不同模型的真实差异:
from sklearn.model_selection import train_test_split # 按8:2拆分训练/测试集,random_state保证结果可复现 X_train, X_test, y_train, y_test = train_test_split(df_Dog_X, df_Dog_y, test_size=0.2, random_state=42) # 重新训练并预测(以三个模型为例) # 决策树 from sklearn import tree modelDTC_Dog = tree.DecisionTreeClassifier(criterion='gini') modelDTC_Dog.fit(X_train, y_train) predictedDTC_Dog = modelDTC_Dog.predict(X_test) # 逻辑回归 from sklearn.linear_model import LogisticRegression modelLR_Dog = LogisticRegression(max_iter=1000) # 增加迭代次数避免不收敛 modelLR_Dog.fit(X_train, y_train) predictedLR_Dog = modelLR_Dog.predict(X_test) # 随机森林 from sklearn.ensemble import RandomForestClassifier modelRF_Dog = RandomForestClassifier(random_state=42) modelRF_Dog.fit(X_train, y_train) predictedRF_Dog = modelRF_Dog.predict(X_test)
其他可能的原因及排查步骤
如果拆分数据集后还是结果一致,那咱们继续查:
1. 目标变量(df_Dog_y)分布极端不平衡
比如99%的样本都是「被领养」或者「未被领养」,那所有模型都会优先预测占比最高的类别,自然结果一致。
排查代码:
print("目标变量类别占比:") print(df_Dog_y.value_counts(normalize=True))
如果确实不平衡,可以给模型加class_weight='balanced'参数,或者用SMOTE这类方法做数据增强。
2. 特征完全没有区分度
如果你的df_Dog_X里的特征都是常量(比如所有样本的「动物类型」都是狗),或者和目标变量完全不相关,那所有模型都学不到有效规律,只能做出相同的默认预测。
排查代码(以决策树特征重要性为例):
import pandas as pd # 查看决策树的特征重要性 feature_importance = pd.DataFrame({ '特征名称': df_Dog_X.columns, '重要性': modelDTC_Dog.feature_importances_ }).sort_values('重要性', ascending=False) print(feature_importance)
如果所有特征的重要性都接近0,那你得重新选特征或者构造新特征(比如把「收容时长」「动物年龄」这类变量做处理)。
3. 模型参数设置过于保守
比如你给决策树设了max_depth=1,给逻辑回归加了极强的正则化C=0.001,给随机森林设了n_estimators=1,这些极端参数会让模型的拟合能力被严重限制,导致它们的决策边界高度相似。
解决办法:放开参数限制,比如给决策树设max_depth=5,逻辑回归用默认C=1.0,随机森林设n_estimators=100,再试试效果。
内容的提问来源于stack exchange,提问作者ChanChunky

