【Logistic回归】原理及Python代码示例

1、基本原理


1.1   Logistic分布


X是随机变量,X服从Logistic分布即X满足下式:


分布函数的图像如下:


X取值在正负无穷大之间,P(X)在0-1之间取值,呈S型单调上升曲线。

1.2   二项Logistic回归


二项Logistic回归中,X取值为实数,Y取值为0或1。Logistic回归模型如下:



x=(x1,x,2,...,xn,1),为样本输入,w=(w1,w2,...,wn,b)为权值向量,b为偏置。按照这个模型可以求得Y=1和Y=0的概率,将x分到概率大的那一类。

1.3   参数估计


给定训练集T={(x1,y1),(x2,y2),...,(xn,yn)},用极大似然估计法估计参数。设P(Y=1|x)=p,P(Y=0|X)=1-p,似然函数为


取对数得对数似然函数为:


对L(w)求最大值可得w的估计,常用方法是梯度下降法和拟牛顿法等。

1.4   多项式Logistic回归

以上介绍的二项Logistic回归模型是二类问题,只用于Y=0或1的情况。对于Y有多种类别的情况,可将其推广到多项式Logistic回归。设Y的取值为{1,2,...,K},则多项式Logistic回归模型为:



参数估计的方法也可从二项Logistic回归的方法推广过来。

2、Python代码示例

调用scikit-learn机器学习库实现朴素贝叶斯分类器。数据文件wine data 点这里下载,在右侧可以找到“wine”连接,下载wine.data文件。这是意大利三种酒的分类数据,包含了13种不同的酒的属性,共分成3类,分别标记为“1”、“2”、“3”。每行为一个样本数据,第一列为酒的种类,后13列为酒的属性,一共178个样本。源代码如下:

import scipy as sp
import numpy as np
from sklearn.cross_validation import train_test_split
from sklearn import metrics
from sklearn.linear_model import LogisticRegression

x=np.loadtxt("wine.data" , delimiter = "," , usecols=(1,2,3,4,5,6,7,8,9,10,11,12,13) )      #获取属性集
y=np.loadtxt("wine.data" , delimiter = "," , usecols=(0) )                                  #获取标签集
print(x)     #查看样本
# 加载数据集,切分数据集80%训练,20%测试
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2)         #切分数据集
#调用逻辑斯特回归
model = LogisticRegression()
model.fit(x_train, y_train)
print(model)       #输出模型
# make predictions
expected = y_test                       #测试样本的期望输出
predicted = model.predict(x_test)       #测试样本预测
#输出结果
print(metrics.classification_report(expected, predicted))       #输出结果,精确度、召回率、f-1分数
print(metrics.confusion_matrix(expected, predicted))            #混淆矩阵



运行结果如下:


关于精确度、召回率、f1分数等概念请参考这篇文章最后部分。多次实验,发现分类正确率可达90%以上,分类效果不错。




逻辑回归是一种用于分类问题的机器学习算法,其原理是基于线性回归的思想,通过使用逻辑函数(也称为sigmoid函数)将预测结果映射到[0,1]之间的概率值。以下是一个使用Python实现逻辑回归的示例代码: ```python import numpy as np import matplotlib.pyplot as plt # 定义sigmoid函数 def sigmoid(z): return 1 / (1 + np.exp(-z)) # 定义损失函数 def loss(h, y): return (-y * np.log(h) - (1 - y) * np.log(1 - h)).mean() # 定义逻辑回归模型 class LogisticRegression: def __init__(self, lr=0.01, num_iter=100000, fit_intercept=True, verbose=False): self.lr = lr self.num_iter = num_iter self.fit_intercept = fit_intercept self.verbose = verbose def add_intercept(self, X): intercept = np.ones((X.shape[0], 1)) return np.concatenate((intercept, X), axis=1) def fit(self, X, y): if self.fit_intercept: X = self.add_intercept(X) # 初始化权重参数 self.theta = np.zeros(X.shape[1]) for i in range(self.num_iter): z = np.dot(X, self.theta) h = sigmoid(z) gradient = np.dot(X.T, (h - y)) / y.size self.theta -= self.lr * gradient if(self.verbose == True and i % 10000 == 0): z = np.dot(X, self.theta) h = sigmoid(z) print(f'loss: {loss(h, y)}') def predict_prob(self, X): if self.fit_intercept: X = self.add_intercept(X) return sigmoid(np.dot(X, self.theta)) def predict(self, X, threshold=0.5): return self.predict_prob(X) >= threshold # 示例:使用逻辑回归对二分类数据进行训练和预测 from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split # 生成二分类数据集 X, y = make_classification(n_samples=100, n_features=2, n_informative=2, n_redundant=0, random_state=42) # 将数据集划分为训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 创建逻辑回归模型并进行训练 model = LogisticRegression(lr=0.1, num_iter=300000) model.fit(X_train, y_train) # 在测试集上进行预测 y_pred = model.predict(X_test) # 计算准确率 accuracy = (y_pred == y_test).mean() print(f'Accuracy: {accuracy}') ``` 这段代码首先定义了sigmoid函数和损失函数,然后实现了一个LogisticRegression类,其中包含了fit方法用于训练模型,以及predict_prob和predict方法用于预测。最后,示例代码使用sklearn库生成了一个二分类数据集,将数据集划分为训练集和测试集,并使用逻辑回归模型进行训练和预测。最后计算了预测的准确率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值