Skip to content

ECNUyhy/ML-Assignment-2

 
 

Repository files navigation

Assignment 2: 手写体分类任务

Python Deadline License

📅 截止日期:11月17日0:00 | 🏆 查看排行榜


📋 任务概述

本次任务是一个手写数字分类任务,要求在 train.npz 训练数据上,基于 Kernel + SVM 实现一个手写体识别模型,模型输入为 28×28像素的灰度手写数字图片,输出为 0~9 共10类数字标签。请实现 SVM 的核心算法逻辑,通过合理的特征工程与参数选择提升模型性能。

🎓 作业要求

✨ 1. 独立实现 Kernel + SVM 分类模型对手写数字图片进行分类,对比多项式核和高斯核效果。
✨ 2. 根据混淆矩阵,分析当前SVM算法瓶颈。
✨ 3. 独立实现机器学习模型的核心算法逻辑,不得调用任何外部机器学习库。
❌ 禁止使用的库
  • sklearn / scikit-learn
  • tensorflow
  • torch / pytorch
  • keras
  • xgboost
  • lightgbm
  • catboost
  • statsmodels
  • libsvm
  • liblinear
  • shotgun
  • thundersvm
  • cuml

📊 数据说明

📂 数据集

  • 训练集: data/train.npz

📌 数据格式

训练集

  • train.npz 文件包含两个数组:X_trainy_train
  • X_train:6800张28×28像素的灰度手写数字图片
  • y_train:图片对应的数字标签,取值范围为 0~9

🎨 数据示例

下面是一个手写数字"3"的28×28像素灰度图像示例:

手写数字"3"的像素灰度图

手写数字3

对应的数值矩阵

