gpt4 book ai didi

python - 为什么 sklearn 训练/测试分割加上 PCA 会使我的标签不正确?

转载 作者:行者123 更新时间:2023-12-01 08:51:24 32 4
gpt4 key购买 nike

我正在 Scikit-learn(Python 3 上的 0.20)中探索 PCA,使用 Pandas 来构建我的数据。当我应用测试/训练分割(并且仅当)时,我的输入标签似乎不再与 PCA 输出匹配。

import pandas
import sklearn.datasets
from matplotlib import pyplot
import seaborn

def load_bc_as_dataframe():
data = sklearn.datasets.load_breast_cancer()
df = pandas.DataFrame(data.data, columns=data.feature_names)
df['diagnosis'] = pandas.Series(data.target_names[data.target])
return data.feature_names.tolist(), df

feature_names, bc_data = load_bc_as_dataframe()

from sklearn.model_selection import train_test_split
# bc_train, _ = train_test_split(bc_data, test_size=0)
bc_train = bc_data

from sklearn.decomposition import PCA
pca = PCA(n_components=2)
bc_pca_raw = pca.fit_transform(bc_train[feature_names])
bc_pca = pandas.DataFrame(bc_pca_raw, columns=('PCA 1', 'PCA 2'))
bc_pca['diagnosis'] = bc_train['diagnosis']

seaborn.scatterplot(
data=bc_pca,
x='PCA 1',
y='PCA 2',
hue='diagnosis',
style='diagnosis'
)

pyplot.show()

enter image description here

这看起来很合理,并且准确的分类结果也证明了这一点。如果我将 bc_train = bc_data 替换为 train_test_split() 调用(即使使用 test_size=0),我的标签似乎不再对应于原来的。

enter image description here

我意识到 train_test_split() 正在对我的数据进行洗牌(一般来说,我希望如此),但我不明白为什么这会成为问题,因为 PCA 和标签分配使用相同的打乱数据。 PCA的变换只是一个投影,虽然它显然没有保留相同的特征(列),但它不应该改变哪个标签与哪个帧对应。

如何正确地重新标记我的 PCA 输出?

最佳答案

该问题分为三个部分:

  1. train_test_split()中的改组导致 bc_train 中的索引采用随机顺序(与行位置相比)。
  2. PCA 对数值矩阵进行运算,并有效地从输入中去除索引。创建一个新的DataFrame重新创建顺序索引(与行位置相比)。
  3. 现在我们在bc_train中有随机索引和 bc_pca 中的连续索引。当我这样做时bc_pca['diagnosis'] = bc_train['diagnosis'] , bc_trainreindexedbc_pca s 指数。这会重新排序 bc_train数据,使其索引匹配 bc_pca

换句话说,当我使用 bc_pca['diagnosis'] 进行分配时,Pandas 对索引进行左连接(即 __setitem__() ),而不是逐行复制(类似于 update()

我觉得这不太直观,而且我找不到 __setitem__() 的文档的行为超出了源代码,但我希望它对于更有经验的 Pandas 用户来说是有意义的,也许它在我没有见过的更高级别上有记录。

有多种方法可以避免这种情况。我可以重置训练/测试数据的索引:

bc_train, _ = train_test_split(bc_data, test_size=0)
bc_train.reset_index(inplace=True)

或者,我可以从 values 进行分配成员(member):

bc_pca['diagnosis'] = bc_train['diagnosis'].values

在构建 DataFrame 之前我也可以做类似的事情(可以说更明智,因为 PCA 有效地在 bc_train[feature_names].values 上运行)。

关于python - 为什么 sklearn 训练/测试分割加上 PCA 会使我的标签不正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53093983/

32 4 0