Python Logistic回归的截距和系数不精确

Python Logistic回归的截距和系数不精确,python,pandas,data-modeling,logistic-regression,Python,Pandas,Data Modeling,Logistic Regression,我最近在大熊猫身上训练了一个逻辑回归模型,它运行得非常好。然后我对另一列尝试了同样的方法,但这次我得到了奇怪的系数,如果我用它们创建一个函数并输入随机输入,我就不能正确地得到输出 那么,让我现在更详细地解释一下。我首先清理数据,然后从integer类型中得到一列,它将成为我的目标列。因此,我对列进行变换,使所有值为1的单元格变为0,所有其他单元格(值大于1)变为1。这非常有效,如果我检查这些值(使用value_counts()),我在列中得到1.300.000 0-s,大约400.000 1-s

我最近在大熊猫身上训练了一个逻辑回归模型,它运行得非常好。然后我对另一列尝试了同样的方法,但这次我得到了奇怪的系数,如果我用它们创建一个函数并输入随机输入,我就不能正确地得到输出

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

另外,我将为帖子重命名我的专栏,以获得较短的名称和更简单的内容:

acc_data_for_modeling_2.head()
casualt将成为目标列。在这里,它仍然包含介于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)
此函数返回以下值,这意味着我们有更多的0-s作为输出:

0    1367268
1     413211
Name: num_of_casualties, dtype: int64
在获得系数和截距后,我创建函数来测试模型:

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。我认为这种模式在这种形式下是不可靠的


提前谢谢

y术语
48.99279695*num of_vehicles
在您的表达式中占主导地位,一旦您拥有两辆以上的汽车,您的功率变量就会低于-40。如果你用它的sigmoid,你会得到一个非常接近1的数字作为
exp(-40)=4.248354255291589e-18
,python会精确地四舍五入到1。

,但我不明白为什么会发生这种情况。对模型进行了训练,使得0是更可能的输出。我的代码中是否有任何错误,或者如何获得输出值=0。如果我总是得到1,那么这个模型肯定是不可靠的。也许可以检查一下用
predict
方法预测的模型Probba和你的函数预测的proba是否相同。数据集中的大多数观察确实涉及2-3辆车,但事故中只有1人伤亡,这对我们来说意味着建模数据集中的值应为0。我真的不明白为什么车辆的数量会有这么高的系数,从而使我的模型无效或不精确。我如何用预测方法做到这一点?试着用不同的正则化和class_权重进行实验。。。例如
model_2=logisticsregression(C=0.001,class\u weights='balanced')
!我仍然无法得到0值,但现在我的输出类似于0.2/0.3,这更容易接受。非常感谢。
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
more_than_1_casualty(1,1,0,0,1,1)
1.0