Sklearn 教程

我将为你提供一个简洁的 Scikit-learn(sklearn)教程,涵盖其核心功能和基本使用方法。Scikit-learn 是一个强大的 Python 机器学习库,广泛用于数据分析和建模。以下教程将包括安装、数据预处理、模型训练、评估和调优的示例,适合初学者和有一定经验的用户。


1. 安装 Scikit-learn

确保你已安装 Python(建议版本 3.6+)。使用 pip 安装 Scikit-learn:

pip install scikit-learn

验证安装:

import sklearn
print(sklearn.__version__)  # 查看版本号

依赖库(如 NumPy、SciPy)会自动安装。


2. Scikit-learn 核心概念

  • 数据集:Scikit-learn 使用 NumPy 数组或 Pandas DataFrame 存储数据。通常,X 表示特征矩阵,y 表示目标变量。
  • 估算器(Estimator):所有模型(如回归、分类、聚类)都遵循估算器接口,包含 fit()predict() 等方法。
  • 管道(Pipeline):用于组合数据预处理和模型训练步骤。
  • 交叉验证:用于评估模型性能,防止过拟合。
  • 超参数调优:通过 GridSearchCV 或 RandomizedSearchCV 优化模型参数。

3. 基本工作流程

以下是一个完整的示例,使用 Scikit-learn 进行分类任务(基于经典的鸢尾花数据集)。

步骤 1:加载数据

Scikit-learn 提供了一些内置数据集,例如鸢尾花数据集:

from sklearn.datasets import load_iris
iris = load_iris()
X, y = iris.data, iris.target  # X 是特征矩阵,y 是类别标签
print(X.shape)  # (150, 4) 表示 150 个样本,4 个特征
print(y.shape)  # (150,) 表示 150 个标签

步骤 2:数据预处理

数据预处理是机器学习的重要步骤。常见操作包括:

  • 标准化(Standardization):将特征缩放到均值为 0、方差为 1。
  • 归一化(Normalization):将特征缩放到 [0, 1] 范围。
  • 处理缺失值:用均值、中位数等填充缺失值。

示例 – 标准化:

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)  # 标准化特征

步骤 3:拆分数据集

将数据分为训练集和测试集以评估模型性能:

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42)
print(X_train.shape, X_test.shape)  # (120, 4), (30, 4)

步骤 4:选择和训练模型

使用逻辑回归(Logistic Regression)作为示例分类器:

from sklearn.linear_model import LogisticRegression
model = LogisticRegression(random_state=42)
model.fit(X_train, y_train)  # 训练模型

步骤 5:预测和评估

对测试集进行预测并评估模型性能:

from sklearn.metrics import accuracy_score, classification_report
y_pred = model.predict(X_test)  # 预测
accuracy = accuracy_score(y_test, y_pred)  # 计算准确率
print(f"Accuracy: {accuracy:.2f}")
print("Classification Report:\n", classification_report(y_test, y_pred, target_names=iris.target_names))

输出示例:

Accuracy: 1.00
Classification Report:
               precision    recall  f1-score   support
      setosa       1.00      1.00      1.00        10
  versicolor       1.00      1.00      1.00         9
   virginica       1.00      1.00      1.00        11
    accuracy                           1.00        30
   macro avg       1.00      1.00      1.00        30
weighted avg       1.00      1.00      1.00        30

步骤 6:超参数调优

使用 GridSearchCV 优化模型参数:

from sklearn.model_selection import GridSearchCV
param_grid = {'C': [0.1, 1, 10], 'penalty': ['l2']}
grid_search = GridSearchCV(LogisticRegression(random_state=42), param_grid, cv=5)
grid_search.fit(X_train, y_train)
print("Best Parameters:", grid_search.best_params_)
print("Best Score:", grid_search.best_score_)

4. 其他常用模型

Scikit-learn 支持多种机器学习算法,以下是几个常用模型的简单示例:

决策树(Decision Tree)

