线性、逻辑回归算法学习

1、什么是一元线性回归

线性:两个变量之间的关系是一次函数,也是数据与数据之间的关系。
回归:人们在测试事物的时候因为客观条件所限,求的都是测试值,而不是真实值,为了无限接近真实值,无限次的进行测量,最后通过这些测量数据计算回归到真实值,这就是回归的由来。
KNN最近邻值是:KNN横纵轴坐标为两个特征,比如身高体重与某种疾病关系。
一元线性回归:只有横轴是特征,纵轴是输出值,比如股价与时间的关系。
通俗的说就是用一个函数去逼近这个真实值

在这里插入图片描述

1.2、线性回归解决什么问题

通过大量样本数据进行处理,可以得出一个 比较符合事物内部规律的y=kx+b,从而对结果进行预测,解决的就是通过已知样本数据,预测未知数据,比如房价进行预测,电影票房预测。

计算k和b的计算公式:
在这里插入图片描述

损失函数(loss function),衡量了误差大小,不断地去优化,找出最优解,平方残差和是最常用的一种方式
在这里插入图片描述在这里插入图片描述

在这里插入图片描述

1.3、实现一元线性回归

在这里插入图片描述

# 使用boston数据集 
import numpy as np
import matplotlib.pyplot as plt
import sklearn
from sklearn.model_selection import train_test_split
import pandas as pd 

# 加载波士顿房屋数据集
data_url = "http://lib.stat.cmu.edu/datasets/boston"
raw_df = pd.read_csv(data_url, sep="\s+", skiprows=22, header=None)
data = np.hstack([raw_df.values[::2, :], raw_df.values[1::2, :2]])
target = raw_df.values[1::2, 2]

from sklearn.model_selection import train_test_split
# 拆分数据集
x_train,x_test,y_train,y_test = train_test_split(data,target,train_size=0.7,random_state=233)

x_train[:,5].shape,y_train.shape
plt.scatter(x_train[:,5],y_train)

def fit(x,y):
    a_up = np.sum((x-np.mean(x))*(y-np.mean(y)))
    a_bottom = np.sum((x-np.mean(x))**2)
    a = a_up/a_bottom
    b = np.mean(y) - a *np.mean(x)
    return a,b

a,b = fit(x_train[:,5],y_train)
a,b

plt.scatter(x_train[:,5],y_train)
plt.plot(x_train[:,5],a*x_train[:,5]+b,c='r')
plt.show()

1.4、使用sklearn实现一元线性回归

from sklearn.linear_model import LinearRegression
lr = LinearRegression()
lr.fit(x_train[:,5].reshape(-1,1),y_train)
y_predict = lr.predict(x_test[:,5].reshape(-1,1))

plt.scatter(x_test[:,5],y_test)
plt.plot(x_test[:,5],y_predict,c='r')
plt.show()

2、多元线性回归

参考链接

线性回归是评估自变量x和应变量y之间的一种线性关系,当只有一个自变量称为一元线性回归,多个自变量称为多元线性回归,现实生活中数据都是比较复杂的,比如影响房价的因素往往不止一个,可能还有附近地铁,房间数,层数,建筑年代等诸多因素。不过每个因素对房价影响权重不同,因此我们可以用多个权重来表示多个因素与房屋价格的关系

x:影响因素,即特征。
w:每个x的影响力度。
n:特征的个数。
y^:房屋的预测价格。
在这里插入图片描述

在这里插入图片描述
这样,就可以表示为:
在这里插入图片描述

多元线性回归在空间中,可以表示为一个超平面,去拟合空间中的数据点。
我们的目的就是从现有的数据中,去学习w与b的值。一旦w与b的值确定,就能够确定拟合数据的线性方程,这样就可以对未知的数据x进行预测y(房价)

损失函数:
对于机器学习来讲,就是从已知数据去建立一个模型,使得该模型能够对未知数据进行预测。实际上,机器学习的过程就是确定模型参数的过程。
对于监督学习来说,我们可以通过建立损失函数来实现模型参数的求解,损失函数也称目标函数或代价函数,简单来说就是关于误差的一个函数。损失函数用来衡量模型预测值与真实值之间的差异。机器学习的目标,就是要建立一个损失函数,使得该函数的值最小。
也就是说,损失函数是一个关于模型参数的函数(以模型参数w作为自变量的函数),自变量可能的取值组合通常是无限的,我们的目标,就是要在众多可能的组合中,找到一组最合适的自变量组合,使得损失函数的值最小。
在线性回归中,我们使用平方损失函数(最小二乘法),定义如下:
在这里插入图片描述

