Добра практика ли е да се намали набор от данни, за да има по-добро разлагане на 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