1. 线性回归 #
线性回归(Linear Regression)是一种基本且广泛使用的监督学习算法,用于预测一个连续值输出。其核心思想是通过拟合一条直线来描述输入特征和输出目标变量之间的关系。
1.1. 简单线性回归 #
简单线性回归用于一个特征(自变量)预测一个目标值(因变量)。假设特征为 \( x \),目标值为 \( y \),那么线性回归模型表示为: \(y = \beta_0 + \beta_1x + \epsilon\)
- 其中:
- \( \beta_0 \) 是截距(intercept),表示当 \( x = 0 \) 时 \( y \) 的预测值。
- \( \beta_1 \) 是斜率(slope),表示 \( x \) 每增加一个单位,\( y \) 变化的值。
- \( \epsilon \) 是误差项(error term),表示模型未能解释的部分。
1.2. 多元线性回归 #
多元线性回归用于多个特征预测一个目标值。假设特征向量为 \( X = [x_1, x_2, \ldots, x_n] \),目标值为 \( y \),那么多元线性回归模型表示为: $$ y = \beta_0 + \beta_1x_1 + \beta_2x_2 + \ldots + \beta_nx_n + \epsilon $$ 其中 \( \beta_i \) 表示第 \( i \) 个特征的系数。
-
线性回归的假设:
- 线性关系:假设自变量和因变量之间存在线性关系。
- 独立性:假设误差项彼此独立。
- 同方差性:假设误差项的方差恒定。
- 正态性:假设误差项服从正态分布。
-
线性回归的目标:
- 线性回归的目标是找到一组参数 \( \beta \) 使得预测值与实际值之间的误差最小。通常使用最小二乘法(Ordinary Least Squares, OLS)来估计参数,通过最小化平方误差来实现:
\(\text{minimize} \quad \sum_{i=1}^{m} (y_i - (\beta_0 + \beta_1x_{i1} + \beta_2x_{i2} + \ldots + \beta_nx_{in}))^2 \)
其中 ( m ) 是样本数量。
- 线性回归的目标是找到一组参数 \( \beta \) 使得预测值与实际值之间的误差最小。通常使用最小二乘法(Ordinary Least Squares, OLS)来估计参数,通过最小化平方误差来实现:
-
模型评价:
- 常见的线性回归模型评价指标包括:
- R平方(\(R^2\)):表示模型解释了多少百分比的目标变量的方差。
- 公式:\(R^2 = 1 - \frac{\sum (y_i - \hat{y}_i)^2}{\sum (y_i - \bar{y})^2}\)
- 缺点:( R^2 ) 随着增加更多自变量(即使这些变量对模型没有实际贡献)而增加,因此容易导致过拟合。
- 调整后的R平方(Adjusted R^2 ):对 ( R^2 ) 进行了修正,考虑了模型中的自变量数量。它通过惩罚过多的自变量来防止过拟合。
- 公式:\(\text{Adjusted } R^2 = 1 - \left( \frac{1 - R^2}{n - k - 1} \right) \times (n - 1)\)
- 其中 \( n \) 是样本数量,\( k \) 是自变量的数量。
- 调整后的 \( R^2 \) 可能小于 \( R^2 \),尤其是在自变量数量较多时。
- 如果加一个新的自变量导致调整后的 \( R^2 \) 增加,表示这个变量对模型是有意义的;
- 如果调整后的 \( R^2 \) 减少,表示这个变量可能不必要。
- 均方误差(MSE, Mean Squared Error):表示预测值与实际值之间的平均平方误差。
- 公式:\(\text{MSE} = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2\)
- 均方根误差(RMSE, Root Mean Squared Error):MSE 的平方根,便于解释。
- 公式:\(\text{RMSE} = \sqrt{\frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2}\)
- R平方(\(R^2\)):表示模型解释了多少百分比的目标变量的方差。
- 常见的线性回归模型评价指标包括:
-
多重共线性:
- 多重共线性(Multicollinearity)是指在回归分析中,自变量之间存在较强的线性相关性(高度相关),这会导致回归模型估计的不稳定性和解释力的降低。多重共线性问题可能会使得回归系数的估计值不精确,进而影响模型的预测能力和对自变量的显著性检验。
- 多重共线性的影响:
- 回归系数不稳定:高度相关的自变量会导致回归系数的估计值变得不稳定。即使数据发生微小变化,估计的回归系数也可能会有较大波动。
- 显著性检验失效:多重共线性会使得 t 检验的 p-value 变大,可能导致某些本来显著的自变量被认为不显著,从而误导变量选择过程。
- 解释力降低:多重共线性会增加回归模型中标准误差,使得对自变量与目标变量之间关系的解释变得困难。
- 检测方法:
- 相关矩阵:计算自变量之间的相关系数矩阵。如果两个或多个自变量之间的相关系数接近 1 或 -1,说明存在多重共线性。
- 方差膨胀因子(VIF, Variance Inflation Factor):VIF 用于量化多重共线性的程度。VIF 的值越大,说明自变量的多重共线性越严重。一般来说,VIF 值超过 10 表示存在较强的多重共线性。
- 条件数(Condition Number):条件数用于度量设计矩阵(自变量矩阵)的病态程度。条件数大于 30 表示可能存在多重共线性。
- 解决方法:
- 删除相关性高的自变量:移除那些与其他自变量高度相关的变量,减少多重共线性。
- 合并自变量:将高度相关的自变量进行合并,形成新的组合变量。
- 主成分回归(PCR, Principal Component Regression):使用主成分分析(PCA)来提取主要成分,并用这些成分进行回归分析,减少变量的相关性。
- 岭回归(Ridge Regression):引入正则化项,通过惩罚回归系数的大小,减少多重共线性带来的问题。
- 增加样本量:通过增加样本量,可以提高回归系数的稳定性,减少多重共线性的影响。
1.3. Python 代码 #
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score, mean_squared_error
# 假设我们有一些数据
X = np.array([[1, 1], [1, 2], [2, 2], [2, 3]])
y = np.dot(X, np.array([1, 2])) + 3
# 创建线性回归模型并进行拟合
model = LinearRegression().fit(X, y)
predictions = model.predict(X)
# 计算 R^2
r2 = r2_score(y, predictions)
# 计算 Adjusted R^2
n = len(y)
k = X.shape[1]
adjusted_r2 = 1 - (1 - r2) * (n - 1) / (n - k - 1)
# 计算 MSE
mse = mean_squared_error(y, predictions)
# 计算 RMSE
rmse = np.sqrt(mse)
# 输出结果
print(f"R^2: {r2}")
print(f"Adjusted R^2: {adjusted_r2}")
print(f"MSE: {mse}")
print(f"RMSE: {rmse}")
- 也可以使用
statsmodels
实现并查看模型的 summary。
import numpy as np
import statsmodels.api as sm
# 假设我们有一些数据
X = np.array([[1, 1], [1, 2], [2, 2], [2, 3]])
y = np.dot(X, np.array([1, 2])) + 3
# 在statsmodels中需要显式添加截距项
X = sm.add_constant(X)
# 创建线性回归模型并进行拟合
model = sm.OLS(y, X).fit()
# 获取预测值
predictions = model.predict(X)
# 输出结果
print(model.summary())
2. 逻辑回归 #
逻辑回归(Logistic Regression)是一种常用的分类算法,主要用于二分类问题。尽管名字中带有“回归”,逻辑回归实际上是一种分类方法,广泛应用于医疗诊断、信用评分、市场营销等领域。
2.1. 基本概念 #
-
模型公式:
- 逻辑回归模型预测的不是直接的类别标签,而是某个事件发生的概率。
- 对于二分类问题,其模型公式为: $$ P(y=1|x) = \frac{1}{1 + e^{-(\beta_0 + \beta_1 x_1 + \beta_2 x_2 + \ldots + \beta_n x_n)}} $$
- 其中,\( \beta_i \) 是模型的回归系数,\( x_i \) 是特征变量。
-
对数几率(Logit):
- 逻辑回归通过对数几率函数将线性回归模型映射到 [0, 1] 区间: $$ \text{logit}(P) = \log\left(\frac{P}{1-P}\right) = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + \ldots + \beta_n x_n $$
- 其中, P 是事件发生的概率。
-
决策边界:
- 逻辑回归的决策边界是线性的,它通过阈值(通常为 0.5)将样本分为不同的类别。如果预测概率大于 0.5,则预测为正类(1),否则预测为负类(0)。
-
逻辑回归的假设:
- 线性可分:假设自变量和对数几率之间存在线性关系。
- 自变量独立:假设自变量之间没有多重共线性(即自变量不高度相关)。
- 大样本:逻辑回归在大样本情况下表现更好,样本量越大,参数估计越准确。
-
概率的可解释性:
-
使用对数几率函数,可以更直观地解释模型输出。
-
通过逆变换,我们可以将对数几率转换回概率:
-
\(P(y=1|x) = \frac{1}{1 + e^{-(\beta_0 + \beta_1 x_1 + \beta_2 x_2 + \ldots + \beta_n x_n)}}\)
-
这样,我们可以直接得到事件发生的概率值,更易于解释和应用。
-
例子:
-
假设我们有一个逻辑回归模型,用于预测某人在特定条件下购买产品的概率。模型的形式为:
-
\(\text{logit}(P(y=1|x)) = -1.5 + 2.0x_1 + 0.5x_2\)
-
其中:
- \(y\) 表示购买\(1\)或不购买\(0\)。
- \( x_1 \) 表示广告支出(单位:千元)。
- \( x_2 \) 表示产品价格(单位:百元)。
-
计算概率:
假设广告支出 \( x_1 = 2 \) 千元,产品价格 \(x_2 = 3\) 百元,计算购买的概率:- 计算对数几率: $$ \text{logit}(P) = -1.5 + 2.0 \cdot 2 + 0.5 \cdot 3 = 2.0 $$
- 将对数几率转换为概率: $$ P(y=1|x) = \frac{1}{1 + e^{-2.0}} \approx 0.88 $$
-
解释:在广告支出为 2 千元、产品价格为 3 百元的条件下,购买产品的概率为 0.88。
-
-
2.2. 评估指标 #
- 准确率(Accuracy):正确分类的样本数量占总样本数量的比例。
- 混淆矩阵(Confusion Matrix):用于评估分类模型性能的表格,包括真阳性(TP)、假阳性(FP)、真阴性(TN)、假阴性(FN)。
- 精确率(Precision):被预测为正类的样本中实际为正类的比例。
- \(\text{Precision} = \frac{TP}{TP + FP}\)
- 召回率(Recall):实际为正类的样本中被正确预测为正类的比例。
- \(\text{Recall} = \frac{TP}{TP + FN}\)
- F1分数(F1 Score):精确率和召回率的调和平均数。
- \(F1 = 2 \times \frac{\text{Precision} \times \text{Recall}}{\text{Precision} + \text{Recall}} \)
- ROC曲线和AUC:ROC 曲线(受试者工作特征曲线)展示了不同阈值下的真阳性率和假阳性率,AUC(曲线下面积)表示模型区分正负类的能力。
-
多重共线性
在逻辑回归中,多重共线性仍然是一个重要的问题。它会导致回归系数估计的不稳定性和解释力的降低。检测和解决多重共线性的方法与线性回归中相同,包括相关矩阵、方差膨胀因子(VIF)和条件数等。
2.3. Python 代码 #
以下是一个使用 scikit-learn 库实现逻辑回归的示例:
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import confusion_matrix, accuracy_score, precision_score, recall_score, f1_score, roc_auc_score, roc_curve
import matplotlib.pyplot as plt
# 假设我们有一些数据
X = np.array([[1, 1], [1, 2], [2, 2], [2, 3], [3, 3], [3, 4]])
y = np.array([0, 0, 0, 1, 1, 1])
# 拆分数据集,使用 stratify=y 参数,以保持训练集和测试集中类别的比例一致。
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42, stratify=y)
# 创建逻辑回归模型并进行拟合
model = LogisticRegression()
model.fit(X_train, y_train)
# 预测
predictions = model.predict(X_test)
# 评估
accuracy = accuracy_score(y_test, predictions)
precision = precision_score(y_test, predictions, zero_division=0)
recall = recall_score(y_test, predictions, zero_division=0)
f1 = f1_score(y_test, predictions, zero_division=0)
roc_auc = roc_auc_score(y_test, model.predict_proba(X_test)[:, 1])
# 打印评估结果
print(f"Accuracy: {accuracy}")
print(f"Precision: {precision}")
print(f"Recall: {recall}")
print(f"F1 Score: {f1}")
print(f"ROC AUC: {roc_auc}")
# 混淆矩阵
cm = confusion_matrix(y_test, predictions)
print("Confusion Matrix:")
print(cm)
fpr, tpr, _ = roc_curve(y_test, model.predict_proba(X_test)[:, 1])
plt.plot(fpr, tpr, label=f'ROC curve (area = {roc_auc:.2f})')
plt.plot([0, 1], [0, 1], 'k--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic (ROC) Curve')
plt.legend(loc="lower right")
plt.show()