2.2、使用sklearn实现多元线性回归

多元线性回归没办法通过画图看出效果,但是可以通过score来获取模型的评分。
注意:多元线性回归是不需要归一化的,学习的是各自维度特征

# 使用boston数据集 
import numpy as np
import matplotlib.pyplot as plt
import sklearn
from sklearn.model_selection import train_test_split
import pandas as pd 

# 加载波士顿房屋数据集
data_url = "http://lib.stat.cmu.edu/datasets/boston"
raw_df = pd.read_csv(data_url, sep="\s+", skiprows=22, header=None)
data = np.hstack([raw_df.values[::2, :], raw_df.values[1::2, :2]])
target = raw_df.values[1::2, 2]

x_train,x_test,y_train,y_test = train_test_split(data,target,test_size=0.3,random_state=233)
lr = LinearRegression()
lr.fit(x_train,y_train)
lr.score(x_test,y_test)

2.3、MSE

MSE(Mean Squared Error),平均平方差,为所有样本数据误差(真实值与预测值之差)的平方和,然后取均值。越接近0越好,mse越小容易出现过拟合,反之容易欠拟合。
在这里插入图片描述

手动实现

mse = np.sum(((y_test-y_predict)**2)/len(y_test))
mse

使用skleran实现

# 使用sklearn实现
from sklearn.metrics import mean_squared_error
mean_squared_error(y_test,y_predict)

2.4、RMSE

RMSE(Root Mean Squared Error),平均平方误差的平方根,即在MSE的基础上,取平方根。放大了较大误差之间的差距
在这里插入图片描述

#RMSE,先对数据进行了平方然后累加在开方,放大了较大误差之间的差距
rmse = np.sqrt(mse)

# 使用skleran实现
from sklearn.metrics import mean_squared_error
mean_squared_error(y_test,y_predict,squared=False)

2.5、MAE

MAE(Mean Absolute Error),平均绝对值误差,为所有样本数据误差的绝对值和,然后去均值。真实误差
在这里插入图片描述

# MAE 真是误差
mae = np.sum((np.abs(y_test-y_predict))/len(y_test))

# 使用skleran实现
from sklearn.metrics import mean_absolute_error
mean_absolute_error(y_test,y_predict)

2.6、R^2

R2为决定系数,用来表示模型拟合性的分值,值越高表示模型拟合性越好,在训练集中,R2的取值范围为[0,1]。在R2的取值范围为[-∞,1]。从公式定义可知,最理想情况,所有的样本数据的预测值与真实值相同,即RSS为0,此时R2为1。
在这里插入图片描述
在这里插入图片描述

r2 = 1 - (np.sum((y_test-y_predict)**2))/(np.sum((y_test-np.mean(y_test))**2))
r2

公式二:消除样本本身取值大小的影响,实现了归一化
在这里插入图片描述

1-mse/np.var(y_test)

# skleran实现
from sklearn.metrics import r2_score
r2_score(y_test,y_predict)

2.7、模型评价方法总结

总结:MSE计算简单,RMSE和MAE保持了和样本同样的量纲,MSE和MAE适用误差相对明显的时候,大的误差就会有比较大的权重,RMSE针对误差不是很明显的时候,MAE相比MSE更能凸显异常值,在回归模型中损失函数一般使用MAE、MSE、RMSE,性能评估指标一般使用R^2。

3、多项式回归代码实现

对于非线性回归的数据,我们可以使用多项式回归拟合一条曲线。

在这里插入图片描述
在这里插入图片描述

可以明显看到使用直线拟合非线性数据,效果非常不好。

# 多项式回归
x = np.random.uniform(-4,2,size=(100))
y = 2*x**2 + 4*x+3+np.random.randn(100)
X = x.reshape(-1,1)
plt.scatter(x,y)
plt.show()

lr = LinearRegression()
lr.fit(X,y)
y_predict = lr.predict(X)
plt.scatter(x,y)
plt.plot(np.sort(x),y_predict[np.argsort(x)],color='red')
plt.show()

