零基础机器学习|线性回归

一、数据收集和预处理

1、读取可视化

使用pandas库导入csv(逗号相隔开的文件)pd.read_csv()

import pandas as pd
df_ads = pd.read_csv("本地文件地址D:\…\双斜线表示“)

使用head()读出数据表格的前5行

df_ads.head()

2、相关分析

导入画图工具库 matplotlib 和统计学可视化库 seaborn 画出热力图

import matplotlib.pyplot as plt
import seaborn as sns
sns.heatmap(df_ads.corr(),cmap = “YlGnBu”,annot = True)
plt.show()

3、散点图

aspect = 1 长宽相同

sns.pairplot(df_ads,x_vars=[‘wechat’,‘weibo’,‘others’],y_vars=‘sales’,
height = 4, aspect = 1 ,kind = ‘scatter’)
plt.show()

3、预处理

1)导入数据

X = np.array(df_ads)
y = np.array(df_ads.sales)

2)删除标签

axis = 0 列
axis = 1 行

X = np.delete(数据, 标签个数 , axis = 1)

3)数据矩阵化

区分张量和向量的区别
数据导入进来时,是数组但是我们需要它为张量方便做乘法计算
用reshape的方法把向量转化成矩阵

X = X.reshape((len(x),1))
y = y.reshape((len(y),1))

二、拆分训练集和测试集

使用sklearn.model_selection 中的函数

from sklearn.model_selection import train_test_split

拆分处理, test_size 比例是0.2 ,random_state每次运行得到相同 的训练和测试数据

X_train, X_test,y_train,y_test = train_test_split(X, y, test_size = 0.2,random_state = 0)

三、数据归一化

自定义定义函数完成公式
X = X − m i n ( X ) m a x ( X ) − m i n ( X ) X = { \frac {X-min(X)}{max(X) - min(X)}} X=max(X)min(X)Xmin(X)

def scaler (train, test):
    min_value = train.min(axis = 0)
    max_value = train.max(axis = 0)
    gap = max_value - min_value
    train -= min_value
    train /= gap
    test -= min_value
    test /= gap
    return train, test

四、损失函数

自定义一下函数计算
L ( w , b ) = M S E = 1 2 N ∑ ( x , y ) ∈ D ( y − h ( x ) ) 2 L(w,b) =MSE = {\frac{1}{2N} \sum_{(x,y)\in D}(y-h(x))^2} L(w,b)=MSE=2N1(x,y)D(yh(x))2

def loss_fuction(X,y,weight,bias):
    y_hat = weight*X + bias
    loss = y_hat - y
    cost = np.sum(loss**2) / (2*len(X))
    return cost#损失函数的值

五、梯度下降

使用以下公式计算梯度,数学微积分联系的比较紧密,可以好好看看数学
梯度 = 1 2 N ∑ i = 1 N ( y ( i ) − ( w ∗ x ( i ) ) ) ∗ x ( i ) 梯度 = {\frac {1}{2N}\sum_{i=1}^N(y^{(i)}-(w*x^{(i)}))*x^{(i)}} 梯度=2N1i=1N(y(i)(wx(i)))x(i)
更新权重
w = w − α N ∑ i = 1 N ( y ( i ) − ( w ∗ x ( i ) ) ) ∗ x ( i ) w = w-{\frac{\alpha}{N}\sum_{i=1}^N(y^{(i)}-(w*x^{(i)}))*x^{(i)}} w=wNαi=1N(y(i)(wx(i)))x(i)

