深度学习笔记

文章目录

  • 聚类
      • 导入模块
      • 生成模拟数据
      • 建立并训练 K-Means 聚类模型
      • 创建图形
      • 绘制散点图(聚类结果)
      • 获取聚类中心
      • 可视化聚类中心
      • 设置图形标题和标签
    • 输出效果
  • 数据降维
    • 一、常见的数据降维方法
    • 二、Python 降维示例(用 PCA 将 3D 数据降至 2D)
      • ✅ 第1部分:导入模块
      • ✅ 第2部分:生成模拟数据
      • ✅ 第3部分:PCA降维处理
      • ✅ 第4部分:开始绘图
      • ✅ 第5部分:绘制散点图
      • ✅ 第6部分:完善图像细节并显示
    • ✨ 最终效果
  • 数据降维的作用
    • ✅ 一、降维的主要作用
      • 1. **降低计算复杂度**
      • 2. **可视化高维数据**
      • 3. **去除冗余和噪声**
      • 4. **防止“维数灾难”(curse of dimensionality)**
      • 5. **提高模型性能**
    • 二、常用降维方法简表
    • ✅ 总结一句话:
  • 模型性能的度量
      • ✅ 一、模型性能度量的意义(简要介绍)
      • ✅ 二、常见性能度量指标(简要分类)
      • ✅ 三、Python 示例:使用 sklearn 设置模型性能度量方法
        • 示例代码(分类任务)
    • 一、背景:鸢尾花数据集简介(Iris Dataset)
    • 二、为什么做二分类?
    • 三、机器学习流程(逻辑回归模型)
        • 1️⃣ 数据预处理
      • 2️⃣ 模型训练
        • 3️⃣ 模型预测
      • 四、模型性能评估指标(详细解释)
      • 五、完整代码示例(逻辑回归 + 二分类评估)
      • 六、输出解释
    • 逐行解释代码
      • ✅ 第1步:导入必要模块
    • ✅ **整体功能:**
      • 第1行:
      • ✅ 意思:创建一个逻辑回归模型对象
      • 第2行:
      • ✅ 意思:用训练数据训练模型
    • 举个例子帮助理解:
    • 训练完成后你可以做:
    • ✅ 1. `model.predict(X_test)`
      • 功能:
      • 输入:
      • 输出:
      • 用途:
    • ✅ 2. `model.predict_proba(X_test)`
      • 功能:
      • 输入:
      • 输出:
      • 用途:
    • ✅ 3. `model.coef_`
      • 功能:
      • 输出:
      • 用途:
    • ✅ 4. `model.score(X_test, y_test)`
      • 功能:
      • 输入:
      • 输出:
      • 用途:
    • 总结表:
    • ✅ 总结一句话:
    • ✅ 总结一下:这段代码完成了什么?
    • ✅ 一、什么是 R²(决定系数)
      • 定义:
      • 数学表达式:
    • ✅ 二、Python 示例:线性回归 + R² 可视化
    • ✅ 第一步:模拟带噪声的线性数据
      • 目标:
      • 示例代码:
      • 图示说明:
    • ✅ 第二步:拟合线性回归模型
      • 目标:
      • 示例代码:
    • ✅ 第三步:预测 + 可视化结果
      • 预测:
      • 可视化代码:
    • ✅ 第四步:输出 R² 评分
      • 目标:
      • R² 含义:
    • 总结:整个流程图
    • ✅ 想深入?你可以进一步学习:
    • ✅ 完整代码 + 逐行解释
      • 导入所需模块:
      • 设置绘图中文支持:
      • 设置随机数种子:
      • 生成模拟自变量(特征)X:
      • 构造因变量(目标值)y:
      • ✂️ 划分训练集和测试集:
      • 创建线性回归模型对象:
      • 训练模型(拟合):
      • 进行预测:
      • 计算并输出 R² 分数:
      • 创建图像窗口:
      • 绘制散点图(测试集真实值):
      • 绘制预测回归线:
      • ️ 添加标题:
      • 添加坐标轴标签:
      • 添加图例和网格线:
      • 显示图像窗口
    • ✅ 总结流程
    • ✅ 三、运行结果说明
    • ✅ 四、适用场景
  • 无监督学习与监督学习
    • ✅ 一、监督学习(Supervised Learning)
      • 定义:
      • 举例:
      • 常见任务:
      • 常见算法:
    • ✅ 二、无监督学习(Unsupervised Learning)
      • 定义:
      • 举例:
      • 常见任务:
      • 常见算法:
    • ✅ 三、监督 vs 无监督:对比表
    • ✅ 四、实际应用场景对比
    • ✅ 五、延伸:半监督 & 强化学习
    • ✅ 六、小结

聚类

我们用 sklearn 实现一个二维数据的 K-Means 聚类并可视化:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans

# 1. 生成模拟数据(3个簇)
X, y_true = make_blobs(n_samples=300, centers=3, cluster_std=0.6, random_state=42)

# 2. 训练K-Means模型
kmeans = KMeans(n_clusters=3, random_state=42)
kmeans.fit(X)
y_kmeans = kmeans.predict(X)

