当前位置: 首页 > news >正文

Day 21 训练

Day 21 训练

  • 常见的降维算法
    • 数据预处理
    • 无监督降维
      • PCA(主成分分析)
      • 主成分分析(PCA)
      • 作用和优势
      • 应用场景
      • t-SNE(t-分布随机邻域嵌入)
      • t-SNE(t-分布随机邻域嵌入)
      • 为什么 t-SNE 特别适用于高维数据的可视化
      • 应用场景
    • 有监督降维
      • LDA(线性判别分析)
    • 总结


常见的降维算法

在数据分析和机器学习中,降维是一种常见的预处理步骤,能够帮助我们减少数据的复杂性、提高模型的性能以及避免过拟合。本文将介绍几种常见的降维算法,包括无监督的 PCA 和 t-SNE,以及有监督的 LDA,并通过实际代码演示它们的应用。

数据预处理

在开始降维之前,我们首先需要对数据进行预处理,以下是数据预处理的代码:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import warningswarnings.filterwarnings("ignore")
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False# 读取数据
data = pd.read_csv('data.csv')# 筛选字符串变量并进行标签编码和独热编码
discrete_features = data.select_dtypes(include=['object']).columns.tolist()# Home Ownership 标签编码
home_ownership_mapping = {'Own Home': 1,'Rent': 2,'Have Mortgage': 3,'Home Mortgage': 4
}
data['Home Ownership'] = data['Home Ownership'].map(home_ownership_mapping)# Years in current job 标签编码
years_in_job_mapping = {'< 1 year': 1,'1 year': 2,'2 years': 3,'3 years': 4,'4 years': 5,'5 years': 6,'6 years': 7,'7 years': 8,'8 years': 9,'9 years': 10,'10+ years': 11
}
data['Years in current job'] = data['Years in current job'].map(years_in_job_mapping)# Purpose 独热编码
data = pd.get_dummies(data, columns=['Purpose'])
data2 = pd.read_csv("data.csv")  # 重新读取数据,用来做列名对比
list_final = []
for i in data.columns:if i not in data2.columns:list_final.append(i)
for i in list_final:data[i] = data[i].astype(int)# Term 0 - 1 映射
term_mapping = {'Short Term': 0,'Long Term': 1
}
data['Term'] = data['Term'].map(term_mapping)
data.rename(columns={'Term': 'Long Term'}, inplace=True)# 连续特征用中位数补全
continuous_features = data.select_dtypes(include=['int64', 'float64']).columns.tolist()
for feature in continuous_features:mode_value = data[feature].mode()[0]data[feature].fillna(mode_value, inplace=True)# 删除 Loan ID 列
data.drop(columns=['Id'], inplace=True)

无监督降维

无监督降维算法不使用任何关于数据样本的标签信息,仅根据数据点本身的分布、方差、相关性等特性来寻找低维表示。

PCA(主成分分析)

PCA 是一种常见的无监督降维算法,其核心思想是识别数据中方差最大的方向,并将数据投影到由这些最重要的主成分构成的新的、维度更低的子空间上。
这段内容主要是在介绍主成分分析(PCA)算法,以下是对这段内容的详细解释:

主成分分析(PCA)

  • 定义:PCA 是一种常见的无监督降维算法,它通过线性变换将原始数据转换到一个新的坐标系统中,使得在这个新坐标系统中,数据的方差沿着坐标轴被最大化。
  • 核心思想:其核心思想是识别数据中方差最大的方向,并将数据投影到由这些最重要的主成分构成的新的、维度更低的子空间上。
    • 方差最大的方向:在数据中,方差最大的方向通常包含了最多的“信息”。例如,假设我们有一组二维数据,这些数据点在某个方向上分布得更分散(即方差更大),那么这个方向就更能代表数据的特征。PCA 的目标就是找到这样的方向。
    • 主成分:这些方差最大的方向被称为“主成分”。第一个主成分是方差最大的方向,第二个主成分是与第一个主成分正交且方差次大的方向,以此类推。通过选择前几个主成分,我们可以将数据投影到一个低维空间中,同时尽可能保留原始数据的信息。
    • 投影到低维子空间:将数据投影到由这些主成分构成的新的子空间上,可以降低数据的维度。例如,如果我们选择前两个主成分,就可以将高维数据投影到二维平面上,从而实现降维。在这个新的低维空间中,数据的结构和分布仍然可以被较好地保留,同时减少了数据的复杂性,便于后续的分析和处理。