使用多项式回归拟合
在这里插入图片描述

X_new = np.hstack([X,X**2])
lr = LinearRegression()
lr.fit(X_new,y)
y_predict = lr.predict(X_new)
plt.scatter(x,y)
plt.plot(np.sort(x),y_predict[np.argsort(x)],color='red')
plt.show()+# 输出函数截取
lr.intercept_
# 输出函数特征值
lr.coef_

使用sklearn实现

# 使用sklearn实现
from sklearn.preprocessing import PolynomialFeatures
# 最高2次幂
polynomial = PolynomialFeatures(degree=2)
# 转换后的特征
x_poly = polynomial.fit_transform(X)
lr = LinearRegression()
lr.fit(x_poly,y)
y_predict = lr.predict(x_poly)
plt.scatter(x,y)
plt.plot(np.sort(x),y_predict[np.argsort(x)],color='red')
plt.show()

4、逻辑回归解决分类问题

在这里插入图片描述
误差距离计算方式:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

4.2、使用sklearn实现逻辑回归

# 逻辑回归
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.datasets import make_classification
x,y = make_classification(
    n_samples=200,# 样本数
    n_features=2,# 特征数
    n_redundant=0,# 冗余特指数
    n_classes=2,# 类型
    n_clusters_per_class=1,# 族设为1
    random_state=1024
)
x.shape,y.shape

x_train,x_test,y_train,y_test = train_test_split(x,y,train_size=0.7,random_state=1024,stratify=y)
plt.scatter(x_train[:,0],x_train[:,1],c=y_train)

from sklearn.linear_model import LogisticRegression
clf = LogisticRegression()
clf.fit(x_train,y_train)
clf.score(x_test,y_test)
clf.predict(x_test)

4.3、超参数使用

# 超参数
from sklearn.model_selection import GridSearchCV
params = [{
    'penalty':['l2','l1'],# 损失函数正则项
    'C':[0.0001,0.001,0.01,0.1,1,10,100,1000],
    'solver':['liblinear']# 优化算法
},{
    'penalty':['none'],
    'C':[0.0001,0.001,0.01,0.1,1,10,100,1000],
    'solver':['lbfgs']
},{
    'penalty':['elasticnet'],
    'C':[0.0001,0.001,0.01,0.1,1,10,100,1000],
    'l1_ratio':[0,0.25,0.5,0.75,1],
    'solver':['saga'],
    'max_iter':[200]
}]
grid = GridSearchCV(
    estimator=LogisticRegression(),
    param_grid=params,
    n_jobs=-1
)

grid.fit(x,y)
grid.best_score_

grid.best_estimator_.score(x_test,y_test)
grid.best_params_

4.4、多项式逻辑回归

在这里插入图片描述

# 多项式逻辑回归
np.random.seed(0)
X = np.random.normal(0,1,size=(200,2))
y = np.array((X[:,0]**2)+(X[:,1]**2)<2,dtype='int')
x_train,x_test,y_train,y_test = train_test_split(X,y,train_size=0.7,random_state=1024,stratify=y)
plt.scatter(x_train[:,0],x_train[:,1],c=y_train)

from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures(degree=2)
poly.fit(x_train)

x2 = poly.transform(x_train)
x2t = poly.transform(x_test)
clf = LogisticRegression()
clf.fit(x2,y_train)
clf.score(x2,y_train)
clf.score(x2t,y_test)

4.5、多分类问题OVR

在这里插入图片描述

在这里插入图片描述

# 多分类问题,OVO和OVR
from sklearn import datasets
iris = datasets.load_iris()
x = iris.data
y = iris.target
x_train,x_test,y_train,y_test = train_test_split(x,y,random_state=666)

plt.scatter(x_train[:,0],x_train[:,1],c=y_train)
plt.show()

from sklearn.multiclass import OneVsRestClassifier
ovr = OneVsRestClassifier(clf)
ovr.fit(x_train,y_train)
ovr.score(x_test,y_test)

4.6、多分类问题OVO

在这里插入图片描述
在这里插入图片描述

# 多分类问题,OVO和OVR
from sklearn import datasets
iris = datasets.load_iris()
x = iris.data
y = iris.target
x_train,x_test,y_train,y_test = train_test_split(x,y,random_state=666)