# 3. 可视化聚类结果
plt.figure(figsize=(8, 6))
plt.scatter(X[:, 0], X[:, 1], c=y_kmeans, s=50, cmap='viridis')
centers = kmeans.cluster_centers_
plt.scatter(centers[:, 0], centers[:, 1], c='black', s=200, alpha=0.7, marker='X', label='Centers')
plt.title("K-Means Clustering Result")
plt.xlabel("Feature 1")
plt.ylabel("Feature 2")
plt.legend()
plt.grid(True)
plt.show()

当然,下面是对前面那段 K-Means 聚类 Python 示例的逐行解释,适合初学者理解:


import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans

导入模块

  • numpy:用于数值计算;
  • matplotlib.pyplot:用于绘图;
  • make_blobs:生成模拟聚类数据(内置在 sklearn.datasets);
  • KMeans:K-Means 聚类模型(sklearn.cluster 模块)。

# 1. 生成模拟数据(3个簇)
X, y_true = make_blobs(n_samples=300, centers=3, cluster_std=0.6, random_state=42)

生成模拟数据

  • n_samples=300:共生成 300 个样本;
  • centers=3:将数据划分为 3 个簇;
  • cluster_std=0.6:每个簇内部的散布程度(标准差);
  • random_state=42:确保每次运行结果一致(设置随机种子);
  • X:二维数组,形状为 (300, 2),表示 300 个二维数据点;
  • y_true:每个样本的真实簇标签(仅用于可视化参考,不参与训练)。

# 2. 训练K-Means模型
kmeans = KMeans(n_clusters=3, random_state=42)
kmeans.fit(X)
y_kmeans = kmeans.predict(X)

建立并训练 K-Means 聚类模型

  • KMeans(n_clusters=3):告诉模型我们期望分成 3 个簇;
  • .fit(X):根据数据 X 训练模型,学习出每个簇的中心;
  • .predict(X):为每个点预测所属的簇编号(0、1 或 2);
  • y_kmeans:模型预测的簇标签数组,形状为 (300,)。

# 3. 可视化聚类结果
plt.figure(figsize=(8, 6))

创建图形

  • 设置画布大小为 8x6 英寸。

plt.scatter(X[:, 0], X[:, 1], c=y_kmeans, s=50, cmap='viridis')

绘制散点图(聚类结果)

  • X[:, 0]:第1列(x坐标),X[:, 1]:第2列(y坐标);
  • c=y_kmeans:根据聚类标签着色;
  • s=50:点的大小;
  • cmap='viridis':颜色映射(紫→绿)。

centers = kmeans.cluster_centers_

获取聚类中心

  • cluster_centers_:返回每个簇的二维坐标中心点(形状为 (3, 2))。

plt.scatter(centers[:, 0], centers[:, 1], c='black', s=200, alpha=0.7, marker='X', label='Centers')

可视化聚类中心

  • 黑色大 X 点表示每个簇的中心;
  • s=200:点很大;
  • alpha=0.7:透明度;
  • label='Centers':用于图例说明。

plt.title("K-Means Clustering Result")
plt.xlabel("Feature 1")
plt.ylabel("Feature 2")
plt.legend()
plt.grid(True)
plt.show()

设置图形标题和标签

  • title():图标题;
  • xlabel() / ylabel():轴标签;
  • legend():显示图例(簇中心);
  • grid(True):添加网格线;
  • show():显示图形。

输出效果

你运行这段代码后会看到一个 2D 散点图,分为三类,每类用不同颜色表示,中心点用黑色 X 表示。


数据降维

**数据降维(Dimensionality Reduction)**是将高维数据映射到低维空间的技术,同时尽可能保留原始数据的关键信息。常用于:

  • 可视化高维数据(如二维/三维展示)
  • 降低计算复杂度
  • 去除噪声、冗余特征
  • 解决“维数灾难”

一、常见的数据降维方法

方法 说明
PCA(主成分分析) 保留数据方差最大方向的投影(线性降维)
t-SNE 保留局部结构,适合可视化(非线性降维)
UMAP 比 t-SNE 更快、更能保持全局结构(非线性)
LDA 有监督降维,最大化类间差异

二、Python 降维示例(用 PCA 将 3D 数据降至 2D)

这段代码的作用是:生成一个3维、3类的模拟分类数据集,用 PCA 将其降维为2维,并用散点图可视化降维后的结果。

我们用 PCA + matplotlib 可视化:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.decomposition import PCA

# 1. 生成模拟的 3D 数据(含3个特征)
X, y = make_classification(n_samples=300, n_features=3, n_redundant=0,
                           n_informative=3, n_clusters_per_class=1, n_classes=3, random_state=42)

# 2. 使用PCA将数据从3维降到2维
pca = PCA(n_components=2)
X_reduced = pca.fit_transform(X)

# 3. 可视化降维后的数据
plt.figure(figsize=(8, 6))
plt.scatter(X_reduced[:, 0], X_reduced[:, 1], c=y, cmap='Set1', s=40, edgecolor='k')
plt.title("PCA: 3D data reduced to 2D")
plt.xlabel("Principal Component 1")
plt.ylabel("Principal Component 2")
plt.grid(True)
plt.show()


import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.decomposition import PCA

✅ 第1部分:导入模块

  • numpy:用于数值计算;
  • matplotlib.pyplot:用于绘图;
  • make_classification:生成模拟分类数据;
  • PCA:主成分分析类,用于降维。

