从0开始学习机器学习--Day22--优化总结以及误差作业(上)

在之前,我们了解到在算法存在高方差问题时,扩充训练集的数据量有助于降低验证集的误差。那么,是否有其他情况我们可以通过增加数据量来优化算法呢?

假如我们有这样一个学习问题:我需要在{to,too,two}中选出一个填入以下句子:For breakfast, I ate __eggs.在这种问题中,句子的信息越多,算法越有可能得到答案,也就是说训练集数据额定增大是有益的。在房价问题中,假如我们只给了房屋面积的大小以及价格,单纯只靠这个预测到真实的价格的难度是很大的,毕竟还需要考虑所处位置的地价。

其实,这类问题概括起来,只要解决了偏差和方差的问题就可以了,那么我们要做的就是让算法的参数尽可能地多的同时,再增加训练集的数量,这样,在前者的作用下会变得很小,而在庞大的数据量的加持下,,这样我们就可以保证很小,从而达到优化算法的目的。

题目:利用水库的水位变化预测大坝的出水量

代码:

复制代码
import numpy as np
import scipy.io as sio
import matplotlib.pyplot as plt
from scipy.optimize import minimize

def linear(): # 线性回归
    fig, ax = plt.subplots()
    ax.scatter(X_train[:, 1], y_train)
    ax.set(xlabel = 'water level',
           ylabel = 'flowing data')
    return fig, ax

def reg_cost(theta, X, y, l):#正则化代价函数
    cost = np.sum(np.power((X@theta - y.flatten()), 2))
    reg = theta[1:]*l

    return (cost + reg)/(2*len(X))

def reg_gradient(theta, X, y, l): #正则化梯度
    grad = (X@theta-y.flatten())@X
    reg = l*theta
    reg[0] = 0
    return(grad + reg)/len(X)

def train_model(X, y, l):
    theta = np.ones(X.shape[1])
    res = minimize(fun=reg_cost,
                   x0=theta,
                   args=(X, y, l),
                   method='TNC',
                   jac=reg_gradient)
    return res.x

def learning_curve(X_train, y_train, X_val, y_val, l):
    x = range(1, len(X_train)+1) #由于range()左闭右开取不到最后一个数,所以在最后要+1
    training_cost = [] # 训练集代价函数
    cv_cost = [] #验证集代价函数

    for i in x:
        res = train_model(X_train[:i, :], y_train[:i, :], l)
        training_cost_i = reg_cost(res, X_train[:i, :], y_train[:i, :],l)
        cv_cost_i = reg_cost(res, X_val, y_val, l)
        training_cost.append(training_cost_i)
        cv_cost.append(cv_cost_i)

    plt.plot(x, training_cost, label='training cost')
    plt.plot(x, cv_cost, label='cv cost')
    plt.legend()
    plt.xlabel('training numbers')
    plt.ylabel('error')
    plt.show()


l=1
data = sio.loadmat('ex5data1.mat')
print(data.keys())

X_train = data['X']
y_train = data['y']
print(X_train.shape)
print(y_train.shape)


X_val = data['Xval']
y_val = data['yval']
print(X_val.shape)
print(y_val.shape)

X_test = data['Xtest']
y_test = data['ytest']
print(X_test.shape)
print(y_test.shape)



X_train = np.insert(X_train, 0, 1, axis=1)
X_val = np.insert(X_val, 0, 1, axis=1)
X_test = np.insert(X_test, 0, 1, axis=1)
fig, ax = linear()
plt.show()

theta = np.ones(X_train.shape[1])
reg__cost = reg_cost(theta, X_train, y_train, l)
print(reg__cost)

reg__gradient = reg_gradient(theta, X_train, y_train, l)
print(reg__gradient)

theta_final = train_model(X_train, y_train, l=0)
fig, ax = linear()
plt.plot(X_train[:, 1], X_train@theta_final, c='r')
plt.show()# 线性回归

compare = learning_curve(X_train, y_train, X_val, y_val, l=0)
print(compare) #比较训练集和验证集的误差,判断是否出现高偏差或高方差

输出:

复制代码
dict_keys(['__header__', '__version__', '__globals__', 'X', 'y', 'Xtest', 'ytest', 'Xval', 'yval'])
(12, 1)
(12, 1)
(21, 1)
(21, 1)
(21, 1)
(21, 1)
[303.99319222]
[-15.30301567 598.25074417]

原始数据散点图

线性回归模拟图

训练集和验证集的代价函数误差

今日小结:比之前学会了更灵活地用函数写功能来实现,但数据之间的维度转换很重要。今天的作业只有一半,在作正则化时没考虑到维度的问题,还在整改。

作业参考:https://www.bilibili.com/video/BV124411A75S?spm_id_from=333.788.videopod.episodes&vd_source=867b8ecbd62561f6cb9b4a83a368f691&p=8

相关推荐
寻道码路5 小时前
LangChain4j Java AI 应用开发实战(四):提示词工程进阶 - 模板化与结构化 Prompt 设计
java·人工智能·ai·prompt·aigc
Ws_10 小时前
C#学习 Day2
开发语言·学习·c#
Raink老师10 小时前
【AI面试临阵磨枪-70】Agent 系统如何做分布式调度、跨服务协作、故障恢复?
人工智能·面试·职场和发展
神谕的祝福10 小时前
comfyui从0到1开始学习-第三讲生图与降噪实验
学习
星夜夏空9911 小时前
STM32单片机学习(32) —— ADC
stm32·单片机·学习
tedcloud12311 小时前
RTK部署教程:构建稳定的AI Workflow环境
服务器·javascript·人工智能·typescript·ocr
Raink老师11 小时前
【AI面试临阵磨枪-71】如何用 AI 优化推荐系统、内容审核、广告创意、搜索体验?
人工智能·面试·职场和发展
AI医影跨模态组学11 小时前
Biomarker Res(IF=11.5)安徽医科大学第一医院:基于机器学习的放射组学模型:子宫内膜癌患者的预后预测及机制探索
人工智能·深度学习·论文·医学·医学影像·影像组学
ftpeak11 小时前
Mooncake:以 KVCache 为中心的分离式 LLM 服务架构
人工智能·ai·架构·ai编程·ai开发
Terrence Shen11 小时前
Hermes agent的tools是怎么落地应用的系列
人工智能·llm·agent·hermes