线性模型算法-完结总结篇

简介

该篇文章就是在CSDN上更新的最终版本。

本文章将介绍:机器学习中的线性模型有关内容,我将尽可能做到 详细地介绍线性模型的所有相关内容,模块如下,希望这些将有助于读者了解这种最初步但却强大的算法:

  • 线性回归
  • 逻辑回归 Sigmoid函数
  • Lasso回归
  • Ridge回归

同时,考虑到学习线性回归算法的学者,大部分是入门者,所以也会详细python中使用到的库、以及在文章案例中所用到的常用方法。

在这里插入图片描述


前置

什么是回归

回归 就是 整合+预测

  • 回归处理的问题可以预测:

    • 预测房价

    • 销售额的预测

    • 设定贷款额度

就是可以根据事物的相关特征预测出对应的结果值

概念对比

回归算法是相对分类算法而言的,两者最终都可以得到一个想要的预测结果,但二者区别与我们想要预测的 目标变量y 的值类型有关。

1.如果目标变量y是离散型变量,如预测用户的性别(男、女),预测月季花的颜色(红、白、黄……),预测是否患有肺癌(是、否),那我们就需要用分类算法去拟合训练数据并做出预测;

2.如果y是连续型变量,如预测用户的收入(4千,2万,10万……),预测员工的通勤距离(500m,1km,2万里……),预测患肺癌的概率(1%,50%,99%……),我们则需要用回归模型。


线性回归

定义

线性回归(Linear Regression)就是一种用于建立和分析关于两个或多个变量之间线性关系的统计方法和机器学习算法。它被广泛应用于预测和建模任务,尤其是用于预测数值型输出(连续型变量)。

这个算法简单但非常强大,线性回归作为是机器学习和统计学中最简单但也是最有用的工具之一,它为许多预测问题提供了一个坚实的基础。在实际应用中,线性回归通常有多种变体,如多元线性回归、岭回归、Lasso回归等,以适应不同问题的需求。


一元线性回归

线性回归可以说是用法非常简单、,作为机器学习的入门算法非常合适。我们上中学的时候,都学过二元一次方程,我们将 y 作为因变量,x 作为自变量,得到方程:

在这里插入图片描述

当给定参数β0和β1的时候,画在坐标图内是一条直线(“线性”)。

当我们只用一个 x 来预测y,就叫一元线性回归,也就是在找一个直线来拟合数据。

比如,我有一组数据画出来的散点图,横坐标代表广告投入金额,纵坐标代表销售量,线性回归就是要找一条直线,并且让这条直线尽可能地拟合图中的数据点。

在这里插入图片描述

这里我们得到的拟合方程是y = 0.0512x + 7.1884,此时当我们获得一个新的广告投入金额后,我们就可以用这个方程预测出大概的销售量。


多元线性回归方程

简而言之,线性回归的基本思想是寻找自变量(输入特征)与因变量(输出目标)之间的线性关系,即一个线性方程,用来描述这些变量之间的关系。一般来说,我们涉及到的特征 X 也不止一个,线性回归模型的方程如下:

在这里插入图片描述

预测的本质就是在模型训练中,不断改进预测,找到最佳系数组[b],这样我们就可以说线性回归的效果达到目的

条件

线性回归适用于以下情况:

  • 希望理解和建模两个或多个变量之间的线性关系

  • 需要进行数值型输出的预测。

  • 需要估计特征对目标变量的影响,即你可以得到所以特征对应的权重。

  • 需要进行简单的模型解释和解释能力较强的建模。

预判断

判断线性关系的方法

散点图(Scatter Plot):

  • 绘制两个变量的散点图。
  • 如果数据点大致围绕一条直线排列,则表明它们之间存在线性关系。

相关系数(Correlation Coefficient):

  • 计算皮尔逊相关系数 r 。

  • 如果 |r| 接近 1,表示强烈的线性关系。r 接近 0 则表明关系非线性。

    # 计算相关系数
    correlation_coef, _ = np.corrcoef(x, y)[0, 1]
    print(f"Correlation coefficient: {correlation_coef}")
    

注意 :做线性回归,不要忘了前提假设是y和x呈线性关系,如果两者不是线性关系,就要选用其他的模型啦。


相关python库与模块介绍

Sklearn

Sklearn (全称 Scikit-Learn) 是基于 Python 语言的机器学习工具。它建立在 NumPy, SciPy, Pandas 和 Matplotlib 之上,里面的 API 的设计非常好,所有对象的接口简单,很适合新手上路。在 Sklearn 里面有六大任务模块:分别是分类、回归、聚类、降维、模型选择和预处理

在这里插入图片描述

要使用上述六大模块的方法,可以用以下的伪代码,注意 import 后面我用的都是一些通用名称,如 SomeClassifier, SomeRegressor, SomeModel,具体化的名称由具体问题而定,比如

  • SomeClassifier = RandomForestClassifier
  • SomeRegressor = LinearRegression
  • SomeModel = KMeans, PCA
  • SomeModel = GridSearchCV, OneHotEncoder

