【问题标题】:Intercept and coefficients of Logistic Regression are not preciseLogistic回归的截距和系数不精确
【发布时间】:2019-07-23 13:14:14
【问题描述】:

我最近在 Pandas 中使用逻辑回归训练了一个模型,它运行良好。然后我对另一列进行了同样的尝试,但是这次我得到了奇怪的系数,如果我用它们创建一个函数并输入随机输入,我就不能正确地得到输出。

所以,现在让我更详细地解释一下。我首先清理我的数据,我有一个整数类型的列,这将是我的目标列。出于这个原因,我转换列,使所有值为 1 的单元格变为 0,所有其他单元格(值大于 1)变为 1。这很完美,如果我检查值(使用 value_counts())我得到 1.300列中的 .000 0-s 和大约 400.000 1-s。这分别意味着之后的建模我应该更频繁地得到一个 0 作为输出。 然后我对数据进行建模并得到我的截距和系数。我使用它们创建了一个函数,但是当我开始输入时,我总是得到一个 1 作为输出。即使我输入了应该有助于输出 = 0 的输入,我仍然得到 1 的输出。我做错了什么吗?我知道模型有 77% 的准确率,但它仍然应该返回 0-s :D

P.S 我将为帖子重命名我的专栏以获得更短的名称并更容易:

acc_data_for_modeling_2.head()

受害者将成为目标列。这里它仍然包含 1 到 87 之间的值。

             vehicles   casualt light_cond  Fatal Serious Slight Urban
Accident_Index                          
200501BS00001      1        1      1          0      1      0      1
200501BS00002      1        1      0          0      0      1      1
200501BS00003      2        1      0          0      0      1      1
200501BS00004      1        1      1          0      0      1      1
200501BS00005      1        1      0          0      0      1      1

现在我将更改它并将列转换为布尔数值:

acc_data_for_modeling_2.casual = np.where(acc_data_for_modeling_2.casualt>1, 1,0)
acc_data_for_modeling_2["num_of_casualties"].value_counts()

此函数返回以下内容,这意味着我们有更多的 0-s 作为输出。:

0    1367268
1     413211
Name: num_of_casualties, dtype: int64
acc_data_target_2 = acc_data_for_modeling_2.casualt
acc_data_features_2 = acc_data_for_modeling_2.drop("casualt", axis=1)
acc_data_features_scaled_2 = scaler.fit_transform(acc_data_features_2)
acc_data_scaled_2 = scaler.fit_transform(acc_data_for_modeling_2)
features_train_2, features_test_2, target_train_2, target_test_2 = train_test_split(
    acc_data_features_scaled_2, acc_data_target_2, train_size = 0.7, test_size=0.3, random_state=42)
model_2 = LogisticRegression()
model_2.fit(features_train_2, target_train_2)
accuracy_2 = model_2.score(features_test_2, target_test_2)
print(accuracy_2)

0.7729806943445963
model_2.intercept_

array([-0.76128204])
model_2.coef_

array([[48.99279695, -0.22751056,  0.26471774, -0.37005559, -0.65594413,
        -0.56159163]])

得到系数和截距后,我创建了我的函数来测试模型:

def more_than_1_casualty(num_of_vehicles, light_cond,accident_severity_Fatal, accident_severity_Serious, 
                         accident_severity_Slight, urban_or_rural_area_Urban):
    power = (-(-0.76128204 + 48.99279695*num_of_vehicles -0.22751056*light_cond
               +0.26471774*accident_severity_Fatal  -0.37005559*accident_severity_Serious 
               -0.65594413*accident_severity_Slight -0.56159163*urban_or_rural_area_Urban))

    result = 1/(1+np.exp(power))

    return result

然后我输入一些输入,下面的情况应该更可能返回输出 0,但是...:

more_than_1_casualty(1,1,0,0,1,1)
1.0

我希望有时会得到输出值 0 而不仅仅是 1。我认为这个模型在这种形式下是不可靠的。

提前致谢!

【问题讨论】:

  • 尝试尝试不同的正则化和类权重...例如model_2 = LogisticRegression(C=0.001, class_weights='balanced')
  • 这成功了!我仍然无法获得 0 值,但现在我的输出类似于 0.2/0.3,这更容易接受。谢谢!

标签: python pandas data-modeling logistic-regression


【解决方案1】:

48.99279695*num_of_vehicles 一词在您的表达中占主导地位,一旦您拥有两辆以上的汽车,您的功率变量就会低于 - 40。如果您采用 sigmoid,您会得到一个非常接近 1 的数字,例如 exp(-40) = 4.248354255291589e-18,python 会将四舍五入为 1。

【讨论】:

  • 没错,但我不明白为什么会发生这种情况。该模型已经过训练,因此 0 是更可能的输出。我的代码有什么问题吗,或者我怎样才能得到输出值 = 0。如果我总是得到 1,那么这个模型肯定不可靠。
  • 也许检查predict方法预测的模型概率和你的函数预测的概率相同。
  • 数据集中的大部分观察确实涉及 2-3 辆汽车,但事故中只有 1 人伤亡,这对我们来说应该意味着数据集中用于建模的值应该是 0 . 我真的不明白为什么车辆的数量会得到如此高的系数,从而使我的模型无效或不精确。
  • 如何使用 predict 方法做到这一点?
猜你喜欢
  • 2022-08-06
  • 2019-02-12
  • 2020-09-12
  • 1970-01-01
  • 1970-01-01
  • 2020-08-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多