如何动态更改scikit学习函数的参数,即找到最佳参数

时间:2016-05-24 07:51:35

标签: python machine-learning scikit-learn

我正在尝试使用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

我从具有不同comp值的循环调用mypca函数。我这样做是为了找到我试图解决的问题的最佳价值。但mypca函数总是返回相同的值,即Xpca,而与comp的值无关 它返回的值对于我从循环发送的comp的第一个值是正确的,即在我的情况下每次发送的Xpca值对于comp = 10是正确的。

我应该怎样做才能找到最佳的comp值?

2 个答案:

答案 0 :(得分:1)

您使用PCA缩小尺寸。

从你的代码:

<form action="" method="POST" dynamic-form-action="customAction">
     ...
</form>

您的输入数据集for n_comp in range(10,1000,20): Xpca = mypca(X,n_comp) # X is a 2 dimensional array print Xpca 只是一个二维数组,最小X是10,因此PCA会尝试为您找到10个最佳维度。从10> 2,你将永远得到相同的答案。 :)

答案 1 :(得分:0)

看起来你正试图为组件数量传递不同的值,并重新适应每个组件。关于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来查看解释的方差分数(k)。如果您的数据分布在低维线性子空间附近,那么当您绘制R^2k时,曲线将具有“肘”形状。肘部将位于子空间的维度上。查看此曲线是一种很好的做法,因为它有助于理解数据。即使没有干净的肘部,通常选择R^2的阈值,例如保留95%的差异。

以下是如何操作(这应该在具有max_components组件的模型上完成):

# Calculate fraction of variance explained
# for each choice of number of components
r2 = pca.explained_variance_.cumsum() / x.var(0).sum()

您可能想要进行的另一种方法是获取PCA转换的数据并将其提供给下游算法(例如分类器/回归),然后根据性能选择组件数量(例如,使用交叉验证)。 / p>

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