【问题标题】:logistic regression predicts 1 for all samples逻辑回归预测所有样本为 1
【发布时间】:2020-09-22 08:07:13
【问题描述】:

我正在尝试使用如下数据训练逻辑回归模型: 分类变量:0 或 1 数值变量:8到20之间的连续数

我有 20 个数值变量,我想一次只使用一个用于预测模型,看看哪个是最好的特征。

我使用的代码是:

for variable in numerical_variable:
    X = data[[variable ]]
    y = data[categorical_variable]

    X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.20,random_state=0)

    logreg = LogisticRegression()
    logreg.fit(X_train, y_train)

    y_pred=logreg.predict(X_test)
    print(y_pred)

    cnf_matrix = metrics.confusion_matrix(y_test, y_pred)

    print("Accuracy:", metrics.accuracy_score(y_test, y_pred))
    print("Precision:", metrics.precision_score(y_test, y_pred))
    print("Recall:", metrics.recall_score(y_test, y_pred))

分类变量偏向1,大约有800个1到200个0。所以我认为这就是为什么它总是预测一个,不管测试样本(如果我不设置 random_state=0)和数值变量。 (使用python 3)

关于如何解决此问题的任何想法?

谢谢

【问题讨论】:

  • 您尝试过不同的采样方法吗?我会尝试 SRS 和其他方法。您的输入数据肯定看起来有偏差,但这应该没什么大不了的,因为 logR 应该从每个实体的属性中学习,而不是从数据集的元数据中学习。问题似乎出在 imo 输入层。
  • 谢谢,我会看看这个 - 我也尝试过使用 logreg =logisticRegression(class_weight = 'balanced') 这有帮助,现在有时也会预测到 0。与一切都是 1 时的准确度相似。
  • 很明显,该模型没有足够的数据来声明为 0(由于样本量小)。因为梯度下降总是试图最小化误差,所以您的模型说最好将所有内容猜测为 1,而不是给某些实体 0,因为它会降低整体准确度。这有意义吗?
  • 是的,这是有道理的,那么您是否仍然建议使用 SRS 和其他采样方法?
  • 好吧,您受到数据的限制。除非您有更多为 0 的样本,否则您将无能为力。但是,是的,不同的采样方法肯定会超过这个错误。

标签: python python-3.x scikit-learn logistic-regression prediction


【解决方案1】:

使用joblib 库来保存您的模型,

import joblib
your_model = LogisticRegression()
your_model.fit(X_train, y_train)
filename = 'finalized_model.sav'
joblib.dump(your_model, filename)

此代码会将您的模型保存为“finalized_model.sav”。扩展名无关紧要,即使你不写。

然后您可以通过此代码调用您的精确和固定模型,以始终进行相同的预测。

your_loaded_model = joblib.load('finalized_model.sav')

作为预测示例;

your_loaded_model.predict(X_test)

【讨论】:

  • 我不明白这对始终为 1 的预测有何帮助。
  • 完全误解了你的麻烦,以为你总是想进行相同的预测(没有不同的随机性),但如果你找到了问题的解决方案也没关系
猜你喜欢
  • 2020-06-26
  • 2019-03-05
  • 2019-06-07
  • 2021-12-27
  • 2021-05-12
  • 2019-10-01
  • 2021-02-27
  • 1970-01-01
  • 2022-11-27
相关资源
最近更新 更多