多数据驱动稀疏pls包
py_ddspls的Python项目详细描述
mddspls is the python light package of the data-driven sparse PLS algorithm
在高维设置(大量变量)中,一个目标是选择相关变量,从而降低维度。子空间的选择通常由有监督的工具来管理。但是,一些数据可能会丢失,从而影响子空间选择的有效性。对于数据驱动的稀疏PLS,我们提出了一种基于偏最小二乘的PLS方法,称为dd sPLS,该方法允许联合变量选择和子空间估计,同时通过一种称为Koh Lanta的新算法训练和测试缺失的数据插补
它包含一个主要类mddspls和一个相关的重要方法表示predict允许从新数据集进行预测名为perf_mddspls的函数允许计算交叉验证。
数据模拟
人们可能有兴趣通过regression和^{str1}$classification来模拟数据和测试包。这里使用的是加标模型:
#!/usr/bin/env python import py_ddspls import numpy as np import sklearn.metrics as sklm n = 100 R_model = 10 R_X_Y = 2 T = 10 L = np.array(np.random.normal(0,1,n*R_model)).reshape((n,R_model)) p_t = 20 q = 5 Xs = {} for t in range(T): Omega_1_2 = np.diag(np.random.uniform(0,1,R_model)) u,s,vh = np.linalg.svd(np.array(np.random.normal(0,1,p_t*p_t)).reshape((p_t,p_t))) U_mod_T = vh[0:R_model,:] Xs[t] = L@Omega_1_2@U_mod_T Omega_y_1_2 = np.diag(np.concatenate((np.ones(R_X_Y),np.zeros(R_model-R_X_Y)))) u,s,vh = np.linalg.svd(np.array(np.random.normal(0,1,R_model*R_model)).reshape((R_model,R_model))) U_mod_T = vh[:,0:q] Y = L@Omega_y_1_2@U_mod_T k_groups = 2 Y_transfor = Y[:,0] lolo = np.linspace(np.min(Y_transfor),np.max(Y_transfor),k_groups+1) Y_bin = np.zeros(n) for ii in range(n): for k_i in range(k_groups): if (Y_transfor[ii]>=lolo[k_i])&(Y_transfor[ii]<lolo[k_i+1]): Y_bin[ii] = k_i if Y_transfor[ii]==lolo[k_groups]: Y_bin[ii] = k_groups-1 pos_0 = np.where(Y_bin==0)[0] pos_1 = np.where(Y_bin==1)[0] Y_classif = np.repeat("Class 2",n) Y_classif[pos_1] = "Class 1" # Missing values are introduced in blocks 1, 2 and 3 Xs[0][0,:] = None Xs[1][1:3,:] = None Xs[2][2:10,:] = None
dd spls正则化参数固定为0.6:
lambd=0.6
为示例的sack定义了一个列车/测试数据集:
id_train = range(30,100) id_test = range(30) Xtrain = {} Ytrain = Y[id_train,:] Xtest = {} for t in range(T): Xtrain[t] = Xs[t][id_train,:] Xtest[t] = Xs[t][id_test,:]
回归分析
让我们产生2轴:
R=2
使用sklearn工具开始建模并检查结果:
mod_0=py_ddspls.model.ddspls(Xtrain,Ytrain,lambd=lambd,R=R,mode="reg",verbose=True) Y_est_reg = mod_0.predict(Xtest) print(sklm.mean_squared_error(Y[id_test,:],Y_est_reg))
如果不考虑交叉验证,则可以使用生成的工具执行交叉验证,参数ncores允许修复进程中要使用的核心数
perf_model_reg = py_ddspls.model.perf_ddspls(Xs,Y,R=R,kfolds="loo",n_lambd=10,NCORES=4,mode="reg") print(perf_model_reg) fig = plt.figure() ax = fig.add_subplot(1, 1, 1) cols = ['r','g','b','y','black','brown'] for jj in range(q): ax.plot(perf_model_reg[:,1],perf_model_reg[:,jj+2],cols[jj]) ax.plot(perf_model_reg[:,1], np.sqrt((perf_model_reg[:,2:(2+q)]**2).mean(axis=1)),"brown",linewidth=2,ls="--") plt.legend(np.concatenate((1+np.arange(q),np.array("RMSE of RMSE errors").reshape((1,)))),loc='upper') plt.title('Leave-One-Out Cross-validation error against $\lambda$') plt.xlabel('$\lambda$') plt.ylabel('RMSE') plt.show()
它返回这种图形
对于0.9,可以找到每个变量rmse的最小rmse。假设只有y变量1和4被x数据集很好地描述,则可以减轻此oservation。在这种情况下,与专家进行讨论可能有助于确定要给参数的值
分类分析
让我们产生^ {EM1} $ 1 EEM>轴,因为只有一个组必须被区分:
R=1
使用sklearn工具开始建模并检查结果:
mod_0_classif=py_ddspls.model.ddspls(Xs,Y_bin,lambd=lambd,R=R,mode="clas",verbose=True) Y_est = mod_0_classif.predict(Xtest) print(sklm.classification_report(Y_est, Y_classif[id_test]=='Class 1'))
交叉验证可以使用生成工具执行,参数ncores允许使用并行化:
perf_model_class = py_ddspls.model.perf_ddspls(Xs,Y_classif,R=R,kfolds="loo",n_lambd=40,NCORES=7,mode="classif") print(perf_model_class) fig = plt.figure() ax = fig.add_subplot(1, 1, 1) ax.plot(perf_model_class[:,1], perf_model_class[:,2]) plt.title('Leave-One-Out Cross-validation error against $\lambda$') plt.xlabel('$\lambda$') plt.ylabel('Classification Error') plt.show()
它返回这种图形
可以看出,可以选择一个大约等于0.45的参数。享受:)