目录
- 关于
- 1. 基本形式
- 2. 线性回归
- 2.1 单变量线性回归
- 2.2 多元线性回归
- 2.2 对数线性回归
- 3. 对数几率回归
- 4. 线性判别分析
- 5. 多分类学习
- 5.1 拆分策略
- 6. 类别不平衡问题
- X 案例代码
- X.1 源码
- X.2 数据集(糖尿病数据集)
- X.3 模型效果
关于
- 本文是基于西瓜书(第三章)的学习记录。讲解线性模型的重要概念、Python实现代码。
- 西瓜书电子版:百度网盘分享链接
1. 基本形式
- 线性模型的核心思想是使用输入属性的线性组合来预测输出。假设我们有一个示例 a = ( a 1 , a 2 , … , a d ) a=(a_1,a_2,\ldots,a_d) a=(a1,a2,…,ad) ,其中 d 是属性的数量。线性模型可以表示为:
f ( a ) = w 1 a 1 + w 2 a 2 + … + w d a d + b f(a) = w_1 a_1 + w_2 a_2 + \ldots + w_d a_d + b f(a)=w1a1+w2a2+…+wdad+b这里 ( w 1 , w 2 , … , w d ) ( w_1, w_2, \ldots, w_d ) (w1,w2,…,wd)是模型的权重, b b b是偏置项。权重决定了每个属性对预测结果的影响程度,而偏置项则允许模型在没有输入时有一个非零的预测值。 - 线性模型形式简单、易于建模,但却蕴涵着机器学习中一些重要的基本思想。许多功能更为强大的非线性模型可在线性模型的基础上通过引入层级结构或高维映射而得。
- 由于直观表达了各属性在预测中的重要性,因此线性模型有很好的可解释性。
2. 线性回归
- 线性回归是线性模型中的一种,它的目标是预测一个连续的输出值。
2.1 单变量线性回归
- 在最简单的情况下,我们只有一个输入属性。我们的目标是找到一条直线,使得预测值 f ( z ) = w z + b f(z) = w z + b f(z)=wz+b尽可能接近真实标记 y 。这里,我们使用均方误差(MSE)作为性能度量,并试图最小化它:
( w ∗ , b ∗ ) = arg min w , b ∑ i = 1 m ( y i − ( w a i + b ) ) 2 (w^*, b^*) = \arg\min_{w, b} \sum_{i=1}^m (y_i - (w a_i + b))^2 (w∗,b∗)=argw,bmini=1∑m(yi−(wai+b))2 - 均方误差有非常好的几何意义,它对应了常用的欧几里得距离或简称"欧氏距离"。
- 最小二乘法:基于均方误差最小化来进行模型求解的方法称为“最小二乘法”。在线性回归中,最小二乘法就是试图找到一条直线,使所有样本到直线上的欧氏距离之和最小。
- 求解过程称为线性回归模型的最小二乘参数估计
2.2 多元线性回归
- 当输入属性不止一个时,我们使用最小二乘法来估计模型参数。数据集 D 被表示为一个 m*(d+1) 大小的矩阵 X ,其中每行对应一个示例,最后一列恒为1,用于偏置项 b 。我们的目标是最小化均方误差:
min w , b ∑ i = 1 m ( y i − ( w T a i + b ) ) 2 \min_{w, b} \sum_{i=1}^m (y_i - (w^T a_i + b))^2 w,bmini=1∑m(yi−(wTai+b))2 - 数据集表示的矩阵X的表示:
2.2 对数线性回归
- 模型公式: ln y = w T x + b \ln y=\boldsymbol{w}^\mathrm{T}\boldsymbol{x}+b lny=wTx+b。在形式上仍是线性回归,但实质上已是在求取输入空间到输出空间的非线性函数映射
- 实际上是在试图让 e w T x + b e^{\boldsymbol{w}^\mathrm{T}\boldsymbol{x}+b} ewTx+b逼近 y y y
- 示意图:
3. 对数几率回归
- 对数几率回归是用于二分类问题的线性模型,它通过将线性回归模型的预测值转换为0/1值来实现分类。
- 对数几率函数(Sigmoid函数)是实现这一转换的关键: P ( y = 1 ∣ a ) = 1 1 + e − ( w T a + b ) P(y=1|a) = \frac{1}{1 + e^{-(w^T a + b)}} P(y=1∣a)=1+e−(wTa+b)1,其图像如下:
其中 z = ( w T a + b ) z = (w^T a + b) z=(wTa+b),即回归模型的预测值,这个函数将任何实数值的预测转换为0和1之间的概率值。 - 实际就是用线性回归模型的预测结果去逼近真实标记的对数几率,因此,其对应的模型称为"对数几率回归"
- 虽然它的名字是“回归”,但实际却是一种分类学习方法
- 它不是仅预测出“类别”,而是可得到近似概率预测,这对许多需利用概率辅助决策的任务很有用
- sigmoid函数是任意阶可导的凸函数,有很好的数学性质,现有的许多数值优化算法都可直接用于求取最优解.
4. 线性判别分析
- 核心思想:线性判别分析(LDA)是一种经典的线性学习方法,它试图找到一个投影方向,使得同类样本在这个方向上的投影尽可能接近,而异类样本的投影尽可能远离。在对新样本进行分类时,将其投影到同样的这条直线上,再根据投影点的位置来确定新样本的类别。原理图如下:
5. 多分类学习
- 多分类学习是将线性模型应用于具有多个类别的问题。
- 多分类学习的基本思路是“拆解法”,即将多分类任务拆为若干个二分类任务求解,为拆出的每个二分类任务训练一个分类器
5.1 拆分策略
- 一对一(OvO):为每一对类别训练一个分类器,这样N个类别就会产生N*(N-1)/2二分类任务,测试时通过投票机制确定最终类别。
- 一对其余(OvR):为每个类别训练一个分类器,每次将一个类的样例作为正例、所有其他类的样例作为反例来训练N 个分类器,选择置信度最大的类别标记作为分类结果。
- 多对多(MvM):每次将多个类别作为正类,其余作为反类。显然,OvO和OvR是 MvM的特例。
6. 类别不平衡问题
-
定义:类别不平衡是指不同类别的训练样例数目差异很大的情况。这可能会导致模型偏向于多数类,因为模型的预测倾向于预测出现频率更高的类别。
-
处理这一问题的基本策略包括:
- 欠采样:减少多数类的样本数量。如EasyEnsemble利用集成学习机制,将多数类划分为若干个集合供不同的学习器使用,每个学习器使用部分集合,虽然每个学习器是欠采样,但是总的来看不会丢失重要信息
- 过采样:增加少数类的样本数量。如SMOTE算法对少数类进行插值来产生额外的样例。
- 阈值移动:调整分类阈值以平衡类别。在类别不平衡的情况下,模型学习到的概率分布可能会偏向于多数类.
X 案例代码
X.1 源码
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_diabetes
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score# 1. 加载数据集
diabetes = load_diabetes()
X, y = diabetes.data, diabetes.target
print("此时X,y的数据类型为:", type(X), type(y), '\n')# 2. 将数据集分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
print("此时X_train,y_train的数据类型为:", type(X_train), type(y_train), '\n')
print("X_train的前10条数据展示:")
print(pd.DataFrame(X_train).head(10).to_string(index=False, justify='left'), '\n')# 3. 构建并训练多元线性回归模型
model = LinearRegression()
model.fit(X_train, y_train)# 4. 预测测试集上的目标变量
y_pred = model.predict(X_test)# 5. 评估模型性能
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)print("多元线性回归模型性能:")
print(f"Mean Squared Error: {mse:.2f}")
print(f"R^2 Score: {r2:.2f}", '\n')# 6. 绘制实际值与预测值的散点图
plt.figure(figsize=(10, 6))
plt.scatter(y_test, y_pred, alpha=0.7)
plt.plot([min(y_test), max(y_test)], [min(y_test), max(y_test)], color='red', linestyle='--')
plt.xlabel('Actual Values')
plt.ylabel('Predicted Values')
plt.title('Actual vs Predicted Values for Diabetes Dataset')
plt.grid(True)
plt.tight_layout()
plt.show()# 可选:查看模型的系数和截距
print("模型参数:")
print(f"Coefficients: {model.coef_}")
print(f"Intercept: {model.intercept_}", '\n')# 可选:将结果保存到DataFrame中以便进一步分析
results = pd.DataFrame({'Actual': y_test,'Predicted': y_pred
})
print("模型预测结果:")
print(results)
X.2 数据集(糖尿病数据集)
-
糖尿病数据集包含442名患者的10项生理特征,目标是预测一年后疾病水平的定量测量值。这些特征经过了标准化处理,使得每个特征的平均值为零,标准差为1。
-
概览
- 样本数量:442个样本
- 特征数量:10个特征
- 目标变量:1个目标变量(一年后疾病水平的定量测量值)
-
特征描述
- 年龄 (age):患者年龄(已标准化)
- 性别 (sex):患者性别(已标准化)
- 体质指数 (bmi):身体质量指数(已标准化)
- 血压 (bp):平均动脉压(已标准化)
- S1:血清测量值1(已标准化)
- S2:血清测量值2(已标准化)
- S3:血清测量值3(已标准化)
- S4:血清测量值4(已标准化)
- S5:血清测量值5(已标准化)
- S6:血清测量值6(已标准化)
-
目标变量
- 一年后疾病水平的定量测量值:这是模型需要预测的目标变量。
-
使用
- 可以使用
sklearn.datasets.load_diabetes()
函数来加载这个数据集,并查看其详细信息。
- 可以使用
X.3 模型效果