def graient_descent(X, y, weight, bias, lr, iteration):#lr为步长,iteration:迭代次数
    l_history = np.zeros(iteration)#创建一个全0 长度为iteration 的数组
    w_history = np.zeros(iteration)
    b_history = np.zeros(iteration)
    for i in range (iteration):
        y_hat = weight * X + bias
        loss = y_hat - y
        derivation_weight = X.T.dot(loss)/len(X) #计算权重的梯度 ,
        derivation_bias = sum(loss)*1/len(X)#计算偏置梯度
        weight = weight - lr*derivation_weight #现W=原W-学习速率(多块速度下降)乘以权重梯度(导数)
        bias =bias - lr*derivation_bias
        l_history[i] = loss_fuction(X,y,weight,bias)
        w_history[i] = weight
        b_history[i] = bias
    return l_history, w_history, b_history

六、调用封装线性回归的函数

自定义线性回归函数 ,包含梯度下降,梯度下降中包含损失函数,并计算预测的准确率

def linear_regression(X, y, weight, alpha, iterations):
    loss_history, weight_history = gradient_descent(X, y,
                                                    weight,
                                                    alpha, iterations)
    print("训练最终损失:", loss_history[-1]) # 打印最终损失
    y_pred = X.dot(weight_history[-1]) # 进行预测
    traning_acc = 100 - np.mean(np.abs(y_pred - y))*100 # 计算准确率
    print("线性回归训练准确率: {:.2f}%".format(traning_acc))  # 打印准确率
    return loss_history, weight_history # 返回训练历史记录

七、定义迭代次数,学习率,初始权重(优化,调参)

iterations = 300; # 迭代300次
alpha = 0.15; #学习速率设为0.15
weight = np.array([0.5,1,1,1]) # 权重向量,w[0] = bias
#计算一下初始值的损失
print ('当前损失:',loss_function(X_train, y_train, weight))

八、损失函数图像观察

观察随着迭代次数的增加,损失的数值是否减少

plt.plot(loss_history,'g--',label = 'Loss Curve')
plt.xlabel('Iteration')
plt.ylabel('loss')
plt.legend()
plt.show()

九、预测未来

输入X对应特征的数据,预测y销售量
提前保留没有被更改的X原始数据

def min_max_gap(train):
    min_val = train.min(axis = 0)
    max_val = train.max(axis = 1)
    gap = max_val - min_val
    return min_val,max_val,gap
y_min , y_max,y_gap = min_max_gap(y_train)

提前定义最大最小函数,方便后续还原归一化后的数据

X_train_original = X_train.copy()

注意要将归一化后的数据还原

X_plan = [250,50,50] # 要预测的X特征数据
X_train,X_plan = scaler(X_train_original,X_plan) # 对预测数据也要归一化缩放
X_plan = np.append([1], X_plan ) # 加一个哑特征X0 = 1
y_plan = np.dot(weight_history[-1],X_plan)
y_value = y_plan*y_gap + y_min # y_gap是当前y_train中最大值和最小值的差,y_min是最小值
print ("预计商品销售额: ",y_value, "千元")

十、完整代码

import numpy as np #导入NumPy数学工具箱
import pandas as pd #导入Pandas数据处理工具箱
df_ads = pd.read_csv('F:\\MachineLearning_testData\\advertising.csv')
df_ads.head()

X = np.array(df_ads) # 构建特征集,含全部特征
X = np.delete(X, [3], axis = 1) # 删除掉标签
y = np.array(df_ads.sales) #构建标签集,销售金额
print ("张量X的阶:",X.ndim)
print ("张量X的形状:", X.shape)
print (X)

y = y.reshape(-1,1) #通过reshape函数把向量转换为矩阵,-1就是len(y),返回样本个数
print ("张量y的形状:", y.shape)

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y,
                                   test_size=0.2, random_state=0)
def scaler(train, test): # 定义归一化函数 ,进行数据压缩
    # 数据的压缩
    min = train.min(axis=0) # 训练集最小值
    max = train.max(axis=0) # 训练集最大值
    gap = max - min # 最大值和最小值的差
    train -= min # 所有数据减最小值
    train /= gap # 所有数据除以大小值差
    test -= min #把训练集最小值应用于测试集
    test /= gap #把训练集大小值差应用于测试集
    return train, test # 返回压缩后的数据


