使用Python实现Logistic回归的简单实例

简介

在机器学习和统计分析中,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回归模型的大致流程。当然,这只是冰山一角,在实际应用中还会遇到更多复杂的问题,比如选择合适的超参、处理不平衡数据集、避免过拟合等,但这都是后话了。如果你想深入了解这些内容,可以继续阅读相关资料或者尝试更复杂的问题!