如何动态更改scikit learn函数的参数,即查找最佳参数

2024-10-01 19:26:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用sklearn的PCA函数进行降维,特别是

from sklearn.decomposition import PCA

def mypca(X,comp): 
pca = PCA(n_components=comp)
pca.fit(X)
PCA(copy=True, n_components=comp, whiten=False)
Xpca = pca.fit_transform(X)
return Xpca

for n_comp in range(10,1000,20):
    Xpca = mypca(X,n_comp) # X is a 2 dimensional array
    print Xpca

我从一个循环调用mypca函数,该函数具有不同的comp值。我这样做是为了找到我要解决的问题的最佳补偿值。但mypca函数始终返回相同的值,即Xpca,与comp的值无关。
它返回的值对于我从循环中发送的第一个comp值是正确的,即它每次发送的Xpca值对于comp=10是正确的。在

我应该怎么做才能找到公司的最佳价值?


Tags: 函数fromimportdefcomponentssklearnfitcopy
2条回答

看起来您正在尝试传递不同的组件数量值,并重新适应每个组件。PCA的一个优点是它实际上没有必要这样做。您可以填充完整数量的组件(甚至与数据集中的维度一样多的组件),然后简单地丢弃不需要的组件(即那些差异较小的组件)。这相当于用较少的零部件重新拟合整个模型。节省了大量计算。在

如何做到:

# x = input data, size(<points>, <dimensions>)

# fit the full model
max_components = x.shape[1] # as many components as input dimensions
pca = PCA(n_components=max_components)
pca.fit(x)

# transform the data (contains all components)
y_all = pca.transform(x)

# keep only the top k components (with greatest variance)
k = 2
y = y_all[:, 0:k]

至于如何选择组件的数量,这取决于您想做什么。选择组件数量的一个标准方法是查看每个选择k所解释的方差的分数(R^2)。如果您的数据分布在低维线性子空间附近,那么当您绘制R^2k时,曲线将具有“肘部”形状。弯头将位于子空间的维数处。观察这条曲线是很好的做法,因为它有助于理解数据。即使没有干净的弯头,通常也要为R^2选择一个阈值,例如保留95%的方差。在

下面是如何做到这一点(这应该在包含max_components组件的模型上完成):

^{pr2}$

您可能希望继续的另一种方法是将PCA转换后的数据输入到下游算法(例如分类器/回归),然后根据性能选择组件数量(例如使用交叉验证)。在

旁注:也许只是格式问题,但是mypca()中的代码块应该缩进,否则它不会被解释为函数的一部分。在

使用PCA来减少维数。在

根据您的代码:

for n_comp in range(10,1000,20):
    Xpca = mypca(X,n_comp) # X is a 2 dimensional array
    print Xpca

您的输入数据集X只是一个二维数组,最小的n_comp是10,因此PCA会尝试为您找到10个最佳维度。从10>;2开始,您总是得到相同的答案。:)

相关问题 更多 >

    热门问题