[笔记]机器学习之机器学习模型及案例分析《一》回归(一)

简介: [笔记]机器学习之机器学习模型及案例分析《一》回归

活动地址:CSDN21天学习挑战赛

前言

环境:

python3.7

IDEA

机器学习基本思路:

  • 推导公式进行建模
  • 优化模型
  • 评估系数
  • 根据模型进行预测

回归

1. 案例

一元线性回归的例子引出线性回归模型:

1920年汽车速度与刹车距的数据,现在,我们想研究速度与刹车距离之间到底有什么样的关系。

绘制散点图

# 1.收集数据
data_cars = pd.read_csv("../data/cars.csv",usecols = ["speed","dist"])
print(data_cars.head())
# 2.可视化
speed = data_cars["speed"]
dist = data_cars["dist"]
plt.scatter(speed,dist) # 散射
plt.title("Scatter plot of vehicle speed and braking distance")
plt.show()

呈现线性关系:

为了使预测更为精准

从图像直观描述,就是使寻找一条直线,使得所有样本点到直线的距离之和最短,如图7.1.2所示:

以下在机器学习中称为损失函数:

损失函数

损失函数:简而言之,就是实际偏离模型的数据点与预期在模型上的数据点的差值,规律总结而成的函数。

我们可以通过直接法和迭代法两种方式对该损失函数进行优化,进而得到使损失函数最小的回归系数。下面,我们分别用这两种方法进行求解。

直接法

直接法,就是直接给出优化问题的最优解,并不是所有的优化问题都可以用直接法得到最优解,如果要

使用直接法,损失函数需要满足两个条件:

1. 损失函数为凸函数; (曲线是凹状或者凸状)

2. 损失函数为解析解,即通过严格的公式所求得的解。

凸函数定义:

图7.1.3 凸函数曲线图

python代码:

## 2.2 损失函数
import sympy
#设定回归系数
alpha, beta = sympy.symbols("alpha beta")
#设定损失函数
L = 0.5* np.sum((dist - beta*speed - alpha)**2)
#求偏导
print(sympy.diff(L, alpha))
#50.0*alpha + 770.0*beta - 2149.0
print(sympy.diff(L, beta))
#770.0*alpha + 13228.0*beta - 38482.0
f1 = sympy.diff(L, alpha)
f2 = sympy.diff(L, beta)
### 求解线性方程组
outcome = sympy.solve([f1, f2], [alpha, beta])
print(outcome)
#{alpha: -17.5790948905109, beta: 3.93240875912409} 最优解

{alpha: -17.5790948905109, beta: 3.93240875912409} 最优解

我们将直线 y = 3.932x+ -17.570 绘制在车速与刹车距离散点图中,如图7.1.5所示。

### 绘图
alpha_num = outcome[alpha]
beta_num = outcome[beta]
dist_pre = beta_num*speed + alpha_num
plt.scatter(speed, dist)
plt.plot(speed, dist_pre, c = "r")
plt.title("Fitting results")
plt.show()

迭代法

很多情况都是非凸形的 没法使用直接法进行优化 所以我们可以使用迭代法求解。迭代法是一种不断用变量的旧值递推新值的过程,即迭代的用旧值修正对最优解的估计。

这里,我们使用迭代法中的小批量梯度下降法解决问题:

对于我们的问题,小批量梯度下降法的过程如下:

  1. 确定要求解的模型参数为 α,β ;
  2. 定义小批量梯度下降法的损失函数:

  3. 求解梯度,并定义递推关系:

    在[0, 10)中按照均匀分布随机产生alpha和beta的初始值,定义学习率 和 均为0.02,定义迭代次数
    为20000次;
  4. 迭代,迭代完成输出最后的模型参数。
#迭代法
import random
#定义递推关系,更新迭代变量
def update_var(old_alpha, old_beta, y, x, learning_rate):
    len_x = len(x)
    alpha_delta = np.sum(-(y - old_beta*x - old_alpha))/len_x
    beta_delta = np.sum(-x*(y - old_beta*x - old_alpha))/len_x
    new_alpha = old_alpha - learning_rate*alpha_delta
    new_beta = old_beta - learning_rate*beta_delta
    return (new_alpha, new_beta)
