纯手打,代码整理中,持续更新中^-^
序号延用总结七
15、线性模型 逻辑回归
15.1 定义
线性模型用于分类的核心思想非常直观:试图找到一个线性决策边界(在特征空间中是一条直线、一个平面或一个超平面),将不同类别的数据点分开。
对于二分类问题,模型学习的是:
x[0] 到 x[p] 表示样本的 p 个特征。
w[0] 到 w[p] 是模型学习到的权重系数(Coefficients),体现了每个特征对决策的重要性。
b 是截距(Intercept),也叫偏置。
如果这个线性函数的结果大于 0,样本被预测为类别 A;否则被预测为类别 B。
这个决策边界就是函数y=0 所代表的那个超平面。
那么如何将线性输出转换为概率?
虽然决策是线性的,但我们可以通过一个链接函数(如 Sigmoid 函数)将线性输出映射到 [0, 1] 区间,解释为样本属于某个类别的概率。这就是逻辑回归的做法。
先直接看一段代码,然后再详细讲下参数
15.2 代码示例
主要流程就是: 标准化 + 正确的数据划分 + 全面评估
from sklearn.datasets import load_iris from sklearn.linear_model import LogisticRegression from sklearn.metrics import accuracy_score, classification_report from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler # 1, 加载数据 iris = load_iris() X = iris.data # 特征矩阵(150个样本,4个特征:萼长、萼宽、瓣长、瓣宽) y = iris.target # 特征值 目标向量(3类鸢尾花:0,1,2) # 2, 数据预处理 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2) # 划分训练集和测试集 scaler = StandardScaler() # 数据标准化:消除不同特征量纲的影响 # 这里fit_transform是在训练集上“学习”并“转换” # 然後得到scaler.mean_ 训练集的均值和scaler.scale_ 标准差 X_train_scaled = scaler.fit_transform(X_train) # fit计算生成模型,transform通过模型转换数据 X_test_scaled = scaler.transform(X_test) # 使用训练集的参数转换测试集 # 3, 创建和训练 LogisticRegression 模型 model = LogisticRegression() model.fit(X_train_scaled, y_train) # 使用训练数据拟合(训练)模型 # 4, 进行预测并评估模型 y_pred = model.predict(X_test_scaled) # 在测试集上进行预测 print('模型预测值:', y_pred) print('正确值 :', y_test) accuracy = accuracy_score(y_test, y_pred) # 计算准确率 print(f'测试集准确率:{accuracy:.2f}') print('分类报告:\n', classification_report(y_test, y_pred, target_names=iris.target_names))结果输出:
15.3 详细参数
上面代码中,LogisticRegression 是 scikit-learn 中用于执行逻辑回归的分类器,适用于二分类和多分类任务。
LogisticRegression(penalty='l2', *, dual=False, tol=0.0001, C=1.0, fit_intercept=True, intercept_scaling=1, class_weight=None, random_state=None, solver='lbfgs', max_iter=100, multi_class='auto', verbose=0, warm_start=False, n_jobs=None, l1_ratio=None)正则化参数
penalty (默认='l2')
正则化类型,用于防止过拟合
可选值: 'l1', 'l2', 'elasticnet', 'none'
'l1' (Lasso): 产生稀疏模型,可用于特征选择
'l2' (Ridge): 默认值,使所有特征系数变小但不为零
'elasticnet': L1和L2的混合
'none': 无正则化
C (默认=1.0)
正则化强度的倒数
必须是正浮点数
值越小,正则化越强
l1_ratio (默认=None)
仅当 penalty='elasticnet' 时使用
控制L1和L2正则化的混合比例(0到1之间)
0表示纯L2,1表示纯L1
求解器参数
solver (默认='lbfgs')
优化算法
可选值: 'newton-cg', 'lbfgs', 'liblinear', 'sag', 'saga'
不同求解器支持不同的正则化类型:
'liblinear': 支持L1和L2
'saga': 支持所有正则化类型
其他: 主要支持L2或无正则化
max_iter (默认=100)
求解器收敛的最大迭代次数
对于大型数据集可能需要增加此值
tol (默认=1e-4)
优化的容忍度/停止阈值
当损失函数变化小于此值时停止迭代
多分类参数
multi_class (默认='auto')
多分类策略
可选值: 'auto', 'ovr', 'multinomial'
'ovr' (one-vs-rest): 为每个类别训练一个二分类器
'multinomial': 直接多分类,使用softmax函数
'auto': 自动选择
类别权重参数
class_weight (默认=None)
处理类别不平衡
可选值: None, 'balanced', 或字典 {class_label: weight}
'balanced': 自动调整权重与类别频率成反比
其他重要参数
random_state (默认=None)
随机数种子,用于 reproducible results
当solver为'sag', 'saga'或'liblinear'时使用
fit_intercept (默认=True)
是否拟合截距项(偏置项)
n_jobs (默认=None)
用于计算的CPU核心数
-1表示使用所有可用的核心
verbose (默认=0)
输出详细程度
值越大,输出信息越详细
warm_start (默认=False)
是否使用前一次拟合的结果作为初始化
15.4 分类的线性模型
在sklearn.linear_model中,最常用的分类线性模型是:
LogisticRegression(逻辑回归)
原理:虽然名字带“回归”,但它是经典的分类算法。它使用 Sigmoid 函数将线性模型的输出转换为概率值(0 到 1 之间)。
损失函数:通常使用对数损失(Log Loss)或交叉熵损失(Cross-Entropy Loss)来优化模型参数。
特点:
输出有概率意义,可以知道分类的置信度。
可解释性强,权重系数的大小和正负代表了特征的影响方向和程度。
可以通过 penalty 参数施加 L1 或 L2 正则化以防止过拟合。
示例
from sklearn.datasets import load_iris from sklearn.linear_model import LogisticRegression from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.metrics import accuracy_score # 加载数据 X, y = load_iris(return_X_y=True) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 标准化(推荐,尤其使用 L2 正则时) scaler = StandardScaler() X_train_scaled = scaler.fit_transform(X_train) X_test_scaled = scaler.transform(X_test) # 创建并训练模型 model = LogisticRegression( penalty='l2', # 正则化类型 C=1.0, # 正则强度(越小正则越强) solver='lbfgs', # 优化器(自动支持多分类) max_iter=200, # 最大迭代次数 random_state=42 ) model.fit(X_train_scaled, y_train) # 预测 y_pred = model.predict(X_test_scaled) y_proba = model.predict_proba(X_test_scaled) # 获取概率 print("准确率:", accuracy_score(y_test, y_pred)) print("预测概率(前3个样本):\n", y_proba[:3])输出:
SGDClassifier(随机梯度下降分类器)
原理:这是一个通用的线性分类器,它使用随机梯度下降(Stochastic Gradient Descent)来最小化不同的损失函数。
灵活性:通过设置 loss 参数,它可以模拟其他线性模型:
loss='log_loss':等价于逻辑回归。loss='hinge':等价于线性支持向量机(SVM)。loss='perceptron':等价于感知机。
特点:
非常适合大规模数据集,因为它是增量式学习的,每次只用一个或一小批样本更新模型。
效率高,但需要仔细调参(如学习率)。
示例
from sklearn.linear_model import SGDClassifier # 注意:SGD 对特征尺度敏感,必须标准化! scaler = StandardScaler() X_train_scaled = scaler.fit_transform(X_train) X_test_scaled = scaler.transform(X_test) # 创建 SGD 分类器(设置 loss='log_loss' 等价于逻辑回归) sgd_model = SGDClassifier( loss='log_loss', # ← 关键!指定为逻辑回归 penalty='l2', # 正则化 alpha=1e-4, # 正则强度(注意:SGD 用 alpha,不是 C) learning_rate='optimal', max_iter=1000, tol=1e-3, random_state=42 ) sgd_model.fit(X_train_scaled, y_train) # 预测 y_pred_sgd = sgd_model.predict(X_test_scaled) y_proba_sgd = sgd_model.predict_proba(X_test_scaled) print("SGD 准确率:", accuracy_score(y_test, y_pred_sgd))输出