Python中如何借助sklearn实现逆LLE解决分类任务降维数据泄露问题
基于sklearn实现LLE测试集映射方案
首先澄清概念:你需要的功能是训练集拟合LLE后对测试集做无泄露的降维映射,属于LLE的out-of-sample扩展能力,不是逆LLE(逆LLE是指从低维嵌体重构回原始高维特征的操作)。sklearn自带的LocallyLinearEmbedding类已经原生支持该能力,无需额外实现。
实现逻辑
sklearn的LLE在fit训练集后,会保留训练集的原始特征、低维嵌入结果、邻域计算规则等参数,调用transform方法处理测试集时会执行以下步骤,完全避免数据泄露:
- 对每个测试样本,仅在训练集样本中查找k近邻
- 沿用训练阶段的权重计算规则,得到测试样本对应训练集近邻的线性重构权重
- 用训练集的低维嵌入结果,结合上述权重计算得到测试样本的低维表示,和训练集降维结果分布完全对齐
修正后的完整代码
import numpy as np from sklearn import preprocessing, model_selection from sklearn import svm from sklearn.manifold import LocallyLinearEmbedding ### 生成模拟数据 n_row = 10000 n_col = 50 X = np.random.random((n_row, n_col)) # 修正原代码参数格式错误 y = np.random.randint(5, size=n_row) ### 数据预处理 X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size = 0.5, random_state = 1) scaler = preprocessing.StandardScaler() scaler.fit(X_train) X_train = scaler.transform(X_train) X_test = scaler.transform(X_test) ### LLE降维部分 # 初始化LLE对象 lle = LocallyLinearEmbedding(n_neighbors=15, n_components=10, method='modified', eigen_solver='dense') # 拟合训练集同时得到训练集降维结果 X_train_lle = lle.fit_transform(X_train) # 直接对测试集做映射,无数据泄露,结果和训练集分布对齐 X_test_lle = lle.transform(X_test) ### 模型训练与推理 clf = svm.SVC(kernel='linear') clf.fit(X_train_lle, y_train) y_pred = clf.predict(X_test_lle)
补充说明
如果你确实需要实现逆LLE(从低维嵌入重构回原始高维特征),可以基于训练集的低维嵌入lle.embedding_和原始训练特征X_train拟合一个逆映射模型,比如用k近邻回归或者MLP实现,输入低维向量输出高维原始特征即可。
内容的提问来源于stack exchange,提问作者Djordje Savic
相关产品推荐
相关产品推荐

