1. Scikit-learn 简介
- 定义:
Scikit-learn(简称sklearn
)是基于 Python 的开源机器学习库,提供了一系列算法和工具,用于数据挖掘、数据预处理、分类、回归、聚类、模型评估等任务。 - 特点:
- 基于 NumPy、SciPy 和 Matplotlib 开发,与科学计算库无缝集成。
- 算法接口统一,学习曲线低,适合快速实现机器学习任务。
- 包含丰富的内置数据集(如鸢尾花、葡萄酒数据集)和常用算法(如决策树、随机森林、SVM、K-means)。
- 适用场景:
- 研究与开发中的快速原型设计。
- 生产环境中需要稳定、易维护的机器学习模型。
2. 安装与环境配置
安装命令
pip install scikit-learn
注意:
- 若需特定版本(如
0.24
),可指定版本:pip install scikit-learn==0.24.0
- 推荐使用 虚拟环境(如
virtualenv
或conda
)管理依赖,避免版本冲突。
虚拟环境示例(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版本为例)
-
Halving Search(渐进式搜索):
- 适用于大规模搜索空间或训练缓慢的模型(如
HalvingGridSearchCV
和HalvingRandomSearchCV
)。 - 需要先启用实验功能:
from sklearn.experimental import enable_halving_search_cv from sklearn.model_selection import HalvingGridSearchCV
- 适用于大规模搜索空间或训练缓慢的模型(如
-
ICE 图(个体条件期望):
- 可视化特征与预测结果的关系,支持
plot_partial_dependency
的kind='individual'
参数。
- 可视化特征与预测结果的关系,支持
-
分类特征支持:
HistGradientBoostingClassifier
和HistGradientBoostingRegressor
新增categorical_features
参数,支持分类特征的高效处理。- 示例:
from sklearn.ensemble import HistGradientBoostingClassifier model = HistGradientBoostingClassifier(categorical_features=[True, False])
5. 常见问题与解决方案
(1) 数据格式不兼容
- 问题:混合使用
H2O
和Scikit-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. 推荐学习资源
- 官方文档:
Scikit-learn 官网 - 书籍:
- 《Scikit-Learn机器学习核心技术与实践》(谭贞军)
- 《Python机器学习基础教程》(Sebastian Raschka)
- 实践示例:
- 使用鸢尾花、葡萄酒等内置数据集快速上手分类任务。
- 尝试
GridSearchCV
和RandomizedSearchCV
进行超参数调优。
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))