背景
在机器学习模型的分类性能评估中,如何有效地将高维数据的分类效果直观地展示出来是一个问题,Nature Communications 的一项研究展示了一种通过结合预测概率与主成分分析(PCA)的方法来可视化模型的分类效果,这一方法可以应用于多个领域的数据分类任务中,详情可以参考往期文章——复现Nature图表——基于PCA降维与模型预测概率的分类效果可视化
然而,在本次复现中,作者采用t-SNE来替代PCA进行降维,并进一步改进可视化效果,这种选择的背后,源于PCA和t-SNE在降维方法上的显著差异
- PCA是一种线性降维方法,能够捕捉数据的全局线性结构,适用于特征间具有线性关系的数据
- t-SNE是一种非线性降维技术,特别适合处理高维数据中复杂的非线性结构,可更有效地展示数据的局部分布及类别间的区分
因此,采用t-SNE能够更清晰地揭示高维数据中类别间的潜在分布模式,为模型的分类效果提供更直观、更细致的可视化支持,这种方法适用于复杂数据集的分类任务,特别是在类别分布具有非线性特点时效果更佳
代码实现
模型构建
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'Times New Roman'
plt.rcParams['axes.unicode_minus'] = False
import warnings
import seaborn as sns
warnings.filterwarnings("ignore")
df = pd.read_excel("2024-12-24公众号Python机器学习AI.xlsx")
from sklearn.model_selection import train_test_split
# 划分特征和目标变量
X = df.drop(['y'],axis=1)
y = df['y']
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2,
random_state=42, stratify=df['y'])
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
# Random Forest模型参数
params_rf = {
'random_state': 42, # 随机种子,用于结果的可重复性
'n_jobs': -1, # 并行计算的线程数量,-1表示使用所有可用的CPU核心
'verbose': 1 # 输出详细进度信息
}
# 初始化Random Forest分类模型
model_rf = RandomForestClassifier(**params_rf)
# 定义参数网格,用于网格搜索
param_grid = {
'n_estimators': [100, 200], # 树的数量选择
'max_depth': [3, 5, None], # 树的深度
'min_samples_split': [2, 5], # 划分所需样本数选择
'min_samples_leaf': [1, 2], # 叶子节点样本数选择
'max_features': ['sqrt', None] # 特征分裂方式
}
# 使用GridSearchCV进行网格搜索和k折交叉验证
grid_search = GridSearchCV(
estimator=model_rf,
param_grid=param_grid,
scoring='neg_log_loss', # 评价指标为负对数损失
cv=5, # 5折交叉验证
n_jobs=-1, # 并行计算
verbose=1 # 输出详细进度信息
)
# 训练模型
grid_search.fit(X_train, y_train)
# 输出最优参数
print("Best parameters found: ", grid_search.best_params_)
print("Best Log Loss score: ", -grid_search.best_score_)
# 使用最优参数训练模型
best_model_class = grid_search.best_estimator_
代码的主要目的是通过构建并优化随机森林分类模型,对二分类数据集进行分类任务的模型训练和性能优化
数据加载与预处理:
- 从本地 Excel 文件中加载数据,并将数据划分为特征 (X) 和目标变量 (y)
- 使用 train_test_split 将数据集划分为训练集和测试集,保证数据划分的随机性和目标变量类别分布的一致性(通过 stratify 参数)
随机森林模型构建与参数优化:
- 初始化随机森林模型,并通过设置参数网格 (param_grid) 定义待优化的超参数(如树的数量、深度、叶子节点样本数等)
- 使用网格搜索 (GridSearchCV) 和5折交叉验证,以 负对数损失 (Log Loss) 作为评价指标,自动搜索超参数的最优组合
最后使用最优参数重新训练随机森林分类器,以获得最终的优化模型,本代码使用的是模拟的二分类数据集,并不来源于实际的文献或真实场景数据,因此结果仅为方法的演示,不具备实际意义
获取模型预测概率
# 预测类别的概率
probabilities = best_model_class.predict_proba(X_test)
# 创建一个 DataFrame,列名为类别
probability_df = pd.DataFrame(probabilities, columns=[f'Prob_Class_{i}' for i in range(probabilities.shape[1])])
# 如果需要,可以添加 X_test 的索引或其他标识列
probability_df.index = X_test.index
# 重置索引,并选择是否保留原索引作为一列
probability_df.reset_index(drop=True, inplace=True)
probability_df.head()
使用优化后的随机森林模型对测试集 (X_test) 进行预测,生成每个样本属于各类别的概率,并将这些概率存储为一个DataFrame(probability_df),方便后续分析和可视化
t-sne降维原始数据
from sklearn.manifold import TSNE
df_selected = X_test
# 创建t-SNE对象
tsne = TSNE(n_components=1, random_state=42)
# 进行t-SNE降维
tsne_result = tsne.fit_transform(df_selected)
# 将t-SNE结果保存为DataFrame
tsne_df = pd.DataFrame(tsne_result, columns=["TSNE Component 1"])
tsne_df.head()
使用t-SNE(t-分布随机邻域嵌入) 对测试集 X_test 的特征进行降维处理,将高维数据降维为1维,首先初始化一个t-SNE对象,设置降维到1个主成分 (n_components=1) 和随机种子以确保结果的可重复性,然后对测试集特征数据执行t-SNE降维操作。最后,将降维结果存储为一个 Pandas DataFrame(tsne_df),列名为 TSNE Component 1,便于后续可视化和分析
合并数据集
# 将 t-SNE 结果 (tsne_df) 和其他数据合并
combined_df = pd.concat([probability_df, tsne_df, y_test.reset_index(drop=True)], axis=1)
combined_df.rename(columns={y_test.name: 'True'}, inplace=True)
combined_df.head()
将预测的类别概率数据 (probability_df)、t-SNE 降维结果 (tsne_df) 和测试集的真实类别标签 (y_test) 合并到一个新的 DataFrame (combined_df) 中
基于t-SNE降维与预测概率的分类效果可视化
colors = combined_df['True'].map({0: '#A0D6B4', 1: '#C3A6D8'})
# 绘制散点图,使用 t-SNE 结果
plt.figure(figsize=(10, 6), dpi=1200)
plt.scatter(combined_df['Prob_Class_1'], combined_df['TSNE Component 1'],
c=colors, edgecolor='black', s=100) # s=100 增大点的大小,edgecolor='black' 添加黑色边框
# 添加分界线和轴标签
plt.axvline(x=0.5, color='gray', linestyle='--')
plt.xlabel('Predicted value for GC')
plt.ylabel('TSNE Component 1')
plt.title('Test set')
# 添加类别图例并移到图外
for true_value, color, label in [(0, '#A0D6B4', 'NGC'), (1, '#C3A6D8', 'GC')]:
plt.scatter([], [], color=color, edgecolor='black', s=100, label=label)
plt.legend(title="Class", loc="center left", bbox_to_anchor=(1, 0.5))
plt.tight_layout(rect=[0, 0, 0.85, 1])
plt.savefig('1.pdf', format='pdf', bbox_inches='tight')
plt.show()
通过t-SNE降维和预测概率的结合,直观地展示了分类模型在测试集上的表现。具体来说,横轴为模型预测类别1的概率 (Prob_Class_1),纵轴为t-SNE降维后的一维特征表示 (TSNE Component 1)。每个点表示测试集中的一个样本,颜色根据样本的真实类别 (True) 区分:绿色为类别NGC,紫色为类别GC,并使用垂直的虚线 (x=0.5) 表示预测类别的决策边界(概率为 0.5)
可视化解读:
- 横轴(预测概率): 横轴展示了模型对样本属于类别GC的预测概率。靠近0的点代表模型倾向预测该样本为NGC(类别0),靠近1的点则代表模型倾向预测该样本为GC(类别1)
- 纵轴(t-SNE 降维):t-SNE将高维特征降维到一维,展示了样本在一个非线性特征空间中的分布。纵轴反映了类别的潜在分布和模型对类别间关系的学习情况
- 点的颜色:点的颜色表示真实类别(绿色:NGC,紫色:GC),用来验证模型预测概率的准确性。如果某类别的点更多地出现在正确的概率范围(如NGC在靠近0的区域,GC在靠近1 的区域),说明模型分类效果较好
- 决策边界: 决策边界(虚线x=0.5)将概率空间分为两部分,模型预测小于0.5的样本为 NGC,大于0.5的样本为GC。如果点的颜色在决策边界两侧分布明显,则表明模型分类效果较好
解读重点:
- 如果绿色点(NGC)大多集中在左侧(Prob_Class_1<0.5),紫色点(GC)集中在右侧(Prob_Class_1>0.5),说明模型的分类概率较准确
- 如果某些颜色的点越过了决策边界(例如绿色点在右侧或紫色点在左侧),则说明这些样本被模型错误分类
该可视化结合了模型的预测概率和特征空间分布,能够直观地帮助评估模型的分类性能,以及模 型对类别区分的能力和错误分类的模式
基于t-SNE降维与预测概率的分类效果分布可视化(含边缘直方图)
改进的可视化方法结合了t-SNE降维、模型预测概率和边缘直方图,将模型的分类效果和数据分布特征直观地展示出来。相比前面的单纯散点图,这里增加了顶部和右侧的边缘直方图,用于显示预测概率和t-SNE降维结果的类别分布。通过这种方法,不仅可以直观观察模型的分类边界(如决策点0.5),还可以分析分类错误的样本分布以及不同类别的样本在降维空间中的分布特点,为评估模型性能和改进提供了更全面的信息支持,代码与数据集获取:如需获取本文的源代码和数据集,请添加作者微信联系
基于PCA降维与预测概率的分类效果分布可视化(含边缘直方图)
当然PCA降维也可以结合边缘分布可视化,可以直观展示模型的分类概率、降维特征分布及分类正确性,为性能评估和模型优化提供全面支持,代码与数据集获取:如需获取本文的源代码和数据集,请添加作者微信联系
往期推荐
期刊配图:随机森林RF二分类模型的SHAP瀑布图详解与绘制教程
复现SCI文章 SHAP 依赖图可视化以增强机器学习模型的可解释性
复现 Nature 图表——基于PCA的高维数据降维与可视化实践及其扩展
复现Nature图表——基于PCA降维与模型预测概率的分类效果可视化
如果你对类似于这样的文章感兴趣。
欢迎关注、点赞、转发~
个人观点,仅供参考