def min_max_gap(train):  # 计算训练集最大,最小值以及他们的差,用于后面反归一化过程
    min = train.min(axis=0)  # 训练集最小值
    max = train.max(axis=0)  # 训练集最大值
    gap = max - min  # 最大值和最小值的差
    return min, max, gap


y_min, y_max, y_gap = min_max_gap(y_train)
X_train_original = X_train.copy() # 保留一份训练集数据副本,用于对要预测数据归一化
X_train,X_test = scaler(X_train,X_test) # 对特征归一化
y_train,y_test = scaler(y_train,y_test) # 对标签也归一化
x0_train = np.ones((len(X_train),1)) # 构造X_train长度的全1数组配合对Bias的点积
X_train = np.append(x0_train, X_train, axis=1) #把X增加一系列的1
x0_test = np.ones((len(X_test),1)) # 构造X_test长度的全1数组配合对Bias的点积
X_test = np.append(x0_test, X_test, axis=1) #把X增加一系列的1
print ("张量X的形状:", X_train.shape)
print (X_train)
def loss_function(X, y, W): # 手工定义一个MSE均方误差函数,W此时是一个向量
    y_hat = X.dot(W.T) # 点积运算 h(x)=w_0*x_0 + w_1*x_1 + w_2*x_2 + w_3*x_3
    loss = y_hat.reshape((len(y_hat),1))-y # 中间过程,求出当前W和真值的差异
    cost = np.sum(loss**2)/(2*len(X)) # 这是平方求和过程, 均方误差函数的代码实现
    return cost # 返回当前模型的均方误差值
def gradient_descent(X, y, W, lr, iterations): # 定义梯度下降函数
    l_history = np.zeros(iterations) # 初始化记录梯度下降过程中损失的数组
    W_history = np.zeros((iterations,len(W))) # 初始化权重数组
    for iter in range(iterations): # 进行梯度下降的迭代,就是下多少级台阶
        y_hat = X.dot(W.T) # 这个是向量化运行实现的假设函数
        loss = y_hat.reshape((len(y_hat),1))-y # 中间过程, y_hat和y真值的差
        derivative_W = X.T.dot(loss)/len(X) #求出多项式的梯度向量
        derivative_W = derivative_W.reshape(len(W))
        W = W - lr*derivative_W # 结合下降速率更新权重
        l_history[iter] = loss_function(X, y, W) # 损失的历史记录
        W_history[iter] = W # 梯度下降过程中权重的历史记录
    return l_history, W_history # 返回梯度下降过程数据
#首先确定参数的初始值
iterations = 300; # 迭代300次
alpha = 0.15; #学习速率设为0.15
weight = np.array([0.5,1,1,1]) # 权重向量,w[0] = bias
#计算一下初始值的损失
print ('当前损失:',loss_function(X_train, y_train, weight))
# 定义线性回归模型
def linear_regression(X, y, weight, alpha, iterations):
    loss_history, weight_history = gradient_descent(X, y,
                                                    weight,
                                                    alpha, iterations)
    print("训练最终损失:", loss_history[-1]) # 打印最终损失
    y_pred = X.dot(weight_history[-1]) # 进行预测
    traning_acc = 100 - np.mean(np.abs(y_pred - y))*100 # 计算准确率
    print("线性回归训练准确率: {:.2f}%".format(traning_acc))  # 打印准确率
    return loss_history, weight_history # 返回训练历史记录
# 调用刚才定义的线性回归模型
loss_history, weight_history = linear_regression(X_train, y_train,
                           weight, alpha, iterations) #训练机器
print("权重历史记录:", weight_history)
print("损失历史记录:", loss_history)