# 1. 生成模拟的 3D 数据(含3个特征)
X, y = make_classification(n_samples=300, n_features=3, n_redundant=0,
                           n_informative=3, n_clusters_per_class=1, n_classes=3, random_state=42)

✅ 第2部分:生成模拟数据

  • n_samples=300:生成 300 个样本;
  • n_features=3:每个样本有 3 个特征(即 3 维);
  • n_informative=3:3 个特征中全是“有用的”;
  • n_redundant=0:没有冗余特征;
  • n_clusters_per_class=1:每个类别一个簇;
  • n_classes=3:共分为 3 个类别;
  • random_state=42:设置随机种子,使结果可重复;
  • X:特征矩阵,形状为 (300, 3);
  • y:标签数组,包含每个样本所属的类别(0, 1, 2)。

# 2. 使用 PCA 将数据从 3维降到 2维
pca = PCA(n_components=2)
X_reduced = pca.fit_transform(X)

✅ 第3部分:PCA降维处理

  • PCA(n_components=2):指定降维目标是二维;

  • fit_transform(X)

    • fit:分析原始数据的主成分方向(即特征协方差最大方向);
    • transform:将原始数据投影到这两个主方向上;
  • X_reduced:降维后的数据,形状为 (300, 2),可以直接用于二维可视化。


# 3. 可视化降维后的数据
plt.figure(figsize=(8, 6))

✅ 第4部分:开始绘图

  • 设置图像画布大小为 8x6 英寸。

plt.scatter(X_reduced[:, 0], X_reduced[:, 1], c=y, cmap='Set1', s=40, edgecolor='k')

✅ 第5部分:绘制散点图

  • X_reduced[:, 0]:PCA 第一个主成分坐标;
  • X_reduced[:, 1]:第二个主成分;
  • c=y:按类别着色;
  • cmap='Set1':颜色方案,3类颜色清晰可分;
  • s=40:点的大小;
  • edgecolor='k':黑色边框。

plt.title("PCA: 3D data reduced to 2D")
plt.xlabel("Principal Component 1")
plt.ylabel("Principal Component 2")
plt.grid(True)
plt.show()

✅ 第6部分:完善图像细节并显示

  • 设置图标题和坐标轴标签;
  • 添加网格线,增强可读性;
  • plt.show():显示图像。

✨ 最终效果

深度学习笔记_第1张图片

数据降维的作用

降维(Dimensionality Reduction)的作用是在尽可能保留原始数据信息的前提下,将高维数据映射到低维空间。它是数据预处理、可视化和建模中非常重要的一步。


✅ 一、降维的主要作用

1. 降低计算复杂度

  • 特征维度越高,计算量越大(特别在机器学习和深度学习中);
  • 降维可以加快训练速度、减少内存占用。

举例:将 1000 个特征压缩到 50 个,大大减少矩阵运算开销。


2. 可视化高维数据

  • 人眼无法直接理解 3 维以上的数据;
  • 通过降维(如 PCA、t-SNE)可将高维数据投影到二维或三维,方便观察数据分布、聚类结构或分类边界。

举例:PCA 把 50 维数据投影到 2D 平面图,颜色表示类别,清晰看到数据分布。


3. 去除冗余和噪声

  • 原始数据常含有冗余特征或噪声维度;
  • 降维可识别最重要的方向(主成分),去除对分类/聚类无用的信息。

举例:在高维基因表达数据中,仅少数基因与疾病显著相关,其它维度是噪声。


4. 防止“维数灾难”(curse of dimensionality)

  • 在高维空间中,样本之间的距离会变得非常相似,影响模型效果;
  • 降维能提高模型的泛化能力、稳定性。

举例:KNN、SVM 等算法在高维下常过拟合,降维后效果更好。


5. 提高模型性能

  • 去除无关特征后,许多算法(如逻辑回归、树模型)性能会更好;
  • 特别是在样本量远小于特征数(小样本高维)时尤为重要。

举例:在医学中,样本往往只有几百,而变量有几千个,降维后可用于稳健建模。


二、常用降维方法简表

方法 类型 特点
PCA 线性 保留最大方差方向,常用于初步降维
t-SNE 非线性 保留局部结构,适合可视化
UMAP 非线性 比 t-SNE 快,保持全局+局部结构
LDA 线性,有监督 最大化类间差异,常用于分类前处理
Autoencoder 非线性神经网络 深度学习方式的非线性降维

✅ 总结一句话:

降维的核心目标:去掉“无关冗余”,保留“有用本质”。


模型性能的度量

✅ 一、模型性能度量的意义(简要介绍)

模型性能度量是评估一个机器学习模型好坏的手段,能回答这些关键问题:

问题 意义
模型是否准确? 衡量预测与实际结果的接近程度
模型是否稳定? 衡量模型对新数据的泛化能力
模型是否偏向某类? 检查是否过拟合、欠拟合或样本不均衡问题
模型是否适合当前任务? 不同任务(分类、回归、排序)需要不同指标

✅ 二、常见性能度量指标(简要分类)

任务类型 常见指标 说明
分类任务 accuracy, precision, recall, f1-score, ROC-AUC 用于判断分类对错情况
回归任务 MSE, RMSE, MAE, R² 用于衡量预测值与实际值的差异
聚类任务 Silhouette score, Calinski-Harabasz 无监督场景中的结构评估

✅ 三、Python 示例:使用 sklearn 设置模型性能度量方法

