Sklearn中的PCA - ValueError:数组不能包含infs或NaN

时间:2016-12-19 20:33:36

标签: python scikit-learn pca

我正在尝试使用网格搜索来选择数据的主成分数量,然后再进行线性回归。我很困惑如何制作我想要的主要组件数量的字典。我把我的列表放在param_grid参数中的字典格式中,但我认为我做错了。到目前为止,我已收到有关包含infs或NaN的数组的警告。

我遵循将线性回归移植到PCA的说明:http://scikit-learn.org/stable/auto_examples/plot_digits_pipe.html

ValueError:数组不能包含infs或NaNs

我能够在可重现的示例中得到相同的错误,我的真实数据集更大:

import pandas as pd
import numpy as np
from sklearn.decomposition import PCA
from sklearn.linear_model import LinearRegression
from sklearn.pipeline import Pipeline
from sklearn.model_selection import GridSearchCV

df2 = pd.DataFrame({ 'C' : pd.Series(1, index = list(range(8)),dtype = 'float32'),
                     'D' : np.array([3] * 8,dtype = 'int32'),
                     'E' : pd.Categorical(["test", "train", "test", "train",
                     "test", "train", "test", "train"])})

df3 = pd.get_dummies(df2)

lm = LinearRegression()

pipe = [('pca',PCA(whiten=True)),
         ('clf' ,lm)]

pipe = Pipeline(pipe)


param_grid = {
    'pca__n_components': np.arange(2,4)}

X = df3.as_matrix()

CLF = GridSearchCV(pipe, param_grid = param_grid, verbose = 1, cv = 3)

y = np.random.normal(0,1,len(X)).reshape(-1,1)

CLF.fit(X,y)

ValueError: array must not contain infs or NaNs

编辑:我在y中输入了fit语句,但它仍然给了我同样的错误。但是,这对我的数据集来说不是可重现的例子。

2 个答案:

答案 0 :(得分:7)

我可能在scikit-learn 0.18.1.

中遇到PCA问题

查看错误报告https://github.com/scikit-learn/scikit-learn/issues/7568

描述的解决方法是将PCA与svd_solver='full'一起使用。 所以试试这段代码:

pipe = [('pca',PCA(whiten=True,svd_solver='full')),
       ('clf' ,lm)]

答案 1 :(得分:1)

这是我写的一些代码。它似乎对我有用。请注意,当您呼叫fit时,您需要提供训练数据(即Y矢量)。

import pandas as pd
import numpy as np
from sklearn.decomposition import PCA
from sklearn.linear_model import LinearRegression
from sklearn.pipeline import Pipeline
from sklearn.model_selection import GridSearchCV



df2 = pd.DataFrame({ 'C' : pd.Series(1, index = list(range(8)),dtype = 'float32'),
                     'D' : np.array([3] * 8,dtype = 'int32'),
                     'E' : pd.Categorical(["test", "train", "test", "train",
                     "test", "train", "test", "train"])})

df3 = pd.get_dummies(df2)

lm = LinearRegression()

pipe = [('pca',PCA(whiten=True)),
         ('clf' ,lm)]

pipe = Pipeline(pipe)


param_grid = {
    'pca__n_components': np.arange(2,4),
}

X = df3.as_matrix()

CLF = GridSearchCV(pipe, param_grid = param_grid, verbose = 1, cv = 3)

y = np.random.normal(0,1,len(X)).reshape(-1,1)

CLF.fit(X,y)

print(CLF.best_params_)

print语句会向您显示最佳n_components。没有y,你无法计算RSS,也无法分辨出什么是“最佳”。