2025/10/25日 每日总结 逻辑回归实战:特征工程+模型优化

逻辑回归实战:特征工程+模型优化,把Iris分类做到98%准确率

继数据准备与模型评估后,这次聚焦逻辑回归算法的实战落地——不只是简单调用模型,还加入了完整的特征工程和多模型对比,最终在Iris数据集上实现了超98%的准确率。这篇笔记整理了从特征构造到模型调优的全流程,适合想深入理解逻辑回归和特征工程的小伙伴~

一、实验核心目标

  1. 深入理解逻辑回归(对数几率回归)的算法原理与Python实现

  2. 掌握特征工程全流程:特征构造、特征选择、特征变换

  3. 用五折交叉验证完成模型训练与多指标评估(准确率、精度、召回率、F1)

  4. 对比逻辑回归与其他经典模型(决策树、随机森林等)的性能差异

  5. 学会超参数优化(网格搜索/随机搜索)提升模型效果

二、实验核心内容

  1. 加载Iris数据集,进行探索性数据分析(EDA)

  2. 特征工程三板斧:

  • 构造新特征(面积、比率、周长等)
  • 特征选择(递归特征消除RFE)
  • 特征变换(标准化)
  1. 五折交叉验证训练逻辑回归模型

  2. 超参数优化(正则化强度、求解器等)

  3. 对比6种经典分类模型的性能

  4. 可视化分析(特征相关性、PCA降维、模型对比图)

三、核心技术框架

1. 特征工程逻辑

# 特征工程核心流程
  1. 特征构造:基于业务逻辑创建新特征(花瓣面积、花萼比率等)

  2. 特征选择:用RFE筛选最优特征子集(保留6个关键特征)

  3. 特征变换:标准化处理,消除量纲影响


### 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)进一步提升准确率~

posted @ 2025-12-29 14:45  Moonbeamsc  阅读(3)  评论(0)    收藏  举报
返回顶端