0206二阶段AI实验课程《机器学习实战:用BaseML、BaseDT搭建线性回归、多项式回归与SVM模型》

 

 

 

二阶段AI实验课程

,将于2月6日开始。具体时间安排如下,直播方式和一阶段上课保持一致:

 2月6日,晚上,19:30~21:00(主讲老师:刘正云)

实验内容:

【机器学习】搭建算法并训练线性回归、多项式回归、支持向量机(SVM)等机器学习模型,制作个性化数据集,涉及到BaseML、BaseDT等工具。

2月7日,晚上,19:30~21:00(主讲老师:郑祥)

实验内容:【深度学习】训练常见的卷积神经网络模型,如LeNet和MobileNet,能制作个性化的ImageNet数据集,涉及到MMEdu、EasyTrain等工具。

 2月8日,晚上,19:30~21:00(主讲老师:邱奕盛) 

实验内容:【模型部署】利用统一推理框架实现模型部署。在训练好的模型基础上,设计简洁的体验界面,最终尝试在行空板上实现完整效果的呈现,涉及XEduHub、PySimpleGUI、PySimpleGUIWeb等工具。

 

第二阶段课程

二阶段AI实验课程,将于2月6日开始。具体时间安排如下,直播方式和一阶段上课保持一致:
- 2月6日,晚上,19:30~21:00(主讲老师:刘正云)
实验内容:【机器学习】搭建算法并训练线性回归、多项式回归、支持向量机(SVM)等机器学习模型,制作个性化数据集,涉及到BaseML、BaseDT等工具。
- 2月7日,晚上,19:30~21:00(主讲老师:郑祥)
实验内容:【深度学习】训练常见的卷积神经网络模型,如LeNet和MobileNet,能制作个性化的ImageNet数据集,涉及到MMEdu、EasyTrain等工具。
- 2月8日,晚上,19:30~21:00(主讲老师:邱奕盛)
实验内容:【模型部署】利用统一推理框架实现模型部署。在训练好的模型基础上,设计简洁的体验界面,最终尝试在行空板上实现完整效果的呈现,涉及XEduHub、PySimpleGUI、PySimpleGUIWeb等工具。
123456788888888888888888



【2/4 22:50 关于作业和算力账号发放的通知】 针对所有已经提交作业的老师,我们到时候都会发放算力账号,请各位老师知悉。作业已经于2/4 12:00截至上传,凡提交过的老师可以通过 
http://site01.openhydra.net:30012/evt/checkupload 查询自己上传的作业(只要查询到存在1个文件即可)。
由于最终有529位老师提交了作业,为了让每个老师都拥有机会使用算力,平台会使用预约机制来分配大家的使用,到时候我们会公布平台网址,账号会发放到老师的邮箱。相关邮件通知,将于2/6 开始逐步发送。
—————————
【历史公告】

【2/3 10:55 二阶段实验课程延期2天通知】各位老师,十分抱歉,受到AI实验平台所在算力机房年度停机维护的影响,因为主讲老师需要一定时间在实验环境备课,原定于2月4日开始的二阶段AI实验课程,将推迟2天进行,于2月6日开始,具体开始时间将会在2月4日早上9:00前更新,在群里和网页上正式公布通知。

—————————

- 更多的Xeduhub 资料 可以参考 : https://xedu.readthedocs.io/zh-cn/master/xedu_hub/introduction.html
- 在线回放方法(无需下载):
【步骤1】扫码进入温州科技高级中学公众号 -->【步骤2】点击视频号:温州科技高级中学 -->【步骤3】点击直播回放
-人工智能创新型教师培育计划回放合集, 链接: https://pan.baidu.com/s/1kty6pdd9OCMh3d2cTscFTA?pwd=XEDU 提取码: XEDU
- 关于一些谢老师讲课的PPT、可供下载的百度网盘视频,也陆续会放到:https://www.openhydra.net/event/20250120/  尽情期待

http://site01.openhydra.net:30012/

 

 

 

 

 

 模型训练

 模型验证

 模型推理

 

 

 

 

 

 

 实验1  

# 温度推测

 

 

 

 

 

回顾任务

预测连续值的任务;

 

8:2 的方式 ,将数据集进行拆分,   

80%分一个表格,(训练集)

20%分一个表格(验证集)

xedu的数据处理库,将数据库划分;训练和验证。

 

 

 

 


# 更新库文件
!pip install --upgrade BaseDT 
from BaseDT.dataset import split_tab_dataset
# 指定待拆分的csv数据集
path = "data/make_sensor.csv"
# 指定特征数据列、标签列、训练集比重
tx,ty,val_x,val_y = split_tab_dataset(path,data_column=range(0,1),label_column=1,train_val_ratio=0.8)

  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 实验3 训练投石机

 

 

多项式 归回分析

 

 

回归于线性的关系。 

 

 

 

 

 

 

   

 