array([0.78 0.   0.64 0.   0.   0.42 0.   0.57 0.29 0.   0.   0.   0.   0.74
  0.   0.08 1.   0.   0.   0.07 0.   0.   0.13 0.27 0.   0.   0.   0.  ]
 [0.32 0.   0.   1.   0.   0.   0.25 0.28 0.6  0.   0.   0.   0.   0.61
  0.01 0.78 0.11 0.   0.11 0.   0.   0.   0.   0.   0.05 0.   0.1  1.  ]
 [0.   1.   0.81 0.61 0.   0.   0.   0.   0.   0.   0.   1.   1.   1.
  0.77 0.39 0.88 0.71 0.12 0.84 0.05 1.   0.   0.67 0.   0.   0.22 0.02]
 [0.75 0.   0.   0.   0.83 0.   0.26 0.   0.29 0.92 1.   1.   1.   1.
  1.   0.26 0.   0.   0.75 0.52 0.67 0.   0.06 0.   0.67 0.11 0.   0.09]
 [0.4  0.   1.   0.   0.   0.84 0.   0.04 0.73 0.   0.42 1.   0.38 0.21
  0.   0.31 0.   0.11 0.08 0.58 0.   0.78 0.03 0.22 0.22 0.   0.   0.  ]
 [0.   0.84 0.94 0.   0.   0.   0.46 0.52 0.   1.   1.   0.65 1.   1.
  0.57 1.   0.   0.74 0.37 0.87 0.   0.   1.   0.3  0.57 0.46 0.73 0.  ]
 [0.05 0.37 0.58 0.38 0.14 1.   0.   0.35 0.   1.   0.77 1.   0.99 0.89
  0.36 1.   0.   0.   0.13 0.   0.08 1.   0.   0.72 0.31 0.   0.   0.24]
 [0.13 0.06 0.   0.63 0.   0.   0.4  0.42 1.   1.   0.26 0.26 0.62 1.
  0.26 0.88 0.   0.17 1.   0.   0.17 0.43 0.93 0.67 0.   0.53 0.   0.  ]
 [0.   0.03 0.   0.32 0.   1.   0.09 1.   0.   0.25 0.   0.15 1.   0.18
  0.5  0.69 0.56 1.   1.   0.98 0.54 0.   0.46 0.   0.   0.95 0.   0.56]
 [0.   0.   0.   0.26 0.   0.22 0.02 0.7  1.   0.22 0.   1.   0.51 1.
  1.   1.   0.37 0.   1.   1.   0.72 0.64 0.42 0.   0.   0.   1.   1.  ]
 [0.   0.   0.   0.   0.31 0.49 0.28 0.   0.   0.   0.47 1.   0.96 0.19
  1.   0.34 0.42 0.03 0.08 0.46 1.   0.48 0.23 0.   0.   0.96 0.51 0.  ]
 [0.1  0.69 0.   0.   0.03 0.26 0.2  0.34 0.   0.91 1.   1.   1.   0.72
  0.11 0.5  0.   0.   0.61 0.78 0.83 1.   0.2  0.   0.2  0.   0.   0.77]
 [0.93 0.61 0.   0.   0.   0.   0.   0.11 0.46 0.   1.   0.41 1.   1.
  0.41 0.11 0.   0.   0.   0.   0.68 1.   0.   0.   0.   1.   0.   0.05]
 [0.57 0.   0.08 0.79 0.   1.   0.06 0.56 0.   1.   0.82 1.   1.   0.67
  0.09 0.62 0.   0.68 0.   0.   0.82 1.   0.   0.45 0.   0.   0.8  0.76]
 [0.   0.   0.   0.   0.19 0.25 0.   0.   0.23 0.   0.17 1.   1.   0.
  0.68 0.   0.29 1.   1.   0.   0.55 1.   0.17 0.22 0.   0.05 0.   0.  ]
 [0.28 0.   0.   1.   0.   0.   0.57 1.   0.   1.   1.   1.   0.49 0.24
  0.   0.   0.   1.   0.21 0.   0.   1.   0.34 0.19 0.26 0.   0.   0.27]
 [0.12 0.24 0.   0.   0.   0.04 0.   0.   0.19 0.89 0.81 0.   0.34 0.
  0.   0.   0.   0.   0.06 0.79 0.83 1.   0.   0.53 0.   0.9  0.42 0.  ]
 [0.28 0.   0.   0.   1.   0.   0.   0.   0.   0.   0.41 0.46 0.   0.
  0.   0.66 0.   1.   0.72 1.   1.   0.84 0.71 0.28 0.   0.   0.   0.27]
 [0.38 0.26 0.19 0.33 0.22 0.03 0.   0.   1.   0.   0.   0.   0.   0.
  0.   0.   0.   0.   0.09 1.   1.   0.86 0.1  0.   0.78 0.27 0.37 0.  ]
 [0.   0.83 0.   1.   0.   0.   0.21 0.32 0.   0.   1.   0.   0.14 0.2
  0.   0.71 0.49 0.26 0.23 1.   0.74 1.   0.   0.04 0.   0.31 0.   0.  ]
 [1.   0.22 1.   1.   0.25 1.   0.   0.18 0.21 0.76 0.1  1.   0.   0.95
  0.   0.   0.93 0.6  1.   0.52 0.   0.   0.07 0.   0.   0.   0.   0.01]
 [0.34 0.   0.4  0.69 0.   0.1  0.   0.89 0.   0.49 0.   0.   0.   0.
  0.03 0.33 0.69 0.84 1.   0.92 0.   0.   0.   0.   0.   0.   0.97 0.69]
 [0.   0.   1.   0.   0.   0.16 0.39 0.34 0.14 0.   0.   0.   0.59 0.08
  0.02 1.   0.01 0.99 0.89 0.87 0.12 0.   0.   1.   1.   0.97 0.   1.  ]
 [0.   0.   1.   0.   0.63 0.   0.   0.   0.38 0.75 0.62 0.   0.31 0.8
  0.   0.   0.   1.   0.   0.   0.   0.36 0.   0.9  0.41 0.14 0.03 0.  ]
 [0.   0.   0.76 0.   0.   0.   0.   0.   0.   0.14 0.75 0.9  0.56 0.79
  1.   1.   1.   0.   0.   0.   0.   0.08 0.   0.   0.17 0.79 0.   0.  ]
 [0.   0.   0.   1.   0.   0.   0.   0.25 0.   0.   0.42 1.   0.25 0.25
  1.   1.   0.   0.34 0.   0.   0.   0.47 0.   0.   0.66 1.   0.63 0.88]
 [0.   0.78 0.   1.   0.   0.13 0.   0.   0.19 0.   0.12 0.46 0.   0.17
  0.   0.   0.   0.21 0.   0.   0.   0.03 0.   0.12 0.76 0.51 0.91 0.87]
 [0.28 0.66 0.   0.   0.   0.   0.   0.   0.   0.   0.59 0.   1.   0.
  0.   0.53 0.53 0.   0.31 0.   0.75 0.68 0.55 0.45 0.   0.04 0.   0.  ])

🔍 数据特征说明

特征 说明
图像尺寸 28×28像素
颜色空间 灰度(0-1浮点数)
数据范围 0.0(白色)到 1.0(黑色)
样本数量 6800个训练样本
类别数量 10个数字(0-9)

💡 数据预处理提示

📈 评测指标和评分方式

评测指标

  • Accuracy:分类准确率
  • Confusion Matrix:混淆矩阵(展示各类预测混淆情况)
  • Prediction_Time:预测时间(秒)

