Докато се опитвах да работя върху набор от данни за измами с кредитни карти в 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)
Благодаря за вашата помощ,