2、逻辑回归

时间:2024-12-20 07:50:46

1. 为什么要叫逻辑回归

逻辑回归模型的名称可能会引起一些混淆,因为它名字中包含了"回归"这个词,但实际上它是一种用于解决分类问题的模型,而不是回归问题。
逻辑回归最初是从线性回归模型演变而来的。线性回归用于预测连续的数值输出,逻辑回归则是在线性回归的基础上进行了修改,以解决输出为分类标签(如0和1)的问题。

2. 逻辑回归在NILM中的应用

2.1 应用可能

1. 电力能耗分解
逻辑回归可以用于推断每个设备在特定时间段内是否处于工作状态。通过监测电流或电压的变化,逻辑回归可以识别出特定设备的运行状态(开/关)。
2. 设备识别
逻辑回归可以作为NILM系统中的一个分类器,用于识别特定类型的家电设备。例如,在训练阶段,逻辑回归可以通过设备的电流特征和工作模式(如波形和频率)学习各种家电的模式。在实时监测中,逻辑回归模型能够根据电流或电压信号的模式识别出不同设备的使用情况。

2.2 案例

以伪代码的形式简要介绍逻辑回归在NILM中的模型训练和实时预测两个阶段的应用。

# 假设有一组训练数据,包含设备的电流或电压数据以及设备的状态标签(开/关)

# 训练阶段:使用逻辑回归模型训练设备状态分类器

Initialize theta (模型参数)
Initialize learning rate (学习率)
Initialize number of iterations (迭代次数)

# Gradient Descent (梯度下降优化)
for iter from 1 to number of iterations:
    Compute predictions using logistic function:
        h_theta = sigmoid(theta * features)  # features是设备的电流或电压特征
    Compute cost function:
        cost = -(1/m) * sum(y * log(h_theta) + (1 - y) * log(1 - h_theta))  # y是实际的设备状态标签
    Compute gradient:
        gradient = (1/m) * features * (h_theta - y)
    Update parameters theta:
        theta = theta - learning_rate * gradient

# 实时监测阶段:使用训练好的模型预测设备状态

# 输入当前的电流或电压数据作为 features
Compute prediction using trained logistic regression model:
    predicted_status = predict(theta, features)
    
# 输出预测的设备状态 predicted_status(开/关)

# sigmoid函数的定义
function sigmoid(z):
    return 1 / (1 + exp(-z))

# 预测函数的定义
function predict(theta, features):
    return sigmoid(theta * features)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

插入讲解:梯度下降优化过程

梯度下降是一种优化算法,用于最小化损失函数,即模型预测值与实际值之间的差异。逻辑回归的损失函数是对数损失函数,用于衡量模型输出的概率和实际标签之间的误差。

代码中采用 h_theta 接收 sigmoid 函数的输出,即表示设备处于打开状态的概率
sigmoid(z)=1/(1+e^-z),在逻辑回归中,sigmoid函数将线性回归模型的输出转换为概率值,表示某个事件发生的概率。在二分类问题中,可以解释为正类的概率。

损失函数计算,使用对数损失函数来计算模型的误差,对数损失函数为:
在这里插入图片描述

接下来根据损失函数的梯度来更新模型参数,每次迭代更新参数来减少损失函数的值,直到最优。

3. 逻辑回归的工作原理

逻辑回归模型是一种广泛应用于分类问题的监督学习算法。它通过学习从输入特征到离散类别标签之间的映射关系来进行预测。

3.1 假设函数

逻辑回归模型的假设函数使用sigmoid函数将线性组合的结果转换为一个0到1之间的概率值:

在这里插入图片描述

3.2 损失函数(Cost Function)

逻辑回归模型通常使用对数损失函数来衡量预测值和实际标签之间的差异。
在这里插入图片描述
在这里插入图片描述

3.3 参数优化(Parameter Optimization)

为了使模型能够做出准确的预测,需要最小化损失函数 J(θ)。通常采用梯度下降等优化算法来更新参数 θ:
在这里插入图片描述
在这里插入图片描述

3.4 逻辑回归应用场景

  • 二分类问题:预测一个事件是否发生(如垃圾邮件识别、疾病诊断等)。
  • 概率预测:输出的概率可以用来判断事件发生的可能性大小。
  • 特征重要性:可以通过参数 θ 的大小和方向来分析不同特征对预测结果的影响程度。

4. 逻辑回归在电器识别中的应用

下面展示一个简单的示例,使用Python和Scikit-learn库来实现逻辑回归模型,用于识别家庭电器的状态(开启或关闭)。

4.1 数据集介绍

我们将使用一个虚拟的数据集来模拟电器的状态。假设我们有以下特征:

  • 电流(Current):表示电器的电流值。
  • 电压(Voltage):表示电器的电压值。
  • 电器状态(Status):标记电器是开启(1)还是关闭(0)。

4.2 步骤

1. 导包

import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, confusion_matrix

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

2. 生成虚拟数据

