基于LLM与多智能体的微服务自治运维系统设计与实践
2026/5/24 4:13:03
线性回归是统计学和机器学习中最基础的回归分析方法,核心目标是构建自变量(特征)与连续型因变量(标签)之间的线性关系模型,通过拟合最优直线 / 超平面,实现对连续值的预测。以下是从核心定义到应用要点的全维度梳理:
适用于单个特征预测单个连续标签,是线性回归的基础形式:
适用于多个特征预测单个连续标签(如 10 个特征预测糖尿病病情),是实际场景中最常用的形式:
线性回归的优化目标是找到最优的W(系数)和b(截距),使得残差平方和(SSE)最小:
线性回归的可靠性依赖 4 个关键假设,违反假设会导致模型系数失真、预测失效:
特征与因变量之间存在显著的线性关系(如血糖越高,糖尿病病情指数越高);
样本之间相互独立,无自相关性(如时间序列数据中 “今天的血糖值影响明天的血糖值” 则违反独立性);
残差的方差在所有样本上恒定,无 “异方差”(如低血糖样本的预测误差小,高血糖样本的预测误差大);
残差服从正态分布(大部分残差集中在 0 附近,极端残差极少);
线性回归的核心是 “线性假设 + 最小二乘优化”,是回归任务的 “入门基准模型”:
import numpy as np import pandas as pd from sklearn.preprocessing import StandardScaler from sklearn.metrics import r2_score, mean_squared_error from sklearn.model_selection import train_test_split class MyLinearRegression: def __init__(self): self.coef_ = None # 回归系数(对应10个特征的w1-w10) self.intercept_ = None # 截距(对应b) def fit(self, X, y): """ 训练模型:用最小二乘法求解参数 X: 特征矩阵 (n_samples, n_features) y: 标签向量 (n_samples,) """ # 步骤1:给X添加截距列(全1列),对应b的系数 X_with_intercept = np.hstack([np.ones((X.shape[0], 1)), X]) # 步骤2:最小二乘法公式求解参数 W = (X^T X)^-1 X^T y # X^T X:特征的协方差矩阵,(X^T X)^-1:逆矩阵,X^T y:特征与标签的协方差 X_T = X_with_intercept.T try: X_T_X_inv = np.linalg.inv(X_T @ X_with_intercept) # 矩阵求逆 except np.linalg.LinAlgError: # 若矩阵不可逆(特征线性相关),用伪逆 X_T_X_inv = np.linalg.pinv(X_T @ X_with_intercept) W = X_T_X_inv @ X_T @ y # 拆分截距和系数:W[0]是截距,W[1:]是10个特征的系数 self.intercept_ = W[0] self.coef_ = W[1:] def predict(self, X): """预测:y = w1x1 + w2x2 + ... + w10x10 + b""" return X @ self.coef_ + self.intercept_ # ---------------------- 1. 读取CSV数据 ---------------------- df = pd.read_csv("糖尿病数据.csv") # 检查缺失值(必须处理,否则矩阵运算报错) if df.isnull().any().any(): df = df.fillna(df.mean()) # 缺失值用均值填充(简单有效) # 拆分特征(X)和标签(y):前10列是特征,最后1列是结果 X = df.iloc[:, :-1].values # (n_samples, 10) y = df.iloc[:, -1].values # (n_samples,) # ---------------------- 2. 数据预处理(标准化) ---------------------- # 线性回归对尺度敏感,10个特征需标准化(Z-score) scaler = StandardScaler() X_scaled = scaler.fit_transform(X) # 标准化后的特征 # 划分训练集/测试集(避免过拟合,验证模型泛化能力) X_train, X_test, y_train, y_test = train_test_split( X_scaled, y, test_size=0.2, random_state=42 # 20%作为测试集 ) # ---------------------- 3. 训练手动实现的线性回归 ---------------------- my_lr = MyLinearRegression() my_lr.fit(X_train, y_train) # 输出参数:10个特征的系数 + 截距 print("=== 手动实现线性回归参数 ===") print(f"截距 b = {my_lr.intercept_:.4f}") for i in range(10): print(f"特征{i + 1}的系数 w{i + 1} = {my_lr.coef_[i]:.4f}") # ---------------------- 4. 预测与评估 ---------------------- # 训练集预测 y_train_pred = my_lr.predict(X_train) # 测试集预测 y_test_pred = my_lr.predict(X_test) # 评估指标(拟合优度R²、均方误差MSE) print("\n=== 模型评估结果 ===") # 训练集 print(f"训练集 R² = {r2_score(y_train, y_train_pred):.4f}") print(f"训练集 MSE = {mean_squared_error(y_train, y_train_pred):.4f}") # 测试集(关键:泛化能力) print(f"测试集 R² = {r2_score(y_test, y_test_pred):.4f}") print(f"测试集 MSE = {mean_squared_error(y_test, y_test_pred):.4f}") # ---------------------- 5. 对比sklearn官方实现(验证正确性) ---------------------- from sklearn.linear_model import LinearRegression sk_lr = LinearRegression() sk_lr.fit(X_train, y_train) print("\n=== sklearn官方线性回归参数(对比验证) ===") print(f"截距 b = {sk_lr.intercept_:.4f}") for i in range(10): print(f"特征{i + 1}的系数 w{i + 1} = {sk_lr.coef_[i]:.4f}") # 对比预测结果(应几乎一致) sk_y_test_pred = sk_lr.predict(X_test) print(f"\nsklearn测试集 R² = {r2_score(y_test, sk_y_test_pred):.4f}") # 加L2正则(Ridge)优化(手动实现可参考,或直接用sklearn) from sklearn.linear_model import Ridge ridge_lr = Ridge(alpha=1.0) # alpha越大,正则化越强 ridge_lr.fit(X_train, y_train) print(f"Ridge测试集 R² = {r2_score(y_test, ridge_lr.predict(X_test)):.4f}")截距 b = 151.3457 特征1的系数 w1 = 1.8027 特征2的系数 w2 = -11.5092 特征3的系数 w3 = 25.8006 特征4的系数 w4 = 16.5388 特征5的系数 w5 = -44.3051 特征6的系数 w6 = 24.6408 特征7的系数 w7 = 7.7723 特征8的系数 w8 = 13.0952 特征9的系数 w9 = 35.0169 特征10的系数 w10 = 2.3150 === 模型评估结果 === 训练集 R² = 0.5279 训练集 MSE = 2868.5466 测试集 R² = 0.4526 测试集 MSE = 2900.1733 === sklearn官方线性回归参数(对比验证) === 截距 b = 151.3457 特征1的系数 w1 = 1.8027 特征2的系数 w2 = -11.5092 特征3的系数 w3 = 25.8006 特征4的系数 w4 = 16.5388 特征5的系数 w5 = -44.3051 特征6的系数 w6 = 24.6408 特征7的系数 w7 = 7.7723 特征8的系数 w8 = 13.0952 特征9的系数 w9 = 35.0169 特征10的系数 w10 = 2.3150 sklearn测试集 R² = 0.4526 Ridge测试集 R² = 0.4541