第八章《搞懂算法:逻辑回归是怎么回事》笔记

本文介绍了逻辑回归的基本原理,包括其在概率估计中的应用,与线性回归的区别,以及如何通过sigmoid函数进行分类。详细阐述了损失函数的选择和优化方法,以及正则化策略防止过拟合,并给出了编程实践的步骤。

8.1 如何理解逻辑回归

逻辑回归根据给定的自变量数据集来估计事件的发生概率,由于结果是一个概率,因此因变量的范围在 0 和 1 之间。

逻辑回归的与线性回归一样,也是以线性函数为基础的;而与线性回归不同的是,逻辑回归在线性函数的基础上添加了一个非线性函数,如sigmoid函数,使其可以进行分类。

逻辑回归是一种典型的分类问题处理算法,其中二分类(LR)是多分类 (softmax)的基础或者说多分类可以由多个二分类模拟得到。

8.2 逻辑回归算法实现过程

(1)选择算法。

根据经验和观察,我们认为房屋面积、房间数、朝向、地址等特征变量与目标变量“房价” 之间似乎存在着某种线性关系,应该用线性回归算法来表达。但是,现在情况有了变化,历史样本数据中的“房价”数据只给出“高档房屋”“普通房屋”这种分类,因此需要将线性回归算法的函数值压缩为 0 ~ 1。

sigmoid 函数恰好提供了这样的功能。将线性回归算法的函数值 f (x) 作为 sigmoid 函数的自 变量,就可以得到,从而将最终“房价”计算值压缩为 (0,1)。

(2)损失函数。

在线性回归模型中,我们采用最小二乘法,也就是均方误差作为“差别” 的度量标准,所以我们需要找到一组参数 w 和 b,使得均方误差最小化。但是逻辑回归模型表达式是非线性的,这会造成均方误差表达式不是凸函数,无法采用常用的梯度下降法来求解使得损失函数最小化的参数值。研究者们最后提出了如下的损失函数:

第一,我们寻找的损失函数一定符合这样的特点:如果真实值和计算值差距很大,那么损失函数的值一定很大;如果真实值和计算值差距很小,那么损失函数的值一 定很小。

第二,这里的 y 表示房价档次的真实值,可能是 0 或者 1;这里的 f (x) 表示的是把一组特 征变量的历史数据(房屋面积、房间数等)作为自变量输入具体逻辑回归模型(带有参数)后 计算出来的数值,这个结果是 (0,1) 的某个实数。

第三,当真实值是“高档房屋”,也就是 y =1 所表达的含义。如果某组参数确定的逻辑回 归模型f (x)计算出的房价档次数值越接近1,就说明这是一组不错的参数,那么损失函数值就应该越小。当 f (x)趋近1时,损失函数表达式-log( f (x))的数值趋近0,非常符合要求。如果f (x)趋近0,损失函数趋于+∞,说明这组参数非常糟糕。

第四,当真实值是“普通房屋”,也就是 y = 0 所表达的含义。f(x)和损失函数趋势类似三。

(3)参数估计。

上述损失函数本质上也是一个凸函数。而对凸函数就可以采用梯度下降法来求解损失函数值达到最小时所对应的参数值。具体做法与线性回归算法类似。

(4)正则化。

为了解决这种过拟合的问题,也需要采取正则化的方法,将系数估计朝 0 的方向进 行约束、调整或缩小,降低模型在学习过程中的复杂度和不稳定程度,从而尽量避免过拟合情况。

8.3 编程实践:手把手教你写代码

