Python数据分类案例实操?

wen python案例 2

本文目录导读:

  1. 环境准备
  2. 加载与探索数据
  3. 数据预处理与划分
  4. 模型训练与评估
  5. 模型对比与可视化
  6. 结果分析(示例)
  7. 扩展练习(推荐尝试)

下面是一个完整的 Python 数据分类案例实操,我们将使用经典的 鸢尾花(Iris)数据集,依次完成:数据加载、探索性分析、特征与标签分离、数据集划分、模型训练(逻辑回归、KNN、决策树)以及模型评估与可视化。


环境准备

# 安装所需库(如已安装可跳过)
!pip install pandas numpy matplotlib seaborn scikit-learn
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# 设置中文字体(可选)
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 忽略警告
import warnings
warnings.filterwarnings('ignore')

加载与探索数据

加载数据

from sklearn.datasets import load_iris
iris = load_iris()
df = pd.DataFrame(data=iris.data, columns=iris.feature_names)
df['target'] = iris.target
df['target_name'] = df['target'].map({0: 'setosa', 1: 'versicolor', 2: 'virginica'})
print("数据集前5行:")
print(df.head())

数据基本信息

print("\n数据类型与缺失值:")
print(df.info())
print("\n描述性统计:")
print(df.describe())
print("\n类别分布:")
print(df['target_name'].value_counts())

可视化探索

# 分类散点图(取前两个特征)
plt.figure(figsize=(10, 6))
sns.scatterplot(data=df, x='sepal length (cm)', y='sepal width (cm)',
                hue='target_name', palette='deep', s=80)'鸢尾花:花萼长 vs 花萼宽')
plt.show()
# 箱线图(查看特征分布)
plt.figure(figsize=(12, 6))
sns.boxplot(data=df, x='target_name', y='petal length (cm)')'花瓣长度在不同类别中的分布')
plt.show()

数据预处理与划分

from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
# 特征与标签
X = df[iris.feature_names]      # 特征:4个数值特征
y = df['target']                # 标签:0,1,2
# 划分训练集和测试集(70%训练,30%测试)
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.3, random_state=42, stratify=y
)
# 特征缩放(对于KNN、逻辑回归等很重要)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
print(f"训练集样本数:{X_train.shape[0]}, 测试集样本数:{X_test.shape[0]}")

模型训练与评估

逻辑回归

from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
lr_model = LogisticRegression(max_iter=200)
lr_model.fit(X_train_scaled, y_train)
y_pred_lr = lr_model.predict(X_test_scaled)
print("=== 逻辑回归 ===")
print(f"准确率:{accuracy_score(y_test, y_pred_lr):.4f}")
print("\n分类报告:")
print(classification_report(y_test, y_pred_lr, target_names=iris.target_names))

K-近邻 (KNN)

from sklearn.neighbors import KNeighborsClassifier
knn_model = KNeighborsClassifier(n_neighbors=5)
knn_model.fit(X_train_scaled, y_train)
y_pred_knn = knn_model.predict(X_test_scaled)
print("=== KNN (k=5) ===")
print(f"准确率:{accuracy_score(y_test, y_pred_knn):.4f}")
print("\n分类报告:")
print(classification_report(y_test, y_pred_knn, target_names=iris.target_names))

决策树

from sklearn.tree import DecisionTreeClassifier
dt_model = DecisionTreeClassifier(max_depth=3, random_state=42)
dt_model.fit(X_train, y_train)      # 决策树一般不需要缩放
y_pred_dt = dt_model.predict(X_test)
print("=== 决策树 (max_depth=3) ===")
print(f"准确率:{accuracy_score(y_test, y_pred_dt):.4f}")
print("\n分类报告:")
print(classification_report(y_test, y_pred_dt, target_names=iris.target_names))

模型对比与可视化

混淆矩阵对比

fig, axes = plt.subplots(1, 3, figsize=(15, 4))
models = [
    ('逻辑回归', y_pred_lr),
    ('KNN (k=5)', y_pred_knn),
    ('决策树', y_pred_dt)
]
for ax, (name, y_pred) in zip(axes, models):
    cm = confusion_matrix(y_test, y_pred)
    sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', ax=ax,
                xticklabels=iris.target_names, yticklabels=iris.target_names)
    ax.set_title(f'{name} 混淆矩阵')
    ax.set_xlabel('预测')
    ax.set_ylabel('真实')
plt.tight_layout()
plt.show()

准确率柱状图

accuracies = {
    '逻辑回归': accuracy_score(y_test, y_pred_lr),
    'KNN (k=5)': accuracy_score(y_test, y_pred_knn),
    '决策树': accuracy_score(y_test, y_pred_dt)
}
plt.figure(figsize=(8, 5))
plt.bar(accuracies.keys(), accuracies.values(), color=['skyblue', 'orange', 'green'])
plt.ylim(0.9, 1.0)   # 放大显示差异
plt.ylabel('准确率')'不同模型在测试集上的准确率对比')
for i, (name, acc) in enumerate(accuracies.items()):
    plt.text(i, acc + 0.002, f'{acc:.4f}', ha='center', fontsize=12)
plt.show()

结果分析(示例)

模型 测试准确率 说明
逻辑回归 9778 线性决策边界,在本数据上效果极好
KNN (k=5) 9778 基于距离,需要特征缩放,整体分类准确
决策树 9556 可解释性强,但容易过拟合(这里限制了深度为3)
  • 所有模型都表现良好,因为鸢尾花数据集本身分类边界清晰。
  • 实际工作中,需要根据业务需求选择:
    • 需要可解释性 → 决策树 / 逻辑回归
    • 数据量大、非线性 → 随机森林 / XGBoost
    • 高维大数据 → 逻辑回归 / 支持向量机

扩展练习(推荐尝试)

  1. 调参优化
    • 对 KNN 的 n_neighbors 做循环测试,找出最佳 K 值
    • 对决策树的 max_depthmin_samples_split 做网格搜索
  2. 尝试其他算法
    • 支持向量机 (SVC)
    • 随机森林 (RandomForestClassifier)
    • 朴素贝叶斯 (GaussianNB)
  3. 交叉验证
    • cross_val_score 评估模型稳定性
  4. 可视化决策边界

    只取前两个特征,画出分类器的决策区域


这个案例代码可以直接在 Jupyter Notebook 或 VSCode 中运行,如果需要,我也可以提供 其他数据集(如红酒、心脏病、泰坦尼克) 的类似实操代码,或者针对 二分类 vs 多分类 的场景单独做讲解。

标签: 案例实操

抱歉,评论功能暂时关闭!