在 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))
,你想找到alpha
和beta
。我认为最简单的方法是首先转换您的数据:
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 中的特征选择