Является ли хорошей практикой сокращение набора данных для лучшей декомпозиции PCA?

Пытаясь работать с набором данных о мошенничестве с кредитными картами в Kaggle (ссылка), я обнаружил, что может иметь лучшую модель, если я уменьшу размер набора данных для обучения. Просто чтобы объяснить, набор данных состоит из 284807 записей 31 функции. В этом наборе данных всего 492 мошенничества (то есть всего 0,17%).

Я попытался выполнить PCA для полного набора данных, чтобы сохранить только 3 наиболее важных измерения, чтобы иметь возможность его отображать. Результат следующий:

PCA с полным набором данных

В этом невозможно найти закономерность, чтобы определить, мошенничество это или нет.

Если я уменьшу набор данных не мошенничество только для увеличения соотношения (мошенничество/немошенничество), это то, что у меня есть с тем же графиком

PCA_100000

PCA_10000

PCA_1000

Теперь я не знаю, имеет ли смысл подгонять PCA к сокращенному набору данных, чтобы получить лучшую декомпозицию. Например, если я использую PCA с 100 000 баллов, мы можем сказать, что все записи с PCA1 > 5 — мошенничество.

Это код, если вы хотите попробовать:

dataset = pd.read_csv("creditcard.csv")
sample_size = 284807-492  # between 1 and 284807-492
a = dataset[dataset["Class"] == 1]  # always keep all frauds
b = dataset[dataset["Class"] == 0].sample(sample_size) # reduce non fraud qty

dataset = pd.concat([a, b]).sample(frac=1)  # concat with a shuffle

# Scaling of features for the PCA
y = dataset["Class"]
X = dataset.drop("Class", axis=1)
X_scale = StandardScaler().fit_transform(X)

# Doing PCA on the dataset
pca = PCA(n_components=3)
X_pca = pca.fit_transform(X_scale)

pca1, pca2, pca3, c = X_pca[:, 0], X_pca[:, 1], X_pca[:, 2], y
plt.scatter(pca1, pca2, s=pca3, c=y)
plt.xlabel("PCA1")
plt.ylabel("PCA2")
plt.title("{}-points".format(sample_size))
# plt.savefig("{}-points".format(sample_size), dpi=600)

Спасибо за вашу помощь,


person Nicolas M.    schedule 12.09.2017    source источник


Ответы (1)


Это имеет смысл, определенно.

Используемый вами метод широко известен как случайная неполная выборка, и в ML он обычно полезен, когда вы имеете дело с проблемами несбалансированных данных (например, с той, которую вы описываете). Подробнее об этом можно узнать на этой странице Википедии.

Конечно, есть много других методов борьбы с дисбалансом классов, но прелесть этого метода в том, что он достаточно прост и иногда очень эффективен.

person carrdelling    schedule 12.09.2017
comment
Большое спасибо за этот ответ! Есть чему поучиться, и это, безусловно, хорошо - person Nicolas M.; 12.09.2017