⚡ 评测使用 10个并发线程 对测试集进行预测

位次排序逻辑:Accuracy高 -> 推理时间短 -> 最近提交时间远

评分方式

总分:20分

🏆 20分 - Metric得分(基于Accuracy值)

📊 评分规则

采用线性变换的方式计算分数:

🌟 等级 📍 标准 💯 得分
前10%学生 leaderboard第10%分位的Accuracy 20分
(满分)
中间学生 在10%分位线和baseline之间 6-20分
(线性插值)
Baseline baseline的Accuracy 6分
未提交 - 0分

📂 项目结构

📦 project/
 ┣ 📄 data/train.npz         # 训练数据
 ┣ 🔧 model.py               # 模型实现
 ┣ 🚀 solution.py            # 推理接口
 ┣ 📋 requirements.txt       # 依赖库
 ┣ 🐧 evaluate-linux         # Linux评测程序
 ┣ 🍎 evaluate-macos         # macOS评测程序
 ┗ 🪟 evaluate-win.exe       # Windows评测程序

💡 Baseline: Logistic regression模型,你需要实现自己的SVM模型


💻 模型实现

🎨 1. model.py - 模型类

class Model:
    def __init__(self):
        """初始化模型所需参数、变量或结构(如权重、缓存等)"""


    def fit(self, X, y):
        """
        模型训练函数

        Args:
            X: numpy数组, shape (n_samples,H,W)
            y: numpy数组, shape (n_samples,)
        Returns:
            None
        """
        # 在此处实现模型训练逻辑(可自由设计模型结构与训练方式)


    def predict(self, X):
        """
        模型预测函数

        Args:
            X: numpy数组, shape (n_samples, n_features)
        Returns:
            numpy数组, shape (n_samples,)
        """
        # 在此处实现推理逻辑,返回每个样本的预测类别
        

🚀 2. solution.py - 推理接口

class Solution:
    def __init__(self):
        """初始化推理类,加载并训练模型"""
        self.model = Model()
        # 可加载训练数据并训练模型
        # self.model.fit(X_train, y_train)

    def forward(self, sample: np.ndarray) -> dict:
        """
        模型推理接口,接收单条样本数据并返回预测结果

        Args:
            sample: numpy数组, shape (H,W)
        
        Returns:
            dict: {'prediction': int},预测类别
        """
        x = sample.reshape(1, -1)  
        y_pred = self.model.predict(x)
        return {"prediction": int(y_pred[0])}

⚙️ 环境要求

Python NumPy Pandas

📦 依赖安装:

conda create -n ML python=3.10
conda activate ML
pip install -r requirements.txt

🚀 运行评测

📥 1. 下载评测程序

📖 点击查看详细步骤
  1. 🔗 进入GitHub仓库
  2. 🏷️ 点击 release 标签
  3. ⬇️ 下载对应系统的文件:

⚠️ 重要:将下载的评测程序放在项目根目录(与solution.py、model.py同级)

⚙️ 2. 设置环境变量

🐧 Linux/macOS:

export STUDENT_ID='你的学号'
export STUDENT_NAME='你的姓名'
export STUDENT_NICKNAME='你的昵称'
export MAIN_CONTRIBUTOR='human'(or 'ai')

💾 持久化:添加到~/.bashrc~/.zshrc

🪟 Windows:

set STUDENT_ID=你的学号
set STUDENT_NAME=你的姓名
set STUDENT_NICKNAME=你的昵称
set MAIN_CONTRIBUTOR=human(or ai)

💾 持久化:系统设置 → 环境变量

▶️ 3. 运行评测

🐧 Linux(ubuntu 24.02)

chmod +x evaluate-linux
./evaluate-linux

🍎 macOS

chmod +x evaluate-macos
./evaluate-macos

⚠️ macOS 首次运行提示:若系统提示 “无法打开,因为它来自身份不明的开发者”,请按以下步骤操作: 点击弹窗中的 “取消”; 打开系统设置(System Settings) → 进入隐私与安全性(Privacy & Security); 在页面下方 “安全” 区域找到 “evaluate-macos 已被阻止打开” 的提示,点击右侧 “仍要打开”; 在确认窗口中再次点击 “打开”,即可正常运行。

🪟 Windows

evaluate-win.exe

🏆 Leaderboard

🌐 访问地址

🔗 http://101.132.193.95:3000


✨ 功能特性

📊 实时排名显示

📈 详细指标展示

🔄 未提交同学显示

⏰ 支持多次提交,以截止日期前的最佳成绩为准


🎉 祝你取得好成绩!

📅 记得在11月17日0:00前提交你的最佳成绩!


Made with ❤️ for Machine Learning Education

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Python 100.0%