我们使用了NumPy生成了随机的电流和电压数据,模拟了电器的特征。

# 生成随机数据作为示例
np.random.seed(0)
num_samples = 1000

# 生成随机的电流和电压数据
current = np.random.uniform(0.5, 10, num_samples)
voltage = np.random.uniform(100, 240, num_samples)

# 模拟电器状态,假设电流大于某个阈值时表示电器开启
threshold = 5.0
status = (current > threshold).astype(int)

# 合并特征矩阵
X = np.column_stack((current, voltage))

# 打印前几个样本的特征和标签
print("样本特征 X:")
print(X[:5])
print("样本标签 status:")
print(status[:5])

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

3. 划分训练集和测试集

X_train, X_test, y_train, y_test = train_test_split(X, status, test_size=0.2, random_state=42)

  • 1
  • 2

4. 训练逻辑回归模型

使用Scikit-learn中的LogisticRegression来初始化和训练逻辑回归模型。

# 初始化逻辑回归模型
model = LogisticRegression()

# 训练模型
model.fit(X_train, y_train)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

5. 模型评估

通过计算准确率和输出混淆矩阵来评估模型的性能。

# 在测试集上进行预测
y_pred = model.predict(X_test)

# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"模型准确率:{accuracy:.2f}")

# 输出混淆矩阵
conf_mat = confusion_matrix(y_test, y_pred)
print("混淆矩阵:")
print(conf_mat)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

插入讲解-混淆矩阵

混淆矩阵能够帮助我们详细分析模型在不同类别上的预测情况,从而更好地理解模型的性能。基于混淆矩阵可以计算出多种评估指标,例如精确率(Precision)、召回率(Recall)和F1分数(F1-score)

二分类问题在的混淆矩阵示例:

在这里插入图片描述

混淆矩阵可以帮助我们具体分析模型在每个类别上的预测情况,进而衡量模型在不同类型错误上的表现。

6. 可视化

使用matplotlib来绘制决策边界,展示模型如何区分不同状态的电器。

# 可视化决策边界
plt.figure(figsize=(10, 6))

# 生成网格点来绘制决策边界
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 10, X[:, 1].max() + 10
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.1),
                     np.arange(y_min, y_max, 10))

Z = model.predict(np.c_[xx.ravel(), yy.ravel()])

# 将结果放入彩图
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, cmap=plt.cm.Paired, alpha=0.8)

# 绘制训练数据点
plt.scatter(X[:, 0], X[:, 1], c=status, cmap=plt.cm.Paired)
plt.xlabel('Current')
plt.ylabel('Voltage')
plt.title('Decision Boundary for Logistic Regression')
plt.show()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

7. 结果展示及完整代码

模型评估结果:
由于样本数较少,模型完全预测成功。
在这里插入图片描述
可视化结果:
左侧为关闭状态电器分布,右侧为开启状态电器数分布。因为代码设定电流阈值为5.0,若电器电流大于5.0即判定为开启状态。
在这里插入图片描述

import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, confusion_matrix

# 生成随机数据作为示例
np.random.seed(0)
num_samples = 1000

# 生成随机的电流和电压数据
current = np.random.uniform(0.5, 10, num_samples)
voltage = np.random.uniform(100, 240, num_samples)

# 模拟电器状态,假设电流大于某个阈值时表示电器开启
threshold = 5.0
status = (current > threshold).astype(int)

# 合并特征矩阵
X = np.column_stack((current, voltage))

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, status, test_size=0.2, random_state=42)

# 初始化逻辑回归模型
model = LogisticRegression()

# 训练模型
model.fit(X_train, y_train)

# 在测试集上进行预测
y_pred = model.predict(X_test)

# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"模型准确率:{accuracy:.2f}")

# 输出混淆矩阵
conf_mat = confusion_matrix(y_test, y_pred)
print("混淆矩阵:")
print(conf_mat)

# 可视化决策边界
plt.figure(figsize=(10, 6))

# 生成网格点来绘制决策边界
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 10, X[:, 1].max() + 10
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.1),
                     np.arange(y_min, y_max, 10))

Z = model.predict(np.c_[xx.ravel(), yy.ravel()])

# 将结果放入彩图
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, cmap=plt.cm.Paired, alpha=0.8)

# 绘制训练数据点
plt.scatter(X[:, 0], X[:, 1], c=status, cmap=plt.cm.Paired)
plt.xlabel('Current')
plt.ylabel('Voltage')
plt.title('Decision Boundary for Logistic Regression')
plt.colorbar()
plt.show()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65

5. 总结

逻辑回归是一种基于线性假设的统计学习方法,专用于解决二分类问题。通过将特征的线性组合映射到概率空间,利用sigmoid函数输出概率值。模型通过最大似然估计或梯度下降优化参数,以最大化对真实标签的预测能力。逻辑回归易于理解和实现,适用于大规模数据集和快速预测需求,但对非线性关系和特征依赖性敏感,通常需进行特征工程处理。评估时常用准确率、精确度、召回率等指标。