2025/10/25日 每日总结 逻辑回归实战:特征工程+模型优化
逻辑回归实战:特征工程+模型优化,把Iris分类做到98%准确率
继数据准备与模型评估后,这次聚焦逻辑回归算法的实战落地——不只是简单调用模型,还加入了完整的特征工程和多模型对比,最终在Iris数据集上实现了超98%的准确率。这篇笔记整理了从特征构造到模型调优的全流程,适合想深入理解逻辑回归和特征工程的小伙伴~
一、实验核心目标
-
深入理解逻辑回归(对数几率回归)的算法原理与Python实现
-
掌握特征工程全流程:特征构造、特征选择、特征变换
-
用五折交叉验证完成模型训练与多指标评估(准确率、精度、召回率、F1)
-
对比逻辑回归与其他经典模型(决策树、随机森林等)的性能差异
-
学会超参数优化(网格搜索/随机搜索)提升模型效果
二、实验核心内容
-
加载Iris数据集,进行探索性数据分析(EDA)
-
特征工程三板斧:
- 构造新特征(面积、比率、周长等)
- 特征选择(递归特征消除RFE)
- 特征变换(标准化)
-
五折交叉验证训练逻辑回归模型
-
超参数优化(正则化强度、求解器等)
-
对比6种经典分类模型的性能
-
可视化分析(特征相关性、PCA降维、模型对比图)
三、核心技术框架
1. 特征工程逻辑
# 特征工程核心流程
-
特征构造:基于业务逻辑创建新特征(花瓣面积、花萼比率等)
-
特征选择:用RFE筛选最优特征子集(保留6个关键特征)
-
特征变换:标准化处理,消除量纲影响
### 2. 模型对比清单
| 模型类型 | 核心作用 | 调优重点 |
| --- | --- | --- |
| 逻辑回归 | baseline模型,线性可分场景 | 正则化强度C、求解器solver |
| 决策树 | 捕捉非线性关系 | 树深度max_depth、剪枝参数 |
| 随机森林 | 降低过拟合,提升稳定性 | 树数量n_estimators、max_depth |
| 支持向量机(SVM) | 高维数据表现优异 | 核函数类型、正则化参数C |
| K近邻(KNN) | 简单直观,无训练过程 | 近邻数n_neighbors、距离度量 |
| 梯度提升 | 集成学习,拟合复杂模式 | 学习率learning_rate、树数量 |
### 3. 超参数优化策略
- 逻辑回归:重点调优`C`(正则化强度)、`penalty`(正则化类型)、`solver`(求解器)
- 采用随机搜索(RandomizedSearchCV):在大参数空间中高效找到最优组合,比网格搜索更快
- 五折交叉验证保证调优结果可靠,避免过拟合
## 四、关键代码实现
### 1. 特征工程类(可复用)
```python
class IrisFeatureEngineering:
"""特征工程工具类,封装构造、选择、变换逻辑"""
def __init__(self):
self.feature_names = []
self.transformer = None
def construct_features(self, df):
"""构造新特征:基于植物学特性创建衍生特征"""
df_feat = df.copy()
numeric_cols = df.select_dtypes(include=[np.number]).columns
if len(numeric_cols) >= 4:
sl, sw, pl, pw = numeric_cols[:4]
基础特征:面积、比率
df_feat["petal_area"] = df_feat[pl] * df_feat[pw] # 花瓣面积
df_feat["sepal_area"] = df_feat[sl] * df_feat[sw] # 花萼面积
df_feat["petal_ratio"] = df_feat[pl] / (df_feat[pw] + 1e-6) # 花瓣长宽比
df_feat["sepal_ratio"] = df_feat[sl] / (df_feat[sw] + 1e-6) # 花萼长宽比
高级特征:周长、紧致度
df_feat["petal_perimeter"] = 2 * (df_feat[pl] + df_feat[pw])
df_feat["sepal_perimeter"] = 2 * (df_feat[sl] + df_feat[sw])
df_feat["compactness"] = (df_feat["petal_area"] + df_feat["sepal_area"]) / (
df_feat["petal_perimeter"] + df_feat["sepal_perimeter"] + 1e-6
)
return df_feat
def select_features(self, X, y, method='rfe', k=6, model=None):
"""特征选择:默认用RFE(递归特征消除)"""
if model is None:
model = RandomForestClassifier(n_estimators=100, random_state=42)
if method == 'rfe':
selector = RFE(model, n_features_to_select=k)
X_selected = selector.fit_transform(X, y)
selected_indices = selector.get_support()
self.feature_names = [self.feature_names[i] for i in range(len(selected_indices)) if selected_indices[i]]
return X_selected, self.feature_names
def transform_features(self, X, method='standard'):
"""特征变换:标准化(默认)或归一化"""
if method == 'standard':
self.transformer = StandardScaler()
elif method == 'minmax':
self.transformer = MinMaxScaler()
return self.transformer.fit_transform(X)
### 2. 逻辑回归训练与评估核心代码
```python
def main():
# 1. 加载数据(默认用sklearn内置Iris数据集)
iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
df['species'] = [iris.target_names[i] for i in iris.target]
X, y, target_names = iris.data, iris.target, iris.target_names
# 2. 特征工程
fe = IrisFeatureEngineering()
df_engineered = fe.construct_features(df) # 构造新特征
X_engineered = df_engineered.select_dtypes(include=[np.number]).values
fe.feature_names = df_engineered.select_dtypes(include=[np.number]).columns.tolist()
X_selected, selected_features = fe.select_features(X_engineered, y, k=6) # 选择6个最优特征
X_final = fe.transform_features(X_selected) # 标准化
# 3. 模型初始化与优化
optimizer = ModelOptimizer()
# 逻辑回归基础模型
lr_base = LogisticRegression(random_state=42, max_iter=1000)
# 超参数优化(随机搜索)
lr_optimized = optimizer.optimize_model(lr_base, "逻辑回归", X_final, y)
# 4. 五折交叉验证评估
evaluator = AdvancedEvaluator()
print("\n📊 逻辑回归(优化后)综合评估:")
lr_metrics, _, _ = evaluator.evaluate_model_comprehensive(
lr_optimized, X_final, y, target_names, "优化后逻辑回归"
)
# 5. 多模型对比(可选)
models = optimizer.get_models() # 获取6种经典模型
results = []
for name, model in models.items():
print(f"\n--- 评估 {name} ---")
optimized_model = optimizer.optimize_model(model, name, X_final, y)
metrics, _, _ = evaluator.evaluate_model_comprehensive(
optimized_model, X_final, y, target_names, f"优化后{name}"
)
results.append({"模型名称": f"优化后{name}", **metrics})
# 6. 可视化分析
evaluator.plot_feature_analysis(X_final, y, selected_features, target_names) # 特征分析图
evaluator.plot_model_comparison(pd.DataFrame(results)) # 模型对比图
if __name__ == "__main__":
main()
五、实验关键结果
1. 模型性能排名(优化后)
| 模型名称 | 准确率 | 精确率 | 召回率 | F1值 |
|---|---|---|---|---|
| 优化后K近邻 | 0.9800 | 0.9801 | 0.9800 | 0.9800 |
| 优化后逻辑回归 | 0.9733 | 0.9738 | 0.9733 | 0.9733 |
| 优化后支持向量机 | 0.9733 | 0.9738 | 0.9733 | 0.9733 |
| 优化后随机森林 | 0.9667 | 0.9668 | 0.9667 | 0.9667 |
| 优化后决策树 | 0.9667 | 0.9668 | 0.9667 | 0.9667 |
| 优化后梯度提升 | 0.9533 | 0.9534 | 0.9533 | 0.9533 |
2. 关键发现
-
特征工程效果显著:构造的衍生特征(如花瓣面积、紧致度)让所有模型性能提升5%-10%
-
逻辑回归表现超预期:在Iris数据集(近似线性可分)上,优化后准确率达97.33%,接近非线性模型
-
K近邻意外夺冠:因数据集样本分布均匀、特征区分度高,K近邻无需复杂训练即能达到98%准确率
-
正则化的重要性:逻辑回归通过调整
C=1.0(正则化强度),有效避免了过拟合3. 可视化结果亮点
-
特征相关性热图:花瓣长度与花瓣面积相关性达0.99,验证了构造特征的合理性
-
PCA降维图:三类鸢尾花在二维空间中边界清晰,说明特征区分度良好
-
模型雷达图:逻辑回归在各指标上表现均衡,无明显短板
六、实战心得与踩坑记录
1. 特征工程是核心加分项
-
一开始直接用原始4个特征,逻辑回归准确率只有92%,构造新特征后提升到97%+
-
特征选择很必要:原始特征+构造特征共10个,筛选后保留6个,既减少计算量,又避免冗余特征干扰
2. 模型调优的小技巧
-
逻辑回归的
solver选择:小数据集用lbfgs求解器更快,大数据集适合liblinear -
正则化选择:Iris数据集无明显过拟合,用默认
l2正则化即可;如果过拟合严重,可尝试l1正则化做特征选择 -
随机搜索vs网格搜索:参数空间大时(如SVM的C和gamma),随机搜索效率是网格搜索的3-5倍
3. 模型选择的思考
-
逻辑回归的优势:训练快、可解释性强、泛化能力稳定,适合作为 baseline
-
当数据非线性明显时(如复杂分类任务),随机森林/SVM表现更优;但简单数据集上,K近邻/逻辑回归性价比更高
-
评估模型不能只看准确率:多分类任务中,精度、召回率、F1值能更全面反映模型性能
这次实验不仅练熟了逻辑回归的实现,更深刻理解了“特征工程决定模型上限,模型调优逼近上限”的道理。后续可以尝试用多项式特征扩展逻辑回归,或者加入集成学习(如Stacking)进一步提升准确率~

浙公网安备 33010602011771号