上面具体化的例子分别是随机森林分类器线性回归器K 均值聚类主成分分析网格追踪法独热编码

分类 (Classification)

from sklearn import SomeClassifier	
from sklearn.linear_model import SomeClassifier	
from sklearn.ensemble import SomeClassifier

回归 (Regression)

from sklearn import SomeRegressor	
from sklearn.linear_model import SomeRegressor	
from sklearn.ensemble import SomeRegressor

聚类 (Clustering)

from sklearn.cluster import SomeModel

降维 (Dimensionality Reduction)

from sklearn.decomposition import SomeModel

模型选择 (Model Selection)

from sklearn.model_selection import SomeModel

预处理 (Preprocessing)

from sklearn.preprocessing import SomeModel

Numpy

NumPy( Numerical Python) 是 Python语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。

Pandas

Pandas 是一个开源的 Python 数据分析库,提供高性能、易用的数据结构和数据分析工具。它是基于 NumPy 库构建的,使得处理大型数据集变得快速而简单。

Pandas 最主要的两个数据结构是:

  1. Series: 一维带标签数组,可以存储任何数据类型(整数、字符串、浮点数、Python 对象等)。其轴标签统称为索引。

  2. DataFrame: 二维带标签数据结构,可以看作是不同类型数据的表格或者 Series 的容器。DataFrame 是用于数据操纵与分析的最常用工具。

使用 Pandas,你可以快速进行以下操作:

  • 数据清洗和准备
  • 数据聚合和关联
  • 数据过滤、选择及转换
  • 数据的导入和导出
  • 时间序列分析

Pandas 强大之处在于它提供了许多内置方法来进行数据操作,使得数据分析任务更加简便。

例如,读取 CSV 文件到 DataFrame 只需要一行代码:

import pandas as pd

df = pd.read_csv('data.csv')

然后可以对这个 DataFrame 进行各种操作,比如:

  • 计算描述性统计信息
df.describe()
  • 筛选某些数据
filtered_df = df[df['column_name'] > some_value]
  • 将处理后的数据存储到新的文件中:
df.to_csv('processed_data.csv', index=False)

Pandas 的灵活性和易用性使其成为 Python 数据分析工具中最受欢迎的库之一。

Matplotlib

Matplotlib 是Python中类似MATLAB的绘图工具,熟悉 MATLAB 也可以很快的上手 Matplotlib。

pyplot

pyplot 是 matplotlib库中的一个模块,它提供了一个类似于 MATLAB 的绘图系统pyplot 用于创建和操作图形及其元素,例如线条、标记、文本和图例等。用户可以使用它来生成简单或复杂的图表,比如条形图、直方图、散点图、线图等。

以下是一些基础的 pyplot 功能:

  • plot(): 绘制线性图
  • scatter(): 绘制散点图
  • bar(): 绘制条形图
  • hist(): 绘制直方图
  • imshow(): 显示图像数据
  • figure(): 创建新的图形窗口
  • xlabel(), ylabel(): 设置轴标签
  • title(): 设置图形标题
  • legend(): 添加图例
  • show(): 显示图形

为了使用 pyplot,首先需要导入模块:

import matplotlib.pyplot as plt

线性回归运用

单特征:价格预测

假设有例子,x和y分别表示某面积和总价,需要根据面积来预测总价。

第一步:导入模块

import numpy as np
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt

第二步:导入数据并绘制散点图

# 创建数据
x = np.array([6, 16, 26, 36, 46, 56]).reshape((-1, 1))
#reshape(x,y)是对array数组的切割即分为x行y列,可以接收特殊的参数 -1,表示该维度的大小将自动计算以符合数组的总大小。
y = np.array([4, 23, 10, 12, 22, 35])

plt.scatter(x, y) 
# 绘制散点图
plt.show()
#展示图像

第三步:创建模型并拟合

model = LinearRegression().fit(x, y) 
LinearRegression()
  • LinearRegression()是来创建一个新的线性回归模型实例。
fit()
  • fit()这部分是在调用 fit 方法对数据进行拟合。其中,x 通常表示特征数据(自变量),y 表示目标数据(因变量)。在机器学习中,x 通常是一个二维数组(或者是类似的结构),每一行代表一个数据点,每一列代表一个特征;y 通常是一个一维数组,代表每个数据点对应的输出结果。

所以,改代码等效于:
1.创建线性回归模型实例
model = LinearRegression()
2.训练模型
model.fit(x, y)

第四步:评估模型

r_sq = model.score(x, y)
print('决定系数:', r_sq)
score()

score函数通常是一个模型对象的方法,用于评估模型的性能。在 scikit-learn 库中,大多数模型类都有一个 score 方法。

这个方法的工作原理如下:

  • 对于分类模型,score 方法通常返回准确率(accuracy),即正确预测的样本比例。
  • 对于回归模型,则常常返回 R² 分数(所以变量命名为r_sq),也称为决定系数,是一个衡量模型拟合优度的指标。

第五步:获取线性回归模型中的参数

# 打印截距:
print('截距:', model.intercept_)

# 打印斜率
print('斜率:', model.coef_) 