作用和优势

  • 降低数据维度:通过将数据投影到低维子空间,减少了数据的特征数量,从而降低了数据的复杂性。这有助于提高模型的性能,减少计算成本,同时避免过拟合。
  • 去除噪声和冗余信息:在降维过程中,PCA 可以去除一些不重要的信息和噪声,使数据更加简洁和清晰。例如,如果数据中存在一些高度相关的特征,PCA 可以将它们合并为一个主成分,从而减少冗余信息。
  • 数据可视化:对于高维数据,直接进行可视化是非常困难的。通过 PCA 降维,可以将高维数据投影到二维或三维空间中,便于我们直观地观察数据的分布和结构,发现数据中的模式和规律。

应用场景

  • 图像处理:在图像识别和处理中,PCA 可以用于图像的降维和特征提取。例如,将高维的图像数据投影到低维空间中,可以提取出图像的主要特征,提高图像识别的效率和准确性。
  • 基因数据分析:在生物信息学中,PCA 可以用于基因数据的降维和分析。通过将高维的基因表达数据投影到低维空间,可以发现基因之间的相关性和差异,为基因功能的研究提供线索。
  • 金融数据分析:在金融领域,PCA 可以用于风险评估和投资组合优化。通过对金融数据进行降维,可以提取出主要的风险因素和市场趋势,为投资决策提供依据。

总之,PCA 是一种非常有效的无监督降维算法,它通过识别数据中方差最大的方向,将数据投影到低维子空间中,从而实现降维的目的。它在数据预处理、特征提取、数据可视化等方面具有广泛的应用,可以帮助我们更好地理解和分析数据。

from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report, confusion_matrix
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
import time# 划分数据集
X = data.drop(['Credit Default'], axis=1)
y = data['Credit Default']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# PCA 降维
print("\n--- 2. PCA 降维 + 随机森林 ---")
scaler_pca = StandardScaler()
X_train_scaled_pca = scaler_pca.fit_transform(X_train)
X_test_scaled_pca = scaler_pca.transform(X_test)pca_expl = PCA(random_state=42)
pca_expl.fit(X_train_scaled_pca)
cumsum_variance = np.cumsum(pca_expl.explained_variance_ratio_)
n_components_to_keep_95_var = np.argmax(cumsum_variance >= 0.95) + 1
print(f"为了保留95%的方差,需要的主成分数量: {n_components_to_keep_95_var}")n_components_pca = 10
pca_manual = PCA(n_components=n_components_pca, random_state=42)
X_train_pca = pca_manual.fit_transform(X_train_scaled_pca)
X_test_pca = pca_manual.transform(X_test_scaled_pca)
print(f"PCA降维后,训练集形状: {X_train_pca.shape}, 测试集形状: {X_test_pca.shape}")start_time_pca_manual = time.time()
rf_model_pca = RandomForestClassifier(random_state=42)
rf_model_pca.fit(X_train_pca, y_train)
rf_pred_pca_manual = rf_model_pca.predict(X_test_pca)
end_time_pca_manual = time.time()print(f"手动PCA降维后,训练与预测耗时: {end_time_pca_manual - start_time_pca_manual:.4f} 秒")
print("\n手动 PCA + 随机森林 在测试集上的分类报告:")
print(classification_report(y_test, rf_pred_pca_manual))
print("手动 PCA + 随机森林 在测试集上的混淆矩阵:")
print(confusion_matrix(y_test, rf_pred_pca_manual))

t-SNE(t-分布随机邻域嵌入)

t-SNE 是一种非线性降维算法,特别适用于高维数据的可视化。它的核心目标是在高维空间中相似的数据点,在降维后的低维空间中也应该保持相似。
这段内容主要介绍了 t-SNE(t-分布随机邻域嵌入)算法的性质和核心目标,以下是对这段内容的进一步解释:

t-SNE(t-分布随机邻域嵌入)

  • 算法性质:t-SNE 是一种非线性降维算法。与线性降维算法(如 PCA)不同,非线性降维算法能够更好地处理数据中的复杂结构和非线性关系。这意味着 t-SNE 可以在降维过程中保留数据的局部结构和相似性,而不仅仅是全局的线性关系。
  • 核心目标:t-SNE 的核心目标是在高维空间中相似的数据点,在降维后的低维空间中也应该保持相似。具体来说,t-SNE 通过以下步骤实现这一目标:
    • 相似性度量:在高维空间中,t-SNE 首先计算每个数据点与其他数据点之间的相似性。这种相似性通常是通过高斯分布的概率来衡量的,即距离越近的数据点相似性越高。
    • 低维嵌入:然后,t-SNE 在低维空间中寻找一种数据点的分布方式,使得低维空间中数据点之间的相似性尽可能接近高维空间中的相似性。这通常是通过优化一个代价函数来实现的,该代价函数衡量了高维和低维空间中相似性的差异。
    • 优化过程:t-SNE 使用梯度下降等优化算法来调整低维空间中数据点的位置,以最小化代价函数。这个过程可能会涉及到多次迭代,直到找到一个相对稳定的低维嵌入。

