sklearn 逻辑回归和 seaborn 逻辑回归有什么区别?
Whats the difference between sklearn logistic regressions and seaborn logistic regressions?
我有一个系统,我使用加权投票的共识意见来预测二元结果。
由于选举是有话题性的,我们可以用它作为例子。假设我对多年来的各种民意测验进行了分析,并根据他们的准确性为他们分配加权投票。 Pollster Skyler 的投票权重为 3,而 Pollster Oakely 的准确度是其两倍,最终的投票权重为 6。以 CGP Gray 的方式(一位有时谈论选举机制的 youtuber)Skyler 预测老虎候选人将赢得打开市议会席位,奥克利预测 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()
LogisticRegression
在 sklearn 中做了一个惩罚回归,你可以在 help page 中获得更多细节,而 seaborn 使用 statsmodels
来执行拟合,这是没有惩罚的。
在 sklearn 中将惩罚设置为 none 会得到相同的结果:
logistic_regression= LogisticRegression(penalty='none')
logistic_regression.fit(x,y)
plt.scatter(x,logistic_regression.predict_proba(x)[:,1], c="green")
sns.regplot(x="majorityPercent", y="isMajorityWinner",
data = df,
logistic = True,
ci = None)
如果你想强制预测概率为 50% 的多数票,你将 x 变量移动 0.5 并拟合无截距的回归,这样在 x=0 时,预测的对数几率 = 0,这意味着概率 = 0.5:
df = pd.DataFrame(dataDict,columns=['majorityPercent', 'isMajorityWinner'])
df['majorityPercent_scaled'] = df[["majorityPercent"]] -0.5
logistic_regression= LogisticRegression(penalty='none',fit_intercept=False)
logistic_regression.fit(df[['majorityPercent_scaled']],df['isMajorityWinner'])
df.plot.scatter(x='majorityPercent',y='isMajorityWinner')
plt.scatter(df["majorityPercent"],logistic_regression.predict_proba(df[['majorityPercent_scaled']])[:,1], c="green")
没有 regplot() 中的截距就无法拟合模型,因此您必须使用 statsmodels 从头开始。
我有一个系统,我使用加权投票的共识意见来预测二元结果。
由于选举是有话题性的,我们可以用它作为例子。假设我对多年来的各种民意测验进行了分析,并根据他们的准确性为他们分配加权投票。 Pollster Skyler 的投票权重为 3,而 Pollster Oakely 的准确度是其两倍,最终的投票权重为 6。以 CGP Gray 的方式(一位有时谈论选举机制的 youtuber)Skyler 预测老虎候选人将赢得打开市议会席位,奥克利预测 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()
LogisticRegression
在 sklearn 中做了一个惩罚回归,你可以在 help page 中获得更多细节,而 seaborn 使用 statsmodels
来执行拟合,这是没有惩罚的。
在 sklearn 中将惩罚设置为 none 会得到相同的结果:
logistic_regression= LogisticRegression(penalty='none')
logistic_regression.fit(x,y)
plt.scatter(x,logistic_regression.predict_proba(x)[:,1], c="green")
sns.regplot(x="majorityPercent", y="isMajorityWinner",
data = df,
logistic = True,
ci = None)
如果你想强制预测概率为 50% 的多数票,你将 x 变量移动 0.5 并拟合无截距的回归,这样在 x=0 时,预测的对数几率 = 0,这意味着概率 = 0.5:
df = pd.DataFrame(dataDict,columns=['majorityPercent', 'isMajorityWinner'])
df['majorityPercent_scaled'] = df[["majorityPercent"]] -0.5
logistic_regression= LogisticRegression(penalty='none',fit_intercept=False)
logistic_regression.fit(df[['majorityPercent_scaled']],df['isMajorityWinner'])
df.plot.scatter(x='majorityPercent',y='isMajorityWinner')
plt.scatter(df["majorityPercent"],logistic_regression.predict_proba(df[['majorityPercent_scaled']])[:,1], c="green")
没有 regplot() 中的截距就无法拟合模型,因此您必须使用 statsmodels 从头开始。