# 预测一个响应并打印它:
y_pred = model.predict(x)
print('预测结果:', y_pred, sep='\n')

predict()
  • predict(): 是多数 scikit-learn 模型中的一个方法,用于生成模型的输出预测。当你传入一组输入特征 x 时,predict() 方法会应用学习到的模型参数对这些数据进行预测。
  • x: 是待预测的数据集,其结构应该与模型训练时使用的特征数据相同。例如,如果模型是用一个包含5个特征的数据集训练的,那么 x 也应该有相同数目的特征。

输入示范

在这里插入图片描述

在这里插入图片描述

多特征:房价预测

y=c+m1x1+m2x2+…+mn*xn

  • y是预测值,是因变量
  • c是截距
  • x1是第一个特征
  • x2是第二个特征
  • xn是第n个特征

第一步:导入库

import numpy as np
import pandas as pd
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression           #导入线性回归模块
from sklearn.metrics import mean_squared_error, r2_score
boston = datasets.load_boston()
'''
这行代码载入了scikit-learn库中的波士顿房价数据集。load_boston()函数返回一个类似于字典的对象,其中包含波士顿房屋价格的数据以及与之相关的各种信息。
具体来说,加载的数据集包括以下部分:

- `data`: 包含了对于504个波士顿房产的13个特征变量的数据。
- `target`: 房产的中值价格,这是一个连续的目标变量。
- `feature_names`: 特征名称的数组。
- `DESCR`: 数据集的详细描述。
- `filename`: 文件的物理位置(如果数据是从文件中加载的)。
'''
datasets
  • scikit-learn(机器学习库)中 datasets 模块,这个模块包含了很多可以直接用于实践机器学习算法的真实世界数据集。
train_test_split()
  • scikit-learn 中的 model_selection模块的train_test_split函数。这个函数用于将数据集分割成两部分:训练集和测试集。

    X_train, X_test, y_train, y_test = train_test_split(train_data, train_target, test_size, random_state, shuffle)

    变量描述
    X_train划分的训练集数据
    X_test划分的测试集数据
    y_train划分的训练集标签
    y_test划分的测试集标签

    参数描述
    train_data还未划分的数据集
    train_target还未划分的标签
    test_size分割比例,默认为0.25,即测试集占完整数据集的比例
    random_state随机数种子,应用于分割前对数据的洗牌。可以是int,RandomState实例或None,默认值=None。设成定值意味着,对于同一个数据集,只有第一次运行是随机的,随后多次分割只要rondom_state相同,则划分结果也相同。
    shuffle是否在分割前对完整数据进行洗牌(打乱),默认为True,打乱

metrics

  • metrics模块导入两个评估指标:mean_squared_error和 r2_score。mean_squared_error用于计算回归模型的均方误差(MSE),r2_score用于确定拟合优度,即模型对数据的解释程度。
.csv
  • CSV(Comma-Separated Values,逗号分隔的值)是一种简单、实用的文件格式,用于存储和表示包括文本、数值等各种类型的数据。CSV 文件通常以 .csv 作为文件扩展名。这种文件格式的一个显著特点是:文件内的数据以逗号 , 分隔,呈现一个表格形式。CSV 文件已广泛应用于存储、传输和编辑数据。

第二步:调整数据

boston_df = pd.DataFrame(boston.data, columns=boston.feature_names)
'''
columns=boston.feature_names: 这里将列名称设置为数据集中特征的名称(比如 'CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 等等)。
'''

boston_df.head()
'''
boston_df.head()这行代码将会显示boston_df这个DataFrame的前五行。这是Pandas库中的一个方法,经常用来快速查看数据集的前几行以及确认数据的导入是否正确。

如果执行了上述代码,你会得到类似如下的输出:
      CRIM    ZN  INDUS  CHAS    NOX     RM   AGE     DIS  RAD    TAX  PTRATIO  B  LSTAT
0  0.00632  18.0   2.31     0  0.538  6.575  65.2  4.0900    1  296.0     15.3 396.90   4.98
1  0.02731   0.0   7.07     0  0.469  6.421  78.9  4.9671    2  242.0     17.8 396.90   9.14
2  0.02729   0.0   7.07     0  0.469  7.185  61.1  4.9671    2  242.0     17.8 392.83   4.03
3  0.03237   0.0   2.18     0  0.458  6.998  45.8  6.0622    3  222.0     18.7 394.63   2.94
4  0.06905   0.0   2.18     0  0.458  7.147  54.2  6.0622    3  222.0     18.7 396.90   5.33

这个输出显示了 DataFrame的每一列及其相应的前五行数据。这些列代表了波士顿房价数据集中的特征,例如犯罪率(CRIM)、住宅用地超过25000平方英尺的比例(ZN)、商业用地的比例(INDUS)等。
'''
boston_df.info()
'''
boston_df.info() 是 Pandas 中用于获取关于数据集信息的方法。执行这行代码将会显示有关 boston_df 这个数据框的一些基本信息,包括每列的非空值数量、数据类型和内存使用情况等。

通常,info() 方法的输出结果如下所示:
列名(特征名称)
非空值数量
每列的数据类型
内存占用情况
这对于快速了解数据集中是否存在缺失值以及每列的数据类型非常有用。
'''
boston_df['PRICE'] = boston.target
DataFrame()
  • 调用 Pandas 中的 DataFrame 构造函数来创建一个新的 DataFrame。

