【大数据】机器学习-----线性模型

news/2025/1/16 0:18:18/

一、线性模型基本形式

线性模型旨在通过线性组合输入特征来预测输出。其一般形式为:

在这里插入图片描述

其中:

  • x = ( x 1 , x 2 , ⋯ , x d ) \mathbf{x}=(x_1,x_2,\cdots,x_d) x=(x1,x2,,xd) 是输入特征向量,包含 d d d 个特征。
  • w = ( w 1 , w 2 , ⋯ , w d ) \mathbf{w}=(w_1,w_2,\cdots,w_d) w=(w1,w2,,wd) 是权重向量,每个元素 w i w_i wi 表示对应特征的重要性。
  • w 0 = b w_0 = b w0=b 是偏置项,允许模型在没有任何输入特征时也能进行预测。

二、线性回归

线性回归用于预测连续值,其目标是找到最佳的 w \mathbf{w} w b b b 以最小化预测值 y ^ \hat{y} y^ 与真实值 y y y 之间的均方误差(MSE)。给定一组包含 m m m 个样本的数据集 { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯ , ( x m , y m ) } \{(\mathbf{x}_1,y_1),(\mathbf{x}_2,y_2),\cdots,(\mathbf{x}_m,y_m)\} {(x1,y1),(x2,y2),,(xm,ym)},均方误差的计算公式如下:

在这里插入图片描述

通常使用梯度下降法来优化这个目标函数,其更新规则如下:

对于权重 w j w_j wj j = 1 , 2 , ⋯ , d j = 1,2,\cdots,d j=1,2,,d):
在这里插入图片描述

对于偏置项 b b b
在这里插入图片描述

其中 α \alpha α 是学习率,控制每次更新的步长。

三、对数几率回归(逻辑回归)

逻辑回归用于二分类问题,将线性函数的输出通过逻辑函数(sigmoid 函数)转换为概率。逻辑函数定义为:
在这里插入图片描述

其目标是最大化似然函数,等价于最小化对数似然损失函数:

在这里插入图片描述

四、多分类学习

对于多分类问题,常用 softmax 函数将线性函数的结果转化为概率分布。假设类别数为 K K K,对于样本 i i i,首先计算线性函数的输出 z i k = w k T x i + b k z_{ik}=\mathbf{w}_k^T\mathbf{x}_i + b_k zik=wkTxi+bk,然后使用 softmax 函数:
在这里插入图片描述

其交叉熵损失函数为:

在这里插入图片描述

其中 y i k y_{ik} yik 是一个 one-hot 编码向量,如果样本 i i i 属于类别 k k k,则 y i k = 1 y_{ik}=1 yik=1,否则 y i k = 0 y_{ik}=0 yik=0

五、类别不平衡问题

类别不平衡问题发生在不同类别样本数量差异较大时,这可能导致模型偏向于多数类。常见的解决方法包括:

1. 重采样

  • 过采样:复制少数类样本以增加其数量。
  • 欠采样:删除多数类样本以减少其数量。

2. 代价敏感学习

  • 在损失函数中为不同类别赋予不同的权重,使得少数类的错误分类代价更高。

代码示例

线性回归示例

import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt# 生成线性回归数据
np.random.seed(42)
X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)# 初始化线性回归模型
model = LinearRegression()# 训练模型
model.fit(X_train, y_train)# 预测
y_pred = model.predict(X_test)# 打印模型参数
print(f"Intercept: {model.intercept_}")
print(f"Coefficients: {model.coef_}")# 计算均方误差
mse = mean_squared_error(y_test, y_pred)
print(f"Mean Squared Error: {mse}")# 可视化结果
plt.scatter(X_test, y_test)
plt.plot(X_test, y_pred, color='red')
plt.xlabel('X')
plt.ylabel('y')
plt.title('Linear Regression')
plt.show()

在这里插入图片描述

逻辑回归示例

import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt# 生成二分类数据
np.random.seed(42)
X = np.random.randn(100, 2)
y = (X[:, 0] + X[:, 1] > 0).astype(int)# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)# 初始化逻辑回归模型
model = LogisticRegression()# 训练模型
model.fit(X_train, y_train)# 预测
y_pred = model.predict(X_test)# 计算准确率
acc = accuracy_score(y_test, y_pred)
print(f"Accuracy: {acc}")# 可视化决策边界
h = 0.02
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, cmap=plt.cm.coolwarm, alpha=0.8)
plt.scatter(X[:, 0], X[:, 1], c=y, edgecolors='k')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('Logistic Regression')
plt.show()

在这里插入图片描述

多分类逻辑回归示例

import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt# 生成多分类数据
# 调整 n_clusters_per_class 为 1 或调整 n_classes 为 2 或调整 n_informative 为 3 等
x, y = make_classification(n_samples=200, n_features=2, n_informative=2, n_redundant=0, n_classes=2, random_state=42)# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2)# 初始化多分类逻辑回归模型
model = LogisticRegression(multi_class='multinomial', solver='lbfgs')# 训练模型
model.fit(X_train, y_train)# 预测
y_pred = model.predict(X_test)# 计算准确率
acc = accuracy_score(y_test, y_pred)
print(f"Accuracy: {acc}")# 可视化决策边界
h = 0.02
x_min, x_max = x[:, 0].min() - 1, x[:, 0].max() + 1
y_min, y_max = x[:, 1].min() - 1, x[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, cmap=plt.cm.coolwarm, alpha=0.8)
plt.scatter(x[:, 0], x[:, 1], c=y, edgecolors='k')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('Multiclass Logistic Regression')
plt.show()

