Skip to content

第2章:快速入门指南

欢迎来到 Scikit-learn 的快速入门指南!本章将通过一个完整的机器学习示例,让你快速体验从数据加载到模型预测的整个流程。

2.1 机器学习基本概念

在开始编码之前,让我们先了解几个核心概念:

  • 特征(Features):用于预测的输入变量,通常用 X 表示
  • 标签(Labels):我们要预测的目标变量,通常用 y 表示
  • 训练集:用于训练模型的数据
  • 测试集:用于评估模型性能的数据
  • 模型:学习数据模式的算法

2.2 第一个机器学习项目:鸢尾花分类

我们将使用著名的鸢尾花数据集来构建一个分类模型。这个数据集包含150个鸢尾花样本,每个样本有4个特征,需要预测3种花的类别。

步骤1:导入必要的库

python
# 导入基础库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

# 导入 Scikit-learn 组件
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix

# 设置中文字体(可选)
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

步骤2:加载和探索数据

python
# 加载鸢尾花数据集
iris = load_iris()

# 查看数据集信息
print("数据集描述:")
print(iris.DESCR[:500] + "...")
print("\n" + "="*50)

# 获取特征和标签
X = iris.data  # 特征矩阵
y = iris.target  # 标签向量

# 查看数据形状
print(f"特征矩阵形状: {X.shape}")
print(f"标签向量形状: {y.shape}")

# 查看特征名称
print(f"特征名称: {iris.feature_names}")
print(f"类别名称: {iris.target_names}")

步骤3:数据探索和可视化

python
# 创建 DataFrame 便于分析
df = pd.DataFrame(X, columns=iris.feature_names)
df['species'] = iris.target_names[y]

# 查看前几行数据
print("数据前5行:")
print(df.head())

# 查看数据统计信息
print("\n数据统计信息:")
print(df.describe())

# 查看类别分布
print("\n类别分布:")
print(df['species'].value_counts())

步骤4:数据可视化

python
# 创建图形
fig, axes = plt.subplots(2, 2, figsize=(12, 10))
fig.suptitle('鸢尾花数据集特征分布', fontsize=16)

# 绘制每个特征的分布
features = iris.feature_names
for i, feature in enumerate(features):
    row = i // 2
    col = i % 2
    
    # 按类别绘制直方图
    for species in iris.target_names:
        data = df[df['species'] == species][feature]
        axes[row, col].hist(data, alpha=0.7, label=species, bins=15)
    
    axes[row, col].set_title(feature)
    axes[row, col].set_xlabel('值')
    axes[row, col].set_ylabel('频次')
    axes[row, col].legend()

plt.tight_layout()
plt.show()

# 绘制特征间的关系
plt.figure(figsize=(10, 8))
sns.pairplot(df, hue='species', markers=["o", "s", "D"])
plt.suptitle('特征间关系图', y=1.02)
plt.show()

步骤5:数据分割

python
# 将数据分割为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
    X, y, 
    test_size=0.2,      # 20% 作为测试集
    random_state=42,    # 设置随机种子,确保结果可重现
    stratify=y          # 保持各类别比例
)

print(f"训练集大小: {X_train.shape[0]}")
print(f"测试集大小: {X_test.shape[0]}")

# 查看分割后的类别分布
print("\n训练集类别分布:")
unique, counts = np.unique(y_train, return_counts=True)
for i, count in enumerate(counts):
    print(f"{iris.target_names[unique[i]]}: {count}")

print("\n测试集类别分布:")
unique, counts = np.unique(y_test, return_counts=True)
for i, count in enumerate(counts):
    print(f"{iris.target_names[unique[i]]}: {count}")

步骤6:训练模型

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

# 训练模型
print("正在训练模型...")
model.fit(X_train, y_train)
print("模型训练完成!")

# 查看模型参数
print(f"\n模型系数形状: {model.coef_.shape}")
print(f"模型截距: {model.intercept_}")

步骤7:模型预测

python
# 在测试集上进行预测
y_pred = model.predict(X_test)

# 预测概率
y_pred_proba = model.predict_proba(X_test)

print("预测结果(前10个):")
for i in range(min(10, len(y_test))):
    true_label = iris.target_names[y_test[i]]
    pred_label = iris.target_names[y_pred[i]]
    confidence = np.max(y_pred_proba[i])
    print(f"真实: {true_label:12} | 预测: {pred_label:12} | 置信度: {confidence:.3f}")

步骤8:模型评估

python
# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"\n模型准确率: {accuracy:.3f} ({accuracy*100:.1f}%)")

# 详细分类报告
print("\n详细分类报告:")
print(classification_report(y_test, y_pred, target_names=iris.target_names))

# 混淆矩阵
cm = confusion_matrix(y_test, y_pred)
print("\n混淆矩阵:")
print(cm)

# 可视化混淆矩阵
plt.figure(figsize=(8, 6))
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues',
            xticklabels=iris.target_names,
            yticklabels=iris.target_names)
plt.title('混淆矩阵')
plt.xlabel('预测标签')
plt.ylabel('真实标签')
plt.show()

步骤9:模型应用