#迭代
def iterative_func(y, x, start_alpha, start_beta,
                   learning_rate, iterative_num, 
                   sample_num):
    alpha_list = []
    beta_list = []
    alpha = start_alpha
    beta = start_beta
    num_list = list(range(1, len(y)+1))
    for i in range(iterative_num):
        alpha_list.append(alpha)
        beta_list.append(beta)
        random.shuffle(num_list)
        index = num_list[:sample_num]
        alpha, beta = update_var(alpha, beta, 
                                 y[index], x[index], learning_rate)
#        print("alpha: {}, beta:{}".format(alpha, beta))
    return (alpha_list, beta_list)
#在[0, 10)之间按照均匀分布随机产生alpha和beta的初始值
start_alpha = np.random.random()*10
start_beta = np.random.random()*10
#设置学习率为0.01,迭代次数为500次,每次计算8个数据
learning_rate = 0.002
iterative_num = 20000
sample_num = 16
alpha_list, beta_list = iterative_func(dist, speed, start_alpha, start_beta,
                                     learning_rate, iterative_num,
                                     sample_num)

最后会发现直接法和迭代法 答案相近

最后绘制α和β变化:

...代码接上...
#写出
import csv
parameter_data = zip(alpha_list, beta_list)
with open("./outcome/gradient_descent_parameter.csv", 'w', newline = '') as f:
    csv_writer = csv.writer(f)
    csv_writer.writerow(["alpha","beta"])
    csv_writer.writerows(parameter_data)
#绘图
plt.subplot(121)
plt.plot(alpha_list)
plt.title("alpha change process")
plt.subplot(122)
plt.plot(beta_list)
plt.title("beta change process")
plt.show()

学习率:影响变化稳定的因素,我们可以设置其学习率随着迭代次数增加逐渐递减,来缓解这种现象

样本数:

迭代次数:

评估数据好坏

直接法求得的回归系数估计值进行评价,即计算其 R^2:

#判定系数R2
dist_pre = beta_num*speed + alpha_num
dist_mean = np.mean(dist)
R_2 = np.sum((dist_pre - dist_mean)**2)/np.sum((dist - dist_mean)**2)
print(R_2)
#0.651079380758251
#预测
new_speed = pd.Series([10, 20, 30])
new_dist_pre = beta_num*new_speed + alpha_num
print(new_dist_pre)

结果R^2得到0.65107938

预测

利用我们的模型对结果进行预测。

我们依然采用直接法求得的回归系数估计值,对新的样本进行预测。

假设新记录的一批车辆的车速分别为10, 20, 30,利用python,我们可以得到刹车距离的预测值为21.745,61.069,100.393。