第三步:划分特征和目标变量

X = boston_df.drop('PRICE', axis=1)
y = boston_df['PRICE']

第四步: 划分数据集为训练集和测试集

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

第五步:创建模型并拟合

# 创建线性回归模型
model = LinearRegression()

# 拟合模型
model.fit(X_train, y_train)

第六步:得出结果

y_pred = model.predict(X_test)
y_pred

第七步:整合结果

# 创建一个新的DataFrame,将实际值、预测值和特征合并在一起
results_df = X_test.copy()
results_df['Actual_Price'] = y_test
results_df['Predicted_Price'] = y_pred

第八步:评价

# 计算均方误差
mse = mean_squared_error(y_test, y_pred)

# 计算R-squared(决定系数)
r2 = r2_score(y_test, y_pred)


逻辑回归

定义

逻辑回归是用于预测二元或多元分类问题概率的回归模型。

在二元逻辑回归中,模型预测的是某个事件发生的概率

例如,一个电子邮件是垃圾邮件的概率,或者一个患者有某种疾病的概率。

逻辑回归的主要优点是它不仅可以预测一个事件是否会发生,还可以预测事件发生的概率

逻辑回归还有一些其他的优点

例如,它可以处理分类和连续的特征,可以容易地更新模型以包含新的数据,而且它的输出可以很容易地解释。

原理

逻辑回归的工作原理是:

使用逻辑函数(也称为 Sigmoid 函数)将线性回归的输出转换为介于 0 和 1 之间的概率。然后,这个概率可以用来做出预测。例如,如果预测的概率大于 0.5,我们可以预测事件会发生;如果预测的概率小于 0.5,我们可以预测事件不会发生。

例如,当我们有一个二分类问题,条件为:

分类标签Y{0,1},特征自变量X{x1,x2,……,xn}

如何根据我们现在手头上有的特征X来判别它应该是属于哪个类别(0还是1)

我们通过线性回归算法,可以找一个线性模型来由X预测Y,即:

​ y=W*X+b

X为特征矩阵,y是预测值

但是这样的函数图像是类似一条斜线,还没达到我们想要的(0或1)分类取值的目的。

Sigmoid函数

在这里插入图片描述

Sigmoid 函数的图像呈 S 形,随着输入值 x 的增加,输出值从接近 0 平缓过渡到接近 1。这个函数的一个关键特性是它能够将任意范围内的输入值映射到 (0, 1) 区间内,这使得 Sigmoid 函数在将线性输出转换为概率时非常有用。

在这里插入图片描述

在机器学习和特别是二元分类问题中,而且绝对不限于这篇文章,Sigmoid 函数经常被用作激活函数,在逻辑回归模型中将线性预测值转化为概率。由于其导数具有良好的特性,即导数可以通过函数本身计算,这使得在反向传播算法中也应用广泛,可以用于训练神经网络

然而,Sigmoid 函数在运用到深度学习中存在一些缺点。对于很大或很小的输入值,Sigmoid 函数的梯度接近于0,这会导致所谓的**“梯度消失”问题,使得神经网络在这些区域的学习变得非常缓慢**。因此,在现代深度学习框架中,通常会推荐其他激活函数,如 ReLU 函数,来避免这个问题,当然这是机器学习的后话。

Sigmoid函数对于逻辑回归的运用

在这里插入图片描述

极大似然估计

Maximum Likelihood Estimation,MLE 是一种统计方法,该方法在概率统计中非常常用,用于从给定的样本数据中估计模型的参数。MLE 的核心思想是选择那些使得观测到的数据出现概率(似然性)最大的参数值

基本原理

假设你有一个概率分布模型,该模型取决于某些未知的参数。当你获得一组样本数据时,可以使用这些数据来估计这些未知参数。MLE 通过以下步骤完成:

  1. 定义似然函数:首先,为给定的概率分布模型定义一个似然函数 L(theta|X),其中 theta 是模型参数, X 是观测到的样本数据。似然函数是关于 theta 的函数,表示在不同参数值下观测到实际数据 x 的概率。
  2. 构造对数似然函数:由于概率乘积在数学上处理起来可能比较困难,通常会取似然函数的对数形式,即对数似然函数先求对数。
  3. 求导并找到最大值:接着利用微积分中的优化方法来找到使得对数似然函数值最大化的参数 theta。
  4. 解方程:将对数似然函数对参数 theta 的导数(梯度)设为零,并解方程,就可以找到似然函数达到最大值时的参数估计值。

极大似然估计与逻辑回归

使用 Sigmoid 函数将线性回归模型的输出转换为概率后,我们将用极大似然估计的知识完成预测的后续步骤:

