一、什么是回归
现有一些数据点,我们用 一条直线对这些点进行拟合,该线称为最佳拟合直线,这个拟合过程就称作回归。利用Logistic 回归进行分类的主要思想是:根据现有数据对分类边界线建立回归公式,以此进行分类。这里的 “回归”一词源于最佳拟合,表示要找到最佳拟合参数集。 训练分类器时的做法就是寻找最佳拟合参数,使用的是最优化算法。
logistic回归:Logistic回归是一种监督学习算法,适用于解决二分类问题。其基本思想是通过sigmoid函数将输入特征映射到[0, 1]的范围,表示事件发生的概率。
二、Logistic回归的步骤
1.收集数据:收集包含特征(输入)和标签(输出)的数据集。对于二分类问题,标签通常是0或1。
2.准备数据:
·对数据进行清理,处理缺失值和异常值。
·若有必要,对特征进行标准化或归一化,确保他们在相同尺度上
3.选择模型:选择Logistic回归作为模型。
4.定义假设函数:Logistic回归的假设函数使用sigmoid函数将线性组合的特征映射到[0, 1]的范围。
5.定义代价函数:用于衡量模型预测与实际标签之间的差异。对数似然代价函数是Logistic回归常用的代价函数。
6.最小化代价函数:使用梯度下降或者其他优化算法最小化代价函数,更新参数。
7.训练模型
8.做出预测:使用训练好的参数对新的数据进行预测。
三、sigmoid函数
Sigmoid函数,也称为logistic函数,具有如下的数学表达式:
其中,z 是输入的线性组合,即 =z=θTx,θ 是参数向量,x 是特征向量。
1.Sigmoid函数在Logistic回归中的作用
在Logistic回归中,Sigmoid函数的作用是将线性组合的特征映射到[0, 1]的范围,表示事件发生的概率。
Logistic回归的假设函数可以表达为:
hθ(x) 表示预测的概率,θ 是参数向量,x 是特征向量。如果hθ(x) 大于等于0.5,我们预测事件发生;如果小于0.5,则预测事件不发生。
# Sigmoid 函数
def sigmoid(z):
return 1 / (1 + np.exp(-z))
2.为什么选择Sigmoid函数?
Sigmoid函数具有良好的性质,使其成为Logistic回归中的理想选择。其将输入映射到0和1之间的范围,同时在导数的计算中也表现得相对简单,有助于模型的训练和收敛。
四、极大似然估计
1.极大似然估计与Logistic回归的关系
Logistic回归中,我们通常使用对数似然代价函数来衡量模型的性能。对于二分类问题,似然函数被表达为观察到的数据在给定模型下的概率。极大似然估计的目标是找到一组参数,使得这一概率最大化。具体来说,我们使用对数似然函数,并通过梯度下降等优化算法来估计最优参数。
2.梯度下降
梯度下降是一种迭代优化算法,用于最小化一个函数,通过沿着函数梯度的反方向迭代更新参数,直至找到函数的最小值。在Logistic回归中,我们的目标是最小化代价函数,即对数似然代价函数。
# 梯度下降算法
def gradient_descent(X, y, theta, learning_rate, iterations):
m = len(y)
cost_history = np.zeros((iterations, 1))
for i in range(iterations):
theta = theta - (learning_rate/m) * (X.T @ (sigmoid(X @ theta) - y))
cost_history[i] = compute_cost(X, y, theta)
return theta, cost_history
3.Logistic回归中的代价函数
Logistic回归中的对数似然代价函数为:
其中 m 是样本数量, y(i) 是第 i 个样本的实际标签, hθ(x(i)) 是Logistic回归的假设函数。
# 代价函数
def compute_cost(X, y, theta):
m = len(y)
h = sigmoid(X @ theta)
cost = (1/m) * (-y.T @ np.log(h) - (1 - y).T @ np.log(1 - h))
return cost
五、实例:信用卡违约预测
在信用卡领域,银行和金融机构经常需要评估客户的信用风险,以决定是否批准其申请或提供额度。Logistic回归可以用来预测客户是否会违约,未能按时偿还信用卡债务。
1.生成示例数据
np.random.seed(42)
# 特征:收入、信用分数
X = np.random.rand(100, 2) * 10
# 标签:1表示违约,0表示未违约
y = (X[:, 0] + X[:, 1] > 10).astype(int).reshape(-1, 1)
# 在特征矩阵中添加一列偏置项
X_bias = np.c_[np.ones((X.shape[0], 1)), X]
2. 梯度下降与代价函数、Sigmoid函数和预测函数
# 代价函数
def compute_cost(X, y, theta):
m = len(y)
h = sigmoid(X @ theta)
cost = (1/m) * (-y.T @ np.log(h) - (1 - y).T @ np.log(1 - h))
return cost
# 梯度下降算法
def gradient_descent(X, y, theta, learning_rate, iterations):
m = len(y)
cost_history = np.zeros((iterations, 1))
for i in range(iterations):
theta = theta - (learning_rate/m) * (X.T @ (sigmoid(X @ theta) - y))
cost_history[i] = compute_cost(X, y, theta)
return theta, cost_history
# 预测函数
def predict(X, theta, threshold=0.5):
probabilities = sigmoid(X @ theta)
return (probabilities >= threshold).astype(int)
3. 初始化模型参数并调用梯度下降算法训练模型
# 初始化参数向量
theta_initial = np.zeros((X_bias.shape[1], 1))
# 设置学习率和迭代次数
learning_rate = 0.01
iterations = 10000
# 运行梯度下降算法
theta_final, cost_history = gradient_descent(X_bias, y, theta_initial, learning_rate, iterations)
4.输出并进行预测
# 输出最终参数
print("Final Parameters:")
print(theta_final)
# 预测
predictions = predict(X_bias, theta_final)
5.绘制决策边界
plt.scatter(X[:, 0], X[:, 1], c=y.flatten(), cmap=plt.cm.Paired)
ax = plt.gca()
xlim = ax.get_xlim()
ylim = ax.get_ylim()
xx, yy = np.meshgrid(np.linspace(xlim[0], xlim[1], 100),
np.linspace(ylim[0], ylim[1], 100))
Z = sigmoid(np.c_[np.ones((xx.ravel().shape[0], 1)), xx.ravel(), yy.ravel()] @ theta_final)
Z = Z.reshape(xx.shape)
plt.contour(xx, yy, Z, levels=[0.5], linewidths=2, colors='red')
plt.title("Logistic Regression Decision Boundary")
plt.xlabel("Income")
plt.ylabel("Credit Score")
plt.show()
6.结果
六、总结
Logistic回归的优缺点:
·优点:计算代价不高,易于理解和实现。
·缺点:容易欠拟合,分类精度可能不高。
Logistic回归作为机器学习领域中的经典算法之一,特别适用于处理二分类问题,通过了解其基本原理和与极大似然估计的关系,我们可以更深入地理解其应用。
参阅:
logistic回归详解_logistics回归函数-CSDN博客