下面以 逻辑回归模型 + 分类任务 为例,演示如何设置和使用不同的性能度量方法。

示例代码(分类任务)
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import (
    accuracy_score, precision_score, recall_score,
    f1_score, roc_auc_score, classification_report
)

# 1. 加载数据
X, y = load_iris(return_X_y=True)

# 二分类示例(只保留前两类)
X, y = X[y != 2], y[y != 2]

# 2. 划分训练集与测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 3. 建模
model = LogisticRegression()
model.fit(X_train, y_train)

# 4. 预测
y_pred = model.predict(X_test)
y_prob = model.predict_proba(X_test)[:, 1]  # 预测概率用于AUC

# 5. 性能度量
print("Accuracy:", accuracy_score(y_test, y_pred))
print("Precision:", precision_score(y_test, y_pred))
print("Recall:", recall_score(y_test, y_pred))
print("F1 Score:", f1_score(y_test, y_pred))
print("ROC AUC:", roc_auc_score(y_test, y_prob))
print("\nClassification Report:\n", classification_report(y_test, y_pred))

这个代码是在鸢尾花(Iris)数据集上训练一个二分类模型,并使用多种指标(准确率、精确率、召回率、F1 分数、AUC)来评估模型性能。


一、背景:鸢尾花数据集简介(Iris Dataset)

  • 是 sklearn 自带的经典数据集,常用于分类算法练习。

  • 包含 150 个样本,每个样本代表一朵鸢尾花,共有 3 个品种(Setosa、Versicolor、Virginica)。

  • 每个样本有 4 个特征:

    • 花萼长度(sepal length)
    • 花萼宽度(sepal width)
    • 花瓣长度(petal length)
    • 花瓣宽度(petal width)

二、为什么做二分类?

  • 原始是三分类任务(0, 1, 2 三个类别);
  • 逻辑回归模型是原生支持二分类的
  • 所以我们只选前两类(0 和 1),简化为二分类任务。

例如我们保留:

  • 类别0(Setosa)
  • 类别1(Versicolor)

问题变为:“这朵花是 Setosa 还是 Versicolor?”


三、机器学习流程(逻辑回归模型)

1️⃣ 数据预处理
  • 使用 load_iris() 加载数据;
  • 筛选出标签为 0 和 1 的样本;
  • 使用 train_test_split() 划分训练集和测试集(通常 70% / 30%)。

2️⃣ 模型训练

  • LogisticRegression() 训练一个逻辑回归模型;
  • 拟合训练数据:model.fit(X_train, y_train)
3️⃣ 模型预测
  • model.predict() 预测测试集的类别;
  • model.predict_proba() 预测属于类别1的概率(用于 AUC)。

四、模型性能评估指标(详细解释)

指标 英文名称 说明 示例
准确率 Accuracy 所有预测中,正确的占比 正确预测了90个,总共100个 → 90%
精确率 Precision 预测为正例中,有多少是真的正例 预测为“有病”的人中,真正有病的比例
召回率 Recall 实际为正例中,有多少被预测出来 所有真正有病的人中,有多少被查出
F1 分数 F1-score Precision 和 Recall 的调和平均数 越接近 1 越好,平衡两者的重要性
ROC AUC Area Under Curve 基于预测概率衡量模型排序能力,0.5为随机,1为最优 AUC=0.95 表示模型预测效果非常好

这些指标一起可以全面评估模型的分类能力,特别是在数据不平衡或对某类错误更敏感的情况下。


五、完整代码示例(逻辑回归 + 二分类评估)

from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import (
    accuracy_score, precision_score, recall_score,
    f1_score, roc_auc_score, classification_report
)

# 1. 加载数据(只取前两类,变成二分类)
X, y = load_iris(return_X_y=True)
X, y = X[y != 2], y[y != 2]

# 2. 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.3, random_state=42
)

# 3. 建立逻辑回归模型
model = LogisticRegression()
model.fit(X_train, y_train)

# 4. 预测标签和概率
y_pred = model.predict(X_test)
y_prob = model.predict_proba(X_test)[:, 1]  # 预测为类别1的概率

# 5. 模型评估
print("✅ Accuracy:", accuracy_score(y_test, y_pred))
print("✅ Precision:", precision_score(y_test, y_pred))
print("✅ Recall:", recall_score(y_test, y_pred))
print("✅ F1 Score:", f1_score(y_test, y_pred))
print("✅ ROC AUC:", roc_auc_score(y_test, y_prob))
print("\n Classification Report:\n", classification_report(y_test, y_pred))

六、输出解释

你将看到类似以下结果(示意):

✅ Accuracy: 1.0
✅ Precision: 1.0
✅ Recall: 1.0
✅ F1 Score: 1.0
✅ ROC AUC: 1.0

 Classification Report:
              precision    recall  f1-score   support

           0       1.00      1.00      1.00        16
           1       1.00      1.00      1.00        14

    accuracy                           1.00        30
   macro avg       1.00      1.00      1.00        30
weighted avg       1.00      1.00      1.00        30

说明模型对当前任务表现极好。


逐行解释代码

当然,下面是你提到的逻辑回归 + 二分类 + 模型评估代码的逐行解释,帮助你完全理解每一步在做什么:


from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import (
    accuracy_score, precision_score, recall_score,
    f1_score, roc_auc_score, classification_report
)