数据角度推电机

 

 

 

 

 

 

 

 

 

 图片 - 提取成手势关键点坐标。 形成数据集

 

xeduhub可以提取;

 

 处理高危数据;

 

 

回归修改成分类; 

多项式回归  - 换 svm

 

 

 

 

   

 

   
 

 问题解决

 

 版本更新

或安装

 

 

版本更新;
!pip install --update xedu-python
!pip install -U xedu-python
 

 

 
 

 手势识别问题。

 

 

 

 

 

 

 

 

 

 11

 

活动3:用支持向量机训练手势分类数据

材料

  • 训练手势数据分类模型(支持向量机).ipynb
  • workflow_pose_val.csv
  • workflow_pose_train.csv

活动目的

了解SVM算法的基本原理及其在分类任务中的应用;掌握使用BaseML库实现SVM模型的训练和评估,能够解释模型评估指标的含义. 。;

背景知 识支持向量机(SVM)是一种强大的分类算法,特别适用于高维数据的分类任务。

本节课中,我们使用使用BaseML等工具来实现算法。

BaseML的官方文档:https://xedu.readthedocs.io/zh-cn/master/baseml/introduction.html

 

活动说明:

手势分类数据集workflow_pose.csv包含了手势的21个关键点坐标,每个手势对应一个标签。支持向量机(SVM)作为一种高效且强大的分类算法,其在处理复杂分类问题时展现出的优越性能,使其成为了实现手势分类的有力工具。我们将使用手势分类数据集来训练SVM模型,并预测手势类别。

 

步骤1:数据准备

查看数据集 数据集workflow_pose_train.csv是使用XEduHub提取的关键点信息文件,前42列为关键点信息数据,代表21个关键点,每个关键点两个坐标数据;最后一列为标签,“0”代表手势1,“1”代表手势3,“2”代表手势5。 可以直接打开数据集文件查看具体内容,也可以使用 Python 的 pandas 库来读取CSV 文件,具体代码如下:

import pandas as pd
# 查看CSV
df = pd.read_csv("data/workflow_pose_train.csv", header=None)
df

  

 

 

   

步骤2:加载模型

首先我们需要导入必要的库文件并构建SVM分类器。在构建SVM分类器时,使用Classification模块并通过cls('SVM')实例化模型,构建SVM分类器的目标是将数据划分为不同的类别;而在构建线性回归模型时,使用Regression模块并通reg('LinearRegression'/'Polynomial')实例化模型,目标是预测连续的数值。两者的任务模块和算法选择不同。

 

# 更新库
!pip install --upgrade BaseML
# 导入BaseML的分类模块
from BaseML import Classification as cls
# 使用BaseML中的SVM模块
model=cls('SVM')

  

 

步骤3:训练模型

将数据集载入模型,进行模型训练,并将模型保存至指定路径,假设数据放置在当前目录下的data文件夹中,训练好的模型存储于当前目录下的checkpoints文件夹中。

# 将数据导入模型中
model.load_tab_data('data/workflow_pose_train.csv')
# 模型训练
model.train()
# 模型保存
model.save('checkpoints/SVM_1.pkl')

  

 

步骤4:验证模型

模型已经训练完成,但是这样的模型具体的效果究竟好不好?对回归任务来说,简单好用的评估指标之一是R平方值,而对分类任务来说,一般选择准确率指标,准确率可以评价分类模型的准确度,衡量模型预测正确的实例占所有实例的比例。想象一下你在做一个分类测试,准确率就是你回答正确的问题数量占总问题数量的比例。准确率越高,表示模型整体预测的准确性越强。

 

model.load('checkpoints/SVM_1.pkl')

# 验证模型  这里使用的是准确度验证acc
model.valid('data/workflow_pose_val.csv',metrics='acc')

  

 v

步骤5:应用模型

在应用模型时,使用模型仓库repo获取图像中的关键点坐标, 测试输出的手势类型是否正确。

from BaseML import Classification as cls
from XEdu.hub import Workflow as wf
# model = wf(task='det_hand', repo='tzlzy321/hand')
model = wf(repo='tzlzy321/hand')
res = model.inference('4.jpg')

# 载入已保存模型
baseml = wf(task='baseml',checkpoint='checkpoints/SVM_1.pkl') # 指定使用的pkl模型
# 确保模型文件正确加载
if isinstance(baseml.model, dict):
    baseml.model = baseml.model['model']  # 提取模型对象

# 使用加载的模型进行推理
result= baseml.inference(res) # 进行模型推理
print(result)

  

运行后需要观察模型的下载进度,查看xedu的服务后台窗口

 

 

要等待下载完成,才能正确的运行识别。

下载后,羡慕路径下要有对应的工具程序才正确。

 正确的识别结果。

 

 

 

 

 

 

 

 

   

 

 

import os
import numpy as np
import tkinter as tk
from tkinter import filedialog, messagebox
from PIL import Image, ImageTk
from XEdu.hub import Workflow as wf

