Python 实用工具与机器学习入门:Rich + Tqdm + Faker + Schedule + Scikit-learn

Python 实用工具与机器学习入门:Rich + Tqdm + Faker + Schedule + Scikit-learn

专栏:Python 常用工具库实战教程 | 第五篇

适合人群:Python 开发者、数据分析师、自动化运维工程师


目录

  • 前言:实用工具的价值
  • [第一章:Rich ------ 让终端焕然一新](#第一章:Rich —— 让终端焕然一新)
    • [1.1 Rich 是什么](#1.1 Rich 是什么)
    • [1.2 彩色文字与样式](#1.2 彩色文字与样式)
    • [1.3 精美表格](#1.3 精美表格)
    • [1.4 面板与布局](#1.4 面板与布局)
    • [1.5 语法高亮](#1.5 语法高亮)
    • [1.6 进度条](#1.6 进度条)
    • [1.7 树形结构与日志](#1.7 树形结构与日志)
    • [1.8 Emoji 与状态图标](#1.8 Emoji 与状态图标)
  • [第二章:Tqdm ------ 最优雅的进度条](#第二章:Tqdm —— 最优雅的进度条)
    • [2.1 基本用法](#2.1 基本用法)
    • [2.2 手动控制](#2.2 手动控制)
    • [2.3 与 Pandas/NumPy 配合](#2.3 与 Pandas/NumPy 配合)
  • [第三章:Faker ------ 造数据的神器](#第三章:Faker —— 造数据的神器)
    • [3.1 基本用法](#3.1 基本用法)
    • [3.2 多语言支持](#3.2 多语言支持)
    • [3.3 数据导出](#3.3 数据导出)
  • [第四章:Schedule ------ 优雅的定时任务](#第四章:Schedule —— 优雅的定时任务)
    • [4.1 基本用法](#4.1 基本用法)
    • [4.2 复杂调度](#4.2 复杂调度)
    • [4.3 实战案例](#4.3 实战案例)
  • [第五章:Scikit-learn ------ 机器学习入门](#第五章:Scikit-learn —— 机器学习入门)
    • [5.1 机器学习概述](#5.1 机器学习概述)
    • [5.2 数据准备与预处理](#5.2 数据准备与预处理)
    • [5.3 监督学习:分类](#5.3 监督学习:分类)
    • [5.4 监督学习:回归](#5.4 监督学习:回归)
    • [5.5 无监督学习:聚类](#5.5 无监督学习:聚类)
    • [5.6 模型评估与交叉验证](#5.6 模型评估与交叉验证)
  • 总结

前言

除了核心的数据处理库之外,Python 生态还有大量实用的小工具,它们虽然不起眼,却能在日常开发中大幅提升效率。本章将介绍四个实用工具和一个机器学习框架:

工具 定位 一句话
Rich 终端美化 让命令行输出像艺术品
Tqdm 进度条 让等待不再焦虑
Faker 数据生成 一键生成海量假数据
Schedule 定时任务 最优雅的 cron 替代
Scikit-learn 机器学习 机器学习界的瑞士军刀

第一章:Rich ------ 让终端焕然一新

1.1 Rich 是什么

Rich 是一个 Python 库,可以让你的终端输出变得五彩斑斓。它支持彩色文字、精美表格、进度条、语法高亮、树形结构等。如果你在开发 CLI 工具或命令行程序,Rich 是必备神器。

bash 复制代码
pip install rich
python 复制代码
from rich.console import Console
console = Console()

1.2 彩色文字与样式

Rich 支持丰富的文字样式:

python 复制代码
from rich.console import Console
console = Console()

# 基本颜色
console.print("红色警告", style="bold red")
console.print("绿色成功", style="bold green")
console.print("蓝色信息", style="bold blue")

# 背景色
console.print("黄底黑字", style="black on yellow")

# 渐变效果
for i, char in enumerate("Hello, Rich!"):
    console.print(char, style=f"rgb({i*20},{255-i*10},{128+i*10})", end="")
console.print()

# 标记语法(类似HTML)
console.print("[bold red]重要[/bold red]: [green]操作成功[/green]")
console.print("[bold cyan]Python[/bold cyan] is [italic]awesome[/italic]!")
console.print("[link=https://python.org]点击访问 Python 官网[/link]")

支持的样式属性:

类别 示例
颜色 red, green, blue, yellow, magenta, cyan, white style="red"
亮色 bright_red, bright_green... style="bright_cyan"
RGB rgb(r,g,b) style="rgb(255,100,50)"
背景 on red, on #ffffff style="on blue"
粗体 bold style="bold"
斜体 italic style="italic"
下划线 underline style="underline"
删除线 strike style="strike"
反转 reverse style="reverse"
闪烁 blink style="blink"

1.3 精美表格

Rich 最引以为傲的功能就是精美的表格输出:

python 复制代码
from rich.table import Table
from rich import box

table = Table(title="Python 工具库速查表", box=box.ROUNDED,
              show_lines=True, title_style="bold magenta",
              border_style="bright_blue")

table.add_column("库名", style="bold cyan", width=15)
table.add_column("用途", style="green", width=30)
table.add_column("安装命令", style="yellow", width=25)
table.add_column("评分", justify="center", width=8)

table.add_row("NumPy", "数组运算、矩阵计算", "pip install numpy", "⭐⭐⭐⭐⭐")
table.add_row("Pandas", "数据分析、表格处理", "pip install pandas", "⭐⭐⭐⭐⭐")
table.add_row("Matplotlib", "数据可视化", "pip install matplotlib", "⭐⭐⭐⭐⭐")
table.add_row("Requests", "HTTP请求", "pip install requests", "⭐⭐⭐⭐⭐")
table.add_row("Pillow", "图像处理", "pip install pillow", "⭐⭐⭐⭐")
table.add_row("BeautifulSoup", "HTML解析", "pip install beautifulsoup4", "⭐⭐⭐⭐")
table.add_row("Scrapy", "爬虫框架", "pip install scrapy", "⭐⭐⭐⭐")
table.add_row("Rich", "终端美化", "pip install rich", "⭐⭐⭐⭐")

console.print(table)

运行效果(终端中会显示彩色精美表格):

1.4 面板与布局

python 复制代码
from rich.panel import Panel
from rich.columns import Columns

# 基本面板
console.print(Panel("面板内容", title="标题", border_style="green"))

# 多面板并排
panel1 = Panel("左侧面板", border_style="green")
panel2 = Panel("右侧面板", border_style="blue")
console.print(Columns([panel1, panel2]))

# 带副标题和边框的面板
long_text = """Rich 库是 Python 中最强大的终端美化库之一。
它可以创建精美的表格、进度条、语法高亮代码块等。"""
console.print(Panel(long_text, title="Rich 库简介",
                     border_style="magenta", subtitle="Python 终端利器"))

1.5 语法高亮

python 复制代码
from rich.syntax import Syntax

code = '''def fibonacci(n):
    """计算第n个斐波那契数"""
    if n <= 1:
        return n
    a, b = 0, 1
    for _ in range(2, n + 1):
        a, b = b, a + b
    return b

# 计算前10个
for i in range(10):
    print(f"fib({i}) = {fibonacci(i)}")'''

syntax = Syntax(code, "python", theme="monokai", line_numbers=True)
console.print(Panel(syntax, title="Python 代码示例", border_style="cyan"))

支持的语言包括:Python、JavaScript、Java、C++、Go、Rust、SQL、JSON、YAML、Markdown 等 100+ 种。

1.6 进度条

python 复制代码
from rich.progress import (Progress, SpinnerColumn, TextColumn,
                             BarColumn, TimeElapsedColumn, MofNCompleteColumn)
import time

with Progress(
    SpinnerColumn(),
    TextColumn("[progress.description]{task.description}"),
    BarColumn(bar_width=40),
    TextColumn("[progress.percentage]{task.percentage:>3.0f}%"),
    MofNCompleteColumn(),
    TimeElapsedColumn(),
    console=console,
) as progress:
    task1 = progress.add_task("[red]下载数据...", total=100)
    task2 = progress.add_task("[green]处理中...", total=100)
    task3 = progress.add_task("[blue]分析中...", total=100)

    while not progress.finished:
        progress.update(task1, advance=1.5)
        progress.update(task2, advance=1.2)
        progress.update(task3, advance=0.8)
        time.sleep(0.05)

1.7 树形结构与日志

python 复制代码
from rich.tree import Tree
from rich.console import Console

# 树形结构
tree = Tree("📁 project", guide_style="bold cyan")
tree.add("📄 requirements.txt")
src = tree.add("📁 src")
src.add("📄 main.py")
src.add("📄 utils.py")
tests = tree.add("📁 tests")
tests.add("📄 test_main.py")
console.print(tree)

# 日志
from rich.logging import RichHandler
import logging

logging.basicConfig(
    level=logging.INFO,
    format="%(message)s",
    datefmt="[%X]",
    handlers=[RichHandler()]
)
logger = logging.getLogger("rich")
logger.info("服务启动成功")
logger.warning("内存使用率超过80%")
logger.error("连接数据库失败")

1.8 Emoji 与状态图标

Rich 支持 Emoji 和状态图标,让输出更加直观:

python 复制代码
console.print("✅ 任务完成")
console.print("❌ 连接失败")
console.print("⚠️  警告: 内存不足")
console.print("ℹ️  提示: 请更新版本")
console.print("🚀 部署成功!")
console.print("📦 正在安装依赖...")
console.print("🔍 搜索中...")
console.print("🔑 请先登录")
console.print("📊 数据分析完成")
console.print("🔄 正在同步...")

Rich 还能导出为 HTML:

python 复制代码
html = console.export_html(clear=False)
with open('output.html', 'w') as f:
    f.write(html)

第二章:Tqdm ------ 最优雅的进度条

2.1 基本用法

Tqdm(来自阿拉伯语 taqaddum,意为"进展")是 Python 中最流行的进度条库。它几乎零侵入------只需要一行代码就能给任何迭代器加上进度条。

bash 复制代码
pip install tqdm
python 复制代码
from tqdm import tqdm
import time

# 最简单的用法:直接包裹可迭代对象
for i in tqdm(range(100)):
    time.sleep(0.02)

# 输出: 100%|██████████| 100/100 [00:02<00:00, 49.50it/s]

# 自定义描述
for i in tqdm(range(100), desc="下载进度", unit="MB"):
    time.sleep(0.02)

# 输出: 下载进度: 100%|██████████| 100/100 [00:02<00:00, 49.50MB/s]

# 处理列表
data = list(range(1000))
for item in tqdm(data, desc="处理数据"):
    # 处理每个数据项
    pass

2.2 手动控制

python 复制代码
from tqdm import tqdm
import time

# 手动更新进度
with tqdm(total=100, desc="安装中", unit="%) as pbar:
    for i in range(10):
        time.sleep(0.5)
        pbar.update(10)  # 每次更新10%

# 自定义后缀信息
with tqdm(total=100, desc="传输") as pbar:
    for i in range(100):
        time.sleep(0.02)
        pbar.set_postfix(loss=0.1/(i+1), acc=0.9+i*0.001)
        pbar.update(1)

# 输出: 传输: 100%|██████████| 100/100 [00:02<00:00, loss=0.001, acc=0.991]

2.3 与 Pandas/NumPy 配合

python 复制代码
import pandas as pd
from tqdm import tqdm

# Pandas apply 进度条
tqdm.pandas(desc="Pandas处理")
df = pd.DataFrame({'data': range(1000)})
df['result'] = df['data'].progress_apply(lambda x: x ** 2)

# NumPy 手动进度
import numpy as np
data = np.random.rand(10000)
results = []
for i in tqdm(range(0, len(data), 100), desc="NumPy批量"):
    batch = data[i:i+100]
    results.extend(batch ** 2)

Tqdm 参数速查:

参数 说明 示例
total 总数量 total=100
desc 描述文字 desc="下载中"
unit 单位 unit="MB"
ncols 进度条宽度 ncols=80
position 多进度条位置 position=0
leave 完成后保留 leave=False
file 输出到文件 file=open('log.txt','w')

第三章:Faker ------ 造数据的神器

3.1 基本用法

在开发和测试时,经常需要大量的模拟数据。Faker 可以一键生成各种逼真的假数据。

bash 复制代码
pip install faker
python 复制代码
from faker import Faker

fake = Faker('zh_CN')  # 中文数据

# 个人信息
print(fake.name())         # 王伟
print(fake.phone_number()) # 13912345678
print(fake.address())      # 安徽省合肥市蜀山区XX路XX号
print(fake.email())        # wei@example.com
print(fake.company())      # 腾讯科技有限公司
print(fake.job())          # 软件工程师
print(fake.credit_card_number())  # 4123456789012345

# 文本
print(fake.text())         # 随机文本
print(fake.sentence())     # 随机句子
print(fake.paragraph())    # 随机段落

# 日期时间
print(fake.date())         # 2025-03-15
print(fake.date_time())    # 2025-03-15 14:30:00
print(fake.year())         # 2025

# 互联网
print(fake.user_name())    # zhangsan
print(fake.url())          # https://example.com/xxx
print(fake.ipv4())         # 192.168.1.1
print(fake.user_agent())   # Mozilla/5.0 ...

# 地理位置
print(fake.latitude())     # 31.2304
print(fake.longitude())    # 121.4737

3.2 多语言支持

Faker 支持 40+ 种语言和地区:

python 复制代码
from faker import Faker

# 中文
zh = Faker('zh_CN')
print(zh.name())      # 李明
print(zh.address())   # 四川省成都市...

# 英文
en = Faker('en_US')
print(en.name())      # John Smith
print(en.address())   # 123 Main St, Springfield, IL

# 日文
ja = Faker('ja_JP')
print(ja.name())      # 山田太郎

# 韩文
ko = Faker('ko_KR')
print(ko.name())      # 김민수

# 多语言混合
multi = Faker(['zh_CN', 'en_US', 'ja_JP'])
for _ in range(3):
    print(multi.name())

3.3 数据导出

python 复制代码
from faker import Faker
import pandas as pd
import json

fake = Faker('zh_CN')

# 生成 DataFrame
users = []
for _ in range(100):
    users.append({
        '姓名': fake.name(),
        '年龄': fake.random_int(min=18, max=65),
        '手机号': fake.phone_number(),
        '邮箱': fake.email(),
        '地址': fake.address(),
        '公司': fake.company(),
        '职位': fake.job(),
        '注册日期': fake.date_between(start_date='-2y', end_date='today'),
        '评分': round(fake.pyfloat(min_value=1.0, max_value=5.0), 1)
    })

df = pd.DataFrame(users)

# 导出为 CSV
df.to_csv('fake_users.csv', index=False, encoding='utf-8-sig')

# 导出为 JSON
df.to_json('fake_users.json', orient='records', force_ascii=False, indent=2)

# 导出为 Excel
df.to_excel('fake_users.xlsx', index=False)

print(f"已生成 {len(df)} 条假数据")
print(df.head())

自定义数据生成器:

python 复制代码
from faker import Faker
from faker.providers import BaseProvider

fake = Faker('zh_CN')

# 自定义 Provider
class ProductProvider(BaseProvider):
    def product_category(self):
        categories = ['电子产品', '服装', '食品', '图书', '家居', '运动']
        return self.random_element(categories)

    def product_name(self):
        brands = ['苹果', '华为', '小米', '索尼', '三星']
        types = ['手机', '笔记本', '耳机', '手表', '平板']
        return f"{self.random_element(brands)} {self.random_element(types)}"

    def order_status(self):
        statuses = ['待付款', '已付款', '已发货', '已签收', '已取消']
        return self.random_element(statuses)

# 注册 Provider
fake.add_provider(ProductProvider)

# 使用
for _ in range(5):
    print(f"商品: {fake.product_name()}")
    print(f"类别: {fake.product_category()}")
    print(f"状态: {fake.order_status()}")
    print("---")

第四章:Schedule ------ 优雅的定时任务

4.1 基本用法

Schedule 是一个轻量级的定时任务库,API 设计非常人性化。

bash 复制代码
pip install schedule
python 复制代码
import schedule
import time

# 每隔10秒执行
def job():
    print("任务执行中...")

schedule.every(10).seconds.do(job)
schedule.every(1).minutes.do(job)
schedule.every(2).hours.do(job)
schedule.every().day.at("10:30").do(job)
schedule.every().monday.do(job)
schedule.every().wednesday.at("13:15").do(job)

while True:
    schedule.run_pending()
    time.sleep(1)

4.2 复杂调度

python 复制代码
import schedule

# 带参数的函数
def greet(name):
    print(f"Hello, {name}!")

schedule.every(5).seconds.do(greet, name="Alice")

# 取消任务
job = schedule.every(5).seconds.do(greet, name="Bob")
schedule.cancel_job(job)

# 仅执行一次
def once_job():
    print("只执行一次!")
    return schedule.CancelJob  # 返回 CancelJob 自动取消

schedule.every(10).seconds.do(once_job)

# 链式调用
schedule.every(1).hour.at(":30").do(job)   # 每小时的第30分钟
schedule.every().hour.at("09:30").do(job)   # 每天09:30
schedule.every().day.at("09:30:00").do(job) # 精确到秒

# 查看已注册的任务
print(schedule.get_jobs())

# 时间单位
schedule.every(1).second
schedule.every(1).minute
schedule.every(1).hour
schedule.every(1).day
schedule.every(1).week

# 星期
schedule.every().monday
schedule.every().tuesday
schedule.every().wednesday
schedule.every().thursday
schedule.every().friday
schedule.every().saturday
schedule.every().sunday

4.3 实战案例

python 复制代码
import schedule
import time
from datetime import datetime

def log(msg):
    print(f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] {msg}")

def check_server():
    """模拟服务器健康检查"""
    log("🔍 检查服务器状态...")
    # 实际应用中用 requests 发起健康检查
    log("✅ 服务器正常")

def backup_database():
    """模拟数据库备份"""
    log("💾 开始数据库备份...")
    log("✅ 备份完成")

def generate_report():
    """模拟生成日报"""
    log("📊 生成日报...")
    log("✅ 日报已发送")

def cleanup_temp():
    """模拟清理临时文件"""
    log("🧹 清理临时文件...")
    log("✅ 清理完成")

# 注册定时任务
schedule.every(5).minutes.do(check_server)
schedule.every().day.at("02:00").do(backup_database)
schedule.every().day.at("09:00").do(generate_report)
schedule.every().saturday.at("03:00").do(cleanup_temp)

log("🚀 定时任务服务启动")
log(f"已注册 {len(schedule.get_jobs())} 个任务")

while True:
    schedule.run_pending()
    time.sleep(1)

Schedule vs Cron 对比:

特性 Schedule Cron
Python 原生 否(系统工具)
可读性 极高 低(需要记忆语法)
跨平台 是(但语法不同)
守护进程 需自己实现 自带
分布式 不支持 不支持
适用场景 简单定时任务 系统级复杂调度

第五章:Scikit-learn ------ 机器学习入门

5.1 机器学习概述

Scikit-learn(简称 sklearn)是 Python 中最流行的机器学习库。它提供了从数据预处理到模型评估的完整工具链。

bash 复制代码
pip install scikit-learn

机器学习的三大类型:

5.2 数据准备与预处理

python 复制代码
import numpy as np
from sklearn.datasets import load_iris, load_boston
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler, MinMaxScaler

# 加载内置数据集
iris = load_iris()
X = iris.data        # 特征 (150, 4)
y = iris.target      # 标签 (150,)

print(f"特征数: {X.shape[1]}")
print(f"样本数: {X.shape[0]}")
print(f"类别数: {len(np.unique(y))}")
print(f"特征名称: {iris.feature_names}")
print(f"类别名称: {iris.target_names}")

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42, stratify=y
)
print(f"训练集: {len(X_train)}, 测试集: {len(X_test)}")

# 特征标准化 (Z-score)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)  # 用训练集fit
X_test_scaled = scaler.transform(X_test)         # 用训练集的参数transform测试集

# 特征归一化 (Min-Max)
normalizer = MinMaxScaler()
X_train_normalized = normalizer.fit_transform(X_train)
X_test_normalized = normalizer.transform(X_test)

预处理方法对比:

方法 公式 范围 适用场景
StandardScaler (x - μ) / σ 无界 大多数算法
MinMaxScaler (x - min) / (max - min) [0, 1] 神经网络
RobustScaler (x - median) / IQR 无界 有离群值的数据
MaxAbsScaler x / max [-1, 1] 稀疏数据

5.3 监督学习:分类

逻辑回归
python 复制代码
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, classification_report

model = LogisticRegression(max_iter=200)
model.fit(X_train_scaled, y_train)
y_pred = model.predict(X_test_scaled)

print(f"准确率: {accuracy_score(y_test, y_pred):.4f}")
print(classification_report(y_test, y_pred, target_names=iris.target_names))
决策树
python 复制代码
from sklearn.tree import DecisionTreeClassifier

model = DecisionTreeClassifier(max_depth=3, random_state=42)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)

print(f"准确率: {accuracy_score(y_test, y_pred):.4f}")

# 特征重要性
for name, importance in zip(iris.feature_names, model.feature_importances_):
    print(f"  {name}: {importance:.4f}")
随机森林
python 复制代码
from sklearn.ensemble import RandomForestClassifier

model = RandomForestClassifier(n_estimators=100, random_state=42)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)

print(f"准确率: {accuracy_score(y_test, y_pred):.4f}")
print("Top 3 特征重要性:")
indices = np.argsort(model.feature_importances_)[::-1][:3]
for i in indices:
    print(f"  {iris.feature_names[i]}: {model.feature_importances_[i]:.4f}")
支持向量机 (SVM)
python 复制代码
from sklearn.svm import SVC

model = SVC(kernel='rbf', C=1.0, gamma='scale')
model.fit(X_train_scaled, y_train)
y_pred = model.predict(X_test_scaled)
print(f"SVM 准确率: {accuracy_score(y_test, y_pred):.4f}")
K 近邻 (KNN)
python 复制代码
from sklearn.neighbors import KNeighborsClassifier

model = KNeighborsClassifier(n_neighbors=5)
model.fit(X_train_scaled, y_train)
y_pred = model.predict(X_test_scaled)
print(f"KNN 准确率: {accuracy_score(y_test, y_pred):.4f}")

分类算法对比:

算法 优点 缺点 适用场景
逻辑回归 简单快速、可解释 只能线性分类 二分类基线
决策树 可解释、无需归一化 容易过拟合 特征分析
随机森林 精度高、抗过拟合 较慢、不可解释 通用分类
SVM 小数据精度高 大数据慢 小数据集
KNN 简单直观 大数据慢 小数据集
XGBoost 精度最高 需调参 竞赛、业务

5.4 监督学习:回归

python 复制代码
from sklearn.datasets import fetch_california_housing
from sklearn.linear_model import LinearRegression
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error, r2_score, mean_absolute_error

# 加载房价数据
housing = fetch_california_housing()
X, y = housing.data, housing.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_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

# 线性回归
lr = LinearRegression()
lr.fit(X_train_scaled, y_train)
y_pred = lr.predict(X_test_scaled)

print("=== 线性回归 ===")
print(f"MSE:  {mean_squared_error(y_test, y_pred):.4f}")
print(f"RMSE: {np.sqrt(mean_squared_error(y_test, y_pred)):.4f}")
print(f"MAE:  {mean_absolute_error(y_test, y_pred):.4f}")
print(f"R²:   {r2_score(y_test, y_pred):.4f}")

# 随机森林回归
rf = RandomForestRegressor(n_estimators=100, random_state=42)
rf.fit(X_train, y_train)
y_pred_rf = rf.predict(X_test)

print("\n=== 随机森林 ===")
print(f"MSE:  {mean_squared_error(y_test, y_pred_rf):.4f}")
print(f"RMSE: {np.sqrt(mean_squared_error(y_test, y_pred_rf)):.4f}")
print(f"MAE:  {mean_absolute_error(y_test, y_pred_rf):.4f}")
print(f"R²:   {r2_score(y_test, y_pred_rf):.4f}")

回归指标解读:

指标 说明 值域 越好越
MSE 均方误差 [0, ∞)
RMSE 均方根误差 [0, ∞)
MAE 平均绝对误差 [0, ∞)
决定系数 (-∞, 1]

5.5 无监督学习:聚类

python 复制代码
from sklearn.cluster import KMeans, DBSCAN
from sklearn.decomposition import PCA

# 使用 Iris 数据做聚类
X_scaled = StandardScaler().fit_transform(iris.data)

# K-Means
kmeans = KMeans(n_clusters=3, random_state=42, n_init=10)
clusters = kmeans.fit_predict(X_scaled)

# 对比聚类结果与真实标签
from collections import Counter
print("K-Means 聚类结果:")
for i in range(3):
    mask = clusters == i
    labels = y[mask]
    dominant = Counter(labels).most_common(1)[0][0]
    print(f"  簇 {i}: {mask.sum()} 样本, 主导类别: {iris.target_names[dominant]}")

# 降维可视化
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)

import matplotlib.pyplot as plt
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
for i in range(3):
    mask = y == i
    plt.scatter(X_pca[mask, 0], X_pca[mask, 1], label=iris.target_names[i])
plt.title('真实标签')
plt.legend()

plt.subplot(1, 2, 2)
for i in range(3):
    mask = clusters == i
    plt.scatter(X_pca[mask, 0], X_pca[mask, 1], label=f'簇 {i}')
plt.title('K-Means 聚类')
plt.legend()
plt.tight_layout()
plt.savefig('images/cluster_comparison.png', dpi=150)

5.6 模型评估与交叉验证

python 复制代码
from sklearn.model_selection import cross_val_score, GridSearchCV
from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay

# 交叉验证
scores = cross_val_score(model, X, y, cv=5, scoring='accuracy')
print(f"5折交叉验证准确率: {scores.mean():.4f} ± {scores.std():.4f}")

# 网格搜索超参数调优
param_grid = {
    'n_estimators': [50, 100, 200],
    'max_depth': [3, 5, 10, None],
    'min_samples_split': [2, 5, 10]
}

grid_search = GridSearchCV(
    RandomForestClassifier(random_state=42),
    param_grid, cv=5, scoring='accuracy', n_jobs=-1
)
grid_search.fit(X_train, y_train)

print(f"最佳参数: {grid_search.best_params_}")
print(f"最佳准确率: {grid_search.best_score_:.4f}")
print(f"测试集准确率: {grid_search.score(X_test, y_test):.4f}")

# 混淆矩阵
y_pred = grid_search.predict(X_test)
cm = confusion_matrix(y_test, y_pred)
disp = ConfusionMatrixDisplay(cm, display_names=iris.target_names)
disp.plot(cmap='Blues')
plt.title('混淆矩阵')
plt.savefig('images/confusion_matrix.png', dpi=150)

模型选择流程:


总结

工具选择速查表

你的需求 推荐工具 安装命令
终端输出美化 Rich pip install rich
进度条 Tqdm pip install tqdm
生成测试数据 Faker pip install faker
定时任务 Schedule pip install schedule
机器学习 Scikit-learn pip install scikit-learn
深度学习 PyTorch / TensorFlow pip install torch

完整安装命令

bash 复制代码
pip install rich tqdm faker schedule scikit-learn numpy pandas matplotlib

学习路线


下一篇预告:《Python 游戏开发与文件处理:PyGame + Turtle + openpyxl + python-docx 实战》------ 用 Python 做游戏、画图形、处理 Excel 和 Word!

相关推荐
测试员周周15 小时前
【Appium 系列】第14节-断言与验证 — Validator 的设计
android·人工智能·python·功能测试·ios·单元测试·appium
Hanniel15 小时前
Python __slots__ 入门指南
开发语言·python·性能优化
小白|15 小时前
tensorflow:昇腾CANN的TensorFlow适配层
人工智能·python·tensorflow
隐层漫游者15 小时前
2026年了,你还只会调包?手把手教你K-Means、随机森林、XGBoost与朴素贝叶斯,全网最硬核机器学习实战指南!
机器学习
彦为君15 小时前
JavaSE-10-并发编程(11个案例)
java·开发语言·python·ai·nio
l1t16 小时前
DeepSeek总结的在 DuckDB 中试驾 Lance 数据湖仓格式
数据库·人工智能·机器学习·duckdb
Cthy_hy16 小时前
树状数组(BIT)进阶:差分优化实现区间修改、区间查询
数据结构·python·算法
码界筑梦坊16 小时前
133-基于Python的全球城市生活成本数据可视化分析系统
开发语言·python·信息可视化·django·毕业设计·生活