为什么 t-SNE 特别适用于高维数据的可视化

  • 高维数据的可视化难题:对于高维数据,直接进行可视化是非常困难的,因为人类很难直观地理解超过三维的数据空间。t-SNE 通过将高维数据映射到二维或三维空间,使得我们能够直观地观察数据的分布和结构。
  • 保留局部结构:t-SNE 在降维过程中特别注重保留数据的局部结构。这意味着在高维空间中彼此接近的数据点在低维空间中也会保持接近,从而使得数据中的簇和模式在可视化中更加明显。这对于发现数据中的潜在结构和模式非常有帮助。
  • 非线性映射的优势:由于 t-SNE 是一种非线性降维算法,它能够更好地处理数据中的复杂关系和非线性结构。这使得 t-SNE 在处理具有复杂结构的高维数据时比线性降维算法(如 PCA)更具优势。

应用场景

  • 高维数据的可视化:t-SNE 最常见的应用场景是高维数据的可视化,例如在图像识别、基因数据分析、金融数据分析等领域。通过将高维数据映射到二维或三维空间,研究人员可以直观地观察数据的分布,发现数据中的簇和模式。
  • 数据探索和分析:在数据探索阶段,t-SNE 可以帮助研究人员快速了解数据的结构和特征,发现数据中的异常点和潜在的模式。这有助于进一步的数据分析和模型构建。

总之,t-SNE 是一种强大的非线性降维算法,特别适用于高维数据的可视化和探索。通过保留数据的局部结构和相似性,t-SNE 能够帮助我们更好地理解和分析复杂的数据集。

from sklearn.manifold import TSNEprint("\n--- 3. t-SNE 降维 + 随机森林 ---")
print("       标准 t-SNE 主要用于可视化,直接用于分类器输入可能效果不佳。")scaler_tsne = StandardScaler()
X_train_scaled_tsne = scaler_tsne.fit_transform(X_train)
X_test_scaled_tsne = scaler_tsne.transform(X_test)n_components_tsne = 2
tsne_model_train = TSNE(n_components=n_components_tsne,perplexity=30,n_iter=1000,init='pca',learning_rate='auto',random_state=42,n_jobs=-1)
print("正在对训练集进行 t-SNE fit_transform...")
start_tsne_fit_train = time.time()
X_train_tsne = tsne_model_train.fit_transform(X_train_scaled_tsne)
end_tsne_fit_train = time.time()
print(f"训练集 t-SNE fit_transform 完成,耗时: {end_tsne_fit_train - start_tsne_fit_train:.2f} 秒")tsne_model_test = TSNE(n_components=n_components_tsne,perplexity=30,n_iter=1000,init='pca',learning_rate='auto',random_state=42,n_jobs=-1)
print("正在对测试集进行 t-SNE fit_transform...")
start_tsne_fit_test = time.time()
X_test_tsne = tsne_model_test.fit_transform(X_test_scaled_tsne)
end_tsne_fit_test = time.time()
print(f"测试集 t-SNE fit_transform 完成,耗时: {end_tsne_fit_test - start_tsne_fit_test:.2f} 秒")print(f"t-SNE降维后,训练集形状: {X_train_tsne.shape}, 测试集形状: {X_test_tsne.shape}")start_time_tsne_rf = time.time()
rf_model_tsne = RandomForestClassifier(random_state=42)
rf_model_tsne.fit(X_train_tsne, y_train)
rf_pred_tsne_manual = rf_model_tsne.predict(X_test_tsne)
end_time_tsne_rf = time.time()print(f"t-SNE降维数据上,随机森林训练与预测耗时: {end_time_tsne_rf - start_time_tsne_rf:.4f} 秒")
total_tsne_time = (end_tsne_fit_train - start_tsne_fit_train) + \(end_tsne_fit_test - start_tsne_fit_test) + \(end_time_tsne_rf - start_time_tsne_rf)
print(f"t-SNE 总耗时 (包括两次fit_transform和RF): {total_tsne_time:.2f} 秒")print("\n手动 t-SNE + 随机森林 在测试集上的分类报告:")
print(classification_report(y_test, rf_pred_tsne_manual))
print("手动 t-SNE + 随机森林 在测试集上的混淆矩阵:")
print(confusion_matrix(y_test, rf_pred_tsne_manual))