class GestureRecognitionApp:
    def __init__(self, root):
        self.root = root
        self.root.title("手势识别系统")
        self.root.geometry("800x600")

        # 创建变量
        self.model_path = tk.StringVar()
        self.image_path = tk.StringVar()
        self.result_text = tk.StringVar()

        # 创建控件
        self.create_widgets()

    def create_widgets(self):
        # 模型选择
        tk.Label(self.root, text="选择模型:").grid(row=0, column=0, padx=10, pady=10)
        self.model_entry = tk.Entry(self.root, textvariable=self.model_path, width=50)
        self.model_entry.grid(row=0, column=1, padx=10, pady=10)
        tk.Button(self.root, text="浏览", command=self.load_model).grid(row=0, column=2, padx=10, pady=10)

        # 图片选择
        tk.Label(self.root, text="选择图片:").grid(row=1, column=0, padx=10, pady=10)
        self.image_entry = tk.Entry(self.root, textvariable=self.image_path, width=50)
        self.image_entry.grid(row=1, column=1, padx=10, pady=10)
        tk.Button(self.root, text="浏览", command=self.load_image).grid(row=1, column=2, padx=10, pady=10)

        # 显示图片
        self.image_label = tk.Label(self.root)
        self.image_label.grid(row=2, column=0, columnspan=3, padx=10, pady=10)

        # 显示结果
        tk.Label(self.root, text="识别结果:").grid(row=3, column=0, padx=10, pady=10)
        self.result_label = tk.Label(self.root, textvariable=self.result_text, font=("Arial", 12), wraplength=400)
        self.result_label.grid(row=3, column=1, columnspan=2, padx=10, pady=10)

        # 识别按钮
        tk.Button(self.root, text="开始识别", command=self.recognize).grid(row=4, column=0, columnspan=3, padx=10, pady=10)

    def load_model(self):
        file_path = filedialog.askopenfilename(filetypes=[("Pickle files", "*.pkl"), ("All files", "*.*")])
        if file_path:
            self.model_path.set(file_path)

    def load_image(self):
        file_path = filedialog.askopenfilename(filetypes=[("Image files", "*.jpg;*.png;*.jpeg"), ("All files", "*.*")])
        if file_path:
            self.image_path.set(file_path)
            self.display_image(file_path)

    def display_image(self, image_path):
        img = Image.open(image_path)
        img.thumbnail((400, 400))  # 调整图片大小
        img_tk = ImageTk.PhotoImage(img)
        self.image_label.config(image=img_tk)
        self.image_label.image = img_tk  # 保持对图片的引用

    def recognize(self):
        model_path = self.model_path.get()
        image_path = self.image_path.get()

        if not model_path or not image_path:
            messagebox.showwarning("警告", "请先选择模型和图片!")
            return

        try:
            # 加载手势检测模型
            model = wf(task='det_hand', repo='tzlzy321/hand')
            res = model.inference(image_path)  # 手势检测的结果

            # 检查 res 是否为 None
            if res is None:
                raise ValueError("手势检测模型没有返回结果,请检查输入图片是否有效。")

            # 加载 SVM 模型
            baseml = wf(task='baseml', checkpoint=model_path)
            if isinstance(baseml.model, dict):
                baseml.model = baseml.model['model']  # 提取模型对象

            # 提取手势检测结果中的特征
            features = np.array(res).reshape(1, -1)  # 将特征转换为二维数组

            # 使用加载的 SVM 模型进行推理
            result = baseml.inference(features)  # 进行模型推理
            self.result_text.set(f"识别结果: {result}")
        except Exception as e:
            messagebox.showerror("错误", f"识别过程中发生错误: {e}")

if __name__ == "__main__":
    root = tk.Tk()
    app = GestureRecognitionApp(root)
    root.mainloop()

  

 

 

   
import os
import shutil
import numpy as np
import tkinter as tk
from tkinter import filedialog, messagebox
from PIL import Image, ImageTk
from XEdu.hub import Workflow as wf
import tempfile

