在python中选择功能

在python中选择功能,python,scikit-learn,k-means,pca,feature-selection,Python,Scikit Learn,K Means,Pca,Feature Selection,我正在尝试做这个算法 将熊猫作为pd导入 导入路径库 进口gaitrec 从tsfresh导入提取功能 从集合导入defaultdict 从sklearn.cluster导入KMeans 从sklearn.decomposition导入PCA 从sklearn.metrics.pairwise导入欧氏距离 类PFA(对象): def _u初始(自,n_功能,q=None): self.q=q self.n_特征=n_特征 def配合(自身,X): 如果不是自我。q: self.q=X.shape

我正在尝试做这个算法

将熊猫作为pd导入
导入路径库
进口gaitrec
从tsfresh导入提取功能
从集合导入defaultdict
从sklearn.cluster导入KMeans
从sklearn.decomposition导入PCA
从sklearn.metrics.pairwise导入欧氏距离
类PFA(对象):
def _u初始(自,n_功能,q=None):
self.q=q
self.n_特征=n_特征
def配合(自身,X):
如果不是自我。q:
self.q=X.shape[1]
pca=pca(n_分量=self.q).拟合(X)
A_q=主成分
kmeans=kmeans(n_集群=self.n_特性).fit(A_q)
clusters=kmeans.predict(A_q)
cluster\u centers=kmeans.cluster\u centers_
dists=defaultdict(列表)
对于枚举(集群)中的i、c:
dist=欧几里德距离(A_q[i,:])。重塑(1,-1),簇中心[c,:]。重塑(1,-1))[0][0]
dists[c].追加((i,dist))
self.index=[在dists.values()中为f排序(f,key=lambda x:x[1])[0][0]
self.features_ux=X[:,self.index_X]
p=pathlib.Path(gaitrec.\uu_文件\u_).parent
dataset_file=p/'DatasetC'/'Subc_001'/'walk0'/'Subc_0010.csv'
read_csv=pd.read_csv(数据集_文件,sep=';',decimal='',name=['time','x','y','z','id']))
读取\u csv['id']=0
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
打印(只读)
提取的特征=提取的特征(读取“\u csv”,column\u id=“id”,column\u sort=“time”)
features_withnot_nanvalues=提取的特征.dropna(how='all',axis=1)
打印(无值的功能)
X=不带值的功能。到
pfa=pfa(n_特征=2274,q=1)
pfa.fit(X)
Y=pfa特性_
打印(Y)#特征提取
列索引=pfa.index#特征索引
打印(列索引)
C:\Users\Thund\AppData\Local\Programs\Python\Python 37\Python.exe C:/Users/Thund/Desktop/RepoBitbucket/gaitrc/gaitrc/extraction.py
时间x y z id
0        0 -0.833333  0.416667 -0.041667   0
1        1 -0.833333  0.416667 -0.041667   0
2        2 -0.833333  0.416667 -0.041667   0
3        3 -0.833333  0.416667 -0.041667   0
4        4 -0.833333  0.416667 -0.041667   0
...    ...       ...       ...       ...  ..
1337  1337 -0.833333  0.416667  0.083333   0
1338  1338 -0.833333  0.416667  0.083333   0
1339  1339 -0.916667  0.416667  0.083333   0
1340  1340 -0.958333  0.416667  0.083333   0
1341  1341 -0.958333  0.416667  0.083333   0
[1342行x 5列]

特征提取:100%|██████████| 3/3[00:04如评论中所述,拟合后的特征来自A_q矩阵的索引,该矩阵的PCA特征数量减少。您将获得两个特征,而不是q特征(本例中为1个)由于重塑.self.features可能来自A_q而不是X。

我认为代码中的问题在于以下语句:

pfa=pfa(n_特征=2274,q=1)

我没有读过这篇文章,但你必须观察
pca
行为。如果作者将
q
变量设置为1,你应该知道为什么
q
为1

例如:

from matplotlib.pyplot import plot
from matplotlib.pyplot import xlabel
from matplotlib.pyplot import ylabel
from matplotlib.pyplot import figure

pca_obj = PCA().fit(X=X)
figure(1, figsize=(6,3), dpi=300)
plot(pca_obj.explained_variance_, linewidth=2)
xlabel('Components')
ylabel('Explained Variaces')
注意:如果您使用的应用程序不是jupyter笔记本
,请在行尾添加
show
,以防看不到任何图形

from matplotlib.pyplot import plot
from matplotlib.pyplot import xlabel
from matplotlib.pyplot import ylabel
from matplotlib.pyplot import figure
from matplotlib.pyplot import show

pca_obj = PCA().fit(X=X)
figure(1, figsize=(6,3), dpi=300)
plot(pca_obj.explained_variance_, linewidth=2)
xlabel('Components')
ylabel('Explained Variaces')
show()
对于我的数据集,结果是:

现在,我可以说:“我的
q
变量是100,因为PCA从100个分量开始表现得更好。”

你能这么说吗?你怎么知道q是1


现在观察您最好的
q
性能变量,看看它是否解决了您的问题。

问题是什么?我不理解警告以及从2k+功能中它只提取前2个的原因不确定警告,但看起来您只是从使用kmeans聚集的功能中选择索引-和kmeans已经在PCA的输出上完成了,这减少了维数。我认为由于A_q(不确定)的重塑,你得到的是两个特征,而不是q特征,但是矩阵的索引并不是指相同的东西,所以这肯定应该改变_q@Elenchus谢谢你的回答。我在欧几里德距离中实现了重塑,因为我遇到了这个问题:。啊,是的,这就是为什么你得到了2个特征,而不是of 1.但重塑并不是真正的问题-A_q的特征数量与PCA中的尺寸数量相同。如果你想要更多的特征,将q.2274尺寸增加到1是相当激烈的,因此在你进行重塑时,可能会移除重塑,并将q限制在最小2。但拟合后的特征应该来自A_q,不是席仍然不明白我应该放多少分量。在数组中我记住了“错误”给了PCA,就是行是组成部分(样本)。在这种情况下,我的数据是这样形成的:每一行代表一次行走,列是行走的特征。因此,如果我将相同的行作为组件,数组是相同的(可能pca会根据方差对数组进行排序),如果我放入更少的组件,它可能会尝试求和一些不太重要的特性,并以更少的行输出数组。我的代码现在看起来是这样的:(我添加了更多的示例)。当我的代码执行kmeans训练时,它会运行得很慢,并提取2126到2289个特性。例如,我如何理解它是否正确?(我试图从2289个特征中选择一些相关特征)在使用
PFA
之前,您需要创建
pca
对象,即
pca\u obj=pca()
。然后您需要将
X
(数据)适配到声明的
pca
对象,即
pca\u obj.fit(X)
然后您需要绘制并查看适当数量的组件
绘制(pca\u obj.explained\u方差_
from matplotlib.pyplot import plot
from matplotlib.pyplot import xlabel
from matplotlib.pyplot import ylabel
from matplotlib.pyplot import figure
from matplotlib.pyplot import show

pca_obj = PCA().fit(X=X)
figure(1, figsize=(6,3), dpi=300)
plot(pca_obj.explained_variance_, linewidth=2)
xlabel('Components')
ylabel('Explained Variaces')
show()