共计 1948 个字符,预计需要花费 5 分钟才能阅读完成。
核心概念:逻辑回归的本质
逻辑回归虽然名字带“回归”,实则是处理分类问题的经典算法。它的核心是通过 Sigmoid 函数将线性回归结果映射到 (0,1) 区间,输出可解释为概率值。比如在金融风控中预测贷款违约概率,或医疗领域判断肿瘤恶性可能性,都是其典型应用场景。

数学表达式很简单:
p = 1 / (1 + e^-(wx + b))
其中 w 是特征权重,b 是偏置项。模型训练的本质就是找到最优的 w 和 b 组合。
Anaconda 环境下的开发痛点
- 环境依赖冲突:同时维护多个项目时,包版本容易打架
- 大数据集内存爆炸:默认的 numpy 数组会加载全部数据到内存
- 特征工程效率低:缺乏系统化的预处理流程
- 类别不平衡陷阱:准确率虚高但少数类识别率极低
完整技术解决方案
1. 用 conda 创建隔离环境
conda create -n logistic_reg python=3.8
conda activate logistic_reg
conda install numpy pandas scikit-learn matplotlib
2. 数据预处理标准化流程
- 缺失值处理:
- 连续特征:用中位数填充(对异常值更鲁棒)
-
分类特征:单独设为 ”Missing” 类别
-
特征标准化:
- 树模型不需要,但逻辑回归必须做!
- 优先选 RobustScaler(抗异常值)
from sklearn.preprocessing import RobustScaler
scaler = RobustScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test) # 注意用训练集参数
3. 特征选择实战技巧
SelectKBest 配合卡方检验筛选 TOP 特征:
from sklearn.feature_selection import SelectKBest, chi2
selector = SelectKBest(chi2, k=20)
X_new = selector.fit_transform(X_train, y_train)
selected_idx = selector.get_support(indices=True)
4. 类别不平衡的两种解决方案
方案 A :调整 class_weight 参数
model = LogisticRegression(class_weight='balanced')
方案 B :SMOTE 过采样(适合极度不平衡场景)
from imblearn.over_sampling import SMOTE
smote = SMOTE(sampling_strategy=0.3)
X_resampled, y_resampled = smote.fit_resample(X_train, y_train)
完整代码示例
# 基础模型训练
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report
model = LogisticRegression(penalty='l2', max_iter=1000)
model.fit(X_train_scaled, y_train)
# 输出评估报告
print(classification_report(y_test, model.predict(X_test_scaled)))
# 超参数网格搜索
param_grid = {'C': [0.001, 0.01, 0.1, 1, 10],
'solver': ['lbfgs', 'liblinear']
}
grid_search = GridSearchCV(LogisticRegression(), param_grid, cv=5)
grid_search.fit(X_resampled, y_resampled)
print(f"最佳参数: {grid_search.best_params_}")
性能优化策略
- 内存优化 :对于稀疏特征(如文本数据),使用
scipy.sparse矩阵 - 增量学习:大数据集可用
SGDClassifier(loss='log') - 并行计算 :设置
n_jobs=-1利用所有 CPU 核心
常见避坑指南
- 特征尺度不一致:务必先标准化再训练
- 多重共线性:检查特征相关系数矩阵,或添加 L1 正则化
- 迭代不收敛:增加 max_iter 或调整 tol 参数
- 预测概率为 0 /1:可能是过拟合,尝试增大 C 值
延伸思考
建议尝试不同正则化方式:
– L1 正则化(得到稀疏解,适合特征选择)
– L2 正则化(默认选择,稳定但不会做特征选择)
– ElasticNet(结合两者优势)
通过这次实践,我发现逻辑回归虽然结构简单,但在精心调优后完全可以匹敌更复杂的模型。特别是在可解释性要求高的场景,它仍是首选方案。
正文完
