You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Logistic回归警告问题:验证rfq_num_of_dealers是否为Done交易的显著预测因子

解决Logistic回归警告并验证特征显著性

Hey there! Let's break down how to fix that UndefinedMetricWarning and verify if rfq_num_of_dealers is a significant predictor for the Done transaction status.

1. 理解警告的根源

那个警告提示你:模型对某个类别(比如Done=1或者Done=0)没有做出任何预测,导致精确率和F1分数无法计算,被迫设为0.0。最常见的原因是数据不平衡(比如Done=1的样本占比极低),或者你的特征rfq_num_of_dealers和目标变量的相关性太弱,模型学不到有效区分模式,只能一直预测占比高的类别。

2. 先做数据探索,摸清特征与目标的关系

你已经开始用groupby分析了,先把代码补全,看看不同rfq_num_of_dealers下Done的分布情况:

import pandas as pd

# 完成分组统计
df_Train_Test_GrpBy = df_Train_Test.groupby(['rfq_num_of_dealers','Done']).size().reset_index(name='Count')

# 查看Done的整体分布(判断是否不平衡)
print("Done类别分布:")
print(df_Train_Test['Done'].value_counts(normalize=True))

# 查看每个rfq_num_of_dealers对应的Done比例
print("\n不同经销商数量下的Done占比:")
print(pd.crosstab(df_Train_Test['rfq_num_of_dealers'], df_Train_Test['Done'], normalize='index'))

从输出里你能直观看到:是不是某些经销商数量对应的Done交易特别少?或者整体Done=1的样本就很少?这能帮你定位警告的直接原因。

3. 验证rfq_num_of_dealers的预测显著性

要验证特征是否显著,统计推断类工具(比如statsmodels)比scikit-learn更直接,因为它会输出系数的p值——这是判断统计显著性的核心指标:

import statsmodels.api as sm

# 给特征加截距项(statsmodels默认不含截距)
X = df_Train_Test['rfq_num_of_dealers']
X = sm.add_constant(X)
y = df_Train_Test['Done']

# 拟合逻辑回归模型
logit_model = sm.Logit(y, X)
result = logit_model.fit()

# 输出模型摘要,重点看rfq_num_of_dealers的P>|z|值
print(result.summary())

在输出的摘要表格里,找到rfq_num_of_dealers那一行:

  • 如果P>|z|值小于0.05,说明这个特征是Done的显著预测因子;
  • 如果p值远大于0.05,说明该特征和Done的关联没有统计显著性。

如果你更习惯用scikit-learn,可以用置换重要性来验证特征的显著性:

from sklearn.linear_model import LogisticRegression
from sklearn.inspection import permutation_importance
from sklearn.model_selection import train_test_split

X = df_Train_Test[['rfq_num_of_dealers']]
y = df_Train_Test['Done']

# 划分训练测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 用class_weight解决数据不平衡问题(避免模型只预测多数类)
model = LogisticRegression(class_weight='balanced')
model.fit(X_train, y_train)

# 计算置换重要性,附带p值
perm_importance = permutation_importance(model, X_test, y_test, n_repeats=10, random_state=42)

print(f"rfq_num_of_dealers的平均重要性:{perm_importance.importances_mean[0]:.4f}")
print(f"显著性p值:{perm_importance.pvalues[0]:.4f}")

同样,p值<0.05意味着特征的重要性是显著的。

4. 解决UndefinedMetricWarning

结合上面的分析,解决警告的核心是让模型能预测到两个类别:

  • 如果是数据不平衡:用class_weight='balanced'(如上面的scikit-learn代码),或者对少数类做过采样(比如SMOTE)、对多数类做欠采样;
  • 如果是特征相关性弱:可以考虑补充其他特征,或者重新确认该特征本身是否真的和Done有关联;
  • 换用更适合不平衡数据的评估指标:比如AUC-ROC、召回率,这些指标不受类别不平衡的影响:
    from sklearn.metrics import roc_auc_score
    
    # 计算AUC-ROC
    y_pred_proba = model.predict_proba(X_test)[:, 1]
    print(f"AUC-ROC分数:{roc_auc_score(y_test, y_pred_proba):.4f}")
    

内容的提问来源于stack exchange,提问作者Peter Lucas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:05:34