# 回归和聚类算法体系 ## 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. 性能评估(均方误差) ```python 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 $$ - **参数**:正则强度α(控制惩罚力度) - **优点**:缓解多重共线性,提升泛化能力 ```python 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](../../_resources/cancer_demo.py) --- ## 4.5 模型保存与加载 - **保存**:使用`import joblib` ```python joblib.dump(model, 'model.pkl') ``` - **加载**: ```python 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](../../_resources/instacart_pca.py)