class GestureRecognitionApp:
    def __init__(self, root):
        self.root = root
        self.root.title("手势识别系统")
        self.root.geometry("800x600")

        # 创建变量
        self.model_path = tk.StringVar()
        self.image_path = tk.StringVar()
        self.result_text = tk.StringVar()

        # 创建控件
        self.create_widgets()

    def create_widgets(self):
        # 模型选择
        tk.Label(self.root, text="选择模型:").grid(row=0, column=0, padx=10, pady=10)
        self.model_entry = tk.Entry(self.root, textvariable=self.model_path, width=50)
        self.model_entry.grid(row=0, column=1, padx=10, pady=10)
        tk.Button(self.root, text="浏览", command=self.load_model).grid(row=0, column=2, padx=10, pady=10)

        # 图片选择
        tk.Label(self.root, text="选择图片:").grid(row=1, column=0, padx=10, pady=10)
        self.image_entry = tk.Entry(self.root, textvariable=self.image_path, width=50)
        self.image_entry.grid(row=1, column=1, padx=10, pady=10)
        tk.Button(self.root, text="浏览", command=self.load_image).grid(row=1, column=2, padx=10, pady=10)

        # 显示图片
        self.image_label = tk.Label(self.root)
        self.image_label.grid(row=2, column=0, columnspan=3, padx=10, pady=10)

        # 显示结果
        tk.Label(self.root, text="识别结果:").grid(row=3, column=0, padx=10, pady=10)
        self.result_label = tk.Label(self.root, textvariable=self.result_text, font=("Arial", 12), wraplength=400)
        self.result_label.grid(row=3, column=1, columnspan=2, padx=10, pady=10)

        # 识别按钮
        tk.Button(self.root, text="开始识别", command=self.recognize).grid(row=4, column=0, columnspan=3, padx=10, pady=10)

    def load_model(self):
        file_path = filedialog.askopenfilename(filetypes=[("Pickle files", "*.pkl"), ("All files", "*.*")])
        if file_path:
            self.model_path.set(os.path.normpath(file_path))  # 标准化路径

    def load_image(self):
        file_path = filedialog.askopenfilename(filetypes=[("Image files", "*.jpg;*.png;*.jpeg"), ("All files", "*.*")])
        if file_path:
            self.image_path.set(os.path.normpath(file_path))  # 标准化路径
            self.display_image(file_path)

    def display_image(self, image_path):
        try:
            img = Image.open(image_path)
            img.thumbnail((400, 400))  # 调整图片大小
            img_tk = ImageTk.PhotoImage(img)
            self.image_label.config(image=img_tk)
            self.image_label.image = img_tk  # 保持对图片的引用
        except Exception as e:
            messagebox.showerror("错误", f"加载图片失败: {e}")

    def recognize(self):
        model_path = self.model_path.get()
        image_path = self.image_path.get()

        if not model_path or not image_path:
            messagebox.showwarning("警告", "请先选择模型和图片!")
            return

        # 检查模型文件是否存在
        if not os.path.exists(model_path):
            messagebox.showerror("错误", f"模型文件不存在: {model_path}")
            return

        # 检查图片文件是否存在
        if not os.path.exists(image_path):
            messagebox.showerror("错误", f"图片文件不存在: {image_path}")
            return

        try:
            # 创建临时目录
            temp_dir = tempfile.mkdtemp()
            temp_image_path = os.path.join(temp_dir, os.path.basename(image_path))

            # 将图片复制到临时目录
            shutil.copy(image_path, temp_image_path)

            # 加载手势检测模型
            model = wf(task='det_hand', repo='tzlzy321/hand')
            res = model.inference(temp_image_path)  # 手势检测的结果

            # 检查 res 是否为 None
            if res is None:
                raise ValueError("手势检测模型没有返回结果,请检查输入图片是否有效。")

            # 加载 SVM 模型
            baseml = wf(task='baseml', checkpoint=model_path)
            if isinstance(baseml.model, dict):
                baseml.model = baseml.model['model']  # 提取模型对象

            # 提取手势检测结果中的特征
            features = np.array(res).reshape(1, -1)  # 将特征转换为二维数组

            # 使用加载的 SVM 模型进行推理
            result = baseml.inference(features)  # 进行模型推理
            self.result_text.set(f"识别结果: {result}")

            # 删除临时目录
            shutil.rmtree(temp_dir)
        except Exception as e:
            messagebox.showerror("错误", f"识别过程中发生错误: {e}")

if __name__ == "__main__":
    root = tk.Tk()
    app = GestureRecognitionApp(root)
    root.mainloop()

  

关键改进点

  1. 临时目录:
    • 使用 tempfile.mkdtemp 创建一个临时目录。
    • 将图片复制到临时目录中,使用临时路径进行识别。
  2. 路径标准化:
    • 使用 os.path.normpathos.path.abspath 确保路径格式正确。
  3. 异常处理:
    • 在加载图片和模型时捕获可能的异常,并给出明确的错误提示。

测试建议

  1. 测试包含中文的路径:
    • 选择包含中文的路径,确保程序能够正确处理。
    • 例如:D:/XEdu/教学资源/拓展实验:训练手势数据分类模型(支持向量机)/4.jpg
  2. 测试临时目录:
    • 确保临时目录中的文件能够被正确加载和识别。
   

 

   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   

 大模型预习

 【机器学习】搭建算法并训练线性回归、多项式回归、支持向量机(SVM)等机器学习模型,制作个性化数据集,涉及到BaseML、BaseDT等工具。

 搭建算法并训练线性回归

 使用Python和常用的机器学习库(如NumPy、Scikit-learn)来实现。

理解线性回归