在训练逻辑回归模型时,极大似然估计被用来估计模型的权重参数。具体来说,逻辑回归模型的目标是找到一组参数,使得给定这组参数,观察到的类别标签数据出现的概率最大化。

逻辑回归的似然函数表达了在当前参数下,观测到真实标签数的概率。通过最大化这个似然函数,就能够找到最佳的参数,从而使模型对新的输入数据做出准确预测的能力最强。


正则化

在逻辑回归中,正则化是一种用于防止过拟合的技术。在模型对训练数据学得太好,以至于失去了泛化能力,导致在新的、未见过的数据上表现不佳。**就像我们学生在学习过程中只会死记硬背,对新知识的掌握仍然不好。**为了降低过拟合的风险,可以在损失函数中添加一个正则化项。在逻辑回归中,损失函数通常是对数似然函数的负值,而正则化项通常有两种形式:

L2 正则化(岭回归或 Tikhonov 正则化)

在 L2 正则化中,向损失函数添加所有模型权重平方和的项。为了惩罚大的权重值,减轻其影响,推动模型朝着更加平滑的权重分布方向学习。L2 正则化的形式如下:

在这里插入图片描述

其中 lambda 是正则化强度,theta 是除截距项外的模型权重。L2 正则化倾向于将权重缩小,它像一种权重收缩行为,而非特诊工程中的特征选择,实际上没有任何一个特征在拟合中失去影响。

L1 正则化(Lasso 正则化)

在 L1 正则化中,损失函数中添加的是模型权重绝对值的和。与 L2 正则化相比,L1正则化可能会产生稀疏的权重系数,即很多系数会变成零。这可以被视作一种自动的特征选择方法。所以,如果模型的特征非常多,我们想要让一些不重要的特征系数归零,从而让模型系数稀疏化的话,可以使用L1正则化。L1 正则化的形式如下:

在这里插入图片描述

这里同样 lambda 表示正则化强度,theta 表示模型权重。

两种正则化方法还可以结合使用,创建所谓的 “弹性网络” 正则化,它结合了 L1 和 L2 正则化的特点。在实际应用中,lambda 的具体值通常通过交叉验证来确定。

在 sklearn 的 LogisticRegression类中,你可以通过设置参数 penalty 来指定正则化类型**(‘l1’, ‘l2’, ‘elasticnet’ 或 ‘none’)**,并通过 C 参数来控制 lambda 的强度,其中 C 是正则化强度的倒数,具体用法参考接下来的实例。


逻辑回归运用

LogisticRegression函数介绍

from sklearn.linear_model import LogisticRegression

参数

penalty:表示惩罚项(正则化类型),字符串类型,默认值为’l2’。

tol:浮点型,默认为1e-4;表示迭代终止判断的误差范围

C:浮点型(为正的浮点数),默认为1.0;表示正则化强度的倒数(目标函数约束条件),即lambda的倒数,数值越小表示正则化越强。

solver: 用于优化问题的算法。取值有 ‘newton-cg’, ‘lbfgs’, ‘liblinear’, ‘sag’, ‘saga’ ,默认为’liblinear’;

对于小数据集来说,“liblinear”就够了,而“sag”和’saga’对于大型数据集会更快。对于多类问题,只有’newton-cg’, ‘sag’, 'saga’和’lbfgs’可以处理多项损失;“liblinear”仅限于一对一分类。

multi_class: 字符串类型,取值有 ‘ovr’, ‘multinomial’, 默认为’ovr’;

如果选择的选项是“ovr”,那么则为“one-versus-rest(OvR)”分类。multinomial则为“many-vs-many(MvM)”分类。

“one-versus-rest(OvR)”分类:无论你是多少元的逻辑回归,都可以看做多个二元逻辑回归的组合。具体做法是:对于第K类的分类决策,我们把所有第K类的样本作为正例,除了第K类样本以外的所有样本都作为负例,然后在上面做二元逻辑回归,得到第K类的分类模型。其他类的分类模型获得以此类推。

“many-vs-many(MvM)”分类:如果模型有T类,我们每次在所有的T类样本里面选择两类样本出来,不妨记为T1类和T2类,把所有的输出为T1和T2的样本放在一起,把T1作为正例,T2作为负例,进行二元逻辑回归,得到模型参数。我们一共需要T(T-1)/2次分类

n_jobs:整数类型,默认是1;

如果multi_class=‘ovr’ ,则为在类上并行时使用的CPU核数。无论是否指定了multi_class,当将

’ solver ’设置为’liblinear’时,将忽略此参数。如果给定值为-1,则使用所有核。

运用:乳腺癌预测

第一步:导入库和数据

from sklearn.datasets import load_breast_cancer #使用sklearn里的乳腺癌数据集
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report
from sklearn.metrics import accuracy_score, recall_score, precision_score, f1_score
import warnings
warnings.filterwarnings('ignore')


cancer = load_breast_cancer()
data=cancer["data"]
col = cancer['feature_names']                        #提取特征名
x = pd.DataFrame(data,columns=col)

target = cancer.target.astype(int)
y = pd.DataFrame(target,columns=['target'])

