引言:
机器学习是现代科技领域的一个热门话题,广泛应用于各行各业。其中的一个重要算法是Logistic回归算法,它在分类问题中具有广泛的应用。
一.Logistic回归算法:
1.基本思想:
Logistic回归是一种用于解决分类问题的监督学习算法。与线性回归不同,Logistic回归输出的是一个概率值,用于表示样本属于某一类的可能性。它基于logistic函数,将输入特征的线性组合转换为一个在0到1之间的概率值。
2.原理
(1)Sigmoid函数
在Logistic回归中,使用Sigmoid函数来建立模型,并将输入映射到一个介于0和1之间的概率值。Sigmoid函数的公式为:
其中,h(z)表示预测的概率,z表示输入的线性组合。
(2)损失函数
为了训练Logistic回归模型,需要定义一个损失函数来衡量预测结果与真实结果之间的差异。常用的损失函数是对数似然损失函数,其公式如下:
其中,θ表示模型的参数,y表示真实类别标签。
(3)参数学习
为了最小化损失函数,使用梯度下降算法来更新模型的参数。通过迭代的方式,不断调整参数,直到达到损失函数的最小值。
3.公式
(1)假设函数
Logistic回归的假设函数可以表示为:
其中,θ表示模型的参数,x表示输入的特征向量。
(2)梯度下降
梯度下降算法用于更新参数θ,使得损失函数最小化。公式:
其中,α表示学习率。
4. 应用领域:
1.信用风险评估:根据客户的财务状况和历史数据,预测客户的违约可能性。
2.垃圾邮件过滤:通过对邮件的文本特征进行分析,将垃圾邮件和正常邮件进行分类。
3.医学诊断:根据患者的症状和实验室数据,预测患者是否患有某种疾病。
二.代码实现:
(1)目的:
用Logistic回归模型根据身高、体重,预测性别。
数据集部分截图:
(2)代码:
import numpy as np
import matplotlib.pyplot as plt
#定义 Logistic 回归类
class LogisticRegression:
def __init__(self, learning_rate=0.01, num_iterations=1000):
self.learning_rate = learning_rate
self.num_iterations = num_iterations
self.weights = None
def sigmoid(self, z):
return 1 / (1 + np.exp(-z))
def initialize_params(self, num_features):
self.weights = np.zeros(num_features)
def fit(self, X, y):
num_samples, num_features = X.shape
self.initialize_params(num_features)
for _ in range(self.num_iterations):
# 前向传播
linear = np.dot(X, self.weights)
y_pred = self.sigmoid(linear)
# 梯度计算
dw = (1 / num_samples) * np.dot(X.T, (y_pred - y))
# 参数更新
self.weights += self.learning_rate * dw
def predict(self, X):
linear = np.dot(X, self.weights)
y_pred = np.round(self.sigmoid(linear))
return y_pred
def error_rate(self, X, y_true):
y_pred = self.predict(X)
incorrect = np.sum(y_pred != y_true)
error_rate = incorrect / len(y_true)
return error_rate
# 从TXT文件中读取数据集
def load_dataset(file_path):
data = np.loadtxt(file_path, delimiter=',')
X = data[:, :-1] # 特征矩阵
y = data[:, -1] # 标签
return X, y
# 加载数据集
file_path = r'D:\Desktop\dataset.txt'
X, y = load_dataset(file_path)
#Logistic 回归模型并训练
model = LogisticRegression(learning_rate=0.01, num_iterations=1000)
model.fit(X, y)
#预测结果
y_pred = model.predict(X)
#划分正负样本
X_pos = X[y == 1]
X_neg = X[y == 0]
#绘制散点图
plt.scatter(X_pos[:, 0], X_pos[:, 1], c='b', label='Positive')
plt.scatter(X_neg[:, 0], X_neg[:, 1], c='r', label='Negative')
#绘制分类线
x_line = np.array([X[:, 0].min() - 1, X[:, 0].max() + 1])
y_line = -(model.weights[0] * x_line + model.weights[1]) / model.weights[2]
plt.plot(x_line, y_line, c='black')
plt.xlabel('x1')
plt.ylabel('x2')
plt.legend()
plt.title('Logistic Regression')
plt.show()
#计算平均错误率
avg_error_rate = model.error_rate(X, y)
print("平均错误率:", avg_error_rate)
结果:
从上面的结果来看,使用逻辑回归进行性别分类的错误率较高。
(3)logistics算法的优缺点:
1.优点
1.简单快速:Logistic回归算法相对于其他复杂的分类算法(如支持向量机和神经网络)来说,计算速度较快且易于实现。它通常不需要太多的计算资源。
2.可解释性强:Logistic回归模型的结果比较容易理解和解释,因为它输出的是一个概率值,可以直接表示样本属于某个类别的可能性。这对于决策者和业务人员来说很重要。
3.可以应对线性可分和线性不可分问题:Logistic回归算法可以应对线性可分和线性不可分的问题。它可以建立一个类似于线性决策边界的模型,并使用Sigmoid函数对输出进行分类。
4.小样本集效果好:当训练样本数量较少时,Logistic回归算法通常能更好地处理,而不容易出现过拟合问题。
2.缺点
1.无法处理复杂关系:由于Logistic回归模型只能建立一个线性决策边界,它无法处理特征之间复杂的非线性关系。如果数据集具有复杂的特征相互影响关系,Logistic回归模型的性能可能受到限制。
2.容易受到样本不平衡的影响:当训练集中的正负样本比例严重不平衡时,Logistic回归算法可能会倾向于预测样本在数量上占主导地位的类别,而无法很好地预测数量较少的类别。
3.不能处理大量的特征和高维数据:对于维度较高的数据,Logistic回归算法可能会受到维度灾难的影响,导致模型的性能下降。
三.出现的问题及解决方法:
1.问题:
一直提示索引有问题,无法显示结果?
2.解决方法:
把特征矩阵的列数与权重向量的维度相匹配,就可以解决了并得到上面的结果。
四.总结:
通过本次实验,了解了Logistic回归算法是机器学习中一种重要的分类算法。它通过将线性回归的输出转化为概率值,适用于各种分类问题。通过对数据集的准备、特征工程、模型训练和评估,可以应用Logistic回归算法于实际问题中,并取得良好的分类效果。