Numpy Sci工具包学习PLS SVD和交叉验证

Numpy Sci工具包学习PLS SVD和交叉验证,numpy,scikit-learn,cross-validation,multidimensional-array,Numpy,Scikit Learn,Cross Validation,Multidimensional Array,当响应变量的形状为(N,)而不是(N,1),其中N是数据集中的样本数时,Sci工具包学习中的sklearn.cross\u decomposition.PLSSVD类似乎失败 但是,当响应变量的形状为(N,1)而不是(N,)时,sklearn.cross\u validation.cross\u val\u score失败。我怎样才能一起使用它们 一段代码: from sklearn.pipeline import Pipeline from sklearn.cross_decompositio

当响应变量的形状为
(N,)
而不是
(N,1)
,其中
N
是数据集中的样本数时,Sci工具包学习中的
sklearn.cross\u decomposition.PLSSVD
类似乎失败

但是,当响应变量的形状为
(N,1)
而不是
(N,)
时,
sklearn.cross\u validation.cross\u val\u score
失败。我怎样才能一起使用它们

一段代码:

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)
具体来说,它在第103行的
交叉分解/pls.pyc
\u center\u scale\u xy
函数中失败,因为形状元组只有一个元素

如果我在
PLSSVD
构造函数中设置
scale=True
,它在第99行的相同函数中失败:
y_std[y_std==0.0]=1.0
,因为它试图对浮点进行布尔索引(
y_std
是浮点,因为它只有一个维度)

看起来,这是一个简单的解决方案,只需确保
y
变量有两个维度,
(N,1)
但是:

如果我用输出变量
y
创建一个维度为
(N,1)
的数组,它仍然会失败。为了更改数组,我在运行
cross\u val\u score
之前添加了以下内容:

y = np.transpose(np.array([y]))
然后,它在第398行的
sklearn/cross_validation.py中失败:

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工具包学习版本
0.15-git


使用
PLSSVD
cross\u val\u score
的任何方法?

偏最小二乘法将数据
X
和目标
Y
投影到每个
n\u分量
向量跨越的线性子空间上。它们的预测方式是,一个预测变量对另一个预测变量的回归分数最大化

组件的数量,即潜在子空间的维度,受变量中特征的数量限制。您的变量
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\u transformed
Y\u transformed
是形状
n\u样本、n\u组件的数组
,它们是
X
Y
的投影版本

关于在
cross\val\u score
中的
Pipeline
中使用
PLSSVD
的问题,您的答案是,它不会立即生效,因为
Pipeline
对象调用
fit
transform
,尽可能使用变量
X
Y
作为参数,正如您在我编写的代码中看到的那样,它们返回一个包含投影的
X
Y
值的元组。管道中的下一步将无法处理此问题,因为它将认为此元组是新的
X

这种类型的失败是由于
sklearn
在多目标支持方面才刚刚开始系统化。您尝试使用的
PLSSVD
估计器本质上是多目标的,即使您仅在一个目标上使用它


解决方案:不要在1D目标上使用偏最小二乘法,即使它与管道一起工作,也不会有任何好处。

偏最小二乘法将数据
X
和目标
Y
投影到每个
n\u分量
向量跨越的线性子空间上。它们的预测方式是,一个预测变量对另一个预测变量的回归分数最大化

组件的数量,即潜在子空间的维度,受变量中特征的数量限制。您的变量
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\u transformed
Y\u transformed
是形状
n\u样本、n\u组件的数组
,它们是
X
Y
的投影版本

关于在
cross\val\u score
中的
Pipeline
中使用
PLSSVD
的问题,您的答案是,它不会立即生效,因为
Pipeline
对象调用
fit
transform
,尽可能使用变量
X
Y
作为参数,正如您在我编写的代码中看到的那样,它们返回一个包含投影的
X
Y
值的元组。管道中的下一步将无法处理此问题,因为它将认为此元组是新的
X

这种类型的失败是由于
sklearn
在多目标支持方面才刚刚开始系统化。您尝试使用的
PLSSVD
估计器本质上是多目标的,即使您仅在一个目标上使用它


解决方案:不要在1D目标上使用偏最小二乘法,即使它与管道一起工作,也不会有任何好处。

如果
y
只有一列,我不确定偏最小二乘法是否有用
PLSSVD
获取
X.T.dot(Y)
的SVD,在您的情况下,它将成为一个列向量。据我所知,偏最小二乘法的要点是找到潜在因子,以投影
X
Y
两个,其中潜在因子f