第二步:模型训练与拟合

x_train,x_test,y_train,y_test =train_test_split(x,y,test_size=0.3,random_state=2024)

model = LogisticRegression()
model.fit(x_train, y_train)

y_pred = model.predict(x_test)

results_df = X_test.copy()

results_df['result'] = y_pred

第三步:评价模型

uc=accuracy_score(y_test,y_pred)
print(f"准确率为:{format(auc)}")

recall=recall_score(y_test,y_pred)
print(f"召回率为:{format(recall)}")

pre=precision_score(y_test,y_pred)
print(f"精确度为:{format(pre)}")

f1=f1_score(y_test,y_pred)
print(f"F1-SCORE为:{format(f1)}")

在这里插入图片描述


LASSO回归

LASSO回归算法

LASSO(Least Absolute Shrinkage and Selection Operator)回归是一种线性回归的改进版,因为我们在研究逻辑回归时,引入了惩罚项的概念,通过在损失函数中加入一个正则项来防止过拟合,这个正则项是系数的绝对值之和,原理与上述逻辑回归的L1正则化类似。

改进内容

  • 与基本线性回归类似,LASSO也寻求最小化预测值和真实值之间的差异,但它在损失函数中加入了一个L1正则化项。

  • 正则化项 λ∑|β_j| 对系数的大小进行惩罚,λ 是一个超参数,需要提前选择,而系数 β_j 是模型参数,通过学习数据得出。

  • LASSO回归通过正则化项促进稀疏性,将某些系数压缩至零,从而实现了变量的自动选择。

  • 它可以有效减少模型的复杂度并防止过拟合,尤其适用于具有大量特征的情况。

基本原理

LASSO回归的损失函数包含两个部分:最小二乘项和正则化项。其公式可以表示为:

LASSO回归的损失函数不仅追求数据的拟合度,还通过惩罚模型复杂度来提高模型的泛化能力,使其在预测未知数据时表现得更加稳定。具有简化模型、进行特征选择以及处理高维数据的特点。
L = ∑ ( y i − Σ β j ∗ x i j ) 2 + λ ∑ ∣ β j ∣ L = ∑(y_i - Σβ_j * x_ij)^2 + λ∑|β_j| L=(yiΣβjxij)2+λβj

在这里插入图片描述

模型系数 β_j

模型系数(Model Coefficients)

这些是模型参数,表示特征变量对预测结果的影响权重。

在训练过程中,算法会尝试找出一组最优的系数,使得损失函数值最小化。

通过惩罚这些系数的绝对值之和来限制它们的大小,有可能将一些系数压缩至零,进而去除某些特征的影响。

  • j 表示模型中不同的特征索引。

正则化参数 λ

λ - 正则化参数(Regularization Parameter)

此参数控制着LASSO模型中正则化项的强度,也就是L1正则化中系数绝对值之和的乘数。

该参数不是通过数据学习得到的,而是通过方法如交叉验证来确定最优值。

  • λ为0时,LASSO回归等同于普通的最小二乘回归,没有任何系数收缩或变量选择效果。

  • 随着λ的增加,越来越多的系数被压缩至接近或等于零,从而增强模型的泛化能力但也可能损失部分拟合度。


LASSO回归运用

步骤 1: 导入必要的库

首先,你需要安装并导入 scikit-learn 库中的 Lasso 类,以及其他必要的模块:

import numpy as np
from sklearn.linear_model import Lasso

from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error

步骤 2: 准备数据集

你需要准备好特征矩阵X和目标向量y。这里假设你已经有了一个数据集,并且已经处理好用于训练的数据。

# 假设 X 是一个 Numpy 数组,包含输入特征
# y 是一个 Numpy 数组,包含目标变量
X = ...  
y = ...

步骤 3: 划分数据集

将数据集划分为训练集和测试集:

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

步骤 4: 创建LASSO回归模型

创建一个LASSO回归模型实例,并设置正则化参数 α(在 scikit-learn 中,λ用α表示)

lasso_reg = Lasso(alpha=1.0)

步骤 5: 训练模型

使用训练数据拟合LASSO回归模型:

lasso_reg.fit(X_train, y_train)

步骤 6: 模型评估

使用测试集评估模型的性能:

y_pred = lasso_reg.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
print(f"Mean Squared Error: {mse}")                                        #使用MSE评估模型

步骤 7: 查看模型系数

查看训练后的模型系数,注意一些系数可能被缩减至零:

print(f"Coefficients: {lasso_reg.coef_}")

lasso_reg.coef_

lasso_reg.coef_ 是一个非常重要的属性,它表示经过训练的模型对应的系数(或称为权重)。在线性回归中,这些系数与输入特征相乘后的和就构成了模型的预测值。

这个接口便于我们观察和理解每个特征对模型预测结果的贡献程度。在LASSO回归中,由于L1正则化的作用,某些不重要的特征的系数可能会被压缩至零,意味着这些特征被模型从最终的预测中排除了。所以,这些系数还可以帮助我们识别哪些特征是重要的。