有监督降维

有监督降维算法在降维过程中会利用数据样本的标签信息,目标是找到一个低维子空间,使得在该子空间中,不同类别的数据点能够被更好地分离开。

LDA(线性判别分析)

LDA 是一种经典的有监督降维算法,其核心目标是找到一个低维特征子空间,使得在该子空间中,不同类别的数据点尽可能地分开,而同一类别的数据点尽可能地聚集。

from sklearn.discriminant_analysis import LinearDiscriminantAnalysisprint("\n--- 4. LDA 降维 + 随机森林 ---")
scaler_lda = StandardScaler()
X_train_scaled_lda = scaler_lda.fit_transform(X_train)
X_test_scaled_lda = scaler_lda.transform(X_test)n_features = X_train_scaled_lda.shape[1]
n_classes = len(np.unique(y_train))
max_lda_components = min(n_features, n_classes - 1)n_components_lda_target = 10
actual_n_components_lda = min(n_components_lda_target, max_lda_components)
print(f"原始特征数: {n_features}, 类别数: {n_classes}")
print(f"LDA 最多可降至 {max_lda_components} 维。")
print(f"目标降维维度: {n_components_lda_target} 维。")
print(f"本次 LDA 将实际降至 {actual_n_components_lda} 维。")lda_manual = LinearDiscriminantAnalysis(n_components=actual_n_components_lda, solver='svd')
X_train_lda = lda_manual.fit_transform(X_train_scaled_lda, y_train)
X_test_lda = lda_manual.transform(X_test_scaled_lda)
print(f"LDA降维后,训练集形状: {X_train_lda.shape}, 测试集形状: {X_test_lda.shape}")start_time_lda_rf = time.time()
rf_model_lda = RandomForestClassifier(random_state=42)
rf_model_lda.fit(X_train_lda, y_train)
rf_pred_lda_manual = rf_model_lda.predict(X_test_lda)
end_time_lda_rf = time.time()print(f"LDA降维数据上,随机森林训练与预测耗时: {end_time_lda_rf - start_time_lda_rf:.4f} 秒")
print("\n手动 LDA + 随机森林 在测试集上的分类报告:")
print(classification_report(y_test, rf_pred_lda_manual))
print("手动 LDA + 随机森林 在测试集上的混淆矩阵:")
print(confusion_matrix(y_test, rf_pred_lda_manual))

总结

本文介绍了几种常见的降维算法,包括无监督的 PCA 和 t-SNE,以及有监督的 LDA。通过实际代码演示了它们的应用,并比较了它们在随机森林分类器上的性能。PCA 适用于线性数据,t-SNE 适用于高维数据的可视化,而 LDA 适用于有监督的分类任务。在实际应用中,可以根据数据的特点和任务的需求选择合适的降维算法。
@浙大疏锦行

相关文章:

  • Spring+LangChain4j小智医疗项目
  • 如何让open-mpi在不同版本的OS上运行
  • java方法的练习题
  • Python内存管理:赋值、浅拷贝与深拷贝解析
  • 数智管理学(九)
  • 【匹配】Smith-Waterman
  • 【高频面试题】LRU缓存
  • JavaScript - 运算符之逗号操作符与逗号分隔符(逗号操作符概述、逗号操作符用法、逗号分隔符、逗号分隔符用法)
  • Miniconda介绍介绍和使用
  • Unix Bourne Shell
  • 已解决(亲测有效!):安装部署Docker Deskpot之后启动出现Docker Engine Stopped!
  • ollama 重命名模型
  • Vue.js---避免无限递归循环 调度执行
  • Elasticsearch 常用语法手册
  • [吾爱出品] 中医问诊辅助记录软件
  • ES常识8:ES8.X如何实现热词统计
  • CPU cache基本原理
  • 基于javaweb的JSP+Servlet家政服务系统设计与实现(源码+文档+部署讲解)
  • 2900. 最长相邻不相等子序列 I
  • Windows注册表备份与恢复指南
  • 温州通报“一母亲殴打女儿致其死亡”:嫌犯已被刑拘
  • 宜昌谱写新叙事:长江大保护与高质量发展如何相互成就
  • 在古老的意大利科莫歌剧院,廖昌永唱响16首中国艺术歌曲
  • 日本前卫艺术先驱群展上海:当具体派相遇古树古宅
  • 脑血管支架:救命神器还是定时炸弹?听听医生的大实话
  • 真人秀《幸存者》百万美元奖金,25年间“缩水”近一半