线性回归是一种用于预测连续值的监督学习算法。它假设目标变量(因变量)与特征(自变量)之间存在线性关系,模型形式为:

 

 

准备数据

首先,我们需要准备数据。你可以使用真实数据集,也可以生成一些随机数据。

 

import numpy as np
import matplotlib.pyplot as plt

# 生成随机数据
np.random.seed(42)
X = 2 * np.random.rand(100, 1)  # 生成100个随机特征值
y = 4 + 3 * X + np.random.randn(100, 1)  # 生成目标值,带有一些噪声

# 可视化数据
plt.scatter(X, y)
plt.xlabel("X")
plt.ylabel("y")
plt.title("Generated Data")
plt.show()

 

搭建线性回归模型

我们可以使用Scikit-learn库中的LinearRegression类来搭建模型。

from sklearn.linear_model import LinearRegression

# 创建线性回归模型
model = LinearRegression()

# 训练模型
model.fit(X, y)

# 输出模型参数
print("截距 (w0):", model.intercept_)
print("权重 (w1):", model.coef_)

  

 预测与评估

训练完成后,我们可以使用模型进行预测,并评估模型的性能。

# 预测
y_pred = model.predict(X)

# 可视化预测结果
plt.scatter(X, y, label="Actual Data")
plt.plot(X, y_pred, color='red', label="Predicted Line")
plt.xlabel("X")
plt.ylabel("y")
plt.title("Linear Regression Prediction")
plt.legend()
plt.show()

# 评估模型
from sklearn.metrics import mean_squared_error, r2_score

mse = mean_squared_error(y, y_pred)
r2 = r2_score(y, y_pred)

print("均方误差 (MSE):", mse)
print("R^2 分数:", r2)

  

手动实现线性回归(可选)

如果你想更深入地理解线性回归,可以手动实现它。以下是使用梯度下降法手动实现线性回归的代码:

# 手动实现线性回归
class LinearRegressionManual:
    def __init__(self, learning_rate=0.01, n_iterations=1000):
        self.learning_rate = learning_rate
        self.n_iterations = n_iterations
        self.weights = None
        self.bias = None

    def fit(self, X, y):
        n_samples, n_features = X.shape
        self.weights = np.zeros(n_features)
        self.bias = 0

        # 梯度下降
        for _ in range(self.n_iterations):
            y_pred = np.dot(X, self.weights) + self.bias

            # 计算梯度
            dw = (1 / n_samples) * np.dot(X.T, (y_pred - y))
            db = (1 / n_samples) * np.sum(y_pred - y)

            # 更新参数
            self.weights -= self.learning_rate * dw
            self.bias -= self.learning_rate * db

    def predict(self, X):
        return np.dot(X, self.weights) + self.bias

# 使用手动实现的线性回归
model_manual = LinearRegressionManual(learning_rate=0.1, n_iterations=1000)
model_manual.fit(X, y)

# 预测
y_pred_manual = model_manual.predict(X)

# 可视化手动实现的预测结果
plt.scatter(X, y, label="Actual Data")
plt.plot(X, y_pred_manual, color='green', label="Manual Predicted Line")
plt.xlabel("X")
plt.ylabel("y")
plt.title("Manual Linear Regression Prediction")
plt.legend()
plt.show()

  

总结

  • 我们使用Scikit-learn库快速搭建并训练了一个线性回归模型。

  • 我们还手动实现了线性回归,使用梯度下降法来优化模型参数。

  • 通过可视化数据和预测结果,我们可以直观地看到模型的拟合效果。

 

 

 

 

 训练多项式回归

 通过引入特征的高次项来拟合非线性关系

理解多项式回归

多项式回归的模型形式为:

 

 多项式回归仍然是一个线性模型,因为它是关于参数

 的线性组合。

 准备数据

我们首先生成一些非线性数据来演示多项式回归的效果。

import numpy as np
import matplotlib.pyplot as plt

# 生成非线性数据
np.random.seed(42)
X = 6 * np.random.rand(100, 1) - 3  # 生成100个随机特征值,范围在[-3, 3]
y = 0.5 * X**2 + X + 2 + np.random.randn(100, 1)  # 生成目标值,带有一些噪声

# 可视化数据
plt.scatter(X, y)
plt.xlabel("X")
plt.ylabel("y")
plt.title("Generated Nonlinear Data")
plt.show()

  

使用Scikit-learn实现多项式回归

Scikit-learn提供了PolynomialFeatures工具,可以将原始特征转换为多项式特征,然后我们可以使用线性回归模型来拟合这些特征。

步骤:

  1. 使用PolynomialFeatures生成多项式特征。

  2. 使用线性回归模型拟合多项式特征。

from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.pipeline import Pipeline

# 创建多项式回归模型
degree = 2  # 多项式的阶数
poly_features = PolynomialFeatures(degree=degree, include_bias=False)
linear_reg = LinearRegression()

