Scikit-learn使用指南

发布于:2025-04-02 ⋅ 阅读:(92) ⋅ 点赞:(0)

1. Scikit-learn 简介

  • 定义
    Scikit-learn(简称 sklearn)是基于 Python 的开源机器学习库,提供了一系列算法和工具,用于数据挖掘、数据预处理、分类、回归、聚类、模型评估等任务。
  • 特点
    • 基于 NumPySciPyMatplotlib 开发,与科学计算库无缝集成。
    • 算法接口统一,学习曲线低,适合快速实现机器学习任务。
    • 包含丰富的内置数据集(如鸢尾花、葡萄酒数据集)和常用算法(如决策树、随机森林、SVM、K-means)。
  • 适用场景
    • 研究与开发中的快速原型设计。
    • 生产环境中需要稳定、易维护的机器学习模型。

2. 安装与环境配置

安装命令
pip install scikit-learn

注意

  • 若需特定版本(如 0.24),可指定版本:
    pip install scikit-learn==0.24.0
    
  • 推荐使用 虚拟环境(如 virtualenvconda)管理依赖,避免版本冲突。
虚拟环境示例(macOS/Linux)
# 创建虚拟环境
python -m venv ml_env
source ml_env/bin/activate  # 激活环境

# 安装依赖
pip install scikit-learn numpy pandas

3. 核心功能与常用模块

(1) 数据集加载

Scikit-learn 提供了多个内置数据集,直接调用即可使用:

from sklearn.datasets import load_iris, load_wine, make_classification

# 加载鸢尾花数据集
iris = load_iris()
X_iris = iris.data  # 特征
y_iris = iris.target  # 标签

# 生成合成数据(分类)
X_syn, y_syn = make_classification(n_samples=1000, n_features=20, random_state=42)
(2) 数据预处理
  • 标准化/归一化
    from sklearn.preprocessing import StandardScaler, MinMaxScaler
    
    scaler = StandardScaler()
    X_scaled = scaler.fit_transform(X)
    
  • 缺失值处理
    from sklearn.impute import SimpleImputer
    
    imputer = SimpleImputer(strategy='mean')
    X_imputed = imputer.fit_transform(X)
    
(3) 模型训练与评估
示例:决策树分类器(鸢尾花数据集)
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score

# 加载数据
iris = load_iris()
X, y = iris.data, iris.target

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 初始化模型并训练
clf = DecisionTreeClassifier()
clf.fit(X_train, y_train)

# 预测与评估
y_pred = clf.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f"准确率: {accuracy:.2f}")
(4) 超参数调优
  • 网格搜索(Grid Search)

    from sklearn.model_selection import GridSearchCV
    
    param_grid = {'max_depth': [3, 5, 7], 'min_samples_split': [2, 5]}
    grid_search = GridSearchCV(DecisionTreeClassifier(), param_grid, cv=5)
    grid_search.fit(X_train, y_train)
    print("最佳参数:", grid_search.best_params_)
    
  • 随机搜索(Random Search)

    from sklearn.model_selection import RandomizedSearchCV
    
    param_dist = {'max_depth': [3, 5, 7], 'min_samples_split': [2, 5, 10]}
    random_search = RandomizedSearchCV(DecisionTreeClassifier(), param_distributions=param_dist, n_iter=10, cv=5)
    random_search.fit(X_train, y_train)
    

4. 版本更新与新特性(以0.24版本为例)

  1. Halving Search(渐进式搜索)

    • 适用于大规模搜索空间或训练缓慢的模型(如 HalvingGridSearchCVHalvingRandomSearchCV)。
    • 需要先启用实验功能:
      from sklearn.experimental import enable_halving_search_cv
      from sklearn.model_selection import HalvingGridSearchCV
      
  2. ICE 图(个体条件期望)

    • 可视化特征与预测结果的关系,支持 plot_partial_dependencykind='individual' 参数。
  3. 分类特征支持

    • HistGradientBoostingClassifierHistGradientBoostingRegressor 新增 categorical_features 参数,支持分类特征的高效处理。
    • 示例:
      from sklearn.ensemble import HistGradientBoostingClassifier
      model = HistGradientBoostingClassifier(categorical_features=[True, False])
      

5. 常见问题与解决方案

(1) 数据格式不兼容
  • 问题:混合使用 H2OScikit-learn 时需转换数据格式。
  • 解决
    # H2OFrame 转 Pandas DataFrame
    import h2o
    df_pandas = h2o_frame.as_data_frame()
    
    # Pandas DataFrame 转 H2OFrame
    h2o_frame = h2o.H2OFrame(df_pandas)
    
(2) 版本冲突
  • 问题:不同项目依赖不同版本的 Scikit-learn。
  • 解决:使用虚拟环境隔离依赖,确保每个项目使用独立的 Python 环境。
(3) 缺失值处理
  • 问题:模型训练时遇到 NaN 值。
  • 解决
    from sklearn.impute import SimpleImputer
    imputer = SimpleImputer(strategy='mean')
    X_imputed = imputer.fit_transform(X)
    

6. 推荐学习资源

  1. 官方文档
    Scikit-learn 官网
  2. 书籍
    • 《Scikit-Learn机器学习核心技术与实践》(谭贞军)
    • 《Python机器学习基础教程》(Sebastian Raschka)
  3. 实践示例
    • 使用鸢尾花、葡萄酒等内置数据集快速上手分类任务。
    • 尝试 GridSearchCVRandomizedSearchCV 进行超参数调优。

7. 代码示例:完整机器学习流程

# 完整流程:数据加载→预处理→模型训练→评估
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import classification_report

# 加载数据
wine = load_wine()
X, y = wine.data, wine.target

# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 定义Pipeline(标准化 + 随机森林)
pipeline = Pipeline([
    ('scaler', StandardScaler()),
    ('classifier', RandomForestClassifier(n_estimators=100))
])

# 训练模型
pipeline.fit(X_train, y_train)

# 评估
y_pred = pipeline.predict(X_test)
print("分类报告:\n", classification_report(y_test, y_pred))