你好,我是小白~
今天和大家聊一个案例:基于 LightGBM 和 t-SNE 的分类任务与数据分析。
1. 背景与目标
我们通过使用 LightGBM(Light Gradient Boosting Machine)模型来进行分类任务,并结合 t-SNE(t-Distributed Stochastic Neighbor Embedding)进行降维可视化分析。我们将使用虚拟数据集,并展示如何应用 t-SNE 来分析高维数据的内在结构。
2. 数据集
为了实现我们的目标,我们生成一个虚拟的数据集,数据集包含多个特征和分类标签。我们将模拟一个具有高维特征的分类任务,通过该任务展示 LightGBM 模型的应用,并使用 t-SNE 对数据进行可视化降维。
数据集特征:
特征数:100 样本数:1000 标签类别:2 类(0 和 1)
3. LightGBM 概述与原理
LightGBM 是一个高效的梯度提升决策树(GBDT)框架,采用了许多优化技术以提高训练速度和减少内存使用。它特别适合处理大规模数据集并能够快速训练出高效的模型。
LightGBM 的关键特点:
基于树的模型:LightGBM 构建决策树,通过贪心算法来选择最佳的特征进行分裂。 叶子节点优先的分裂策略:与传统的层级节点优先的分裂策略不同,LightGBM 使用叶子节点优先策略,能够更好地拟合数据,尤其适合有复杂模式的数据。 支持类别特征:LightGBM 可以直接处理类别特征,无需进行 one-hot 编码等转换,提升了效率。 分布式学习:LightGBM 支持多节点的分布式训练,能够处理大规模数据。
LightGBM 训练流程
1. 初始化:根据训练数据初始化模型参数。 2. 树构建:通过数据的分裂构建决策树。 3. 叶子节点分裂:通过最小化损失函数(如均方误差、交叉熵等)来选择最佳分裂点。 4. 迭代优化:模型不断优化,通过 boosting 方式不断调整树的权重。
4. t-SNE 原理与公式
什么是 t-SNE?
t-SNE(t-Distributed Stochastic Neighbor Embedding)是一种用于高维数据可视化的降维方法。t-SNE 尤其适用于在低维空间中展现高维数据的局部结构,即保留数据点之间的相似性关系。
t-SNE 算法步骤:
1. 计算相似度:首先计算数据点之间的相似度。在高维空间中,使用高斯分布计算数据点之间的相似度:
其中, 和 是数据点, 是与点 相关的带宽。
2. 映射到低维空间:将高维数据点映射到低维空间,计算低维空间中的点之间的相似度:
其中, 和 是低维空间中的点。
3. 最小化KL散度:为了使低维空间中的相似度分布尽可能接近高维空间中的分布,我们需要最小化高维和低维空间相似度之间的KL散度:
通过梯度下降法优化低维数据点的位置,最终得到低维嵌入。
t-SNE 的优缺点
优点:
能很好地揭示数据的局部结构,适合可视化高维数据。 比 PCA 等线性降维方法更能保留复杂的非线性结构。
缺点:
计算复杂度较高,对于大规模数据集计算量大。 降维结果可能受到初始条件和超参数(如 perplexity)的影响。
5. Python实现
数据生成与预处理
import numpy as np
import pandas as pd
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
# 生成虚拟数据集
X, y = make_classification(n_samples=10000, n_features=100, n_informative=50, n_classes=2, random_state=42)
# 拆分数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
LightGBM 模型训练
import lightgbm as lgb
from sklearn.metrics import accuracy_score
# 设置 LightGBM 的数据格式
train_data = lgb.Dataset(X_train, label=y_train)
test_data = lgb.Dataset(X_test, label=y_test, reference=train_data)
# 设置参数
params = {
'objective': 'binary',
'metric': 'binary_error',
'boosting_type': 'gbdt',
'num_leaves': 31,
'learning_rate': 0.05,
'feature_fraction': 0.9,
}
# 训练模型
num_round = 100
bst = lgb.train(params, train_data, num_round, valid_sets=[test_data], early_stopping_rounds=10)
# 预测结果
y_pred = bst.predict(X_test, num_iteration=bst.best_iteration)
y_pred = np.round(y_pred)
# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f'Accuracy: {accuracy:.4f}')
使用 t-SNE 可视化降维
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt
import seaborn as sns
# 使用 t-SNE 对高维数据进行降维
tsne = TSNE(n_components=2, random_state=42)
X_tsne = tsne.fit_transform(X_test)
# 绘制 t-SNE 图
plt.figure(figsize=(10, 8))
sns.scatterplot(x=X_tsne[:, 0], y=X_tsne[:, 1], hue=y_test, palette="Set1", s=60, edgecolor='k', marker='o')
plt.title('t-SNE Visualization of High-Dimensional Data')
plt.xlabel('t-SNE Component 1')
plt.ylabel('t-SNE Component 2')
plt.legend(title='Class', loc='upper right')
plt.show()
在这个示例中,我们通过 LightGBM 训练了一个分类模型,并计算了预测准确率。
之后,使用 t-SNE 对高维数据进行了降维,并通过颜色区分类别,生成了数据点的散点图。这种方式帮助我们理解数据在低维空间中的分布和类别之间的关系。
t-SNE 可视化图:通过 t-SNE 将高维数据映射到 2D 平面,展示了不同类别数据点的分布情况。颜色代表不同的类别,我们可以观察到,类别 0 和类别 1 的数据点有较明显的分离,表明模型在这一数据集上可能取得较好的分类效果。