机器学习-线性回归-sklearn

2023-10-26

线性模型

Scikit-Learn中的线性回归

from sklearn.linear_model import LinearRegression
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
#创建数据集
X=2*np.random.rand(10,1)#100行1列的随机初始化向量
y=4+3*X+np.random.randn(10,1)
#创建模型实例
lin_reg=LinearRegression()
lin_reg.fit(X,y)
plt.plot(X,y,"b.")
#使用模型
x_new=[[0],[2]]
y_predict=lin_reg.predict(X_new)
plt.plot(x_new,y_predict,"r-")
plt.axis([0,2,0,15])
plt.show()

[[4.43739203] [8.71719537]]
在这里插入图片描述

LinearRegression类基于scipy.linalg.lstsq()函数(最小二乘法)

import numpy as np
#创建数据集
X=2*np.random.rand(10,1)#100行1列的随机初始化向量
y=4+3*X+np.random.randn(10,1)
data= np.linalg.lstsq(X, y, rcond=1e-6)
print(data)
#theta_best_svd, residuals, rank, s

(array([[6.25848821]]), array([52.04262759]), 1, array([2.92786811]))

计算伪逆(Moore-Penrose逆)

X=2*np.random.rand(10,1)
print(np.linalg.pinv(X))

[[0.04394662 0.12665656 0.08815469 0.04822709 0.04879359 0.01847769 0.1103439 0.06393026 0.10650913 0.08576313]]

梯度下降

NumPy中使用梯度下降

import numpy as np
#data
X=np.random.randn(100,1)
X_b = np.c_[np.ones((100, 1)), X]  # add x0 = 1 to each instance
print(X_b[0])
y=4+3*X+np.random.randn(100,1)
eta=0.1 #learning rate
n_iterations=1000
m=100
theta=np.random.randn(2,1) #random initialization
for iteration in range(n_iterations):
    gradients=2/m*X_b.T.dot(X_b.dot(theta)-y)
    theta=theta-eta*gradients
print(theta)

[1. 0.68156223] [[4.02101178] [2.871612 ]]

随机梯度下降(SGD) Stochastic gradient descent

随机梯度下降的主要问题是它要用整个训练集来计算每一步的梯度,当训练集很大时
算法会很慢。与之相反的极端是随机梯度下降,每一步在训练集中随机选择一个实例,
并且仅基于该单个实例来计算梯度。
随机性的好处在于可以逃离局部最优,但缺点是永远定位不出最小值。要解决这个困境
有一个好办法就是逐步降低学习率,开始的步长比较大,然后越来越小,让算法尽量靠
近全局最小值。这个过程叫做模拟退火

import numpy as np 
import matplotlib.pyplot as plt
np.random.seed(42)

theta_path_sgd = []#记录中间迭代的过程
#data
X=np.random.randn(100,1)
X_b = np.c_[np.ones((100, 1)), X]  # add x0 = 1 to each instance
y=4+3*X+np.random.randn(100,1)
n_epochs=50
m=len(X_b)
t0,t1=5,50 # learning schedule hyperparameters(学习进度超参数)
def learning_schedule(t):
    return t0/(t+t1)
theta=np.random.randn(2,1) #random initialization
for epoch in range(n_epochs):
    for i in range(m):#每次进行m个回合的迭代,每个回和称为一个轮次
        random_index=np.random.randint(m)
        xi=X_b[random_index:random_index+1]
        yi=y[random_index:random_index+1]
        gradients=2*xi.T.dot(xi.dot(theta)-yi)
        eta=learning_schedule(epoch*m+i)
        theta=theta-eta*gradients
        theta_path_sgd.append(theta)
print(f"theta={theta}")
plt.xlabel("$x_1$", fontsize=18)                     # not shown
plt.ylabel("y", rotation=0, fontsize=18)           # not shown
plt.axis([0, 2, 0, 15])