python
# 创建新的样本进行预测
new_samples = np.array([
    [5.1, 3.5, 1.4, 0.2],  # 类似 setosa 的特征
    [6.2, 2.8, 4.8, 1.8],  # 类似 versicolor 的特征
    [7.2, 3.0, 5.8, 1.6]   # 类似 virginica 的特征
])

# 进行预测
predictions = model.predict(new_samples)
probabilities = model.predict_proba(new_samples)

print("新样本预测结果:")
for i, (sample, pred, prob) in enumerate(zip(new_samples, predictions, probabilities)):
    print(f"\n样本 {i+1}: {sample}")
    print(f"预测类别: {iris.target_names[pred]}")
    print(f"各类别概率:")
    for j, class_name in enumerate(iris.target_names):
        print(f"  {class_name}: {prob[j]:.3f}")

2.3 完整代码示例

将上述所有步骤整合成一个完整的脚本:

python
# iris_classification.py
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix

def main():
    # 1. 加载数据
    iris = load_iris()
    X, y = iris.data, iris.target
    
    # 2. 数据分割
    X_train, X_test, y_train, y_test = train_test_split(
        X, y, test_size=0.2, random_state=42, stratify=y
    )
    
    # 3. 训练模型
    model = LogisticRegression(random_state=42)
    model.fit(X_train, y_train)
    
    # 4. 预测和评估
    y_pred = model.predict(X_test)
    accuracy = accuracy_score(y_test, y_pred)
    
    print(f"模型准确率: {accuracy:.3f}")
    print("\n分类报告:")
    print(classification_report(y_test, y_pred, target_names=iris.target_names))
    
    return model, iris

if __name__ == "__main__":
    model, iris = main()

2.4 Scikit-learn 的核心优势

通过这个简单的例子,我们可以看到 Scikit-learn 的几个核心优势:

1. 统一的API设计

所有模型都遵循相同的接口:

  • fit(X, y): 训练模型
  • predict(X): 进行预测
  • score(X, y): 评估性能

2. 丰富的算法库

python
# 可以轻松切换不同算法
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import SVC
from sklearn.neighbors import KNeighborsClassifier

# 随机森林
rf_model = RandomForestClassifier(random_state=42)
rf_model.fit(X_train, y_train)

# 支持向量机
svm_model = SVC(random_state=42)
svm_model.fit(X_train, y_train)

# K近邻
knn_model = KNeighborsClassifier(n_neighbors=3)
knn_model.fit(X_train, y_train)

3. 完整的工具链

  • 数据预处理
  • 模型选择
  • 性能评估
  • 交叉验证

2.5 常见的机器学习工作流

python
# 标准的机器学习工作流
def ml_workflow(X, y, model_class, **model_params):
    """
    标准机器学习工作流
    """
    # 1. 数据分割
    X_train, X_test, y_train, y_test = train_test_split(
        X, y, test_size=0.2, random_state=42
    )
    
    # 2. 创建和训练模型
    model = model_class(**model_params)
    model.fit(X_train, y_train)
    
    # 3. 预测和评估
    y_pred = model.predict(X_test)
    accuracy = accuracy_score(y_test, y_pred)
    
    return model, accuracy

# 使用示例
from sklearn.ensemble import RandomForestClassifier

model, acc = ml_workflow(X, y, RandomForestClassifier, n_estimators=100)
print(f"随机森林准确率: {acc:.3f}")

2.6 练习题

练习1:基础操作

  1. 使用不同的 test_size 值(0.1, 0.3, 0.4),观察对模型性能的影响
  2. 尝试不设置 random_state,多次运行代码,观察结果的变化

练习2:算法比较

使用以下算法对鸢尾花数据集进行分类,比较它们的性能:

  • 决策树 (DecisionTreeClassifier)
  • 随机森林 (RandomForestClassifier)
  • 支持向量机 (SVC)

练习3:数据探索

  1. 计算每个特征的平均值和标准差
  2. 找出哪两个特征之间的相关性最强
  3. 绘制每个类别在二维特征空间中的分布

练习4:预测新样本

创建5个新的鸢尾花样本,使用训练好的模型进行预测,并分析预测的置信度。

2.7 小结

在这一章中,我们学习了:

  1. 机器学习基本概念:特征、标签、训练集、测试集
  2. 完整的ML工作流:数据加载 → 探索 → 分割 → 训练 → 预测 → 评估
  3. Scikit-learn核心APIfit(), predict(), score()
  4. 模型评估方法:准确率、分类报告、混淆矩阵
  5. 数据可视化技巧:直方图、散点图、热力图

关键要点

  • Scikit-learn 提供了统一、简洁的API
  • 机器学习项目遵循标准的工作流程
  • 数据探索和可视化是重要的第一步
  • 模型评估不仅仅是看准确率

2.8 下一步

现在你已经体验了完整的机器学习流程!在下一章数据预处理基础中,我们将深入学习如何处理真实世界中的"脏"数据,这是成功构建机器学习模型的关键步骤。


章节要点回顾

  • ✅ 掌握了 Scikit-learn 的基本使用方法
  • ✅ 理解了机器学习的标准工作流程
  • ✅ 学会了基本的模型评估方法
  • ✅ 体验了从数据到预测的完整过程

本站内容仅供学习和研究使用。