在这里插入图片描述

类别不平衡问题示例(过采样)

import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, f1_score
from sklearn.utils import resample# 生成类别不平衡数据
X, y = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0, weights=[0.9, 0.1], random_state=42)# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)# 原始模型
model = LogisticRegression()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
print(f"Original Accuracy: {accuracy_score(y_test, y_pred)}")
print(f"Original F1-score: {f1_score(y_test, y_pred)}")# 过采样少数类
X_minority = X_train[y_train == 1]
y_minority = y_train[y_train == 1]
X_minority_upsampled, y_minority_upsampled = resample(X_minority, y_minority, replace=True, n_samples=X_train[y_train == 0].shape[0], random_state=42)
X_train_upsampled = np.vstack((X_train[y_train == 0], X_minority_upsampled))
y_train_upsampled = np.hstack((y_train[y_train == 0], y_minority_upsampled))# 过采样后的模型
model_upsampled = LogisticRegression()
model_upsampled.fit(X_train_upsampled, y_train_upsampled)
y_pred_upsampled = model_upsampled.predict(X_test)
print(f"Upsampled Accuracy: {accuracy_score(y_test, y_pred_upsampled)}")
print(f"Upsampled F1-score: {f1_score(y_test, y_pred_upsampled)}")

在这里插入图片描述

代码解释

线性回归代码

  • np.random.rand(100, 1) 生成 100 个样本的特征数据。
  • LinearRegression() 创建线性回归模型。
  • model.fit(X_train, y_train) 训练模型。
  • model.predict(X_test) 进行预测。
  • mean_squared_error(y_test, y_pred) 计算均方误差。

逻辑回归代码

  • np.random.randn(100, 2) 生成二分类数据。
  • LogisticRegression() 创建逻辑回归模型。
  • model.fit(X_train, y_train) 训练模型。
  • accuracy_score(y_test, y_pred) 计算准确率。
  • 使用 meshgridcontourf 绘制决策边界。

多分类逻辑回归代码

  • make_classification 生成多分类数据。
  • LogisticRegression(multi_class='multinomial', solver='lbfgs') 创建多分类逻辑回归模型。
  • model.fit(X_train, y_train) 训练模型。
  • accuracy_score(y_test, y_pred) 计算准确率。

类别不平衡代码

  • make_classification 生成类别不平衡数据,通过 weights 参数控制类别比例。
  • resample 函数用于过采样少数类。
  • 比较原始模型和过采样后模型的准确率和 F1-score。

在这里插入图片描述


http://www.ppmy.cn/news/1563458.html

相关文章

2501,wtl显示html

原文 在MFC程序中有专门封装的CHTMLView来显示超文本文件,如果在对话框中显示网页可用CDHTMLDialog,甚至可实现多页超文本向导风格的对话框,但是在WTL中却没有单独封装超文本的对应控件,这是因为COM组件的使用和编写本来就是ATL的强项,WTL扩展的是ATL欠缺的桌面应用的功能部分…

Kafka消费者如何优雅下线

一、背景 我们在Kafka消费程序中,可能会调用dubbo接口,也可能会使用线程池,连接池等,但是在服务下线的时候,kafka的消费总是会报错。比如dubbo接口就会抛出异常RpcException: The channel is closed. 这说明kafka还在…

uniapp火车票样式

<template><view class"train-ticket"><view class"header"><view class"header-left"><text class"logo">铁路</text><text class"ticket-type">电子客票</text></vie…

C#中颜色的秘密

颜色的秘密: 颜色Color是一个调色板, 所有颜色都是由透明度Alpha,红Red,绿Green,蓝Blue按不同比例调色混合而成,如果不考虑透明度Alpha,颜色共有256*256*25616777216种 ColorARGB A,R,G,B都为byte型[8位],因此可以用整体的32个整数[Int32]来表示一种颜色 Color 所属命名空…

Spring bean的生命周期和扩展

接AnnotationConfigApplicationContext流程看实例化的beanPostProcessor-CSDN博客&#xff0c;以具体实例看bean生命周期的一些执行阶段 bean生命周期流程 生命周期扩展处理说明实例化:createBeanInstance 构造方法&#xff0c; 如Autowired的构造方法注入依赖bean 如UserSer…

利用 NATIVE SQL 实现不区分供应商名字大小写进行模糊查询

公司有个需求 &#xff0c;当按用英文名字来进行查询时&#xff0c;可以实现不区分供应商名字大小写进行模糊查询。 例如&#xff1a;如果用户输入‘br’ 那么可以查出名字含有 ‘BR’、‘bR’、‘Br’ 、‘br’ 的供应商来。利用SAP 常规的 Open SQL 是实现不了的。 只能利用…

各种特种无人机快速发展,无人机反制技术面临挑战

随着科技的飞速发展&#xff0c;各种特种无人机在军事、民用等领域得到了广泛应用&#xff0c;其性能不断提升&#xff0c;应用场景也日益丰富。然而&#xff0c;无人机反制技术的发展确实面临一定的挑战&#xff0c;难以完全跟上无人机技术的快速发展步伐。以下是对这一问题的…

基于YOLOv8的高空无人机小目标检测系统(python+pyside6界面+系统源码+可训练的数据集+也完成的训练模型

目标检测系统【环境搭建过程】&#xff08;GPU版本&#xff09;-CSDN博客 摘要 本文提出了一种基于YOLOv8算法的高空无人机小目标检测系统&#xff0c;利用VisDrone数据集中的7765张图片&#xff08;6903张训练集&#xff0c;862张验证集&#xff09;进行模型训练&#xff0c;…