【发布时间】:2021-03-11 17:42:35
【问题描述】:
我有一个系统,我使用加权投票的共识意见来预测二元结果。
由于选举是热门话题,我们可以将其用作示例。假设我对多年来的各种民意调查者进行了分析,并根据他们的准确程度为他们分配了加权投票。 Pollster Skyler 的投票权重为 3,而 Pollster Oakely 的准确率是其两倍,最终的投票权重为 6。以 CGP Gray 方式(有时谈论选举机制的 youtuber)Skyler 预测 Tiger 候选人将赢得开放市议会席位,奥克利预测 SnowLepoard 候选人将赢得它。在此示例中,根据总加权投票,预计获胜者将是 SnowLepoard,其多数加权投票百分比为 (6/9) 0.66667。任何给定选举的实际结果当然会有所不同,但一般来说,如果权重很好,我们预计给定候选人的获胜概率会随着多数加权投票百分比的增加而增加,同样,如果多数百分比是50% 的选举是真正的折腾。
考虑到该示例,我正在尝试对数据集进行逻辑回归,其中唯一的自变量是多数加权投票百分比。我尝试了几种不同的方法,虽然两者都普遍认为获胜概率随着多数加权投票百分比的增加而增加,但他们不同意多少,而且双方都没有真正尊重 50/50 多数加权投票百分比表示真正的 50 的想法/50 概率。
蓝线是通过 seaborn 完成的逻辑回归,绿点是通过 sklearn 完成的逻辑回归。代码如下。我认为逻辑回归的基本机制从一个库到另一个库的变化不会那么明显,如果它们为相同的输入产生不同的输出,那么我的设置是错误的。
- 为什么这两个库会产生不同的回归?
- 如何强制回归,对于任一库,以处理 0.5 的加权投票多数作为 50% 的获胜概率?我可能只是填写大量虚拟数据来得出结论,但我觉得必须有一种更优雅的方式。
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.linear_model import LogisticRegression
# Setup a data dict
majorityPercentList = [0.8387096774193549, 0.8387096774193549, 1.0, 1.0, 1.0, 1.0, 0.8387096774193549, 0.8387096774193549, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.8387096774193549, 0.8947368421052632, 0.6578947368421053, 1.0, 0.7894736842105263, 1.0, 0.7631578947368421, 0.8947368421052632, 0.8421052631578947, 0.5789473684210527, 1.0, 0.8421052631578947, 0.9210526315789473, 1.0, 0.7894736842105263, 0.6842105263157895, 0.7894736842105263, 0.8, 0.6, 1.0, 1.0, 1.0, 1.0, 0.8, 1.0, 1.0, 1.0, 0.6, 0.8, 0.8, 1.0, 0.6, 1.0, 0.8823529411764706, 0.6470588235294118, 0.9444444444444444, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.6666666666666666, 1.0, 1.0, 0.9444444444444444, 0.7755102040816326, 1.0, 1.0, 0.84, 0.8, 1.0, 0.98, 0.98, 0.84, 0.98, 1.0, 0.98, 1.0, 0.8, 1.0, 0.8082191780821918, 0.9864864864864865, 0.9324324324324325, 0.9054054054054054, 0.9864864864864865, 0.8108108108108109, 0.7837837837837838, 0.972972972972973, 0.9324324324324325, 0.9054054054054054, 0.8918918918918919, 0.8918918918918919, 0.5066666666666667, 0.8666666666666667]
outcomeList = [0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1]
dataDict = {"majorityPercent": majorityPercentList,
"isMajorityWinner": outcomeList}
# Setup the dataframe
df = pd.DataFrame(dataDict,columns=['majorityPercent', 'isMajorityWinner'])
x = df[["majorityPercent"]]
y = df['isMajorityWinner']
# Run the sklearn logistic regression
logistic_regression= LogisticRegression()
logistic_regression.fit(x,y)
plt.scatter(x,logistic_regression.predict_proba(x)[:,1], c="green")
# Run the seaborn version
sns.regplot(x="majorityPercent", y="isMajorityWinner",
data = df,
logistic = True,
ci = None)
# Show the graphs
plt.show()
【问题讨论】:
-
回归可以有多种形式,猜测它们可能遵循不同的优化标准。如果您查看每个包的代码,您应该会发现它们正在实现的回归形式。
标签: python regression probability logistic-regression