相关文章
|
6天前
|
机器学习/深度学习 人工智能 分布式计算
使用PAI+LLaMA Factory 微调 Qwen2-VL 模型,搭建文旅领域知识问答机器人
本次教程介绍了如何使用 PAI 和 LLaMA Factory 框架,基于全参方法微调 Qwen2-VL模型,使其能够进行文旅领域知识问答,同时通过人工测试验证了微调的效果。
|
14天前
|
机器学习/深度学习 算法 数据可视化
机器学习模型中特征贡献度分析:预测贡献与错误贡献
本文将探讨特征重要性与特征有效性之间的关系,并引入两个关键概念:预测贡献度和错误贡献度。
49 3
|
9天前
|
机器学习/深度学习 数据可视化 JavaScript
探索机器学习模型的可视化技术
【9月更文挑战第23天】在数据科学中,理解和解释机器学习模型的决策过程是至关重要的。本文将介绍几种流行的可视化工具和库,如TensorBoard、D3.js等,帮助读者更好地理解模型内部工作原理及其预测结果。通过实例演示如何使用这些工具进行模型可视化,增强模型的可解释性。
|
14天前
|
机器学习/深度学习 存储 人工智能
文本情感识别分析系统Python+SVM分类算法+机器学习人工智能+计算机毕业设计
使用Python作为开发语言,基于文本数据集(一个积极的xls文本格式和一个消极的xls文本格式文件),使用Word2vec对文本进行处理。通过支持向量机SVM算法训练情绪分类模型。实现对文本消极情感和文本积极情感的识别。并基于Django框架开发网页平台实现对用户的可视化操作和数据存储。
20 0
文本情感识别分析系统Python+SVM分类算法+机器学习人工智能+计算机毕业设计
|
23天前
|
机器学习/深度学习 Python
验证集的划分方法:确保机器学习模型泛化能力的关键
本文详细介绍了机器学习中验证集的作用及其划分方法。验证集主要用于评估模型性能和调整超参数,不同于仅用于最终评估的测试集。文中描述了几种常见的划分方法,包括简单划分、交叉验证、时间序列数据划分及分层抽样划分,并提供了Python示例代码。此外,还强调了在划分数据集时应注意随机性、数据分布和多次实验的重要性。合理划分验证集有助于更准确地评估模型性能并进行有效调优。
|
23天前
|
机器学习/深度学习 人工智能 自然语言处理
机器学习模型之深度神经网络的特点
深度神经网络(Deep Neural Networks, DNNs)是一类机器学习模型,通过多个层级(层)的神经元来模拟人脑的工作方式,从而实现复杂的数据处理和模式识别任务。
32 1
|
1月前
|
机器学习/深度学习 算法 前端开发
R语言基础机器学习模型:深入探索决策树与随机森林
【9月更文挑战第2天】决策树和随机森林作为R语言中基础且强大的机器学习模型,各有其独特的优势和适用范围。了解并熟练掌握这两种模型,对于数据科学家和机器学习爱好者来说,无疑是一个重要的里程碑。希望本文能够帮助您更好地理解这两种模型,并在实际项目中灵活应用。
|
1月前
|
机器学习/深度学习 存储 数据挖掘
Hologres 与机器学习的融合:为实时分析添加预测性分析功能
【9月更文第1天】随着数据科学的发展,企业越来越依赖于从数据中获取洞察力来指导决策。传统的数据仓库主要用于存储和查询历史数据,而现代的数据仓库如 Hologres 不仅提供了高性能的查询能力,还能够支持实时数据分析。将 Hologres 与机器学习技术相结合,可以在实时数据流中引入预测性分析,为企业提供更深入的数据洞见。本文将探讨如何将 Hologres 与机器学习集成,以便实现实时的预测性分析。
56 4
|
1月前
|
机器学习/深度学习 数据采集 存储
一文读懂蒙特卡洛算法:从概率模拟到机器学习模型优化的全方位解析
蒙特卡洛方法起源于1945年科学家斯坦尼斯劳·乌拉姆对纸牌游戏中概率问题的思考,与约翰·冯·诺依曼共同奠定了该方法的理论基础。该方法通过模拟大量随机场景来近似复杂问题的解,因命名灵感源自蒙特卡洛赌场。如今,蒙特卡洛方法广泛应用于机器学习领域,尤其在超参数调优、贝叶斯滤波等方面表现出色。通过随机采样超参数空间,蒙特卡洛方法能够高效地找到优质组合,适用于处理高维度、非线性问题。本文通过实例展示了蒙特卡洛方法在估算圆周率π和优化机器学习模型中的应用,并对比了其与网格搜索方法的性能。
163 1
|
14天前
|
机器学习/深度学习 数据采集 算法
机器学习新纪元:用Scikit-learn驾驭Python,精准模型选择全攻略!
在数据爆炸时代,机器学习成为挖掘数据价值的关键技术,而Scikit-learn作为Python中最受欢迎的机器学习库之一,凭借其丰富的算法集、简洁的API和高效性能,引领着机器学习的新纪元。本文通过一个实际案例——识别垃圾邮件,展示了如何使用Scikit-learn进行精准模型选择。从数据预处理、模型训练到交叉验证和性能比较,最后选择最优模型进行部署,详细介绍了每一步的操作方法。通过这个过程,我们不仅可以看到如何利用Scikit-learn的强大功能,还能了解到模型选择与优化的重要性。希望本文能为你的机器学习之旅提供有价值的参考。
17 0
下一篇
无影云桌面