首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sci-kit学习PLS、SVD和交叉验证

Sci-kit学习PLS、SVD和交叉验证
EN

Stack Overflow用户
提问于 2014-05-27 17:12:54
回答 1查看 2.4K关注 0票数 1

当响应变量的形状为(N,)而不是(N,1)时,Sci-kit中的N类似乎失败了,其中N是数据集中的样本数。

但是,当响应变量的形状为(N,1)而不是(N,)时,(N,)就会失败。我怎么才能把它们放在一起?

代码片段:

代码语言:javascript
复制
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)

具体来说,它在cross_decomposition/pls_.pyccross_decomposition/pls_.pyc函数中失败,'IndexError: tuple index out of range'位于第103:y_std = np.ones(Y.shape[1])行,因为形状元组只有一个元素。

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

看起来,就像一个简单的修复方法,只需确保y变量有两个维度,(N,1)。然而,

如果我从输出变量y中创建一个维度为y的数组,它仍然会失败。为了更改数组,我在运行cross_val_score之前添加了以下内容

代码语言:javascript
复制
y = np.transpose(np.array([y]))

然后,它在第398行的sklearn/cross_validation.py中失败:

代码语言:javascript
复制
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上运行这个程序.

任何将PLSSVDcross_val_score结合使用的方法

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-27 20:38:21

偏最小二乘将您的数据X和目标Y投影到由n_components向量各自覆盖的线性子空间中。它们的投影方式是将一个预测变量的回归分数最大化。

组件的数量,即潜在子空间的维数,是由变量中的特征数所限制的。您的变量Y只有一个特性(一列),因此潜在子空间是一维的,有效地将您的构造简化为更类似(但不完全相同)的线性回归。因此,在这种特殊情况下使用偏最小二乘可能是没有用的。

请看以下内容:

代码语言:javascript
复制
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中使用Pipeline的问题,您的答案是no,因为Pipeline对象使用变量X和< code >D19调用fittransform作为参数(如果可能的话),如果可能的话,它们返回包含投影的XY值的元组。管道中的下一步将无法处理这个问题,因为它会认为这个元组是新的X

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

解决方案:不要在一维目标上使用偏最小二乘,即使它与流水线一起工作,也不会有任何增益。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23895240

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档