#画出迭代过程
for i in range(len(theta_path_sgd)):
    x_draw=[[0],[2]]
    y_draw=[[theta_path_sgd[i][0][0]],[2*theta_path_sgd[i][1][0]+theta_path_sgd[i][0][0]]]
    plt.plot(x_draw,y_draw,"r-")
    if(i>50):#只画出前50次
        break
plt.plot(X,y,"b.")
plt.show()

theta=[[4.11199749] [2.82708341]]
在这里插入图片描述

Scikit-Learn的随机梯度下降

Scikit-Leearn的随机梯度下降执行线性回归,可以使用SGDRegressor类
,该类默认优化平方误差成本函数
代码最多可运行1000个轮次,或者直到一个轮次期间
损失下降小于0.001为止(max_iter=1000,tol=1e-3)。它使用默认的学习调度(与前一个
学习调度不同)以0.1(eta0=0.1)的学习率开始。最后,它不使用任何正则化
(penalty=None,稍后将对此进行详细介绍):

from sklearn.linear_model import SGDRegressor
import numpy as np 
import matplotlib.pyplot as plt
X=np.random.randn(100,1)
y=4+3*X+np.random.randn(100,1)
sgd_reg=SGDRegressor(max_iter=1000,tol=1e-3,penalty=None,eta0=0.1)
sgd_reg.fit(X,y.ravel())#.ravel()将多维数组转为一维
print(sgd_reg.intercept_)#intercept(截距)
print(sgd_reg.coef_) #系数(斜率)
plt.plot(X,y,"b.")
x_draw=[[0],[2]]
y_draw=[[sgd_reg.intercept_[0]],[2*sgd_reg.coef_[0]+sgd_reg.intercept_[0]]]
plt.plot(x_draw,y_draw,"r-")
#plt.axis([0, 2, 0, 15])#坐标系显示范围
plt.show()

[4.18111695] [3.17350694]

在这里插入图片描述

小批量梯度下降

普通的梯度下降是使用全部训练集求梯度,随机梯度下降是随机选一个实例,
小批量梯度下降是在随机梯度下降的基础上每次随机选一小部分实例求梯度

多项式回归

使用线性模型来拟合非线性数据,在非线性方程特征集上训练一个线性模型,这种技术称为多项式回归。

import numpy as np 
import matplotlib.pyplot as plt
np.random.seed(42)
#data
m=100
X=6*np.random.rand(m,1)-3
y=0.7*X**2+X+3.6+np.random.randn(m,1)
plt.plot(X,y,"b.")#画出生成的非线性和噪声数据集
plt.show()

在这里插入图片描述
当存在多个特征时,多项式回归能够找到特征之间的关系(这是普通线性回归模型无法做到的)。PolynomialFeatures还可以将特征的所有组合添加到给定的多项式阶数。例如,如果有两个特征a和b,则degree=3的PolynomialFeatures不仅会添加特征a2、a3、b2和b3,还会添加组合ab、a2b和ab2
PolynomialFeatures(degree=d)可以将一个包含n个特征的数组转换为包含 阶乘(n+d)/(阶乘d * 阶乘 n) 个特征的数组

from sklearn.preprocessing import PolynomialFeatures# Polynomial Features(多项式特征)
from sklearn.linear_model import LinearRegression #线性回归
poly_features=PolynomialFeatures(degree=2,include_bias=False)
X_poly=poly_features.fit_transform(X)#多项式特征
#使用线性模型
lin_reg=LinearRegression()
lin_reg.fit(X_poly,y)
print(lin_reg.intercept_,lin_reg.coef_)
#[2.14407795] [[0.8758063  0.48173944]] y=0.48*x**2+0.87*x+2.14

#画出拟合的曲线
x_draw=[]
y_draw=[]
x=-100
while x<=100:
    x_draw.append(x)
    y_=lin_reg.coef_[0][1]*x**2+lin_reg.coef_[0][0]*x+lin_reg.intercept_[0]
    y_draw.append(y_)
    x=x+0.1