plt.scatter(x_train[:,0],x_train[:,1],c=y_train)
plt.show()

from sklearn.multiclass import OneVsOneClassifier
ovo = OneVsOneClassifier(clf)
ovo.fit(x_train,y_train)
ovo.score(x_test,y_test)

在这里插入图片描述

5、优缺点对比

在这里插入图片描述
KNN对比线性算法:
KNN算法:非参数模型、计算量大、数据无假设
线性算法:可解释性好、建模迅速、线性分布

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

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

相关文章

【自然语言处理八-transformer实现翻译任务-一(输入)】

自然语言处理八-transformer实现翻译任务-一&#xff08;输入&#xff09; transformer架构数据处理部分模型的输入数据(图中inputs outputs outputs_probilities对应的label)以处理英中翻译数据集为例的代码 positional encoding 位置嵌入代码 鉴于transfomer的重要性&#xf…

java——网络编程

什么是计算机网络 把分布在不同地理区域的计算机设备&#xff0c;通过通信设备和线路(网线&#xff0c;光纤&#xff0c;交换机)连接&#xff0c;最终实现数据的传输和资源的共享。 实现不同计算机之间的联系&#xff0c;必须有介质连接 最早的网络&#xff1a;美国五角大楼一…

Go语言不能常量取址!?

题如下图 在软件开发中&#xff0c;常量是一种重要的编程元素&#xff0c;它们在程序中起到固定值的作用被大量使用 Go语言中的常量取址 在 Go 语言中&#xff0c;常量是无法被取址的。这意味着我们不能使用取址操作符 & 来获取常量的地址。例如&#xff1a; const a …

WinRAR功能之【锁定压缩文件】

今天来分享一下WinRAR解压缩软件的“锁定压缩文件”功能&#xff0c;这个功能可以保护压缩包里文件的完整性&#xff0c;也就是不能随意增加、删除以及修改压缩包里的文件。我们可以用两种方式来设置&#xff0c;一起来看看吧&#xff01; 方式1&#xff1a;在压缩文件的时候&a…

Gretel引领革命:发布全球最大开源Text-to-SQL数据集,开启AI培训新篇章|TodayAI

在合成数据行业中处于领先地位的Gretel公司&#xff0c;近日宣布了一项重大突破&#xff0c;推出了世界上最大的开源Text-to-SQL数据集&#xff0c;这一举措将加速AI模型的培训过程&#xff0c;并为全球各行各业的企业解锁新的可能性。 这个数据集包含了超过100,000个精心制作…

msvcp140.dll文件丢失能有什么办法可以解决,提供几种解决办法

哦豁&#xff01;当您打开计算机或想要启动某个应用程序时&#xff0c;意外地弹出一个令人不安的错误提示&#xff1a;“msvcp140.dll文件不见啦&#xff01;”这意味着您的操作系统找不到名为“msvcp140.dll”的重要文件&#xff0c;可能导致一些应用程序无法正常运行。但是别…

集合类多线程(JUC)

一、集合框架概述 集合&#xff1a; 是广义上的集合&#xff0c;简单理解就是容器。注意&#xff1a;集合只能存放对象类型的数据。 集合框架&#xff1a; 指的是 java.util 包中定义的各种容器类、相关的工具类、接口的统称。不同的容器存储不同结 构的数据。使用时要进行导包…

智慧园区水电能源监控管理系统

随着智慧城市的快速发展&#xff0c;智慧园区作为城市智能化的重要组成部分&#xff0c;其能源监控管理系统显得尤为关键。智慧园区水电能源监控管理系统&#xff0c;是利用先进的信息技术和自动控制技术&#xff0c;对园区内的水电能源使用进行实时监控、管理和优化的综合性智…

React 开发者必备技能之Redux基础入门实例

首先,我们需要安装 Redux 及其相关依赖: npm install redux react-reduxredux 是 Redux 库的核心部分,提供了创建 Store、Reducer、Action 等功能。react-redux 是 React 和 Redux 的集成库,用于在 React 组件中使用 Redux。 安装完成后,我们开始创建 Redux 应用程序: 创建 …

HarmonyOS 应用开发-应用异常处理案例

