共计 2959 个字符,预计需要花费 8 分钟才能阅读完成。
为什么选择逻辑回归作为第一个机器学习模型?
逻辑回归是机器学习领域最经典的算法之一,特别适合作为初学者的第一个实战模型。主要原因有三点:

- 原理直观 :虽然名字里有 ” 回归 ”,但它实际上是解决分类问题的,通过 sigmoid 函数将线性结果映射到[0,1] 区间,这个转换过程非常容易理解
- 实现简单:scikit-learn 等库已经提供了高度封装的实现,几行代码就能完成训练和预测
- 功能强大:在很多二分类问题上都能取得不错的效果,比如垃圾邮件识别、疾病预测等
数据预处理:模型成功的基础
- 处理缺失值:
- 对于少量缺失可以采用均值 / 中位数填充
- 缺失较多的特征建议直接删除
-
代码示例:
from sklearn.impute import SimpleImputer imp = SimpleImputer(strategy='mean') X_train = imp.fit_transform(X_train) -
特征缩放:
- 逻辑回归虽然不需要严格的归一化,但特征缩放可以加速收敛
- 常用 StandardScaler 进行标准化
-
代码示例:
from sklearn.preprocessing import StandardScaler scaler = StandardScaler() X_train = scaler.fit_transform(X_train) X_test = scaler.transform(X_test) # 注意测试集用相同的 scaler -
类别特征处理:
- 使用 OneHotEncoder 处理名义型类别特征
- 使用 OrdinalEncoder 处理有序型类别特征
模型训练与调参
核心参数解析
from sklearn.linear_model import LogisticRegression
model = LogisticRegression(
penalty='l2', # 正则化类型,l1 或 l2
C=1.0, # 正则化强度,越小正则化越强
solver='lbfgs', # 优化算法,小数据集用 lbfgs
max_iter=100, # 最大迭代次数
random_state=42 # 随机种子
)
model.fit(X_train, y_train)
重要参数说明:
- penalty:正则化类型,l1 正则化可以产生稀疏解(部分系数为 0),适合特征选择;l2 正则化更常用
- C:正则化强度的倒数,C 越小正则化越强,默认 1.0
- solver:优化算法选择,liblinear 适合小数据集,sag/saga 适合大数据集
模型评估:不只是看准确率
-
基础指标:
from sklearn.metrics import accuracy_score, precision_score, recall_score y_pred = model.predict(X_test) print(f"准确率: {accuracy_score(y_test, y_pred):.4f}") print(f"精确率: {precision_score(y_test, y_pred):.4f}") print(f"召回率: {recall_score(y_test, y_pred):.4f}") -
ROC 曲线与 AUC:
from sklearn.metrics import roc_curve, roc_auc_score import matplotlib.pyplot as plt y_scores = model.predict_proba(X_test)[:, 1] fpr, tpr, thresholds = roc_curve(y_test, y_scores) plt.plot(fpr, tpr) plt.plot([0, 1], [0, 1], 'k--') plt.xlabel('False Positive Rate') plt.ylabel('True Positive Rate') plt.title(f'ROC Curve (AUC = {roc_auc_score(y_test, y_scores):.2f})') plt.show()
五大常见错误及解决方案
- 类别不平衡问题:
- 现象:准确率很高但召回率极低
-
解决:使用 class_weight 参数或对少数类过采样
-
特征相关性过高:
- 现象:系数不稳定
-
解决:检查特征相关性矩阵,删除高相关特征
-
过拟合问题:
- 现象:训练集表现很好但测试集差
-
解决:增加正则化强度(C 调小),或获取更多数据
-
未做特征缩放:
- 现象:收敛速度很慢
-
解决:使用 StandardScaler 标准化特征
-
错误理解概率输出:
- 注意:predict_proba 输出的是类别概率,不是确定的 0 /1
- 需要设置合适的阈值(默认 0.5)
实验报告撰写建议
- 问题描述:明确要解决的分类问题
- 数据探索:展示数据分布、特征相关性等
- 方法描述:说明选择的模型和参数
- 结果分析:用表格对比不同参数 / 方法的性能
- 讨论:分析模型局限性和改进方向
完整代码示例
# 导入库
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report
# 数据加载与预处理
data = pd.read_csv('dataset.csv')
X = data.drop('target', axis=1)
y = data['target']
# 划分训练测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 特征缩放
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
# 模型训练
model = LogisticRegression(penalty='l2', C=1.0, solver='lbfgs', max_iter=100)
model.fit(X_train, y_train)
# 模型评估
y_pred = model.predict(X_test)
print(classification_report(y_test, y_pred))
# 系数分析
coef_df = pd.DataFrame({
'feature': X.columns,
'coefficient': model.coef_[0]
})
print(coef_df.sort_values('coefficient', ascending=False))
延伸思考
- 如何处理多分类问题?LogisticRegression 本身支持 multi_class 参数
- 当特征数量远大于样本数量时,应该选择什么正则化方式?
- 如何解释逻辑回归模型的系数?系数大小是否直接代表特征重要性?
通过这个完整的实战流程,相信你已经掌握了逻辑回归的核心实现要点。记住,在机器学习中,数据质量往往比模型选择更重要,所以一定要重视数据预处理环节。接下来可以尝试在不同的数据集上应用这个流程,观察模型表现的变化。
正文完
发表至: 未分类
近两天内