plt.plot(x_draw,y_draw)
plt.show()

[3.38134581] [[0.93366893 0.76456263]]
在这里插入图片描述

学习曲线

如果模型在训练数据上表现良好,但根据交叉验证的指标泛化较差,则你的模型过拟合。如果两者的表现均不理想,则说明欠拟合

  • 均方误差 mean squared error
  • 训练测试分 train_test_split
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
import numpy as np 
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression #线性回归

X=np.random.randn(100,1)
y=4+3*X+np.random.randn(100,1)
#learning_curves 学习曲线
def plot_learning_curves(model,X,y):
    X_train,X_val,y_train,y_val=train_test_split(X,y,test_size=0.2)
    train_errors,val_errors=[],[]
    #使用交叉验证
    for m in range(1,len(X_train)):#从使用两个数据开始拟合
        model.fit(X_train[:m],y_train[:m])#使用前m个训练集
        y_train_predict=model.predict(X_train[:m])#得出前m个训练集y的预测值
        y_val_predict=model.predict(X_val)#获得验证集预测值
        train_errors.append(mean_squared_error(y_train[:m],y_train_predict))
        #使用mean_squared_error获得训练集预测值均方误差
        val_errors.append(mean_squared_error(y_val,y_val_predict))
        #使用mean_squared_error获得验证集预测值均方误差
    plt.plot(np.sqrt(train_errors), "r-+", linewidth=2, label="train")
    plt.plot(np.sqrt(val_errors), "b-", linewidth=3, label="val")
    plt.legend(loc="upper right", fontsize=14)   # 曲线标注
    plt.xlabel("Training set size", fontsize=14) # x轴标签
    plt.ylabel("RMSE", fontsize=14)              # y轴标签
    plt.axis([0, 80, 0, 3])
    plt.show()
#线性回归模型实例
lin_reg=LinearRegression()
#调用学习曲线函数
plot_learning_curves(lin_reg,X,y)

在这里插入图片描述
在相同数据上的10阶多项式模型的学习曲线

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures# Polynomial Features(多项式特征)
#定义流水线
polynomial_regression=Pipeline([
    ("poly_features",PolynomialFeatures(degree=10,include_bias=False)),#多项式特征
    ("lin_reg",LinearRegression())#线性模型
])
plot_learning_curves(polynomial_regression,X,y)

在这里插入图片描述

曲线之间存在间隙。这意味着该模型在训练数据上的性能要比在验证数据上的性能
好得多,这是过拟合模型的标志。但是,如果你使用更大的训练集,则两条曲线会继续接

正则化线性模型

岭回归 Ridge 闭解式求解


from sklearn.linear_model import Ridge
#创建岭回归实例
ridge_reg=Ridge(alpha=1, solver="cholesky", random_state=42)
ridge_reg.fit(X,y)
print(ridge_reg.predict([[1.5]]))

[[8.44384141]]

岭回归 Ridge 随机梯度下降

from sklearn.linear_model import SGDRegressor
sgd_reg = SGDRegressor(penalty="l2", max_iter=1000, tol=1e-3, random_state=42)
sgd_reg.fit(X, y.ravel())
sgd_reg.predict([[1.5]])

array([8.46340189])

超参数penalty设置的是使用正则项的类型。设为"l2"表示希望SGD在成本函数中添加 一个正则项,等于权重向量的 2范数的平方的一半,即岭回归。

Lasso回归

from sklearn.linear_model import Lasso
lasso_reg = Lasso(alpha=0.1)
lasso_reg.fit(X, y)
lasso_reg.predict([[1.5]])

array([8.35575446])

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

