在 python 中使用 sklearn 对连续数据进行逻辑回归

Posted

技术标签:

【中文标题】在 python 中使用 sklearn 对连续数据进行逻辑回归【英文标题】:Logistic Regression with continuous data using sklearn in python 【发布时间】:2020-10-18 00:32:05 【问题描述】:

如何用回归来描述这些点?在示例中 LinearRegression 不符合点的逻辑分布。这 LogisticRegression() from sklearn 只接受二进制数据。我的 y 值从 0 到 1 是连续的。 我是否必须转换数据或如何获得合适的模型?

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.linear_model import LogisticRegression

a = np.array([1,2,3,4,5,6,7,8,9,10,11,12,13,14])
b = [0,0,0.01,0.08,0.16,00.28,0.5,0.66,0.8,0.9,0.95,0.99,1,1]
data = pd.DataFrame('x': a, 'y':b)

LM = LinearRegression()
LM.fit(data[["x"]],data[["y"]])

plt.scatter(a,b)
plt.plot([1,14], LM.predict([[1],[14]]), color = "red")
plt.show() 

LogM = LogisticRegression()
LogM.fit(data[["x"]],data[["y"]])  # doesn't work

线性模型散点图

【问题讨论】:

【参考方案1】:

逻辑回归通常用于对标签进行分类,即使它输出 0 到 1 之间的实数。这就是为什么 sklearn 需要 y: 中的二进制数据,以便它可以训练模型。

在你的例子中,你有一个 sigmoid 函数s(x)=1/(1+exp(alpha*x + beta)),你想找到alphabeta。我认为最简单的方法是首先转换您的数据:

new_a = a[2:-2]
new_b = np.array(b[2:-2]) # Getting rid of 0 and 1 values
new_b = np.log((1 / new_b) - 1)

现在new_b 是一个数组,其值在alpha*new_a + beta 形式下,因此您可以在其上训练LinearRegression 模型以找到alpha

model = LinearRegression()
model.fit(new_a.reshape(-1, 1), new_b.reshape(-1, 1))
alpha = model.coef_[0, 0]
beta = l.predict([[0]])[0, 0]

最后,您可以查看测试是否符合您的预期:

predicted = 1 / (1 + np.exp(alpha * a + beta))
plt.figure()
plt.plot(a, b)
plt.plot(a, predicted)
plt.show()

【讨论】:

以上是关于在 python 中使用 sklearn 对连续数据进行逻辑回归的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 中使用 sklearn 对模型进行单一预测?

在 python (sklearn) 中使用 Affinity Propagation 对 word2vec 向量进行聚类

Sklearn中如何使用KBinsDiscretizer将连续数据制作成bin?

属性对 Python 中特定目标的预测能力,使用 Sklearn 中的特征选择

详解支持向量机-SVC真实数据案例:预测明天是否会下雨-填补缺失值和编码菜菜的sklearn课堂笔记

为啥在 python 中获取 sklearn 中的***谓词的结果不同?