我使用stats.models
运行了Logit模型,并声明了具有预测值的序列:
M1 = sm.Logit(y_train, X_train)
M1_results = M1.fit()
y_pred = M1_results.predict(X_train) # This returns a series
y_pred
是一个介于0到1之间的值的序列。我想通过将它们与任意截止值进行比较来有条件地覆盖其值。
基本上,如果M1_pred <= 0.7
的第i- 个元素被0
覆盖。否则,请用1
覆盖。
我尝试将for
和if
循环组合在一起:
for i in y_pred:
if i <= 0.7:
i = 0
else:
i = 1
这怎么没覆盖y_pred
中的任何值?
我不得不求助于切片(如建议here):
y_pred[y_pred <= 0.7] = 0
y_pred[y_pred > 0.7] = 1
当我转向多类模型时,这将带来不便。如何使用for
和if
表示法获得相同的结果?
PS:不好意思。我最近从R转到了Python,一切真的很混乱。
答案 0 :(得分:1)
如果y_pred
是列表的实例,则可以使用enumerate函数对带有索引的列表进行迭代。这样您就可以通过列表中的索引设置项目的值。
代码:
for i, item in enumerate(y_pred):
if item <= 0.7:
y_pred[i] = 0
else:
y_pred[i] = 1
或者您可以使用这种单线:
y_pred = [0 if item <= 0.7 else 1 for item in y_pred]
或更简单:
y_pred = [int(item > 0.7) for item in y_pred]
答案 1 :(得分:1)
here说明了您尝试执行的操作无效的原因。基本上,您无法修改要循环的元素。
要遵循for
和if
语句,您可以采取以下措施:
for i in range(len(y_pred)):
if y_pred[i] <= 0.7:
y_pred[i] = 0
else:
y_pred[i] = 1
但是我不明白为什么即使在多类情况下也不能坚持切片。但是我想这是另一个问题。