Sklearn 基础概念
Scikit-learn(sklearn)是一个功能强大的 Python 机器学习库,提供了简单且一致的接口来实现各种机器学习任务。以下是 Scikit-learn 的基础概念,简洁明了,适合快速理解其核心组件和工作原理。
1. 核心概念
- 估算器(Estimator):
- Scikit-learn 的核心对象,所有模型(如分类器、回归器、聚类算法)都基于估算器接口。
- 主要方法:
fit(X, y):训练模型,X是特征矩阵,y是目标变量(监督学习中需要)。predict(X):对新数据进行预测(分类或回归)。transform(X):数据转换(用于预处理或降维)。score(X, y):评估模型性能(如准确率或 R² 分数)。
- 示例:
LogisticRegression()是一个分类估算器,StandardScaler()是一个转换估算器。 - 特征矩阵(X)与目标向量(y):
- X:特征矩阵,通常是二维 NumPy 数组或 Pandas DataFrame,形状为
(n_samples, n_features),表示样本数和特征数。 - y:目标向量,通常是一维数组,形状为
(n_samples,),表示每个样本的标签(分类)或值(回归)。 - 示例:鸢尾花数据集
X是(150, 4)(150 个样本,4 个特征),y是(150,)(150 个类别标签)。 - 监督学习与无监督学习:
- 监督学习:使用带标签的数据(
X和y)训练模型,如分类(LogisticRegression)和回归(LinearRegression)。 - 无监督学习:处理无标签数据(仅
X),如聚类(KMeans)或降维(PCA)。 - 数据集:
- Scikit-learn 提供内置数据集(如
load_iris()、load_breast_cancer())用于测试和学习。 - 支持外部数据(如 CSV 文件)通过 NumPy 或 Pandas 加载。
2. 数据预处理
数据预处理是机器学习的关键步骤,Scikit-learn 提供多种工具:
- 标准化(StandardScaler):将特征缩放为均值 0、方差 1。
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
- 归一化(MinMaxScaler):将特征缩放到指定范围(如 [0, 1])。
- 处理缺失值(SimpleImputer):用均值、中位数等填充缺失数据。
- 编码分类变量(LabelEncoder, OneHotEncoder):将文本标签转为数值。
- 特征选择(SelectKBest):选择重要特征以提高模型性能。
3. 模型训练与评估
- 训练/测试拆分:
使用train_test_split将数据分为训练集和测试集,防止过拟合。
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
- 交叉验证:
使用cross_val_score评估模型稳定性。
from sklearn.model_selection import cross_val_score
scores = cross_val_score(model, X, y, cv=5) # 5 折交叉验证
- 性能指标:
- 分类:准确率(
accuracy_score)、精确率、召回率、F1 分数(classification_report)。 - 回归:均方误差(
mean_squared_error)、R² 分数。 - 聚类:轮廓系数(
silhouette_score)。
4. 管道(Pipeline)
Pipeline 将数据预处理和模型训练步骤组合,避免数据泄漏并简化工作流。
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
pipeline = Pipeline([
('scaler', StandardScaler()),
('classifier', LogisticRegression())
])
pipeline.fit(X_train, y_train)
5. 超参数调优
使用 GridSearchCV 或 RandomizedSearchCV 优化模型参数。
from sklearn.model_selection import GridSearchCV
param_grid = {'classifier__C': [0.1, 1, 10]}
grid_search = GridSearchCV(pipeline, param_grid, cv=5)
grid_search.fit(X_train, y_train)
print(grid_search.best_params_)
6. 常用模型
- 分类:LogisticRegression, RandomForestClassifier, SVC。
- 回归:LinearRegression, Ridge, Lasso。
- 聚类:KMeans, DBSCAN。
- 降维:PCA, TSNE。
7. 统一的工作流程
- 加载数据(
load_iris()或 Pandas)。 - 预处理数据(标准化、编码等)。
- 拆分训练/测试集(
train_test_split)。 - 选择模型并训练(
fit)。 - 预测(
predict)并评估(accuracy_score或其他指标)。 - 调优参数(
GridSearchCV)或使用 Pipeline 优化流程。
8. 关键特点
- 一致性:所有功能遵循统一的 API 设计,易于学习和使用。
- 模块化:支持模块化组合(如 Pipeline、FeatureUnion)。
- 生态兼容:与 NumPy、Pandas、Matplotlib 无缝集成。
- 社区支持:活跃的社区,丰富的文档和示例(https://scikit-learn.org/stable/)。
9. 快速示例
使用鸢尾花数据集进行分类:
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
# 加载数据
iris = load_iris()
X, y = iris.data, iris.target
# 预处理
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 拆分数据
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42)
# 训练模型
model = LogisticRegression(random_state=42)
model.fit(X_train, y_train)
# 预测与评估
y_pred = model.predict(X_test)
print(f"Accuracy: {accuracy_score(y_test, y_pred):.2f}")
10. 注意事项
- 数据质量:确保数据无缺失值、无异常值。
- 过拟合:使用交叉验证、正则化或简单模型防止过拟合。
- 计算效率:中小规模数据表现优异,大数据集可考虑增量学习算法(如
SGDClassifier)。
如果需要深入某个概念(如 Pipeline 的高级用法或特定模型的细节),请告诉我,我可以提供更详细的解释或代码!