第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:基础操作
- 使用不同的
test_size值(0.1, 0.3, 0.4),观察对模型性能的影响 - 尝试不设置
random_state,多次运行代码,观察结果的变化
练习2:算法比较
使用以下算法对鸢尾花数据集进行分类,比较它们的性能:
- 决策树 (
DecisionTreeClassifier) - 随机森林 (
RandomForestClassifier) - 支持向量机 (
SVC)
练习3:数据探索
- 计算每个特征的平均值和标准差
- 找出哪两个特征之间的相关性最强
- 绘制每个类别在二维特征空间中的分布
练习4:预测新样本
创建5个新的鸢尾花样本,使用训练好的模型进行预测,并分析预测的置信度。
2.7 小结
在这一章中,我们学习了:
- 机器学习基本概念:特征、标签、训练集、测试集
- 完整的ML工作流:数据加载 → 探索 → 分割 → 训练 → 预测 → 评估
- Scikit-learn核心API:
fit(),predict(),score() - 模型评估方法:准确率、分类报告、混淆矩阵
- 数据可视化技巧:直方图、散点图、热力图
关键要点
- Scikit-learn 提供了统一、简洁的API
- 机器学习项目遵循标准的工作流程
- 数据探索和可视化是重要的第一步
- 模型评估不仅仅是看准确率
2.8 下一步
现在你已经体验了完整的机器学习流程!在下一章数据预处理基础中,我们将深入学习如何处理真实世界中的"脏"数据,这是成功构建机器学习模型的关键步骤。
章节要点回顾:
- ✅ 掌握了 Scikit-learn 的基本使用方法
- ✅ 理解了机器学习的标准工作流程
- ✅ 学会了基本的模型评估方法
- ✅ 体验了从数据到预测的完整过程