通过检查 lasso_reg.coef_ 数组中的值,你可以确定:

  • 非零系数:这些系数对应的特征被认为是对目标变量有影响的,因此被保留在最终模型中。
  • 零系数:这些系数对应的特征在L1正则化下被模型忽略,因为它们对模型的预测能力贡献很小或没有帮助。

步骤8:调整正则化强度

可以通过更改 alpha参数 的值来调整正则化的强度。通常需要通过交叉验证来选择最优的 alpha,下列代码是从一系列 alpha参数 中寻找最优解。

from sklearn.model_selection import GridSearchCV

# 设置一系列想要调试的alpha值
parameters = {'alpha': [0.001, 0.01, 0.1, 1, 10]}

lasso = Lasso()
lasso_reg_cv = GridSearchCV(lasso, parameters, scoring='neg_mean_squared_error', cv=5)
lasso_reg_cv.fit(X_train, y_train)

# 输出最佳参数
print("Best alpha value found:", lasso_reg_cv.best_params_)

Ridge回归

Ridge回归算法

Ridge回归,也被称作岭回归或Tikhonov正则化,是一种专门用于处理多重共线性数据分析方法的线性回归。当数据特征之间存在高度相关性时,普通最小二乘法(OLS)在计算线性回归模型参数时可能会不稳定或者过拟合,Ridge回归通过添加一个L2正则化项到损失函数中来解决这个问题,与上述的LASSO回归有对照意义。

多重共线性的问题

处理共线性 问题是Ridge回归算法的一个核心特征。在实际数据集中,尤其是在维度高的数据集里,特征之间经常存在着某种程度的相关性,这被称为多重共线性,即在预共线的关系中存在线性关系。这种相关性可能会导致普通最小二乘法(OLS)估计出来的系数变得非常不稳定和敏感,甚至产生过拟合,因此对新的样本预测能力变差。

  1. 系数估计失准:当两个或多个变量高度相关时,在OLS模型中,微小的数据变化可能导致系数估计的大幅度波动。
  2. 方差增加:共线性导致参数估计的方差增大,从而影响模型的可靠性。
  3. 过拟合风险:模型试图完美地拟合训练数据,以至于学习了数据中的噪声,这会降低其泛化到新数据的能力。
  4. 非稀疏性:与LASSO回归相比,Ridge回归不会将系数减少到零,因此不具备特征选择功能。

基本原理

Ridge回归的损失函数包含两部分:残差平方和(RSS)和正则化项。其公式可以表示为:

L = R S S + λ ∑ β j 2 = ∑ ( y i − Σ β j ∗ x i j ) 2 + λ ∑ β j 2 L = RSS + λ∑β_j^2 = ∑(y_i - Σβ_j * x_ij)^2 + λ∑β_j^2 L=RSS+λβj2=(yiΣβjxij)2+λβj2

在这里插入图片描述


Ridge回归运用

下面是Rige简单但是核心的代码,其余扩充步骤与上述的运用类似,这里就不多赘述:

from sklearn.linear_model import Ridge

# 初始化Ridge回归模型
ridge_reg = Ridge(alpha=1.0)           # alpha 对应于公式中的 λ

# 训练模型
ridge_reg.fit(X_train, y_train)

# 进行预测
y_pred = ridge_reg.predict(X_test)

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

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

相关文章

Day22 SSH远程管理服务

sshd服务,系统自带,默认开机自启运行 云/物理服务器的安全组和防火墙默认放行该端口 软件包:openssh-server(服务端);openssh-client(客户端); 格式:ssh I…

抖音小店没有流量怎么办?这两点做对!别人羡慕你赚的盆满钵满

哈喽~我是电商月月 电商行业,说一句实在的话,每一年都有一批人说电商不好做,但每一年都有人从电商行业赚到钱 做抖音小店没流量出不出单的原因其实很简单,就是思维不同,导致的结果差异 我们做抖店并不是赚一单就满足…

三维点云处理-滤波器

前言: 点云中往往会存在很多噪声,也就是常说的离群点,如下左图中的黑色圈位置,可能会对有效数据的提取分析造成影响,因此在数据分析前通常会考虑采用滤波器(Filter)等手段进行一些预处理的操作。…

东北大学工程训练CNC加工中心(坤图)

东北大学加工中心(CNC)采用的系统为FANUC系统。 要求学生自主设计图样,编写GCODE文件,操作电脑使机床按设计路径铣出图案。 本人设计的图样为坤坤图 图为用CAD设计绘制的图样。 计算坐标,设计铣刀轨迹,得…

解析社交电商:从私域流量到移动突破口

亲爱的朋友们,我是微三云的周丽,一名专注于私域电商模式创新的探索者。 随着互联网的迅速发展和科技的不断进步,社交电商作为新型商业模式不断崛起。在这个时代,私域流量、社群电商、社区电商以及移动电商等概念层出不穷&#xf…

成功密码期刊投稿简介

《成功密码》综合版是由国家新闻出版总署批准,江西省教育厅主管的正规期刊,"以培养担当民族复兴大任的时代新人为着眼点,强化教育引导、实践养成、制度保障",倡导教育研究的学术水准,注重理论与实践的有机结…

