【发布时间】: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