简介
在机器学习和统计分析中,Logistic 回归是一种常用的分类算法。它能够根据一组特征数据预测一个类别标签的概率。与线性回归不同的是,Logistic 回归输出的是一个概率值,而不是一个连续数值。在这个示例中,我们将通过Python来实现一个简单的Logistic 回归模型。
数据准备
为了开始我们的 Logistic 回归分析,我们需要一些数据集。我们可以使用Scikit-learn库中的样本数据集,如iris或wine等,但是为了简化问题,我们将从头创建一个简单的二分类问题。
假设我们有两个特征x1和x2,以及对应的一个目标变量y,其中y为0或1表示两类。当且仅当y=1时,我们说这是正样本(positive instance),否则是负样本(negative instance)。
import numpy as np
# 假设我们有以下特征值和目标变量:
X = np.array([[4, 7], [3, 5], [6, 8], [7, 9]])
Y = np.array([0, 0, 1, 1])
实现逻辑函数
在 Logistic 回归中,最重要的一步是定义逻辑函数。这是一个Sigmoid函数,它将任意实数映射到[0,1]区间内。
def sigmoid(x):
return (np.exp(-x) / (1 + np.exp(-x)))
定义成本函数并计算梯度下降步长
成本函数,也称作交叉熵损失,是衡量模型性能好坏的指标。在 Logistic 回归中,这个损失通常被用作优化过程中的目标。
def cost_function(X_train, Y_train):
m = len(Y_train)
h_xi = sigmoid(np.dot(X_train.T,X_train).dot(X_train.T))
# 计算均方误差平方根作为单个样本点上的代价C(y_i,h(x_i))
J = -((Y_train * np.log(h_xi)) + ((m-Y_train) * np.log(1-h_xi))))
return J/m
# 使用上面的cost_function计算当前参数权重下的训练集中每个样本点上的J_value
J_training_set_cost_value = cost_function(X,Y)
print("Training Set Cost Value: ", J_training_set_cost_value)
要最小化这个成本函数,我们需要迭代地调整参数θ直至找到最优解。这通常涉及梯度下降法,即沿着成本梯度方向移动参数以减少误差。
梯度下降更新规则
为了更新我们的参数θj,每次迭代都需要计算出每个θj关于所有其他theta j 和 X 的偏导数,并乘以学习速率α,然后加到之前的theta_j上去。
def gradient_descent_update_rule(theta_current_values_array,
X_data_matrix,
y_target_vector,
learning_rate_alpha):
m_samples_number=len(y_target_vector);
theta_new_values_array=np.zeros(len(theta_current_values_array));
for i in range(len(theta_current_values_array)):
sum_for_derivative=0;
for j in range(m_samples_number):
sum_for_derivative += X_data_matrix[j][i]*(sigmoid(np.dot(X_data_matrix[:, i].T,X_data_matrix)).T-y_target_vector[j]);
theta_new_values_array[i]=theta_current_values_array[i]-learning_rate_alpha*(sum_for_derivative/m_samples_number);
return theta_new_values_array;
然后你可以把这些代码结合起来,在你的实际应用程序里进行训练:
alpha=0.01; # 学习速率 alpha
max_iterations=10000; # 最大迭代次数 max_iterations
initial_theta=np.zeros(len(feature_names)); # 初始猜测 θj 值;这里 feature_names 是 x_0,x_2... 对应于第几列 特征名称
for iteration in range(max_iterations):
initial_theta_after_gradient_descent_calling_gradient_update_rule=
gradient_descent_update_rule(initial_theta ,X ,Y,alpha);
if abs(sum(initial_theta_after_gradient_descent_calling_gradient_update_rule-initial_theta))/len(initial_theta)<epsilon:
break;
final_logit_model_parameters_with_best_accuracy_score =
initial_theta_after_gradient_descent_calling_gradient_update_rule;
以上就是如何使用Python实现一个基本的Logistic回归模型的大致流程。当然,这只是冰山一角,在实际应用中还会遇到更多复杂的问题,比如选择合适的超参、处理不平衡数据集、避免过拟合等,但这都是后话了。如果你想深入了解这些内容,可以继续阅读相关资料或者尝试更复杂的问题!