X_plan = [250,50,50] # 要预测的X特征数据
X_train,X_plan = scaler(X_train_original,X_plan) # 对预测数据也要归一化缩放
X_plan = np.append([1], X_plan ) # 加一个哑特征X0 = 1
y_plan = np.dot(weight_history[-1],X_plan) # [-1] 即模型收敛时的权重
# 对预测结果要做反向缩放,才能得到与原始广告费用对应的预测值
y_value = y_plan*y_gap + y_min # y_gap是当前y_train中最大值和最小值的差,y_min是最小值
print ("预计商品销售额: ",y_value, "千元")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/556695.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Vision Pro应用】分享一个收集Apple Vision Pro 应用的网站

您是否也觉得 Vision Pro 应用程序商店经常一遍又一遍地展示相同的几个 VisionOS 应用程序?许多有趣、好玩的应用程序似乎消失得无影无踪,让人很难发现它们。为了帮助大家更轻松地探索和体验最新、最有趣的 Vision Pro 应用程序,这里分享一个网站https://www.findvisionapp.…

IDEA @Autowired不显示红线

IDEA 中,Autowired 显示红线一般情况是注入 Mapper 或者 Dao 时出现的,如下图: 这个报错是因为 Mapper 或者 Dao 上没有加 Repository 或者 Mapper,Autowired 注入时就判断为这不是一个 Bean。 不建议通过加上面两个注解的方式解…

Java面试八股之hashCode()和equals()方法的重要性

hashCode()和equals()方法的重要性 逻辑判断:equals()方法用于定义对象逻辑上的相等标准,即当两个对象在业务意义上被视为“相同”时,equals()应返回true。 哈希表支持:hashCode()返回一个整数哈希码,用于在哈希表&a…

【电路笔记】-数字逻辑门总结

数字逻辑门总结 文章目录 数字逻辑门总结1、概述2、逻辑门真值表3、总结 数字逻辑门有三种基本类型:与门、或门和非门。 1、概述 我们还看到,数字逻辑门具有与其相反或互补的形式,分别为“与非门”、“或非门”和“缓冲器”,并且…

AIGC的崛起:定义未来内容创作的新纪元

🌟文章目录 🌟AIGC简介🌟 AIGC的相关技术与特点🌟AIGC有哪些应用场景?🌟AIGC对其他行业影响🌟面临的挑战与问题🌟AIGC未来发展 🌟AIGC十大热门网站推荐: 文心…

常用的7个免费ChatGPT网站

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

2022天梯赛 L3_2 关于深度优先搜索和逆序对的题应该不会很难吧这件事 【树上逆序对计数】

传送门:https://pintia.cn/problem-sets/994805046380707840/exam/problems/1518582895035215872?type7&page1 思路 观察发现,逆序对可以分成两类: 节点 u u u 和 v v v 有明确的父子关系(不一定是直属的直连边&#xff…

今天给大家推荐36套404页面模板

404页面是网站必备的一个页面,它承载着用户体验与SEO优化的重任。当用户访问不存在的页面时,服务器会返回404错误代码,并显示404页面。一个好的404页面可以帮助用户快速找到所需信息,并提升网站的用户体验。 以下是一些演示下载资…

Web3技术简介:重新定义互联网的未来

引言 在21世纪的数字时代,互联网已成为我们日常生活的不可或缺的一部分。然而,随着区块链和加密技术的快速发展,一个全新的互联网模型——Web3,正逐渐崭露头角。Web3不仅仅是技术的进步,它更是对传统互联网模型的挑战…

类和对象中阶3⃣️-默认成员函数(赋值运算符重载,取地址及 const取地址操作符重载等)

目录 5.赋值运算符重载 5.1 运算符重载 5.2 赋值运算符重载 5.3 前置和后置重载 5.4 重载流插入与流提取 流插入<<运算符重载 流提取运算符重载 6.日期类实现 7.const成员 8.取地址 及 const取地址操作符 重载 5.赋值运算符重载 5.1 运算符重载 C为了增强代码…

数仓建模—数据仓库初识

