4、回归和聚类算法体系.md 7.0 KB

回归和聚类算法体系

4.1 线性回归

4.1.1 原理

线性回归通过建立特征与目标值的线性关系进行预测:

$$ y = w_1x_1 + w_2x_2 + ... + w_nx_n + b = \mathbf{w}^T\mathbf{x} + b $$

  • 广义线性模型允许非线性关系(如多项式特征)
  • 示例:期末成绩 = 0.7×考试成绩 + 0.3×平时成绩

4.1.2 损失与优化

  • 损失函数:最小二乘法(均方误差)
  • 优化方法
    • 正规方程:直接求解参数(需矩阵可逆)
    • 梯度下降:迭代更新参数(适合大规模数据)

4.1.3 波士顿房价预测流程

  1. 数据获取与划分
  2. 特征标准化
  3. 模型训练(fit()
  4. 参数查看(coef_/intercept_
  5. 性能评估(均方误差)

    import os
    import urllib
    import pandas as pd
    import numpy as np
    from sklearn.linear_model import LinearRegression, SGDRegressor
    
    from sklearn.model_selection import train_test_split
    from sklearn.preprocessing import StandardScaler
    from sklearn.metrics import mean_squared_error
    
    
    # noinspection HttpUrlsUsage
    def load_boston():
    """
    加载Boston数据集
    :return:
    """
    
    data_url = "http://lib.stat.cmu.edu/datasets/boston"
    if not os.path.exists("boston.data"):
        urllib.request.urlretrieve(data_url, "boston.data")
    raw_df = pd.read_csv("boston.data", sep="\s+", skiprows=22, header=None)
    data = np.hstack([raw_df.values[::2, :], raw_df.values[1::2, :2]])
    target = raw_df.values[1::2, 2]
    return data, target
    
    
    def linear_regression_1():
    """
    正规方程的优化方法对波士顿房价进行预测
    :return:
    """
    # 1)加载数据集
    data, target = load_boston()
    # 2)数据集的划分
    x_train, x_test, y_train, y_test = train_test_split(data, target, test_size=0.2, random_state=0)
    
    # 3) 标准化
    scaler = StandardScaler()
    x_train = scaler.fit_transform(x_train)
    x_test = scaler.transform(x_test)
    
    # 4) 预估器训练
    estimator = LinearRegression()
    estimator.fit(x_train, y_train)
    
    # 5) 模型
    print("正规方程的系数为:", estimator.coef_)
    print("正规方程的偏置为:", estimator.intercept_)
    
    # 6) 模型评估
    y_predict = estimator.predict(x_test)
    print("正规方程的均方误差为:", mean_squared_error(y_test, y_predict))
    
    return None
    
    
    def linear_regression_2():
    """
    梯度下降的优化方法对波士顿房价进行预测
    :return:
    """
    # 1)加载数据集
    data, target = load_boston()
    # 2)数据集的划分
    x_train, x_test, y_train, y_test = train_test_split(data, target, test_size=0.2, random_state=0)
    
    # 3) 标准化
    scaler = StandardScaler()
    x_train = scaler.fit_transform(x_train)
    x_test = scaler.transform(x_test)
    
    # 4) 预估器训练
    estimator = SGDRegressor(learning_rate="constant", max_iter=10000, eta0=0.01, penalty='l1')
    estimator.fit(x_train, y_train)
    
    # 5) 模型
    print("梯度下降的系数为:", estimator.coef_)
    print("梯度下降的偏置为:", estimator.intercept_)
    
    # 6) 模型评估
    y_predict = estimator.predict(x_test)
    print("梯度下降的均方误差为:", mean_squared_error(y_test, y_predict))
    return None
    
    
    if __name__ == '__main__':
    linear_regression_1()
    linear_regression_2()
    
    

4.2 欠拟合与过拟合

4.2.1 表现与解决

现象 原因 解决方法
欠拟合 特征不足/模型简单 增加特征、使用复杂模型
过拟合 特征过多/噪声干扰 正则化、交叉验证、特征选择

4.2.2 正则化

  • L1正则化(Lasso):产生稀疏解,适合特征选择
  • L2正则化(Ridge):限制参数大小,防止过拟合

4.3 岭回归(Ridge Regression)

  • 原理:在损失函数中加入L2正则项

$$ L(\mathbf{w}) = \sum(y_i - \hat{y}_i)^2 + \lambda\sum w_j^2 $$

  • 参数:正则强度α(控制惩罚力度)
  • 优点:缓解多重共线性,提升泛化能力

    import os
    import urllib
    import pandas as pd
    import numpy as np
    from sklearn.linear_model import Ridge
    
    from sklearn.model_selection import train_test_split
    from sklearn.preprocessing import StandardScaler
    from sklearn.metrics import mean_squared_error
    
    
    # noinspection HttpUrlsUsage
    def load_boston():
    """
    加载Boston数据集
    :return:
    """
    
    data_url = "http://lib.stat.cmu.edu/datasets/boston"
    if not os.path.exists("boston.data"):
        urllib.request.urlretrieve(data_url, "boston.data")
    raw_df = pd.read_csv("boston.data", sep="\s+", skiprows=22, header=None)
    data = np.hstack([raw_df.values[::2, :], raw_df.values[1::2, :2]])
    target = raw_df.values[1::2, 2]
    return data, target
    
    
    def linear_regression_3():
    """
    岭回归的优化方法对波士顿房价进行预测
    :return:
    """
    # 1)加载数据集
    data, target = load_boston()
    # 2)数据集的划分
    x_train, x_test, y_train, y_test = train_test_split(data, target, test_size=0.2, random_state=0)
    
    # 3) 标准化
    scaler = StandardScaler()
    x_train = scaler.fit_transform(x_train)
    x_test = scaler.transform(x_test)
    
    # 4) 预估器训练
    estimator = Ridge(max_iter=10000)
    estimator.fit(x_train, y_train)
    
    # 5) 模型
    print("岭回归的系数为:", estimator.coef_)
    print("岭回归的偏置为:", estimator.intercept_)
    
    # 6) 模型评估
    y_predict = estimator.predict(x_test)
    print("岭回归的均方误差为:", mean_squared_error(y_test, y_predict))
    return None
    
    
    if __name__ == '__main__':
    linear_regression_3()
    
    

4.4 分类算法:逻辑回归

4.4.1 原理

  • 激活函数:Sigmoid函数将线性输出映射到[0,1]

$$ \sigma(z) = \frac{1}{1 + e^{-z}} $$

  • 决策边界:设定阈值(如0.5)划分类别

4.4.2 性能评估

  • 混淆矩阵:TP/FN/FP/TN
  • 评估指标
    • 精确率(Precision):查得准
    • 召回率(Recall):查得全
    • F1-score:综合指标
    • ROC曲线与AUC:衡量分类器整体性能

4.4.3 案例:乳腺癌预测

  1. 数据预处理(处理缺失值)
  2. 特征标准化
  3. 模型训练与预测
  4. 评估(关注召回率)

cancer_demo.py


4.5 模型保存与加载

  • 保存:使用import joblib

    joblib.dump(model, 'model.pkl')
    
  • 加载

    model = joblib.load('model.pkl')
    

4.6 无监督学习:K-means

4.6.1 原理

  1. 随机初始化聚类中心
  2. 分配样本到最近中心
  3. 更新中心为簇均值
  4. 迭代直至收敛

4.6.2 性能评估

  • 轮廓系数:衡量簇内聚度与分离度

$$ s = \frac{b_i - a_i}{\max(a_i, b_i)} $$

  • 值越接近1效果越好

4.6.3 案例:用户聚类

  1. 数据降维(PCA)
  2. 聚类分析(k=3)
  3. 可视化与评估

instacart_pca.py