工具框架:Scikit-learn、Pandas、NumPy预测鸢尾花的种类
构建一个模型,根据鸢尾花的花萼和花瓣的测量数据(特征)来预测它属于哪个品种(标签)
著名的鸢尾花数据集,包含 Setosa, Versicolour, Virginica 三个品种,每个样本有4个特征(花萼长宽、花瓣长宽)
NumPy: 提供底层的数值计算支持(数组、矩阵运算),Scikit-learn 和 Pandas 的底层计算都大量依赖于 NumPy 数组,如下案例:iris.data 本身就是一个 NumPy 数组,X_train.values 或 X_train.to_numpy() 可以轻松地将 Pandas DataFrame 转换回 NumPy 数组进行更灵活的数学操作
Pandas: 进行数据的读取、清洗、探索和预处理
Scikit-learn: 进行机器学习建模的核心,包括拆分数据、训练模型、评估性能
一、数据加载与探索 - Pandas
import pandas as pd
import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score,confusion_matrix#1.加载数据(Scikit-learn 自带数据集,通常以 NumPy 数组形式存在)
iris = datasets.load_iris()# 2. 用 Pandas 将数据转换为 DataFrame,以便更好地查看和处理
# 将特征数据放入 DataFrame,并指定列名
df = pd.dataFrame()
# 添加目标列(花的种类)
df['target'] = iris.target
# 将数字标签映射回花的名字,方便理解
df['species'] = df['target'].map({0: 'setosa', 1: 'versicolor', 2: 'virginica'})# 3. 使用 Pandas 探索数据
# df.head(), df.info(), df.describe() 是 Pandas 数据探索的“三件套”,快速了解数据全貌。
print("数据前5行:")
print(df.head()) # 查看数据样子
print("\n数据基本信息:")
print(df.info()) # 查看数据类型和有无缺失值
print("\n数值统计描述:")
print(df.describe()) # 查看均值、标准差、分位数等
print("\n类别分布:")
print(df['species'].value_counts()) # 查看每个品种有多少样本,检查是否均衡
数据前5行:sepal length (cm) sepal width (cm) ... target species
0 5.1 3.5 ... 0 setosa
1 4.9 3.0 ... 0 setosa
...数值统计描述:sepal length (cm) sepal width (cm) ...
count 150.000000 150.000000
mean 5.843333 3.057333
std 0.828066 0.435866
min 4.300000 2.000000
25% 5.100000 2.800000
50% 5.800000 3.000000
75% 6.400000 3.300000
max 7.900000 4.400000
二、数据预处理与拆分 - Pandas 与 Scikit-learn 协作
- train_test_split 是 Scikit-learn 中非常核心的函数,用于将数据随机打乱并按比例拆分,确保模型评估的公正性
# 1. 准备特征 (X) 和标签 (y)
# 这里选择 Pandas DataFrame 的列作为特征
X = df[['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']]
# 标签列
y = df['target']# 注意:X 和 y 此刻仍然是 Pandas 的 DataFrame/Series
# 但 Scikit-learn 也完美支持它们,底层通常也会转换为 NumPy 数组进行计算# 2. 拆分数据集为训练集和测试集
# random_state 是随机种子,保证每次拆分结果一致,可复现
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)print(f"训练集大小: {X_train.shape}")
print(f"测试集大小: {X_test.shape}")
三、模型训练与预测 - Scikit-learn
- Scikit-learn 的 API 设计极其统一,所有模型都遵循 fit、predict、score 的模式
# 1. 初始化一个随机森林分类器模型
# n_estimators 是森林中树的数量,random_state 保证结果可复现
model = RandomForestClassifier(n_estimators=100, random_state=42)# 2. 训练模型(拟合数据)
# 这一步就是在“学习”特征和标签之间的关系
model.fit(X_train, y_train)# 3. 使用训练好的模型进行预测
# 对测试集(模型没见过的数据)进行预测
y_pred = model.predict(X_test)
print("模型预测结果:", y_pred[:5])
print("真实标签:", y_test.values[:5])
四、模型评估 - Scikit-learn 的度量模块
# 1. 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"\n模型准确率: {accuracy:.2f}") # 输出 e.g.: 模型准确率: 1.00# 2. 查看混淆矩阵
cm = confusion_matrix(y_test, y_pred)
print("混淆矩阵:")
print(cm)
# 输出示例:
# [[10 0 0] -> 10个setosa全对
# [ 0 9 0] -> 9个versicolor全对
# [ 0 0 11]] -> 11个virginica全对# (可选) 如果想看特征重要性
print("\n特征重要性:")
for name, importance in zip(X.columns, model.feature_importances_):print(f"{name}: {importance:.4f}")
# 通常会显示花瓣的尺寸比花萼的尺寸更重要!