数仓建模—数据仓库初识 数据仓库之父Bill Inmon在1991年出版的"Building the Data Warehouse"一书中所提出的定义被广泛接受 数据仓库&#xff08;Data Warehouse&#xff09;是一个面向主题的&#xff08;Subject Oriented&#xff09;、集成的&#xff08;Integ…

Mysql索引专题

文章目录 1. 数据库索引结构1.1 Hash结构1.2 树结构1.3 Mysql索引怎么提升效率? 2. 执行计划 explainidselect_typetabletypepossible_keyskeykey_lenrefrowsfiteredextra 1. 数据库索引结构 我们都知道mysql数据库的常用存储结构是B树&#xff0c;为什么是B树&#xff1f;试…

邮件代发API发送邮件如何使用?操作指南?

邮件代发邮箱API发送邮件的步骤&#xff1f;代发有哪些注意事项&#xff1f; 在自动化办公、批量营销等场景中&#xff0c;手动发送邮件往往显得效率低下&#xff0c;这时候&#xff0c;邮件代发API就显得尤为重要。那么&#xff0c;邮件代发API发送邮件究竟如何使用呢&#x…

买婴儿洗衣机怎么选择?四大绝佳好用婴儿洗衣机分享

幼龄时期的宝宝的衣物&#xff0c;是比较需要注意的时候。可能一不注意宝宝穿在身上就会有不适宜症状发生。所以宝妈们真的要随时观察&#xff0c;然后在宝宝洗衣服的这上面多下点功夫&#xff0c;不要让宝宝受到这种无谓的伤害。小婴儿的抵抗力比我们差很多。有些细菌、病毒可…

Hadoop大数据处理技术-Linux相关命令

​7.Linux常用命令 1&#xff09;Windows中的dir&#xff1a;列出当前目录下所有的文件和目录 2&#xff09;cd&#xff1a;改变当前目录 cd命令并不能直接实现这种跳跃转换目录的功能 它只能让你在当前目录和其子目录之间来回切换 就像在一张平面地图上移动一样 如果想跨目录…

如何挑选护眼灯?分享护眼灯排行榜前十名

许多家长肯定都有这样的烦恼&#xff0c;家中的孩子自从上学后&#xff0c;每天回家后的学习作写阅读时总会在不知不觉间越来越贴近书本&#xff0c;后来还会时不时眯着眼睛看东西&#xff0c;但其实这种用眼习惯的最大原因是孩子没有足够光线和舒适的环境光线导致的&#xff0…

硬件设备杂记——12G SDI及 AES67/EBU

常见的 SDI线缆规格&#xff0c;HD-SDI又被称为1.5G-SDI&#xff0c;具体参数以秋叶原的参数为例 AES67/EBU 目前音频网络标准主要集中在OSI网络体系的第二层和第三层。 第二层音频标准的弊端在于构建音频网络时需要专用的交换机&#xff0c;无法利用现有的以太网络&#xff0c…

SpringBoot基于redis zset实现滑动窗口限流

通过Redis zset实现滑动窗口限流算法 在开发高并发系统时有三把利器用来保护系统&#xff1a;缓存、降级和限流。限流可以认为服务降级的一种&#xff0c;限流通过限制请求的流量以达到保护系统的目的。 一般来说&#xff0c;系统的吞吐量是可以计算出一个阈值的&#xff0c;…

【leetcode面试经典150题】59. 合并两个有序链表(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主&#xff0c;题解使用C语言。&#xff08;若有使用其他语言的同学也可了解题解思路&#xff0c;本质上语法内容一致&…

【Java框架】Spring框架(四)——Spring中的Bean的创建与生命周期

目录 SpringBean的创建步骤后置处理器(PostProcessor)BeanFactoryPostProcessorBeanPostProcessorInstantiationAwareBeanPostProcessorpostProcessBeforeInstantiationpostProcessAfterInstantiationpostProcessProperties SmartInstantiationAwareBeanPostProcessordetermine…
最新文章