我们用 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)
KMeans(n_clusters=3)
:告诉模型我们期望分成 3 个簇;.fit(X)
:根据数据 X 训练模型,学习出每个簇的中心;.predict(X)
:为每个点预测所属的簇编号(0、1 或 2);y_kmeans
:模型预测的簇标签数组,形状为 (300,)。# 3. 可视化聚类结果
plt.figure(figsize=(8, 6))
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')
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 | 有监督降维,最大化类间差异 |
这段代码的作用是:生成一个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
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)
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)
PCA(n_components=2)
:指定降维目标是二维;
fit_transform(X)
:
fit
:分析原始数据的主成分方向(即特征协方差最大方向);transform
:将原始数据投影到这两个主方向上;X_reduced
:降维后的数据,形状为 (300, 2),可以直接用于二维可视化。
# 3. 可视化降维后的数据
plt.figure(figsize=(8, 6))
plt.scatter(X_reduced[:, 0], X_reduced[:, 1], c=y, cmap='Set1', s=40, edgecolor='k')
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()
plt.show()
:显示图像。降维(Dimensionality Reduction)的作用是在尽可能保留原始数据信息的前提下,将高维数据映射到低维空间。它是数据预处理、可视化和建模中非常重要的一步。
举例:将 1000 个特征压缩到 50 个,大大减少矩阵运算开销。
举例:PCA 把 50 维数据投影到 2D 平面图,颜色表示类别,清晰看到数据分布。
举例:在高维基因表达数据中,仅少数基因与疾病显著相关,其它维度是噪声。
举例:KNN、SVM 等算法在高维下常过拟合,降维后效果更好。
举例:在医学中,样本往往只有几百,而变量有几千个,降维后可用于稳健建模。
方法 | 类型 | 特点 |
---|---|---|
PCA | 线性 | 保留最大方差方向,常用于初步降维 |
t-SNE | 非线性 | 保留局部结构,适合可视化 |
UMAP | 非线性 | 比 t-SNE 快,保持全局+局部结构 |
LDA | 线性,有监督 | 最大化类间差异,常用于分类前处理 |
Autoencoder | 非线性神经网络 | 深度学习方式的非线性降维 |
降维的核心目标:去掉“无关冗余”,保留“有用本质”。
模型性能度量是评估一个机器学习模型好坏的手段,能回答这些关键问题:
问题 | 意义 |
---|---|
模型是否准确? | 衡量预测与实际结果的接近程度 |
模型是否稳定? | 衡量模型对新数据的泛化能力 |
模型是否偏向某类? | 检查是否过拟合、欠拟合或样本不均衡问题 |
模型是否适合当前任务? | 不同任务(分类、回归、排序)需要不同指标 |
任务类型 | 常见指标 | 说明 |
---|---|---|
分类任务 | accuracy, precision, recall, f1-score, ROC-AUC | 用于判断分类对错情况 |
回归任务 | MSE, RMSE, MAE, R² | 用于衡量预测值与实际值的差异 |
聚类任务 | Silhouette score, Calinski-Harabasz | 无监督场景中的结构评估 |
下面以 逻辑回归模型 + 分类任务 为例,演示如何设置和使用不同的性能度量方法。
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)来评估模型性能。
是 sklearn 自带的经典数据集,常用于分类算法练习。
包含 150 个样本,每个样本代表一朵鸢尾花,共有 3 个品种(Setosa、Versicolor、Virginica)。
每个样本有 4 个特征:
例如我们保留:
问题变为:“这朵花是 Setosa 还是 Versicolor?”
load_iris()
加载数据;train_test_split()
划分训练集和测试集(通常 70% / 30%)。LogisticRegression()
训练一个逻辑回归模型;model.fit(X_train, y_train)
。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
)
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]
y != 2
会返回一个布尔数组,表示哪些样本标签不是2;X
和 y
只包含类别 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()
model.fit(X_train, y_train)
X_train
, y_train
训练逻辑回归模型;这两行代码是 逻辑回归模型的核心训练过程,它们的作用是:
构建一个逻辑回归模型,并用训练数据进行拟合(训练),让模型“学会”如何根据特征预测目标值。
model = LogisticRegression()
LogisticRegression()
是 sklearn 提供的逻辑回归分类器;
它还没有被训练,只是定义了一个“空白模型”;
可以设置参数,比如:
penalty='l2'
:L2 正则化(默认)C=1.0
:正则强度(越小越强)solver='lbfgs'
:优化算法选择max_iter=1000
:最大迭代次数model.fit(X_train, y_train)
X_train
是训练特征(二维数组,形如 [样本数, 特征数]
);
y_train
是对应的训练标签(一维数组);
这一步是 “模型学习” 的过程,它会:
假设我们要预测“花是 Setosa 还是 Versicolor”,我们有特征(花瓣长度、花瓣宽度等):
model = LogisticRegression()
相当于:我们拿来一个“空的分类器”。model.fit(X_train, y_train)
相当于:我们“喂它数据”,它根据这些数据自己去“调整参数”,最终“学会了”怎样判断花的种类。model.predict(X_test)
:预测新样本;model.predict_proba(X_test)
:输出预测为每一类的概率;model.coef_
:查看学到的权重;model.score(X_test, y_test)
:计算测试集准确率。这几个方法和属性是 sklearn 中逻辑回归模型常用的接口,我来逐一详细解释它们的作用、返回值,以及什么时候使用它们。
model.predict(X_test)
输出模型对新样本的预测类别(如 0 或 1)
X_test
:测试样本的特征矩阵,形状为 (n_samples, n_features)
[0, 1, 1, 0, ...]
,表示每个样本的预测类别model.predict_proba(X_test)
输出每个样本属于每个类别的概率
X_test
:测试数据集一个二维数组,形如 [[0.2, 0.8], [0.7, 0.3], ...]
需要评估概率相关指标时使用,如:
ROC AUC
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 得到概率
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”的概率;# 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))
输出一个完整的分类报告表格,包括:
一般用于快速报告模型的整体分类效果。
步骤 | 动作 |
---|---|
1 | 加载鸢尾花数据 |
2 | 转换为二分类问题(只保留前两类) |
3 | 划分训练集与测试集 |
4 | 用逻辑回归建模训练 |
5 | 对测试集进行预测 |
6 | 计算并输出多个评价指标:accuracy、precision、recall、f1、AUC |
7 | 输出分类报告,查看模型在每类上的详细表现 |
# R平方系数
当然!我们来简要介绍一下 R²(R平方系数,决定系数) 的概念,并用 Python 例子+可视化演示它在回归模型评估中的作用。
R²(R-squared)衡量回归模型对数据变异的解释程度。
它的取值范围:
R 2 = 1 − 残差平方和(RSS) 总平方和(TSS) R^2 = 1 - \frac{\text{残差平方和(RSS)}}{\text{总平方和(TSS)}} R2=1−总平方和(TSS)残差平方和(RSS)
其中:
我们使用 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)
会学出两个参数:斜率和截距。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²(决定系数)衡量模型预测能力:
from sklearn.metrics import r2_score
r2 = r2_score(y_test, y_pred)
print(f"R²: {r2:.3f}")
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)
.reshape(-1, 1)
:转换成二维列向量,形状为 (100, 1)
,用于模型训练。y = 2.5 * X.flatten() + np.random.normal(0, 3, size=100)
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)
random_state=42
:固定划分方式,使实验可重复。model = LinearRegression()
model
还没有被训练,只是一个空的线性模型容器。model.fit(X_train, y_train)
X_train
和 y_train
来学习模型的参数(斜率和截距);y_pred = model.predict(X_test)
X_test
上进行预测;y_pred
,即模型预测的目标值。r2 = r2_score(y_test, y_pred)
print(f"R2 Score: {r2:.3f}")
r2_score
衡量预测值与真实值之间的拟合程度;R2 Score: 0.906
,说明模型解释了 90.6% 的数据波动。plt.figure(figsize=(8, 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='预测回归线')
plt.title(f"线性回归预测结果\nR2 = {r2:.3f}")
\n
;plt.xlabel("X")
plt.ylabel("y")
plt.legend()
plt.grid(True)
plt.show()
步骤 | 操作内容 |
---|---|
数据准备 | 生成模拟线性数据 X, y |
数据划分 | 划分训练集/测试集 |
模型训练 | 创建并训练 LinearRegression() 模型 |
模型预测 | 使用测试集进行预测 |
模型评估 | 计算并输出 R² 决定系数 |
可视化 | 画出预测直线与实际点的关系图 |
是否还需要我用这套代码扩展成多变量线性回归、加入残差分析、或可视化学习过程?可以继续告诉我你的需求!
会打印出 R² 值,例如 R² Score: 0.906
;
可视化中:
场景 | 是否适用 R² |
---|---|
线性/多元线性回归 | ✅ 非常适用 |
非线性回归(配合其他指标) | ✅ 可参考 |
分类问题 | ❌ 不适用 |
时间序列预测 | ❓ 小心使用(不稳定) |
好的,下面是对 监督学习(Supervised Learning) 和 无监督学习(Unsupervised Learning) 的详细介绍,包括定义、核心区别、常见算法、应用场景与示例。
监督学习是指训练数据中包含明确的“输入 + 输出”标签,模型学习从输入到输出的映射关系。
你可以把它想象成**“有老师监督的学习”**:告诉你题目和答案,模型通过这些练习学会解题。
任务类型 | 输入例子 | 输出例子 |
---|---|---|
分类 | 一张图片、一个病人数据 | 标签:猫/狗,良性/恶性 |
回归 | 房屋面积、位置 | 房价(连续数值) |
无监督学习是指训练数据只有输入,没有任何标签。模型目标是发现数据中的隐藏结构或规律。
可以理解为**“没有老师的自学”**:你拿到一堆没标签的数据,只能自己分析它们的共性、分布、内在结构。
任务类型 | 目标 |
---|---|
聚类 | 把样本分为几类,例如用户分群 |
降维 | 将高维数据压缩为二维进行可视化 |
关联规则 | 找出变量之间的关系,如购物篮分析 |
项目 | 监督学习 | 无监督学习 |
---|---|---|
是否有标签 | ✅ 有(有答案) | ❌ 无标签(无答案) |
目标 | 预测输出 | 发现隐藏结构 |
数据格式 | (输入, 标签) | 只有输入 |
示例 | 图像分类、房价预测、语音识别 | 用户分群、异常检测、推荐系统 |
常见算法 | 回归、SVM、神经网络 | 聚类、PCA、自编码器 |
场景 | 属于哪类? | 描述 |
---|---|---|
判断邮件是否是垃圾邮件 | 监督学习 | 输入:邮件文本,输出:垃圾/正常 |
用户按兴趣自动分组 | 无监督学习 | 只有用户行为,无标签 |
图像识别(猫、狗) | 监督学习 | 图像输入,标注输出 |
异常检测(信用卡欺诈) | 无监督学习 / 半监督 | 无明显标签,通过行为识别出异常 |
类型 | 简要说明 |
---|---|
半监督学习 | 只有部分样本有标签,结合无标签数据学习 |
强化学习 | 模型通过与环境交互“试错”,获得奖励信号来学习 |