# 使用Pipeline将多项式特征转换和线性回归组合在一起
model = Pipeline([
    ("poly_features", poly_features),
    ("linear_reg", linear_reg)
])

# 训练模型
model.fit(X, y)

# 预测
X_test = np.linspace(-3, 3, 100).reshape(-1, 1)  # 生成测试数据
y_pred = model.predict(X_test)

# 可视化结果
plt.scatter(X, y, label="Actual Data")
plt.plot(X_test, y_pred, color='red', label="Polynomial Regression")
plt.xlabel("X")
plt.ylabel("y")
plt.title(f"Polynomial Regression (Degree={degree})")
plt.legend()
plt.show()

  

评估模型

我们可以使用均方误差(MSE)和R²分数来评估模型的性能。

from sklearn.metrics import mean_squared_error, r2_score

# 计算预测值
y_pred_train = model.predict(X)

# 计算均方误差和R²分数
mse = mean_squared_error(y, y_pred_train)
r2 = r2_score(y, y_pred_train)

print("均方误差 (MSE):", mse)
print("R² 分数:", r2)

  

5. 调整多项式阶数

多项式回归的性能高度依赖于选择的阶数(degree)。如果阶数太低,模型可能欠拟合;如果阶数太高,模型可能过拟合。

示例:尝试不同的阶数

degrees = [1, 2, 10, 20]  # 尝试不同的阶数

plt.figure(figsize=(14, 10))
for i, degree in enumerate(degrees):
    # 创建模型
    poly_features = PolynomialFeatures(degree=degree, include_bias=False)
    linear_reg = LinearRegression()
    model = Pipeline([
        ("poly_features", poly_features),
        ("linear_reg", linear_reg)
    ])

    # 训练模型
    model.fit(X, y)

    # 预测
    y_pred = model.predict(X_test)

    # 可视化结果
    plt.subplot(2, 2, i + 1)
    plt.scatter(X, y, label="Actual Data")
    plt.plot(X_test, y_pred, color='red', label=f"Degree={degree}")
    plt.xlabel("X")
    plt.ylabel("y")
    plt.title(f"Polynomial Regression (Degree={degree})")
    plt.legend()

plt.tight_layout()
plt.show()

  

6. 手动实现多项式回归(可选)

如果你想更深入地理解多项式回归,可以手动实现它。以下是使用梯度下降法手动实现多项式回归的代码:

class PolynomialRegressionManual:
    def __init__(self, degree=2, learning_rate=0.01, n_iterations=1000):
        self.degree = degree
        self.learning_rate = learning_rate
        self.n_iterations = n_iterations
        self.weights = None
        self.bias = None

    def fit(self, X, y):
        # 生成多项式特征
        n_samples = X.shape[0]
        X_poly = np.column_stack([X**i for i in range(1, self.degree + 1)])

        # 初始化参数
        n_features = X_poly.shape[1]
        self.weights = np.zeros(n_features)
        self.bias = 0

        # 梯度下降
        for _ in range(self.n_iterations):
            y_pred = np.dot(X_poly, self.weights) + self.bias

            # 计算梯度
            dw = (1 / n_samples) * np.dot(X_poly.T, (y_pred - y))
            db = (1 / n_samples) * np.sum(y_pred - y)

            # 更新参数
            self.weights -= self.learning_rate * dw
            self.bias -= self.learning_rate * db

    def predict(self, X):
        # 生成多项式特征
        X_poly = np.column_stack([X**i for i in range(1, self.degree + 1)])
        return np.dot(X_poly, self.weights) + self.bias

# 使用手动实现的多项式回归
degree = 2
model_manual = PolynomialRegressionManual(degree=degree, learning_rate=0.01, n_iterations=1000)
model_manual.fit(X, y)

# 预测
y_pred_manual = model_manual.predict(X_test)

# 可视化手动实现的预测结果
plt.scatter(X, y, label="Actual Data")
plt.plot(X_test, y_pred_manual, color='green', label="Manual Polynomial Regression")
plt.xlabel("X")
plt.ylabel("y")
plt.title(f"Manual Polynomial Regression (Degree={degree})")
plt.legend()
plt.show()

  

7. 总结

  • 多项式回归通过引入特征的高次项来拟合非线性关系。

  • 使用Scikit-learn的PolynomialFeaturesLinearRegression可以快速实现多项式回归。

  • 手动实现多项式回归可以帮助你更深入地理解其原理。

  • 选择合适的阶数非常重要,避免欠拟合或过拟合。

 

 支持向量机(SVM)

  【机器学习】搭建算法并训练线性回归、多项式回归、支持向量机(SVM)等机器学习模型,制作个性化数据集,涉及到BaseML、BaseDT等工具。

搭建了算法并训练线性回归、多项式回归; 如何支持向量机(SVM)

支持向量机(SVM)是一种强大的机器学习算法,广泛应用于分类和回归问题。以下是关于如何训练SVM模型的详细步骤和方法:

