【发布时间】:2014-07-16 17:02:12
【问题描述】:
当响应变量的形状为(N,) 而不是(N,1)(其中N 是数据集中的样本数)时,Sci-kit learn 中的sklearn.cross_decomposition.PLSSVD 类似乎失败了。
但是,当响应变量的形状为 (N,1) 而不是 (N,) 时,sklearn.cross_validation.cross_val_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)
具体来说,它在cross_decomposition/pls_.pyc 的cross_decomposition/pls_.pyc 的'IndexError: tuple index out of range' 函数中失败,在第103 行:y_std = np.ones(Y.shape[1]),因为形状元组只有一个元素。
如果我在 PLSSVD 构造函数中设置 scale=True,它会在第 99 行的同一函数中失败:y_std[y_std == 0.0] = 1.0,因为它试图在浮点数上执行布尔索引(y_std 是浮点数,因为它只有一维)。
似乎很容易解决,只需确保y 变量有两个维度(N,1)。 但是:
如果我从输出变量y 创建一个维度为(N,1) 的数组,它仍然会失败。为了改变数组,我在运行cross_val_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-kit Learn 版本 0.15-git。
有什么方法可以将PLSSVD 与cross_val_score 一起使用?
【问题讨论】:
-
如果
y只有一列,我不确定偏最小二乘法是否有用。PLSSVD采用X.T.dot(Y)的 SVD,在您的情况下,它成为列向量。据我了解,偏最小二乘法的目的是找到潜在因素来投影X和Y,其中X的潜在因素用于解释Y的潜在因素。在这种情况下,由于Y只有一个条目,看起来这会简化为普通的旧最小二乘法。在其上使用转换器会产生一个用于逻辑回归的一维向量,这似乎毫无意义。您也可以设置阈值。
标签: numpy scikit-learn cross-validation multidimensional-array