机器学习-线性回归-sklearn 的相关文章

  • 如何在刻度标签和轴之间添加空间

    我已成功增加刻度标签的字体 但现在它们距离轴太近了 我想在刻度标签和轴之间添加一点呼吸空间 如果您不想全局更改间距 通过编辑 rcParams 并且想要更简洁的方法 请尝试以下操作 ax tick params axis both whic
  • Python、Tkinter、更改标签颜色

    有没有一种简单的方法来更改按钮中文本的颜色 I use button text input text here 更改按下后按钮文本的内容 是否存在类似的颜色变化 button color red Use the foreground设置按钮
  • DreamPie 不适用于 Python 3.2

    我最喜欢的 Python shell 是DreamPie http dreampie sourceforge net 我想将它与 Python 3 2 一起使用 我使用了 添加解释器 DreamPie 应用程序并添加了 Python 3 2
  • 导入错误:没有名为 _ssl 的模块

    带 Python 2 7 的 Ubuntu Maverick 我不知道如何解决以下导入错误 gt gt gt import ssl Traceback most recent call last File
  • 如何在Windows上模拟socket.socketpair

    标准Python函数套接字 套接字对 https docs python org 3 library socket html socket socketpair不幸的是 它在 Windows 上不可用 从 Python 3 4 1 开始 我
  • __del__ 真的是析构函数吗?

    我主要用 C 做事情 其中 析构函数方法实际上是为了销毁所获取的资源 最近我开始使用python 这真的很有趣而且很棒 我开始了解到它有像java一样的GC 因此 没有过分强调对象所有权 构造和销毁 据我所知 init 方法对我来说在 py
  • 如何使用装饰器禁用某些功能的中间件?

    我想模仿的行为csrf exempt see here https docs djangoproject com en 1 11 ref csrf django views decorators csrf csrf exempt and h
  • python pandas 中的双端队列

    我正在使用Python的deque 实现一个简单的循环缓冲区 from collections import deque import numpy as np test sequence np array range 100 2 resha
  • Abaqus 将曲面转化为集合

    我一直试图在模型中找到两个表面的中心 参见照片 但未能成功 它们是元素表面 面 查询中没有选项可以查找元素表面的中心 只能查找元素集的中心 找到节点集的中心也很好 但是我的节点集没有出现在工具 gt 查询 gt 质量属性选项中 而且我找不到
  • Python:字符串不会转换为浮点数[重复]

    这个问题在这里已经有答案了 我几个小时前写了这个程序 while True print What would you like me to double line raw input gt if line done break else f
  • Geopandas 设置几何图形:MultiPolygon“等于 len 键和值”的 ValueError

    我有 2 个带有几何列的地理数据框 我将一些几何图形从 1 个复制到另一个 这对于多边形效果很好 但对于任何 有效 多多边形都会返回 ValueError 请指教如何解决这个问题 我不知道是否 如何 为什么应该更改 MultiPolygon
  • 如何将 numpy.matrix 提高到非整数幂?

    The 运算符为numpy matrix不支持非整数幂 gt gt gt m matrix 1 0 0 5 0 5 gt gt gt m 2 5 TypeError exponent must be an integer 我想要的是 oct
  • Python - 按月对日期进行分组

    这是一个简单的问题 起初我认为很简单而忽略了它 一个小时过去了 我不太确定 所以 我有一个Python列表datetime对象 我想用图表来表示它们 x 值是年份和月份 y 值是此列表中本月发生的日期对象的数量 也许一个例子可以更好地证明这
  • 如何在 Django 中使用并发进程记录到单个文件而不使用独占锁

    给定一个在多个服务器上同时执行的 Django 应用程序 该应用程序如何记录到单个共享日志文件 在网络共享中 而不保持该文件以独占模式永久打开 当您想要利用日志流时 这种情况适用于 Windows Azure 网站上托管的 Django 应
  • 检查所有值是否作为字典中的键存在

    我有一个值列表和一本字典 我想确保列表中的每个值都作为字典中的键存在 目前我正在使用两组来确定字典中是否存在任何值 unmapped set foo set bar keys 有没有更Pythonic的方法来测试这个 感觉有点像黑客 您的方
  • 在 Pandas DataFrame Python 中添加新列[重复]

    这个问题在这里已经有答案了 例如 我在 Pandas 中有数据框 Col1 Col2 A 1 B 2 C 3 现在 如果我想再添加一个名为 Col3 的列 并且该值基于 Col2 式中 如果Col2 gt 1 则Col3为0 否则为1 所以
  • glpk.LPX 向后兼容性?

    较新版本的glpk没有LPXapi 旧包需要它 我如何使用旧包 例如COBRA http opencobra sourceforge net openCOBRA Welcome html 与较新版本的glpk 注意COBRA适用于 MATL
  • 循环标记时出现“ValueError:无法识别的标记样式 -d”

    我正在尝试编码pyplot允许不同标记样式的绘图 这些图是循环生成的 标记是从列表中选取的 为了演示目的 我还提供了一个颜色列表 版本是Python 2 7 9 IPython 3 0 0 matplotlib 1 4 3 这是一个简单的代
  • 在 Python 类中动态定义实例字段

    我是 Python 新手 主要从事 Java 编程 我目前正在思考Python中的类是如何实例化的 我明白那个 init 就像Java中的构造函数 然而 有时 python 类没有 init 方法 在这种情况下我假设有一个默认构造函数 就像
  • Python 分析:“‘select.poll’对象的‘poll’方法”是什么?

    我已经使用 python 分析了我的 python 代码cProfile模块并得到以下结果 ncalls tottime percall cumtime percall filename lineno function 13937860 9