1. 理解SVM的基本原理

SVM的核心目标是找到一个最优的超平面,将不同类别的数据分开,并最大化两个类别之间的间隔(Margin)。对于线性可分的数据,SVM通过硬间隔最大化来学习一个线性分类器。对于线性不可分的数据,SVM通过引入核函数将数据映射到高维空间,使其在高维空间中变得线性可分

2. 选择合适的核函数

核函数是SVM实现非线性分类的关键。常用的核函数包括:
  • 线性核:适用于线性可分的数据,计算速度快。
  • 多项式核:适用于数据具有多项式关系的情况。
  • 高斯核(RBF核):适用于非线性问题,具有高度的灵活性

3. 准备数据

在训练SVM模型之前,需要对数据进行预处理,包括:
  • 数据清洗:去除噪声和异常值。
  • 特征选择:选择对分类有帮助的特征。
  • 数据标准化:将数据归一化到相同的尺度,有助于提高模型性能

4. 训练SVM模型

使用Python中的Scikit-learn库可以方便地训练SVM模型。以下是一个简单的示例代码
import numpy as np
from sklearn import svm
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# 创建虚拟数据集
X, y = make_classification(n_samples=100, n_features=2, n_informative=2, n_redundant=0, random_state=42)

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 创建SVM模型,选择线性核
svm_model = svm.SVC(kernel='linear', C=1)

# 训练模型
svm_model.fit(X_train, y_train)

# 预测测试集
y_pred = svm_model.predict(X_test)

# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"模型准确率: {accuracy}")

  

5. 模型评估与优化

在模型训练完成后,需要评估其在测试集上的表现。常用的评估指标包括准确率、精确率、召回率和F1分数。此外,可以通过调整以下参数来优化模型性能:
  • C参数:控制模型的复杂度和训练误差之间的权衡。较大的C值会减少训练误差,但可能导致过拟合;较小的C值会使模型更平滑,但可能欠拟合
  • 核函数参数:如RBF核的γ参数,控制数据映射到高维空间后的范围

6. 实际应用案例

SVM在多个领域都有广泛应用,例如:
  • 文本分类:使用SVM对文本数据进行情感分析或主题分类,通常选择RBF核
  • 图像识别:在手写数字识别任务中,SVM能够达到较高的准确率,通常选择RBF核

 

 

 

 

 

 机器学习模型

  【机器学习】搭建算法并训练线性回归、多项式回归、支持向量机(SVM)等机器学习模型,制作个性化数据集,涉及到BaseML、BaseDT等工具。

 BaseML支持的机器学习模型

BaseML支持以下几种常见的机器学习模型,涵盖回归、分类和聚类任务:

1. 回归模型

  • 线性回归(Linear Regression):用于预测连续值,例如房价预测
  • 多项式回归(Polynomial Regression):用于拟合非线性关系
  • 岭回归(Ridge Regression):用于处理共线性数据
  • Lasso回归(Lasso Regression):用于特征选择
  • 支持向量机回归(SVM Regression):用于复杂的非线性回归
  • 随机森林回归(Random Forest Regression):用于回归任务,结合多个决策树
  • 决策树回归(CART Regression):使用决策树进行回归
  • 多层感知机回归(MLP Regression):基于神经网络的回归
  • AdaBoost回归(AdaBoost Regression):基于自适应增强的回归

2. 分类模型

  • K近邻分类(KNN Classification):基于最近邻的分类
  • 支持向量机分类(SVM Classification):用于复杂的非线性分类
  • 朴素贝叶斯分类(Naive Bayes Classification):基于概率的分类
  • 决策树分类(CART Classification):使用决策树进行分类
  • 随机森林分类(Random Forest Classification):结合多个决策树进行分类
  • 多层感知机分类(MLP Classification):基于神经网络的分类
  • AdaBoost分类(AdaBoost Classification):基于自适应增强的分类

3. 聚类模型

  • K均值聚类(K-Means Clustering):用于将数据分成多个簇
  • 谱聚类(Spectral Clustering):基于图论的聚类方法
  • 层次聚类(Agglomerative Clustering):基于层次结构的聚类
  • Birch聚类(Birch Clustering):用于大规模数据的聚类

如何使用BaseML训练这些模型

以下以线性回归、多项式回归和SVM为例,展示如何使用BaseML进行模型训练:
 

线性回归

 
from BaseML import Regression as reg
import pandas as pd

# 实例化线性回归模型
model = reg('LinearRegression')

# 载入数据
model.load_tab_data('数据文件路径.csv')

# 训练模型
model.train()

# 评估模型
model.valid(metrics='r2')  # 使用R²值评估[^28^]

  

多项式回归

from BaseML import Regression as reg
import pandas as pd

# 实例化多项式回归模型
model = reg('Polynomial')

# 载入数据
model.load_tab_data('数据文件路径.csv')

# 训练模型
model.train()

