Python 课程20-Scikit-learn

前言

Scikit-learn 是 Python 中最流行的机器学习库之一,它提供了多种用于监督学习和无监督学习的算法。Scikit-learn 的特点是简单易用、模块化且具有高效的性能。无论是初学者还是专业开发者,都可以借助它进行快速原型设计和模型开发。

在本教程中,我们将深入讲解 Scikit-learn 的基础操作、数据预处理、模型构建与调优、以及常用的机器学习算法,包括线性回归、决策树、支持向量机、聚类等。通过这份详细教程,你将掌握如何使用 Scikit-learn 构建高效的机器学习模型。


目录

前言

目录

[1. Scikit-learn 基础](#1. Scikit-learn 基础)

[安装 Scikit-learn](#安装 Scikit-learn)

[Scikit-learn API 概述](#Scikit-learn API 概述)

数据集导入与基本操作

[2. 数据预处理](#2. 数据预处理)

数据标准化与归一化

处理缺失数据

类别特征编码

数据拆分与交叉验证

[3. 监督学习](#3. 监督学习)

线性回归

逻辑回归

支持向量机(SVM)

决策树与随机森林

[4. 无监督学习](#4. 无监督学习)

[K-means 聚类](#K-means 聚类)

主成分分析(PCA)

[DBSCAN 聚类](#DBSCAN 聚类)

[5. 模型评估与调优](#5. 模型评估与调优)

模型评估指标

交叉验证

网格搜索与随机搜索

[6. 高级功能](#6. 高级功能)

管道(Pipeline)机制

自定义评分函数与模型

[示例:使用 Scikit-learn 进行鸢尾花分类](#示例:使用 Scikit-learn 进行鸢尾花分类)

[步骤 1:加载数据集](#步骤 1:加载数据集)

[步骤 2:数据预处理](#步骤 2:数据预处理)

[步骤 4:评估模型](#步骤 4:评估模型)

[步骤 5:交叉验证与网格搜索调优](#步骤 5:交叉验证与网格搜索调优)

[步骤 6:使用最佳模型进行预测](#步骤 6:使用最佳模型进行预测)

结论


1. Scikit-learn 基础

安装 Scikit-learn

使用 pip 安装 Scikit-learn:

复制代码
pip install scikit-learn

Scikit-learn 依赖于 NumPySciPymatplotlib,确保这些库已经安装。

Scikit-learn API 概述

Scikit-learn 的核心是统一的 API 设计,包括三个主要步骤:

  1. 模型初始化:实例化模型。

  2. 模型拟合 :使用 .fit() 方法训练模型。

  3. 预测与评估 :通过 .predict() 进行预测,使用评估函数进行性能评估。

    from sklearn.linear_model import LinearRegression

    初始化模型

    model = LinearRegression()

    拟合模型

    model.fit(X_train, y_train)

    进行预测

    predictions = model.predict(X_test)

数据集导入与基本操作

Scikit-learn 提供了一些内置的数据集,如 IrisBoston HousingDigits,你可以轻松导入并使用这些数据集。

  • 加载内置数据集

    from sklearn import datasets

    加载 Iris 数据集

    iris = datasets.load_iris()
    X, y = iris.data, iris.target

还可以通过 Pandas 读取 CSV 文件等外部数据集:

复制代码
import pandas as pd

# 从 CSV 文件读取数据
df = pd.read_csv('data.csv')
X = df.drop(columns=['target'])
y = df['target']

2. 数据预处理

在机器学习中,数据预处理是至关重要的步骤。Scikit-learn 提供了多种工具来处理缺失值、标准化数据和编码类别特征。

数据标准化与归一化

机器学习模型通常要求输入数据进行标准化或归一化,以确保所有特征具有相同的尺度。

  • 标准化:通过移除平均值并缩放到单位方差。

    from sklearn.preprocessing import StandardScaler

    scaler = StandardScaler()
    X_scaled = scaler.fit_transform(X)

  • 归一化:将特征值缩放到 [0, 1] 范围。

    from sklearn.preprocessing import MinMaxScaler

    scaler = MinMaxScaler()
    X_normalized = scaler.fit_transform(X)

处理缺失数据

你可以使用 SimpleImputer 处理数据中的缺失值。

复制代码
from sklearn.impute import SimpleImputer

# 用均值填充缺失值
imputer = SimpleImputer(strategy='mean')
X_imputed = imputer.fit_transform(X)
类别特征编码

对于类别型特征,OneHotEncoderLabelEncoder 是常用的工具。

  • OneHotEncoder:将类别特征编码为多个二进制列。

    from sklearn.preprocessing import OneHotEncoder

    encoder = OneHotEncoder(sparse=False)
    X_encoded = encoder.fit_transform(X)

数据拆分与交叉验证

在训练模型前,你需要将数据集拆分为训练集和测试集,以便评估模型的泛化能力。

复制代码
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)

3. 监督学习

线性回归

线性回归 是最基础的回归算法之一,用于预测连续值。

复制代码
from sklearn.linear_model import LinearRegression

# 创建线性回归模型
model = LinearRegression()

# 拟合模型
model.fit(X_train, y_train)

# 预测
y_pred = model.predict(X_test)
逻辑回归

逻辑回归 用于二分类或多分类任务。

复制代码
from sklearn.linear_model import LogisticRegression

# 创建逻辑回归模型
model = LogisticRegression()

# 拟合模型
model.fit(X_train, y_train)

# 预测
y_pred = model.predict(X_test)
支持向量机(SVM)

支持向量机可以用于分类、回归和异常检测任务。

复制代码
from sklearn.svm import SVC

# 创建支持向量机模型
model = SVC(kernel='linear')

# 拟合模型
model.fit(X_train, y_train)

# 预测
y_pred = model.predict(X_test)
决策树与随机森林

决策树 是一种简单但强大的模型,随机森林 是基于多个决策树的集成模型。

  • 决策树

    from sklearn.tree import DecisionTreeClassifier

    model = DecisionTreeClassifier()
    model.fit(X_train, y_train)

  • 随机森林

    from sklearn.ensemble import RandomForestClassifier

    model = RandomForestClassifier()
    model.fit(X_train, y_train)


4. 无监督学习

K-means 聚类

K-means 是一种常见的聚类算法,用于将数据划分为 K 个簇。

复制代码
from sklearn.cluster import KMeans

model = KMeans(n_clusters=3)
model.fit(X)
labels = model.predict(X)
主成分分析(PCA)

主成分分析 是一种降维技术,用于减少数据的特征维度,同时保留数据的主要信息。

复制代码
from sklearn.decomposition import PCA

pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)
DBSCAN 聚类

DBSCAN 是一种基于密度的聚类算法,能够处理噪声和形状不规则的簇。

复制代码
from sklearn.cluster import DBSCAN

model = DBSCAN(eps=0.5, min_samples=5)
labels = model.fit_predict(X)

5. 模型评估与调优

模型评估指标
  • 分类任务常用指标:准确率、精确率、召回率、F1 分数。

    from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score

    准确率

    accuracy = accuracy_score(y_test, y_pred)

    精确率、召回率、F1 分数

    precision = precision_score(y_test, y_pred, average='macro')
    recall = recall_score(y_test, y_pred, average='macro')
    f1 = f1_score(y_test, y_pred, average='macro')

  • 回归任务常用指标:均方误差、平均绝对误差、R² 分数。

    from sklearn.metrics import mean_squared_error, r2_score

    均方误差和 R² 分数

    mse = mean_squared_error(y_test, y_pred)
    r2 = r2_score(y_test, y_pred)

交叉验证

交叉验证可以帮助你评估模型在不同数据划分下的性能。

复制代码
from sklearn.model_selection import cross_val_score

scores = cross_val_score(model, X, y, cv=5)
print("Cross-validation scores:", scores)
网格搜索与随机搜索

通过 GridSearchCVRandomizedSearchCV 可以自动化地进行超参数调优。

  • 网格搜索

    from sklearn.model_selection import GridSearchCV

    param_grid = {'C': [0.1, 1, 10], 'kernel': ['linear', 'rbf']}
    model = SVC()
    grid_search = GridSearchCV(model, param_grid, cv=5)
    grid_search.fit(X_train, y_train)

    print("最佳参数:", grid_search.best_params_)
    print("最佳得分:", grid_search.best_score_)

在上述示例中,GridSearchCV 会尝试不同的参数组合,通过交叉验证选择性能最好的模型。

  • 随机搜索

    from sklearn.model_selection import RandomizedSearchCV
    from scipy.stats import uniform

    param_dist = {'C': uniform(0.1, 10), 'kernel': ['linear', 'rbf']}
    model = SVC()
    random_search = RandomizedSearchCV(model, param_distributions=param_dist, n_iter=10, cv=5, random_state=42)
    random_search.fit(X_train, y_train)

    print("最佳参数:", random_search.best_params_)
    print("最佳得分:", random_search.best_score_)

RandomizedSearchCV 在参数空间较大时效率更高,因为它只随机采样参数组合。


6. 高级功能

管道(Pipeline)机制

Pipeline 机制允许将数据预处理和模型训练步骤串联起来,简化工作流程并避免数据泄漏。

  • 创建管道

    from sklearn.pipeline import Pipeline
    from sklearn.preprocessing import StandardScaler
    from sklearn.svm import SVC

    pipeline = Pipeline([
    ('scaler', StandardScaler()),
    ('svc', SVC())
    ])

    pipeline.fit(X_train, y_train)
    predictions = pipeline.predict(X_test)

  • 在管道中进行参数调优

    from sklearn.model_selection import GridSearchCV

    param_grid = {
    'svc__C': [0.1, 1, 10],
    'svc__kernel': ['linear', 'rbf']
    }

    grid_search = GridSearchCV(pipeline, param_grid, cv=5)
    grid_search.fit(X_train, y_train)

    print("最佳参数:", grid_search.best_params_)

在参数网格中,使用 步骤名称__参数名 的形式指定参数。

自定义评分函数与模型
  • 自定义评分函数

你可以定义自己的评分函数,用于模型评估和选择。

复制代码
from sklearn.metrics import make_scorer, fbeta_score

# 定义自定义评分函数
fbeta_scorer = make_scorer(fbeta_score, beta=0.5)

# 在 GridSearchCV 中使用自定义评分函数
grid_search = GridSearchCV(model, param_grid, scoring=fbeta_scorer, cv=5)
  • 自定义模型

如果 Scikit-learn 没有满足你需求的模型,你可以创建自定义模型,只要遵循 fitpredict 方法的接口。

复制代码
from sklearn.base import BaseEstimator, ClassifierMixin

class MyCustomModel(BaseEstimator, ClassifierMixin):
    def __init__(self, param=1):
        self.param = param

    def fit(self, X, y):
        # 自定义训练逻辑
        return self

    def predict(self, X):
        # 自定义预测逻辑
        return predictions

示例:使用 Scikit-learn 进行鸢尾花分类

我们将使用 Scikit-learn 的 Iris 数据集 进行分类任务。鸢尾花数据集包含 150 个样本,有 4 个特征和 3 个类别,目标是根据花瓣和萼片的大小来预测花的类别。

步骤 1:加载数据集
复制代码
from sklearn import datasets
from sklearn.model_selection import train_test_split

# 加载 Iris 数据集
iris = datasets.load_iris()
X = iris.data
y = iris.target

# 划分数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
步骤 2:数据预处理

我们将对特征进行标准化处理,使每个特征的均值为 0,方差为 1。

复制代码
from sklearn.preprocessing import StandardScaler

# 标准化处理
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

步骤 3:训练分类模型(逻辑回归)

复制代码
from sklearn.linear_model import LogisticRegression

# 创建逻辑回归模型
model = LogisticRegression()

# 训练模型
model.fit(X_train, y_train)
步骤 4:评估模型

我们使用准确率(Accuracy)评估模型在测试集上的性能。

复制代码
from sklearn.metrics import accuracy_score

# 预测测试集
y_pred = model.predict(X_test)

# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"测试集上的准确率: {accuracy:.2f}")
步骤 5:交叉验证与网格搜索调优

使用交叉验证评估模型,并使用 GridSearchCV 进行超参数调优。

复制代码
from sklearn.model_selection import GridSearchCV

# 定义参数网格
param_grid = {
    'C': [0.1, 1, 10],
    'solver': ['lbfgs', 'liblinear']
}

# 使用 GridSearchCV 进行超参数调优
grid_search = GridSearchCV(LogisticRegression(), param_grid, cv=5)
grid_search.fit(X_train, y_train)

# 输出最佳参数和最佳分数
print(f"最佳参数: {grid_search.best_params_}")
print(f"最佳交叉验证得分: {grid_search.best_score_:.2f}")
步骤 6:使用最佳模型进行预测

使用调优后的最佳模型对测试集进行预测,并计算新的准确率。

复制代码
# 使用最佳模型进行预测
best_model = grid_search.best_estimator_
y_pred_best = best_model.predict(X_test)

# 计算准确率
accuracy_best = accuracy_score(y_test, y_pred_best)
print(f"使用最佳模型的测试集准确率: {accuracy_best:.2f}")

完整代码总结

复制代码
from sklearn import datasets
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score

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

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

# 数据预处理
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

# 创建并训练模型
model = LogisticRegression()
model.fit(X_train, y_train)

# 评估模型
y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f"测试集上的准确率: {accuracy:.2f}")

# 交叉验证与调优
param_grid = {'C': [0.1, 1, 10], 'solver': ['lbfgs', 'liblinear']}
grid_search = GridSearchCV(LogisticRegression(), param_grid, cv=5)
grid_search.fit(X_train, y_train)

print(f"最佳参数: {grid_search.best_params_}")
print(f"最佳交叉验证得分: {grid_search.best_score_:.2f}")

# 使用最佳模型进行预测
best_model = grid_search.best_estimator_
y_pred_best = best_model.predict(X_test)
accuracy_best = accuracy_score(y_test, y_pred_best)
print(f"使用最佳模型的测试集准确率: {accuracy_best:.2f}")

结论

通过本教程,你已经全面了解了 Scikit-learn 的基本使用方法和高级功能。从数据预处理、模型构建、模型评估到模型调优,Scikit-learn 提供了一套完整的机器学习解决方案。它的统一 API 设计使得各个算法之间的切换和比较变得非常容易。无论你是机器学习的新手还是经验丰富的开发者,Scikit-learn 都是一个不可或缺的工具,帮助你高效地构建和部署机器学习模型。

相关推荐
依米s1 分钟前
2019年人工智能大会核心议题《智联世界无限可能》
人工智能·waic·人工智能大会
IT_陈寒3 分钟前
JavaScript开发者必知的7个ES2023新特性,让你的代码效率提升50%
前端·人工智能·后端
咚咚王6 分钟前
人工智能之数据分析 Matplotlib:第四章 图形类型
人工智能·数据分析
用户5191495848459 分钟前
Ash框架授权绕过漏洞分析:当绕过策略条件评估为真时
人工智能·aigc
用户5191495848459 分钟前
Bedrock AgentCore Python SDK:零基础设施部署AI代理的终极方案
人工智能·aigc
Maynor99617 分钟前
全网唯一!独家支持 Grok4 Heavy模型 ,教你在国内使用Heavy模型!
人工智能
CryptoPP24 分钟前
使用 KLineChart 这个轻量级的前端图表库
服务器·开发语言·前端·windows·后端·golang
Ai1731639157928 分钟前
2025.11.28国产AI计算卡参数信息汇总
服务器·图像处理·人工智能·神经网络·机器学习·视觉检测·transformer
18你磊哥29 分钟前
chromedriver.exe的使用和python基本处理
开发语言·python
小坏讲微服务43 分钟前
Spring Cloud Alibaba 整合 Scala 教程完整使用
java·开发语言·分布式·spring cloud·sentinel·scala·后端开发