随机推荐

  • 使用拼写检查提高Tesseract OCR准确性

    使用拼写检查提高Tesseract OCR准确性 上一篇博客介绍了如何使用textblob库和Tesseract自动进行OCR文本 然后将其翻译为其他语言 这篇博客还将通过textblob应用自动拼写检查OCR文本来提高OCR准确性 能够使
  • jar包扫描工具: gamma

    1 简介 本项目是一个jar包扫描工具 可以支持插件化订制不同的扫描逻辑 支持以下功能 插件化订制扫描逻辑 让扩展更加容易 将扫描到的文件加载到jvm中以class的形式返回给处理插件 让扫描逻辑写起来更加的容易 支持springBoot
  • 位运算(按位与 、按位或、按位异或、取反、左移右移)

    位运算 与 0 0 0 0 1 0 1 0 0 1 1 1 或 0 0 0 0 1 1 1 0 1 1 1 1 异或 0 0 0 0 1 1 1 0 1 1 1 0 1 按位与运算 双目运算符 其功能是参与运算的两数对应的二进位相与 只有对
  • UE4 像素流的一些使用技巧

    一 测试像素流的三种方法 前提是熟悉官网像素流送那套流程 这里只是讲如何不用打包就能测试的方法 1 第一种方法是vs安装unrealvs扩展 因为安装这个拓展后加可以加命令行参数启动项目https docs unrealengine com
  • 2W薪资必备技能 —— Python接口自动化测试

    目录 一 基础准备 1 环境搭建 2 接口基础知识 2 1 接口分类 2 2 接口请求类型 二 Requests 快速上手 1 requests基础 1 1 发送请求 1 2 参数传递 1 3 接口响应 1 4 接口其他处理 2 reque
  • 理解GC日志

    33 125 GC DefNew 8003K gt 570K 9216K 0 0085326 secs 8003K gt 6714K 19456K 0 0087219 secs Times user 0 00 sys 0 00 real 0
  • 文件洞的处理

    存储引擎经常要面对的一个问题 就是洞的处理 一些思路 1 如果可以 重用现有空间 而不是增加文件大小 比如在hash store中 新value比旧value的长度小 2 使用Segment File 而不是一个抽象的大文件 3 现有seg
  • 【OpenCV-Python】32.OpenCV的人脸检测和识别——人脸检测

    32 OpenCV的人脸检测和识别 人脸检测 文章目录 前言 一 基于Haar的人脸检测 1 使用Haar级联分类器检测人脸 2 使用Haar级联分类器检测猫脸 3 使用Haar级联分类器检测人脸的框架式程序 4 使用Haar级联分类器检测
  • Mybatis之 ${}和#{}区别及动态传入表名

    和 区别 能防止sql注入 不能 方 式 一 般 用 于 传 入 数
  • 系统架构设计师之用例之间的关系:包含、扩展、泛化

    系统架构设计师之用例之间的关系 包含 扩展 泛化
  • Spring session 浏览器sessionId与服务器不一致解决方案

    项目情况 spring boot 和spring session 版本都是 2 0 2 RELEASE 问题描述 请求项目接口后浏览器保存的sessionId与服务器不一致 拿Postman测试如下图 网上找了很久都没发现有人发过这个问题
  • iOS编程基础-Swift(三)-变量与简单类型

    Swift入门指南 iOS9 Programming Fundamentals With swift 第三章 变量与简单类型 深入介绍变量的声明和初始化 介绍所有主要的Swift內建简单类型 这里的简单是相对 集合 说的 第四章会介绍主要的
  • 你所担心的公共Wi-Fi安全问题,痛客们正在想办法

    你是否看过这样的新闻 在公共场所连接免费Wi Fi 然后手机里的个人信息 和银行账号中的钱 瞬间就被 取走 了 而这也造成了如今很多人虽然走到哪儿都会问Wi Fi密码 但一听是公共Wi Fi就摇头的结果 贵州高科控股集团有限公司的主管易延飞
  • ssh用户密码正确但是登录时却报被拒绝

    问题 有时候 在使用SSH登录到服务器时 明明密码正确 但是登录时候却报被拒绝 这是什么原因呢 解决思路 1 此时我们可以查看Linux服务器的安全日志文件 var log secure 若无异常可以看到如下类似报错异常 Oct 6 21
  • 微信小程序开发

    微信小程序开发2023 7 14 7 19 黑马程序员官方文档 https pan baidu com s 1crZTQdIZ7OSDkZIpIWkhYw pwd 1234 vant Weapp 类似element ui的组件库 https
  • 《Graph Learning专栏》 : 高密子图挖掘

    本周我们介绍另一图上的 聚类 算法 高密子图挖掘 Dense Subgraph Mining 这类算法与社群检测不同的是处理的数据对象是异构图 节点的类型不是单一的 同类型节点之间一般没有边 社群检测需要对整张图的节点进行社区划分 而高密子
  • 医学图像——《Difficulty-aware Meta-learning for Rare Disease Diagnosis》

    Lequan Yu Difficulty aware Meta learning for Rare Disease Diagnosis 摘要 这篇文章提出元学习方法解决罕见疾病分类问题 使用 ISIC 2018 skin lesion 分类
  • unity--城市道路车辆行驶

    目录 1 示意图 1 1行驶路线与红绿灯 2 层级面板 2 1红绿灯 2 2车辆路径点 3 属性面板 3 1红绿灯 3 2路径点 4 脚本代码 4 1 控制脚本 4 2红绿灯脚本 4 3路径点脚本 4 4车辆控制脚本 5 实现效果 1 示意
  • Mysql 学习笔记(快速复习)

    Mysql 学习笔记 快速复习 一 MySQL 基础 1 数据库连接工具 1 1 Navicat 使用教程 2 DDL 操作数据库 2 1 创建新数据库 2 2 删除数据库 2 3 使用数据库 3 CLUD 操作数据表 3 1 查询表 3
  • 机器学习-线性回归-sklearn

    线性模型 Scikit Learn中的线性回归 from sklearn linear model import LinearRegression import numpy as np import matplotlib as mpl im