✅ 第1步:导入必要模块

  • load_iris:加载鸢尾花(Iris)数据集;
  • LogisticRegression:用于训练一个逻辑回归模型;
  • train_test_split:划分训练集与测试集;
  • 后面一系列 metrics 是用于评估模型性能的函数。

# 1. 加载数据(只取前两类,变成二分类)
X, y = load_iris(return_X_y=True)
  • 加载鸢尾花数据集;
  • X 是特征矩阵,形状为 (150, 4),表示150个样本,每个样本4个特征;
  • y 是目标变量,原始是0、1、2三类标签。

X, y = X[y != 2], y[y != 2]
  • 为了让问题变成二分类,我们去掉了标签为 2 的样本;
  • y != 2 会返回一个布尔数组,表示哪些样本标签不是2;
  • 筛选后,Xy 只包含类别 0 和 1 的数据。

# 2. 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.3, random_state=42
)
  • 将数据集划分为训练集和测试集;
  • test_size=0.3 表示 30% 的样本用于测试;
  • random_state=42 固定随机种子,保证划分结果可复现。

# 3. 建立逻辑回归模型
model = LogisticRegression()
  • 创建一个逻辑回归模型对象;
  • 默认使用 L2 正则化,适合线性可分的数据。

model.fit(X_train, y_train)
  • 用训练数据 X_train, y_train 训练逻辑回归模型;
  • 模型学习每个特征在预测类别中的权重。

这两行代码是 逻辑回归模型的核心训练过程,它们的作用是:


整体功能:

构建一个逻辑回归模型,并用训练数据进行拟合(训练),让模型“学会”如何根据特征预测目标值。


第1行:

model = LogisticRegression()

✅ 意思:创建一个逻辑回归模型对象

  • LogisticRegression() 是 sklearn 提供的逻辑回归分类器;

  • 它还没有被训练,只是定义了一个“空白模型”;

  • 可以设置参数,比如:

    • penalty='l2':L2 正则化(默认)
    • C=1.0:正则强度(越小越强)
    • solver='lbfgs':优化算法选择
    • max_iter=1000:最大迭代次数

第2行:

model.fit(X_train, y_train)

✅ 意思:用训练数据训练模型

  • X_train 是训练特征(二维数组,形如 [样本数, 特征数]);

  • y_train 是对应的训练标签(一维数组);

  • 这一步是 “模型学习” 的过程,它会:

    • 找到最优的参数(权重和偏置);
    • 最小化分类误差(使用对数损失函数);
    • 建立特征与目标值之间的映射关系。

举个例子帮助理解:

假设我们要预测“花是 Setosa 还是 Versicolor”,我们有特征(花瓣长度、花瓣宽度等):

  1. model = LogisticRegression() 相当于:我们拿来一个“空的分类器”。
  2. model.fit(X_train, y_train) 相当于:我们“喂它数据”,它根据这些数据自己去“调整参数”,最终“学会了”怎样判断花的种类。

训练完成后你可以做:

  • model.predict(X_test):预测新样本;
  • model.predict_proba(X_test):输出预测为每一类的概率;
  • model.coef_:查看学到的权重;
  • model.score(X_test, y_test):计算测试集准确率。

这几个方法和属性是 sklearn 中逻辑回归模型常用的接口,我来逐一详细解释它们的作用、返回值,以及什么时候使用它们。


✅ 1. model.predict(X_test)

功能:

输出模型对新样本的预测类别(如 0 或 1)

输入:

  • X_test:测试样本的特征矩阵,形状为 (n_samples, n_features)

输出:

  • 一个一维数组,形如 [0, 1, 1, 0, ...],表示每个样本的预测类别

用途:

  • 用于分类任务最终“落地”结果判断(分为哪一类)

✅ 2. model.predict_proba(X_test)

功能:

输出每个样本属于每个类别的概率

输入:

  • X_test:测试数据集

输出:

  • 一个二维数组,形如 [[0.2, 0.8], [0.7, 0.3], ...]

    • 第 i 行表示第 i 个样本属于类别 0 和 1 的概率(加起来为1)

用途:

  • 需要评估概率相关指标时使用,如:

    • ROC AUC
    • 阈值优化(如设定0.6为正类而非默认0.5)
    • 排序模型或概率建模

✅ 3. model.coef_

功能:

查看模型训练得到的权重(即每个特征的系数)

输出:

  • 一个二维数组,形如 [[w1, w2, ..., wn]]

    • 表示每个特征在分类决策中的影响力

用途:

  • 用于解释模型(哪些特征更重要,正向还是负向)

  • 可与 model.intercept_ 配合,组成完整的线性表达式:

    z = w 1 x 1 + w 2 x 2 + ⋯ + w n x n + b z = w_1 x_1 + w_2 x_2 + \cdots + w_n x_n + b z=w1x1+w2x2++wnxn+b

    然后再经过 sigmoid 得到概率


✅ 4. model.score(X_test, y_test)

功能:

评估模型的“准确率”(Accuracy)

输入:

  • X_test:测试集特征
  • y_test:测试集真实标签

输出:

  • 一个浮点数,例如 0.93 表示预测正确率为 93%

用途:

  • 快速衡量模型整体预测性能(但对不平衡数据不敏感)

总结表:

方法/属性 作用 返回结果类型 用于何时
predict(X) 分类预测(标签) 1D数组(0/1) 最终输出结果
predict_proba(X) 分类预测(概率) 2D数组 模型概率评估、AUC计算
coef_ 权重系数(斜率) 2D数组 模型解释、特征影响分析
score(X, y) 准确率得分 浮点数 快速评估模型整体表现

✅ 总结一句话:

这两行代码完成了:

“创建模型 + 训练模型”这两个关键步骤,是整个机器学习流程的核心之一。

# 4. 预测标签和概率
y_pred = model.predict(X_test)
  • 对测试集进行预测,返回的 y_pred 是预测的类别标签(0 或 1)。

y_prob = model.predict_proba(X_test)[:, 1]  # 预测为类别1的概率
  • predict_proba 返回每个类别的预测概率,形状为 (n_samples, 2)
  • [:, 1] 表示我们只取预测为“类别 1”的概率;
  • 这个用于计算 ROC AUC 分数(基于概率的排序能力)。

# 5. 模型评估
print("✅ Accuracy:", accuracy_score(y_test, y_pred))
  • 准确率:预测正确的比例(所有对的 / 所有样本);

print("✅ Precision:", precision_score(y_test, y_pred))
  • 精确率:预测为正例(1)中,有多少是真的正例;
  • 高精确率说明“误报”少。

print("✅ Recall:", recall_score(y_test, y_pred))
  • 召回率:真正例中,有多少被模型识别为正;
  • 高召回率说明“漏报”少。

print("✅ F1 Score:", f1_score(y_test, y_pred))
  • F1 分数是 Precision 和 Recall 的调和平均;
  • 当你希望 Precision 和 Recall 之间取得平衡时,F1 是好指标。

print("✅ ROC AUC:", roc_auc_score(y_test, y_prob))
  • ROC AUC(Area Under Curve)是二分类中综合排序能力的指标;
  • 范围为0.5~1,越接近1说明模型越好。

print("\n Classification Report:\n", classification_report(y_test, y_pred))
  • 输出一个完整的分类报告表格,包括:

    • 每个类的 precision、recall、f1-score;
    • 每类样本数量(support);
    • 平均指标(macro、weighted、accuracy);
  • 一般用于快速报告模型的整体分类效果。


✅ 总结一下:这段代码完成了什么?

步骤 动作
1 加载鸢尾花数据
2 转换为二分类问题(只保留前两类)
3 划分训练集与测试集
4 用逻辑回归建模训练
5 对测试集进行预测
6 计算并输出多个评价指标:accuracy、precision、recall、f1、AUC
7 输出分类报告,查看模型在每类上的详细表现

# R平方系数

当然!我们来简要介绍一下 R²(R平方系数,决定系数) 的概念,并用 Python 例子+可视化演示它在回归模型评估中的作用


✅ 一、什么是 R²(决定系数)

定义:

R²(R-squared)衡量回归模型对数据变异的解释程度。

它的取值范围:

  • 一般在 0 ~ 1 之间(也可能为负);
  • 越接近 1,模型对数据的拟合越好;
  • 越接近 0,说明模型几乎不能解释数据的变化;
  • 如果为负,表示模型比“用平均值当预测”还差。

数学表达式:

R 2 = 1 − 残差平方和(RSS) 总平方和(TSS) R^2 = 1 - \frac{\text{残差平方和(RSS)}}{\text{总平方和(TSS)}} R2=1总平方和(TSS残差平方和(RSS

其中:

  • RSS(Residual Sum of Squares):预测误差的平方和;
  • TSS(Total Sum of Squares):真实值与均值的差的平方和。

✅ 二、Python 示例:线性回归 + R² 可视化

我们使用 sklearn 的 LinearRegression 模型,并用 r2_score 计算 R²。

“模拟一组带噪声的线性数据 → 拟合线性回归模型 → 可视化预测效果 → 输出 R² 评分”

这是回归建模的标准完整流程,下面我将一步一步用图示 + 概念 + 示例来帮你理解每一部分。


✅ 第一步:模拟带噪声的线性数据

目标:

我们希望生成一组数据点,它们大致满足线性关系 y = ax + b,但加上了随机误差(噪声),更贴近真实场景。

示例代码:

import numpy as np

np.random.seed(42)
X = np.linspace(0, 10, 100).reshape(-1, 1)
noise = np.random.normal(0, 3, size=100)  # 平均值为0,标准差为3的噪声
y = 2.5 * X.flatten() + noise

图示说明:

你可以理解为:

理想线性关系:       y = 2.5x
实际观测点(模拟): y = 2.5x + 随机噪声

如果没有噪声,你会看到一条完美直线;噪声使得点在直线附近上下浮动。


✅ 第二步:拟合线性回归模型

目标:

scikit-learn 的 LinearRegression 找出最优直线 ŷ = âx + b̂,使得预测值尽可能逼近真实的 y

示例代码:

from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
model = LinearRegression()
model.fit(X_train, y_train)
  • .fit(X_train, y_train) 会学出两个参数:斜率截距
  • 它的目标是最小化误差平方和(Ordinary Least Squares, OLS)

✅ 第三步:预测 + 可视化结果

预测:

y_pred = model.predict(X_test)

你用模型对 X_test 预测出一组 y_pred,然后跟 y_test 比较。


可视化代码:

import matplotlib.pyplot as plt

plt.scatter(X_test, y_test, color='blue', label='真实值')   # 蓝点:测试集真实数据
plt.plot(X_test, y_pred, color='red', label='预测回归线')   # 红线:模型预测线
plt.xlabel("X")
plt.ylabel("y")
plt.title("线性回归预测结果")
plt.legend()
plt.grid(True)
plt.show()

✅ 第四步:输出 R² 评分

目标:

R²(决定系数)衡量模型预测能力:

from sklearn.metrics import r2_score
r2 = r2_score(y_test, y_pred)
print(f"R²: {r2:.3f}")

R² 含义:

R² 值范围 含义
1.0 完美拟合(预测值 = 真实值)
~ 0.8 ~ 0.9 拟合很好
0.5 ~ 0.7 有一定拟合能力(数据噪声较多)
0.0 模型效果和猜测一样差
< 0.0 模型比简单平均还差(模型是错误的)

总结:整个流程图

Step 1: 模拟数据 (y = 2.5x + noise)
        ↓
Step 2: 训练线性模型 (LinearRegression)
        ↓
Step 3: 预测 y_pred 并可视化(散点 + 直线)
        ↓
Step 4: 计算并输出 R² 评估模型拟合效果

✅ 想深入?你可以进一步学习:

方向 示例
使用多变量拟合 X = np.c_[x1, x2, x3]
用多项式回归拟合曲线 PolynomialFeatures()
噪声更大时模型误差分析 增加噪声标准差
换用 Lasso、Ridge 回归 LassoCV, RidgeCV

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score
from sklearn.model_selection import train_test_split

# 设置支持中文的字体,并避免负号乱码
plt.rcParams['font.family'] = 'Microsoft YaHei'  # 兼容中文和常用数学符号
plt.rcParams['axes.unicode_minus'] = False

# 1. 生成模拟数据
np.random.seed(42)
X = np.linspace(0, 10, 100).reshape(-1, 1)
y = 2.5 * X.flatten() + np.random.normal(0, 3, size=100)  # 加入噪声

# 2. 拆分训练和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 3. 建立模型并拟合
model = LinearRegression()
model.fit(X_train, y_train)

# 4. 预测
y_pred = model.predict(X_test)

# 5. 计算 R²
r2 = r2_score(y_test, y_pred)
print(f"R2 Score: {r2:.3f}")

# 6. 可视化结果
plt.figure(figsize=(8, 6))
plt.scatter(X_test, y_test, color='blue', label='真实值')
plt.plot(X_test, y_pred, color='red', linewidth=2, label='预测回归线')
plt.title(f"线性回归预测结果\nR2 = {r2:.3f}")
plt.xlabel("X")
plt.ylabel("y")
plt.legend()
plt.grid(True)
plt.show()


当然可以!下面是你提供的线性回归 + R²可视化的完整代码,我将为你逐行详细解释其作用与原理,适合学习与理解。


✅ 完整代码 + 逐行解释

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score
from sklearn.model_selection import train_test_split

导入所需模块:

  • numpy:用于生成模拟数据(数组、数学操作);
  • matplotlib.pyplot:用于绘图;
  • LinearRegression:sklearn中线性回归模型;
  • r2_score:用于计算 R²(决定系数);
  • train_test_split:划分训练集和测试集。

plt.rcParams['font.family'] = 'Microsoft YaHei'
plt.rcParams['axes.unicode_minus'] = False

设置绘图中文支持:

  • 'Microsoft YaHei':设定图中文字的字体(支持中文);
  • 'axes.unicode_minus' = False:防止负号 - 显示为乱码(特别是在 Windows 上)。

np.random.seed(42)

设置随机数种子:

  • 保证每次运行生成的随机数一致;
  • 结果可复现,有利于调试或展示。

X = np.linspace(0, 10, 100).reshape(-1, 1)

生成模拟自变量(特征)X:

  • 在 0 到 10 之间等间距生成 100 个值;
  • .reshape(-1, 1):转换成二维列向量,形状为 (100, 1),用于模型训练。

y = 2.5 * X.flatten() + np.random.normal(0, 3, size=100)

构造因变量(目标值)y:

  • 2.5 * X:模拟线性关系;
  • + 噪声:加入服从正态分布的随机扰动,模拟真实世界数据;
  • X.flatten():将二维 X 展平为一维,便于加噪声。

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42)

✂️ 划分训练集和测试集:

  • 训练集 80%,测试集 20%;
  • random_state=42:固定划分方式,使实验可重复。

model = LinearRegression()

创建线性回归模型对象:

  • model 还没有被训练,只是一个空的线性模型容器。

model.fit(X_train, y_train)

训练模型(拟合):

  • 用训练集的数据 X_trainy_train 来学习模型的参数(斜率和截距);
  • 最小化残差平方和。

y_pred = model.predict(X_test)

进行预测:

  • 用训练好的模型在测试集 X_test 上进行预测;
  • 输出是 y_pred,即模型预测的目标值。

r2 = r2_score(y_test, y_pred)
print(f"R2 Score: {r2:.3f}")

计算并输出 R² 分数:

  • r2_score 衡量预测值与真实值之间的拟合程度;
  • 输出如 R2 Score: 0.906,说明模型解释了 90.6% 的数据波动。

plt.figure(figsize=(8, 6))

创建图像窗口:

  • 设置画布大小为 8 x 6 英寸。

plt.scatter(X_test, y_test, color='blue', label='真实值')

绘制散点图(测试集真实值):

  • 横坐标是 X_test,纵坐标是 y_test
  • 使用蓝色圆点表示。

plt.plot(X_test, y_pred, color='red', linewidth=2, label='预测回归线')

绘制预测回归线:

  • 红线表示模型预测结果;
  • 线宽设置为 2,便于观察。

plt.title(f"线性回归预测结果\nR2 = {r2:.3f}")

️ 添加标题:

  • 支持换行符 \n
  • 显示模型名称和 R² 分数;
  • 因为字体设置为中文可用,所以中文标题可以正常显示。

plt.xlabel("X")
plt.ylabel("y")

添加坐标轴标签:

  • 横轴是输入特征 X;
  • 纵轴是目标变量 y。

plt.legend()
plt.grid(True)

添加图例和网格线:

  • 图例区分“真实值”和“预测回归线”;
  • 网格线便于读数。

plt.show()

显示图像窗口


✅ 总结流程

步骤 操作内容
数据准备 生成模拟线性数据 X, y
数据划分 划分训练集/测试集
模型训练 创建并训练 LinearRegression() 模型
模型预测 使用测试集进行预测
模型评估 计算并输出 R² 决定系数
可视化 画出预测直线与实际点的关系图

是否还需要我用这套代码扩展成多变量线性回归、加入残差分析、或可视化学习过程?可以继续告诉我你的需求!

✅ 三、运行结果说明

  • 会打印出 R² 值,例如 R² Score: 0.906

  • 可视化中:

    • 蓝点表示测试集的真实值;
    • 红线表示模型拟合的直线;
    • 曲线与蓝点越贴合,说明模型拟合效果越好。

✅ 四、适用场景

场景 是否适用 R²
线性/多元线性回归 ✅ 非常适用
非线性回归(配合其他指标) ✅ 可参考
分类问题 ❌ 不适用
时间序列预测 ❓ 小心使用(不稳定)

无监督学习与监督学习

好的,下面是对 监督学习(Supervised Learning)无监督学习(Unsupervised Learning) 的详细介绍,包括定义、核心区别、常见算法、应用场景与示例。


✅ 一、监督学习(Supervised Learning)

定义:

监督学习是指训练数据中包含明确的“输入 + 输出”标签,模型学习从输入到输出的映射关系。

你可以把它想象成**“有老师监督的学习”**:告诉你题目和答案,模型通过这些练习学会解题。


举例:

  • 你给模型一张图像(输入),同时告诉它图中是“猫”还是“狗”(输出标签)。
  • 模型通过大量样本学习图像特征与分类之间的对应关系。

常见任务:

任务类型 输入例子 输出例子
分类 一张图片、一个病人数据 标签:猫/狗,良性/恶性
回归 房屋面积、位置 房价(连续数值)

常见算法:

  • 线性回归 / 逻辑回归
  • 决策树 / 随机森林
  • KNN
  • 支持向量机(SVM)
  • 神经网络 / CNN / LSTM

✅ 二、无监督学习(Unsupervised Learning)

定义:

无监督学习是指训练数据只有输入,没有任何标签。模型目标是发现数据中的隐藏结构或规律。

可以理解为**“没有老师的自学”**:你拿到一堆没标签的数据,只能自己分析它们的共性、分布、内在结构。


举例:

  • 给模型几百张图片,但不告诉它内容是什么,它需要自己发现哪些图像相似,分成不同“组”。

常见任务:

任务类型 目标
聚类 把样本分为几类,例如用户分群
降维 将高维数据压缩为二维进行可视化
关联规则 找出变量之间的关系,如购物篮分析

常见算法:

  • K-Means 聚类
  • DBSCAN
  • 层次聚类
  • PCA(主成分分析)
  • t-SNE, UMAP(降维)
  • Autoencoder(自编码器)

✅ 三、监督 vs 无监督:对比表

项目 监督学习 无监督学习
是否有标签 ✅ 有(有答案) ❌ 无标签(无答案)
目标 预测输出 发现隐藏结构
数据格式 (输入, 标签) 只有输入
示例 图像分类、房价预测、语音识别 用户分群、异常检测、推荐系统
常见算法 回归、SVM、神经网络 聚类、PCA、自编码器

✅ 四、实际应用场景对比

场景 属于哪类? 描述
判断邮件是否是垃圾邮件 监督学习 输入:邮件文本,输出:垃圾/正常
用户按兴趣自动分组 无监督学习 只有用户行为,无标签
图像识别(猫、狗) 监督学习 图像输入,标注输出
异常检测(信用卡欺诈) 无监督学习 / 半监督 无明显标签,通过行为识别出异常

✅ 五、延伸:半监督 & 强化学习

类型 简要说明
半监督学习 只有部分样本有标签,结合无标签数据学习
强化学习 模型通过与环境交互“试错”,获得奖励信号来学习

✅ 六、小结

  • 监督学习:学的是输入 → 输出,适合预测问题
  • 无监督学习:学的是结构/关系,适合数据探索与压缩
  • 都是机器学习的核心分支

你可能感兴趣的:(深度学习,笔记,人工智能)