SCI-Kit了解PLS SVD和交叉验证(Sci-kit Learn PLS SVD and cr

2019-10-20 04:53发布

所述sklearn.cross_decomposition.PLSSVD在科幻试剂盒类学习看来是失败时的响应变量具有的形状(N,)代替(N,1)其中N是数据集中样品的数目。

然而, sklearn.cross_validation.cross_val_score当响应变量具有的形状失败(N,1)而不是(N,) 我如何使用它们放在一起?

一个代码片段:

from sklearn.pipeline import Pipeline
from sklearn.cross_decomposition import PLSSVD
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression

# x -> (N, 60) numpy array
# y -> (N, ) numpy array

# These are the classifier 'pieces' I'm using
plssvd = PLSSVD(n_components=5, scale=False)
logistic = LogisticRegression(penalty='l2', C=0.5)
scaler = StandardScaler(with_mean=True, with_std=True)

# Here's the pipeline that's failing
plsclf = Pipeline([('scaler', scaler),
                   ('plssvd', plssvd), 
                   ('logistic', logistic)])

# Just to show how I'm using the pipeline for a working classifier
logclf = Pipeline([('scaler', scaler),
                   ('logistic', logistic)])

##################################################################

# This works fine
log_scores = cross_validation.cross_val_score(logclf, x, y, scoring='accuracy',
                                              verbose=True, cv=5, n_jobs=4)

# This fails!
pls_scores = cross_validation.cross_val_score(plsclf, x, y, scoring='accuracy',
                                              verbose=True, cv=5, n_jobs=4)

具体而言,它未能在_center_scale_xy的功能cross_decomposition/pls_.pyc'IndexError: tuple index out of range'在线103: y_std = np.ones(Y.shape[1])这是因为形状元组只有一个元件。

如果设置了scale=TruePLSSVD构造函数,它未能在管路99相同的功能: y_std[y_std == 0.0] = 1.0 ,因为它正试图做一个布尔索引上的浮子( y_std是浮动的,因为它只有一个尺寸)。

看来,像一个简单的办法,只要确保y变量具有两个维度, (N,1) 然而:

如果我创建与尺寸的阵列(N,1)出来的输出变量的y ,它仍然失败。 为了改变阵列,我跑步前添加此cross_val_score

y = np.transpose(np.array([y]))

然后,在失败sklearn/cross_validation.py在行398:

File "my_secret_script.py", line 293, in model_create
    scores = cross_validation.cross_val_score(plsclf, x, y, scoring='accuracy', verbose=True, cv=5, n_jobs=4)
File "/Users/my.secret.name/anaconda/lib/python2.7/site-packages/sklearn/cross_validation.py", line 1129, in cross_val_score
    cv = _check_cv(cv, X, y, classifier=is_classifier(estimator))
File "/Users/my.secret.name/anaconda/lib/python2.7/site-packages/sklearn/cross_validation.py", line 1216, in _check_cv
    cv = StratifiedKFold(y, cv, indices=needs_indices)
File "/Users/my.secret.name/anaconda/lib/python2.7/site-packages/sklearn/cross_validation.py", line 398, in __init__
    label_test_folds = test_folds[y == label]
ValueError: boolean index array should have 1 dimension

我在OSX,NumPy的版本运行此1.8.0 ,SCI-Kit了解版本0.15-git

任何方式使用PLSSVD连同cross_val_score

Answer 1:

偏最小二乘项目既数据X和目标Y通过跨越到线性子空间n_components矢量的每个。 他们预计的方式,在其他一个投影变量的回归分数最大化。

组件的数量,潜在子空间的维度,即通过功能在您的变量数的限制。 您的变量Y只有一个功能(一列),所以潜在的子空间是一维的,有效降低您的建筑的东西更接近(但不完全一样)线性回归。 所以在这种特定情况下使用偏最小二乘可能是没有用的。

看看以下

import numpy as np
rng = np.random.RandomState(42)
n_samples, n_features_x, n_features_y, n_components = 20, 10, 1, 1
X = rng.randn(n_samples, n_features_x)
y = rng.randn(n_samples, n_features_y)

from sklearn.cross_decomposition import PLSSVD
plssvd = PLSSVD(n_components=n_components)

X_transformed, Y_transformed = plssvd.fit_transform(X, y)

X_transformedY_transformed是形状的阵列n_samples, n_components ,它们的投影版本XY

回答你有关使用问题PLSSVD一个内Pipelinecross_val_score ,是 ,这是行不通的开箱即用,因为Pipeline对象调用fittransform使用两个变量XY作为参数,如果可能的话,这,因为你可以看到我写的代码,返回一个包含投影元组 XY值。 在管道中的下一个步骤将无法处理此,因为它会认为这是元组新的X

这种类型的故障是由于这样的事实, sklearn现在才开始系统化有关多目标的支持。 该PLSSVD你要使用估计本质上是多目标的,即使你只使用它的一个目标。

解决方法 :不要在1D目标使用偏最小二乘法,就没有增益,即使它与管道的工作。



文章来源: Sci-kit Learn PLS SVD and cross validation