介绍 本示例介绍了通过应用事件打点hiAppEvent获取上一次应用异常信息的方法&#xff0c;主要分为应用崩溃、应用卡死以及系统查杀三种。 效果图预览 使用说明&#xff1a; 点击构建应用崩溃事件&#xff0c;3s之后应用退出&#xff0c;然后打开应用进入应用异常页面&#x…

分享|创业老阳推荐的Temu蓝海项目到底怎么样?

在当今竞争激烈的创业市场中&#xff0c;寻找一个具有潜力的蓝海项目成为了众多创业者的梦想。近日&#xff0c;创业老阳推荐的Temu蓝海项目引起了广泛关注。那么&#xff0c;这个项目到底怎么样呢?让我们一起来探讨一下。 首先&#xff0c;Temu蓝海项目在定位上具有显著优势 …

【数组】【最长距离】使循环数组所有元素相等的最少秒数

本文涉及知识点 数组 最长距离 LeetCode2808. 使循环数组所有元素相等的最少秒数 给你一个下标从 0 开始长度为 n 的数组 nums 。 每一秒&#xff0c;你可以对数组执行以下操作&#xff1a; 对于范围在 [0, n - 1] 内的每一个下标 i &#xff0c;将 nums[i] 替换成 nums[i] …

吴恩达深度学习 (week1,2)

文章目录 1、神经网络监督学习2、深度学习兴起原因3、深度学习二元分类4、深度学习Logistic 回归5、Logistic 回归损失函数6、深度学习梯度下降法7、深度学习向量法8、Python 中的广播9、上述学习总结10、大作业实现:rocket::rocket:&#xff08;1&#xff09;训练初始数据&…

初识Python(注释、编码规范、关键字...)

&#x1f947;作者简介&#xff1a;CSDN内容合伙人、新星计划第三季Python赛道Top1 &#x1f525;本文已收录于Python系列专栏&#xff1a; 零基础学Python &#x1f4ac;订阅专栏后可私信博主进入Python学习交流群&#xff0c;进群可领取Python视频教程以及Python相关电子书合…

2024年软考考纲改版后考试难度如何?

请注意&#xff1a;2024年软考只有两个资格的考纲发生了变化&#xff0c;分别是系统集成项目管理工程师&#xff08;中项&#xff09;和信息系统监理师&#xff0c;而且变化将在2024年下半年开始执行。其它资格的考纲保持不变&#xff01; 准备参加软考或者已经在备考的考生们…

什么时候考虑使用全局状态管理?vue获取全局状态变量一共有三种方法,你真的理解吗?

同学们可以私信我加入学习群&#xff01; 正文开始 前言一、场景二、设置state中的变量三、直接访问state中的变量四、通过getters访问变量五、通过actions访问变量六、总结总结 前言 本文给大家做个参考&#xff0c;什么时候会考虑使用全局状态管理&#xff1f;以及帮助大家理…

vue+springboot实现JWT登录验证

目录 前言概念实际演示路由信息初始访问登录界面登录验证验证过期 vue实现依赖引入main.js获取和设置token工具类登录方法实体登录方法axios请求 router配置 springboot实现依赖引入JWT工具类忽视jwt验证注解拦截器逻辑跨域&调用拦截器配置登录接口&验证token接口 结语…

初识SpringMVC

一、什么是MVC MVC是一种软件架构模式&#xff08;是一种软件架构设计思想&#xff0c;不止Java开发中用到&#xff0c;其它语言也需要用到&#xff09;&#xff0c;它将应用分为三块&#xff1a; M&#xff1a;Model&#xff08;模型&#xff09;V&#xff1a;View&#xff08…

自定义类型:结构体,位端

结构体内存对齐 结构体的对齐规则&#xff1a; 1. 第一个成员在与结构体变量偏移量为0的地址处。 2. 其他成员变量要对齐到某个数字&#xff08;对齐数&#xff09;的整数倍的地址处。 对齐数 编译器默认的一个对齐数 与 该成员大小的较小值。 VS中默认的值为8 Linux中没有默…

【Shell】各种条件语句的使用——test语句、if语句、case语句

Shell条件语句的使用 条件语句 Shell条件语句的使用条件测试的语法字符串测试表达式整数二元比较操作符逻辑操作符 if的条件语句的语法if的嵌套case语句语法 条件测试的语法 语法1&#xff1a;test <测试表达式> 利用test命令进行条件测试表达式的方法。test命令与<测…