```markdown 代码概述 本任务基于 `笔记本电脑价格.csv` 文件,使用两种基础数据分析算法:**线性回归** 和 **K-means 聚类** 对笔记本电脑价格进行分析。线性回归用于探索硬件配置对价格的影响;K-means 聚类则从无监督角度发现设备的潜在分组模式(如低端、中端、高端机型)。 给出答案(答案为带注释的代码块) ```python import pandas as pd import numpy as np from sklearn.linear_model import LinearRegression from sklearn.cluster import KMeans from sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_split from sklearn.metrics import mean_squared_error, r2_score import matplotlib.pyplot as plt # 1. 读取数据 df = pd.read_csv('笔记本电脑价格.csv', encoding='utf-8') # 2. 数据清洗:处理Ram列(例如'8GB' → 8) df['Ram'] = df['Ram'].str.replace('GB', '', regex=False).astype(int) # 处理Memory列:提取SSD容量(单位GB),忽略HDD def extract_ssd(memory): memory = str(memory).lower() import re if 'ssd' in memory: match = re.search(r'(\d+)gb\s+ssd', memory) or re.search(r'(\d+)', memory.split('ssd')[0]) return int(match.group(1)) if match else 0 elif 'flash storage' in memory: match = re.search(r'(\d+)', memory) return int(match.group(1)) if match else 0 else: return 0 df['SSD_Capacity'] = df['Memory'].apply(extract_ssd) # 3. 线性回归分析:用Ram和SSD_Capacity预测价格 print("=== 线性回归分析 ===") X_reg = df[['Ram', 'SSD_Capacity']] y = df['Price_euros'] # 划分训练测试集 X_train, X_test, y_train, y_test = train_test_split(X_reg, y, test_size=0.2, random_state=42) # 训练模型 lr_model = LinearRegression() lr_model.fit(X_train, y_train) y_pred = lr_model.predict(X_test) # 评估 mse = mean_squared_error(y_test, y_pred) r2 = r2_score(y_test, y_pred) print(f"回归系数: Ram={lr_model.coef_[0]:.2f}, SSD={lr_model.coef_[1]:.2f}") print(f"截距: {lr_model.intercept_:.2f}") print(f"MSE: {mse:.2f}, R²: {r2:.2f}") # 可视化预测结果 plt.figure(figsize=(8, 6)) plt.scatter(y_test, y_pred, color='purple', alpha=0.6) plt.plot([y.min(), y.max()], [y.min(), y.max()], 'r--', lw=2) plt.xlabel('真实价格(€)') plt.ylabel('预测价格(€)') plt.title('线性回归:真实 vs 预测价格') plt.grid(True) plt.show() # 4. K-means 聚类分析:对笔记本进行分组 print("\n=== K-means 聚类分析 ===") # 选取特征(增加重量和屏幕尺寸以丰富聚类维度) df['Inches'] = pd.to_numeric(df['Inches'], errors='coerce').fillna(15.6) # 默认15.6寸 X_clust = df[['Ram', 'SSD_Capacity', 'Inches', 'Price_euros']] # 标准化特征 scaler = StandardScaler() X_scaled = scaler.fit_transform(X_clust) # 使用肘部法确定最优簇数 inertias = [] k_range = range(1, 10) for k in k_range: kmeans = KMeans(n_clusters=k, random_state=42, n_init=10) kmeans.fit(X_scaled) inertias.append(kmeans.inertia_) # 绘制肘部图 plt.figure(figsize=(8, 5)) plt.plot(k_range, inertias, 'bo-', markersize=6) plt.title('K-means 肘部图') plt.xlabel('聚类数量 k') plt.ylabel('簇内平方和(Inertia)') plt.grid(True) plt.show() # 选定k=3进行聚类 optimal_k = 3 kmeans_final = KMeans(n_clusters=optimal_k, random_state=42, n_init=10) clusters = kmeans_final.fit_predict(X_scaled) # 添加聚类标签到原数据 df['Cluster'] = clusters # 分析每类平均价格与配置 cluster_summary = df.groupby('Cluster')[['Price_euros', 'Ram', 'SSD_Capacity', 'Inches']].mean() print("各聚类中心特征均值:") print(cluster_summary) # 可视化聚类结果(用前两个主成分降维展示) from sklearn.decomposition import PCA pca = PCA(n_components=2) X_pca = pca.fit_transform(X_scaled) plt.figure(figsize=(9, 6)) scatter = plt.scatter(X_pca[:, 0], X_pca[:, 1], c=clusters, cmap='viridis', alpha=0.7) plt.colorbar(scatter) plt.title('K-means 聚类结果(PCA 降维可视化)') plt.xlabel('第一主成分') plt.ylabel('第二主成分') plt.grid(True) plt.show() print(f"\n共识别出 {optimal_k} 类笔记本:可用于市场细分(如入门级、主流、高性能产品线)。") ``` 代码解析 1. **数据清洗与特征构造**:统一 `Ram` 和 `SSD_Capacity` 为数值型,便于建模;补充 `Inches` 数值化处理缺失值。 2. **线性回归部分**: - 使用 RAM 和 SSD 作为自变量预测价格; - 输出模型参数及 $R^2$ 指标判断拟合优度; - 图形化展示预测准确性。 3. **K-means 聚类部分**: - 对多维特征标准化后运行 K-means; - 利用“肘部法则”选择最优聚类数; - 使用 PCA 将高维聚类结果投影至二维空间可视化; - 输出各类别平均硬件与价格水平,揭示市场层级。 4. **综合分析逻辑**: - 回归反映个体属性对价格的边际影响; - 聚类揭示整体市场自然形成的设备群体结构。 知识点(列出该代码中遇到的知识点) 1. **线性回归**:建立价格与硬件参数的线性关系模型,用于量化影响程度和价格预测。 2. **K-means 聚类**:无监督学习方法,根据相似性将样本划分为若干组,适用于市场细分场景。 3. **数据标准化与PCA**:聚类前需消除量纲差异,PCA用于高维数据降维以便于可视化分析。 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值