逻辑回归(Logistic Regression)是一种广泛用于二分类问题的线性模型。它的目标是找到一个函数,将输入特征映射到(0, 1)之间的概率值,以预测目标变量的分类。
逻辑回归模型的目标是找到线性决策边界。其假设函数形式为:
逻辑回归的代价函数基于对数似然函数,表示为:
使用梯度下降法优化参数:
数据预处理:标准化或归一化数据。
标准化的目的是将数据转换成均值为0,标准差为1的正态分布数据。标准化的公式为:
推理过程:
归一化的目的是将数据缩放到指定的范围(通常是[0,1])。归一化的常见公式有两种:
推理过程:
通过归一化,数据被缩放到指定范围内(例如[0,1]),这使得不同特征的数据具有相同的尺度,适用于基于梯度的优化算法,如神经网络等。
import numpy as np
from sklearn.preprocessing import StandardScaler, MinMaxScaler
# 生成示例数据
data = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])
# 标准化
scaler_standard = StandardScaler()
standardized_data = scaler_standard.fit_transform(data)
print("标准化数据:\n", standardized_data)
# 归一化
scaler_minmax = MinMaxScaler()
normalized_data = scaler_minmax.fit_transform(data)
print("归一化数据:\n", normalized_data)
拆分数据集:将数据集拆分为训练集和测试集。
模型训练:使用逻辑回归模型进行训练。
模型评估:使用测试集评估模型性能。
penalty:指定正则化类型('l1', 'l2', 'elasticnet', 'none')。
C:正则化强度的倒数,较小的值表示更强的正则化。
solver:优化算法('newton-cg', 'lbfgs', 'liblinear', 'sag', 'saga')。
max_iter:最大迭代次数。
tol:优化的容差。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
# 生成示例数据
np.random.seed(0)
X = np.random.rand(100, 2)
y = (X[:, 0] + X[:, 1] > 1).astype(int)
# 数据分割为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 数据标准化
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
# 创建逻辑回归模型
log_reg = LogisticRegression()
log_reg.fit(X_train_scaled, y_train)
# 进行预测
y_pred = log_reg.predict(X_test_scaled)
# 模型评估
accuracy = accuracy_score(y_test, y_pred)
conf_matrix = confusion_matrix(y_test, y_pred)
class_report = classification_report(y_test, y_pred)
print(f"Accuracy: {accuracy}")
print("Confusion Matrix:")
print(conf_matrix)
print("Classification Report:")
print(class_report)
# 可视化结果
plt.scatter(X_test_scaled[:, 0], X_test_scaled[:, 1], c=y_pred, cmap='bwr', alpha=0.7)
plt.xlabel("Feature 1")
plt.ylabel("Feature 2")
plt.title("Logistic Regression (Unoptimized)")
plt.show()
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import GridSearchCV
# 生成示例数据
np.random.seed(0)
X = np.random.rand(100, 2)
y = (X[:, 0] + X[:, 1] > 1).astype(int)
# 数据分割为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 数据标准化
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
# 创建逻辑回归模型
log_reg = LogisticRegression()
log_reg.fit(X_train_scaled, y_train)
# 进行预测
y_pred = log_reg.predict(X_test_scaled)
# 定义参数网格
param_grid = {
'C': [0.01, 0.1, 1, 10, 100],
'solver': ['newton-cg', 'lbfgs', 'liblinear']
}
# 创建带网格搜索的逻辑回归模型
log_reg_cv = GridSearchCV(LogisticRegression(), param_grid, cv=5)
log_reg_cv.fit(X_train_scaled, y_train)
# 进行预测
y_pred_cv = log_reg_cv.predict(X_test_scaled)
# 模型评估
accuracy_cv = accuracy_score(y_test, y_pred_cv)
conf_matrix_cv = confusion_matrix(y_test, y_pred_cv)
class_report_cv = classification_report(y_test, y_pred_cv)
print(f"Best Parameters: {log_reg_cv.best_params_}")
print(f"Accuracy (CV): {accuracy_cv}")
print("Confusion Matrix (CV):")
print(conf_matrix_cv)
print("Classification Report (CV):")
print(class_report_cv)
# 可视化结果
plt.scatter(X_test_scaled[:, 0], X_test_scaled[:, 1], c=y_pred_cv, cmap='bwr', alpha=0.7)
plt.xlabel("Feature 1")
plt.ylabel("Feature 2")
plt.title("Logistic Regression (Optimized)")
plt.show()
通过比较两个实例,可以看出优化后的模型通过网格搜索选择了最佳的超参数,从而提高了模型的预测性能和泛化能力。