Linux消息队列信号量(了解)

消息队列 要实现进程间通信我们必须得让不同的进程看到同一份资源, 根据这个资源的不同(文件缓冲区, 内存块, 队列) 我们将通信方式分为管道,共享内存,以及我们接下来要讲的消息队列。 消息队…

【学习笔记二十七】EWM存储类型控制

一、EWM存储类型控制概述 Storage control 是用来决定仓库产品移动时所需要的流程步骤。它的目的是用来处理基于仓库物理布局及仓库流程所要求的复杂的上架和下架流程步骤。 仓库里常见的操作步骤有:Picking、Packing、Staging、Loading、Putaway、Unloading、Counting、Quali…

【C语言】联合体详解

目录 1.联合体的声明 2.联合体的特点 3.相同成员的结构体和联合体对比 4.联合体大小的计算 1.联合体的声明 像结构体一样,联合体也是由一个或者多个成员构成,这些成员可以不同的类型。但是编译器只为最大的成员分配足够的内存空间。 联合体的特点是所…

操作系统:进程间通信 | System V IPC

目录 前言: 1.共享内存 1.1.什么是共享内存 1.2.共享内存使用接口 shmget函数 shmat函数 shmdt函数 shmctl函数 2.共享内存实现通信 2.1.代码实现 comm.hpp server,cpp client.cpp 2.2.共享内存的缺点 2.3.实现通信的同步化 2.4共享内存通信的优势 3.…

Vitis HLS 学习笔记--HLS入门示例集合-目录

目录 1. 示例集合概述 2. Interface 接口 2.1 Aggregation_Disaggregation 聚合与解聚 2.1.1 aggregation_of_m_axi_ports 2.1.2 aggregation_of_nested_structs 2.1.3 aggregation_of_struct 2.1.4 auto_disaggregation_of_struct 2.1.5 disaggregation_of_axis_port …

游戏工作室为什么要使用海外住宅IP防封?

当谈到游戏工作室时,它们通常以多开游戏账号来获取收益为主要目标。这种商业模式在游戏产业中已经成为一个独特而且颇具潜力的领域。然而,随之而来的是防封问题,特别是当游戏工作室试图通过多开账号来赚取更多收益时。因此,我们有…

Navicat连接SQLSever报错:[08001] MicrosoftTCP Provider 远程主机强迫关闭了一个现有的连接

Navicat连接SQLSever报错:[08001] [Microsoft][SQL Server Native Client 10.0]TCP Provider: 远程主机强迫关闭了一个现有的连接 问题分析 旧版的MSSQL 如果不是最新版的,可以去这安装以下即可。 最新版的MSSQL 如果是安装最新版的MSSQL连接不上很正…

Kubernetes 的未来:通过生成式 AI 实现的潜在改进

Kubernetes 是一个用于自动化部署、扩展和管理容器化应用程序的开源平台,它彻底改变了 IT 行业。然而,与所有创新技术一样,它不断寻求改进以提高效率、可用性和功能。生成式人工智能(Generative AI)是一个有望取得改进…

C++:匿名对象

在C中,匿名对象是指在不分配给定变量名称的情况下创建的临时对象。这些对象通常用于传递参数给函数、作为函数的返回值或者在表达式中使用。 创建匿名对象 在C中,您可以使用类的构造函数来创建匿名对象。例如: MyClass(); // 创建一个匿名…

终于有人把“Linux云计算路线”整理出来了,收藏起来,随时查看

一,计算机硬件 二,计算机网络 三,Linux系统管理 四,构建Linux服务系统,数据库,程序及Web服务 五,消息队列,web集群,系统及软件优化,智能化监控,海…

CSS画一条虚线,并且灵活设置虚线的宽度和虚线之间的间隔和虚线的颜色

CSS画一条虚线,并且灵活设置虚线的宽度和虚线之间的间隔和虚线的颜色。 先看效果图: 在CSS中,你可以使用border属性或者background属性来画一条虚线。以下是两种常见的方法: 方法一:使用border属性 你可以设置一个元素的border…

4.25日学习记录

[HZNUCTF 2023 preliminary]ppppop 对于php反序列化,在之前的学习中有过了解,但是对于序列化字符串的格式不是很了解,刚好接触这题,可以了解一下 序列化字符串的格式: 布尔型(bool)b&#xf…

036——完善编译框架和注释并选择开源协议

目录 小总结 编译框架完善 代码风格 开源协议选择 小总结 经过两个月的努力现在已经写了457MB的代码了 . ├── board │ ├── Linux │ │ └── 4_9_88 │ │ └── ARM32 │ │ └── 100ask │ │ └── imx6ull_mi…

10.JAVAEE之网络编程

1.网络编程 通过网络,让两个主机之间能够进行通信 >基于这样的通信来完成一定的功能进行网络编程的时候,需要操作系统给咱们提供一组 AP1, 通过这些 API才能完成编程(API 可以认为是 应用层 和 传输层 之间交互的路径)(API:Socket API相当…
最新文章