逻辑回归是数据科学家广泛用于分类和概率计算的监督学习算法。对于数据科学新手来说,这是一个既实用又简单的算法。本文将带深入了解如何通过编写Python代码来实现逻辑回归。
逻辑回归是一种用于二分类和多分类数据集的分类算法。如果对逻辑回归感兴趣,可以阅读更多相关文章,例如:。
实现逻辑回归有两种方式:一种是编写自己的函数,包括Sigmoid函数、成本函数等;另一种是使用Scikit-Learn库,它提供了内置的函数,只需传入参数即可。如果是第一次学习逻辑回归,建议先自己编写代码,以更好地理解算法的核心概念。
在开始项目之前,可视化数据集是很重要的。通过可视化数据集,可以了解数据的分布和特征的重要性。接下来,将训练数据集,包括计算概率和成本,并在可用数据集上降低成本。训练好的模型可以在验证集上进行准确性检查,验证集通常占数据集的20%,其余80%作为训练集。
# 加载数据集
import pandas as pd
loan = pd.read_csv("loan_test.csv")
# 查看数据集
print(loan.head())
使用Matplotlib库绘制图表可以帮助更好地理解数据。接下来,将学习如何使用Sigmoid函数进行预测。
在逻辑回归中,需要使用Sigmoid函数计算训练集中每个条目的预测概率。Sigmoid函数是一个非常重要的概念。下面是一个特征向量X和权重向量Theta的示例。
# 计算Sigmoid函数
import numpy as np
def calc_sigmoid(z):
p = 1 / (1 + np.exp(-z))
p = np.minimum(p, 0.9999)
p = np.maximum(p, 0.0001)
return p
# 计算预测概率
def calc_pred_func(theta, x):
y = np.dot(theta, np.transpose(x))
return calc_sigmoid(y)
成本是预测误差的度量,需要逐步降低成本。首先,使用给定的函数计算成本:
# 计算预测误差
def calc_error(y_pred, y_label):
len_label = len(y_label)
cost = (-y_label * np.log(y_pred) - (1 - y_label) * np.log(1 - y_pred)).sum() / len_label
return cost
# 梯度下降
def gradient_descent(y_pred, y_label, x, learning_rate, theta):
len_label = len(y_label)
J = (-(np.dot(np.transpose(x), (y_label - y_pred))) / len_label)
theta -= learning_rate * J
return theta
# 训练模型
def train(y_label, x, learning_rate, theta, iterations):
list_cost = []
for i in range(iterations):
y_pred = calc_pred_func(theta, x)
theta = gradient_descent(y_pred, y_label, x, learning_rate, theta)
if i % 100 == 0:
print("迭代次数", i)
print("预测概率:", y_pred)
print("权重:", theta)
cost = calc_error(y_pred, y_label)
list_cost.append(cost)
print("最终成本列表:", list_cost)
return theta, list_cost, y_pred
# 预测验证集
def classify(y_test):
return np.around(y_test)
def predict(x_test, theta):
y_test = np.dot(theta, np.transpose(x_test))
p = calc_sigmoid(y_test)
print(p)
return p
# 测试数据准备
x_test = loan.iloc[500:, 1:10].values
x_rows_test, x_columns_test = x_test.shape
z_test = np.ones((x_rows_test, 1), dtype=float)
x_test = np.append(x_test, z_test, axis=1)
y_label_test = loan.loc[500:, "Status_New"].values
y_label_test = y_label_test.astype(float)
x_test = x_test.astype(float)
y_test = predict(x_test, theta)
y_test_pred_labels = classify(y_test)