# 评估模型
model.valid(metrics='r2')  # 使用R²值评估[^33^]

  

支持向量机(SVM)

from BaseML import Classification as cls
import pandas as pd

# 实例化SVM分类模型
model = cls('SVM')

# 载入数据
model.load_dataset(X='特征数据', y='目标数据', type='pandas', x_column=[特征列], y_column=[目标列])

# 训练模型
model.train()

# 评估模型
model.valid(metrics='accuracy')  # 使用准确率评估[^28^][^33^]

  

 

适用场景

  • 线性回归:适用于预测连续值,如房价、温度等
  • 多项式回归:适用于拟合非线性关系的数据
  • SVM:适用于复杂的分类和回归任务,特别是在数据具有非线性分布时

 

 

 

 

 个性化数据集

  【机器学习】搭建算法并训练线性回归、多项式回归、支持向量机(SVM)等机器学习模型,制作个性化数据集,涉及到BaseML、BaseDT等工具。

结合机器学习,使用BaseML、BaseDT等工具,如何制作个性化数据集
 
 

1. 明确数据需求

在制作个性化数据集之前,需要明确以下几点:
  • 数据来源:确定数据的来源,例如传感器数据、用户行为日志、公开数据集等。
  • 数据类型:明确数据的类型,如数值型、分类型、文本型等。
  • 数据用途:确定数据集将用于何种机器学习任务,例如分类、回归、聚类等。

2. 数据收集

根据需求收集数据。可以使用BaseML、BaseDT等工具来辅助数据收集:
  • BaseML:支持从多种数据源(如数据库、API、文件等)导入数据。
  • BaseDT:提供数据爬取功能,可以从网页或API中抓取数据。

示例代码(使用BaseML导入数据):

import baseml as bm

# 从CSV文件导入数据
data = bm.load_data('data.csv')

# 从数据库导入数据
data = bm.load_data('mysql://user:password@host:port/dbname', query='SELECT * FROM table_name')

  

3. 数据预处理

数据预处理是制作个性化数据集的关键步骤,包括数据清洗、特征工程等。

数据清洗

  • 去除重复值:删除重复的记录。
  • 处理缺失值:填充或删除缺失值。
  • 去除异常值:识别并处理异常值。

特征工程

  • 特征选择:选择与目标变量相关的特征。
  • 特征转换:对特征进行标准化、归一化或编码。
  • 特征生成:通过组合或转换生成新的特征。

示例代码(使用BaseML进行数据预处理):

# 去除重复值
data = data.drop_duplicates()

# 处理缺失值
data = data.fillna(method='ffill')  # 前向填充
data = data.dropna()  # 删除缺失值

# 特征标准化
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
data[['feature1', 'feature2']] = scaler.fit_transform(data[['feature1', 'feature2']])

# 特征编码
data = bm.encode_categorical(data, columns=['category_feature'])

  

4. 数据标注

对于监督学习任务,需要对数据进行标注。标注过程可以手动完成,也可以使用自动化工具。

示例代码(使用BaseDT进行数据标注):

import basedt as bd

# 手动标注
data['label'] = bd.annotate(data, label_column='target')

# 自动标注(基于规则)
data['label'] = data['feature'].apply(lambda x: 'class1' if x > threshold else 'class2')

  

5. 数据划分

将数据集划分为训练集、验证集和测试集,以便进行模型训练和评估。

示例代码(使用BaseML划分数据集):

train_data, test_data = bm.split_data(data, test_size=0.2, random_state=42)
train_data, val_data = bm.split_data(train_data, test_size=0.2, random_state=42)

  

6. 数据增强(可选)

对于某些任务,可以通过数据增强来扩充数据集,提高模型的泛化能力。

示例代码(使用BaseML进行数据增强):

# 数据增强
augmented_data = bm.augment_data(train_data, method='smote', target_column='label')

  

7. 数据存储

将处理好的数据存储为适合模型训练的格式,例如CSV、HDF5等。

示例代码(使用BaseML保存数据):

bm.save_data(train_data, 'train_data.csv')
bm.save_data(val_data, 'val_data.csv')
bm.save_data(test_data, 'test_data.csv')

  

8. 验证数据集

在使用数据集之前,需要验证其质量和一致性,确保数据集符合模型训练的要求。

示例代码(使用BaseML验证数据集):

# 验证数据集
bm.validate_data(train_data, val_data, test_data)

  

总结

通过以上步骤,结合BaseML、BaseDT等工具,可以高效地制作个性化数据集,为机器学习模型的训练和优化提供高质量的数据支持。

 

 

 

BaseML

 
BaseML 是什么,怎么用,什么时候用。
 
 
 
 
 

BaseDT

 
BaseDT是什么,怎么用,什么时候用。
 
 
   
posted @ 2025-02-06 22:26  aiplus  阅读(161)  评论(1)    收藏  举报
悬浮按钮示例