from sklearn.tree import DecisionTreeClassifier
dt_model = DecisionTreeClassifier(max_depth=3, random_state=42)
dt_model.fit(X_train, y_train)
y_pred_dt = dt_model.predict(X_test)
print(f"Decision Tree Accuracy: {accuracy_score(y_test, y_pred_dt):.2f}")

随机森林(Random Forest)

from sklearn.ensemble import RandomForestClassifier
rf_model = RandomForestClassifier(n_estimators=100, random_state=42)
rf_model.fit(X_train, y_train)
y_pred_rf = rf_model.predict(X_test)
print(f"Random Forest Accuracy: {accuracy_score(y_test, y_pred_rf):.2f}")

支持向量机(SVM)

from sklearn.svm import SVC
svm_model = SVC(kernel='rbf', random_state=42)
svm_model.fit(X_train, y_train)
y_pred_svm = svm_model.predict(X_test)
print(f"SVM Accuracy: {accuracy_score(y_test, y_pred_svm):.2f}")

K 均值聚类(K-Means Clustering)

用于无监督学习:

from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=3, random_state=42)
kmeans.fit(X_scaled)
clusters = kmeans.labels_
print("Cluster Labels:", clusters[:10])

5. 使用 Pipeline 简化流程

Pipeline 可以将预处理和模型训练组合在一起,避免数据泄漏:

from sklearn.pipeline import Pipeline
pipeline = Pipeline([
    ('scaler', StandardScaler()),  # 标准化
    ('classifier', LogisticRegression(random_state=42))  # 模型
])
pipeline.fit(X_train, y_train)
y_pred_pipeline = pipeline.predict(X_test)
print(f"Pipeline Accuracy: {accuracy_score(y_test, y_pred_pipeline):.2f}")

6. 保存和加载模型

使用 joblib 保存训练好的模型:

import joblib
joblib.dump(model, 'logistic_model.pkl')  # 保存模型
loaded_model = joblib.load('logistic_model.pkl')  # 加载模型
y_pred_loaded = loaded_model.predict(X_test)
print(f"Loaded Model Accuracy: {accuracy_score(y_test, y_pred_loaded):.2f}")

7. 高级功能

  • 特征选择:使用 SelectKBestRFE 选择重要特征。
  from sklearn.feature_selection import SelectKBest, f_classif
  selector = SelectKBest(score_func=f_classif, k=2)
  X_selected = selector.fit_transform(X, y)
  print(X_selected.shape)  # (150, 2)
  • 交叉验证:使用 cross_val_score 评估模型稳定性。
  from sklearn.model_selection import cross_val_score
  scores = cross_val_score(model, X_scaled, y, cv=5)
  print(f"Cross-Validation Scores: {scores.mean():.2f} ± {scores.std():.2f}")
  • 降维:使用 PCA 进行主成分分析。
  from sklearn.decomposition import PCA
  pca = PCA(n_components=2)
  X_pca = pca.fit_transform(X_scaled)
  print(X_pca.shape)  # (150, 2)

8. 实用资源

  • 官方文档:https://scikit-learn.org/stable/
  • 示例代码:https://scikit-learn.org/stable/auto_examples/index.html
  • 数据集:Scikit-learn 内置数据集(如 load_breast_cancerload_digits)或外部数据集(如 Kaggle)。
  • 社区:Stack Overflow、X 平台上搜索 #scikit-learn 获取最新讨论。

9. 注意事项

  • 数据清洗:确保数据无缺失值、无异常值。
  • 特征工程:特征选择和构造对模型性能影响很大。
  • 过拟合:通过正则化、交叉验证或减少模型复杂度防止过拟合。
  • 计算效率:对于大数据集,考虑使用 MiniBatchKMeansSGDClassifier 等高效算法。

这个教程涵盖了 Scikit-learn 的基本使用流程和常见任务。如果你有具体问题(例如某个算法的细节、处理特定数据集、生成可视化图表等),请告诉我,我可以进一步深入讲解或提供代码!

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注