Пытаясь работать с набором данных о мошенничестве с кредитными картами в Kaggle (ссылка), я обнаружил, что может иметь лучшую модель, если я уменьшу размер набора данных для обучения. Просто чтобы объяснить, набор данных состоит из 284807 записей 31 функции. В этом наборе данных всего 492 мошенничества (то есть всего 0,17%).
Я попытался выполнить PCA для полного набора данных, чтобы сохранить только 3 наиболее важных измерения, чтобы иметь возможность его отображать. Результат следующий:
В этом невозможно найти закономерность, чтобы определить, мошенничество это или нет.
Если я уменьшу набор данных не мошенничество только для увеличения соотношения (мошенничество/немошенничество), это то, что у меня есть с тем же графиком
Теперь я не знаю, имеет ли смысл подгонять 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)
Спасибо за вашу помощь,