多数据驱动稀疏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()

它返回这种图形

https://raw.githubusercontent.com/hlorenzo/py_ddspls/master/images/reg.png

对于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()

它返回这种图形

https://raw.githubusercontent.com/hlorenzo/py_ddspls/master/images/cla.png 可以看出,可以选择一个大约等于0.45的参数。

享受:)

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
Java中ArrayList的超简单问题   Java 8在一段时间后过期   java如何创建具有用户定义维度的矩阵,并使用从上到下、从左到右的递增值填充它?   java从JDBC重启mysql   带有sqlite的java LiveData未更新UI   带有JDialog的java小程序在Mac OSX中未正确隐藏   java ActionListener无法从公共类引用数组?   java Apache Digester:NoSuchMethodException:没有这样的可访问方法   安卓中数据库中的java数据没有以正确的格式检索   java快速排序实现:使用random pivot时几乎排序   安卓 Java:高效的ArrayList过滤?   java如何在单独的文件中制作GUI程序   jasper报告如何从JSP或Java代码在JasperReport中传递参数值?