Я изучаю PCA в Scikit-learn (0.20 на Python 3), используя 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()
Это выглядит разумно, и это подтверждается точными результатами классификации. Если я заменим bc_train = bc_data
на train_test_split()
вызов (даже с test_size=0
), мои метки больше не будут соответствовать оригинальным.
Я понимаю, что train_test_split()
перетасовывает мои данные (что мне вообще и нужно), но я не понимаю, почему это будет проблемой, поскольку PCA и назначение меток используют одни и те же перетасованные данные. Преобразование PCA - это всего лишь проекция, и, хотя оно, очевидно, не сохраняет те же функции (столбцы), оно не должно изменять, какая метка соответствует какому фрейму.
Как правильно перемаркировать вывод PCA?