我正在尝试使用网格搜索来选择数据的主成分数量,然后再进行线性回归。我很困惑如何制作我想要的主要组件数量的字典。我把我的列表放在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语句,但它仍然给了我同样的错误。但是,这对我的数据集来说不是可重现的例子。
答案 0 :(得分:7)
我可能在scikit-learn 0.18.1.
查看错误报告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,也无法分辨出什么是“最佳”。